All Automations endpoints sit under /api/brands/{brand}/automations/ with moduleAccess:automations middleware. Authenticate with EF-Access-Key.
List Automations
GET /api/brands/{brand}/automations
Results per page (1–100, default: 25)
newest (default), oldest, created_at, updated_at
asc or desc (used with created_at / updated_at)
curl "https://app.elasticfunnels.io/api/brands/{brand_id}/automations?q=welcome&per_page=50" \
-H "EF-Access-Key: your_api_key_here"
{
"current_page": 1,
"data": [
{
"id": 12,
"title": "Welcome Email Sequence",
"status": "active",
"trigger_node_type": "form_submission",
"entry_node": "start",
"postback_code": "abc-123",
"collection_code": "lead-capture",
"created_at": "2024-12-01T10:00:00.000000Z",
"updated_at": "2024-12-10T15:00:00.000000Z"
}
],
"per_page": 25,
"total": 8,
"last_page": 1
}
List Automations (Unpaginated)
GET /api/brands/{brand}/automations/all
Returns { id, title } for all automations — useful for dropdowns.
[
{ "id": 12, "title": "Welcome Email Sequence" },
{ "id": 15, "title": "Abandoned Cart Recovery" }
]
Get Automation
GET /api/brands/{brand}/automations/{automation}
{
"id": 12,
"title": "Welcome Email Sequence",
"postback_code": "abc-123",
"trigger_node_type": "form_submission"
}
Create Automation
POST /api/brands/{brand}/automations
Automation name (max 255 chars)
curl -X POST https://app.elasticfunnels.io/api/brands/{brand_id}/automations \
-H "EF-Access-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"title": "Post-Purchase Upsell"}'
{
"automation": {
"id": 16,
"title": "Post-Purchase Upsell",
"status": "draft",
"brand_id": 42,
"created_at": "2024-12-11T10:00:00.000000Z"
}
}
Update Automation
PUT /api/brands/{brand}/automations/{automation}
active, inactive, or draft
Trigger type (e.g. form_submission, purchase, tag_added)
Custom postback code (max 255)
Collection code to attach
Delete Automation
DELETE /api/brands/{brand}/automations/{automation}
Clone Automation
Creates a full copy of an automation within the same brand.
POST /api/brands/{brand}/automations/{automation}/clone
New name for the clone. Defaults to "<original title> (Copy)".
curl -X POST https://app.elasticfunnels.io/api/brands/{brand_id}/automations/12/clone \
-H "EF-Access-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"title": "Welcome Sequence v2"}'
{
"automation": {
"id": 17,
"title": "Welcome Sequence v2",
"status": "draft"
}
}
Copy Automation to Another Brand
POST /api/brands/{brand}/automations/copy
Target brand ID to copy into
Title for the copied automation in the target brand
Export Automations
Queue a CSV export of automation records.
POST /api/brands/{brand}/automations/export
Limit export to specific automation IDs
{
"success": true,
"message": "Export started. You will receive an email when it is ready."
}
Get Builder Config
Returns the full visual-builder JSON for an automation. If a draft revision exists, the draft is returned instead of the published version.
GET /api/brands/{brand}/automations/{automation}/builder
curl https://app.elasticfunnels.io/api/brands/{brand_id}/automations/12/builder \
-H "EF-Access-Key: your_api_key_here"
{
"id": 12,
"title": "Welcome Email Sequence",
"config": {
"nodes": { /* builder nodes */ },
"connections": { /* node connections */ }
},
"version": 3,
"trigger_node_type": "form_submission"
}
Save Builder Config
Saves the visual-builder JSON. Pass draft=true to save as a draft revision without publishing.
POST /api/brands/{brand}/automations/{automation}/builder
The complete builder config object (same shape as returned by GET)
If true, saves as a draft revision. Published configs are deployed to S3 and activate the automation.
curl -X POST "https://app.elasticfunnels.io/api/brands/{brand_id}/automations/12/builder?draft=true" \
-H "EF-Access-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ /* builder JSON */ }'
Discard Draft Revision
Discards the current draft revision and reverts to the last published version.
POST /api/brands/{brand}/automations/{automation}/discard-revision
{
"id": 12,
"title": "Welcome Email Sequence",
"config": { /* last published config */ }
}
Get Automation Stats
Returns execution counts per node, aggregated from the event log.
GET /api/brands/{brand}/automations/{automation}/stats
curl https://app.elasticfunnels.io/api/brands/{brand_id}/automations/12/stats \
-H "EF-Access-Key: your_api_key_here"
{
"start-node-abc": {
"success": 315,
"failed": 2,
"skipped": 5
},
"send-email-def": {
"success": 308,
"failed": 9
}
}
Execution Summary
Global summary of automation runs for the brand.
GET /api/brands/{brand}/automations/summary
{
"total_runs": 1420,
"successful_tasks": 1387,
"failed_tasks": 33,
"task_status_counts": {
"success": 1387,
"failed": 33
},
"period_start_date": "2024-12-01T00:00:00Z",
"period_end_date": "2024-12-31T23:59:59Z"
}
Execution Summary by Automation
GET /api/brands/{brand}/automations/summary-by-automation
Returns execution stats grouped per automation ID.
Automation Event Log
GET /api/brands/{brand}/automations/{automation}/logs
Returns paginated execution log for a specific automation.
Automation Events
GET /api/brands/{brand}/automations/{automation}/events
Returns available event types that have fired for this automation.
Notes
postback_code is the unique trigger code used in postback URLs (/webhooks/{code})
- Builder configs are deployed to S3 on publish — draft saves do not activate the automation
- Stats are read from Elasticsearch and may have a short indexing delay
- The
copy endpoint copies across brands; clone copies within the same brand