API Reference
FlowUpdate
Canonical campaign flow payload for `POST /v1/campaigns/{id}/flow`, `PUT .../flow` (deprecated), and `POST .../flow:validate`. Same shape as [CampaignFlow](/docs/reference/schemas/CampaignFlow/). See [Campaign setup](/docs/guides/campaign-setup/) and [Email sequences](/docs/concepts/sequences/).
Canonical campaign flow payload for `POST /v1/campaigns/{id}/flow`, `PUT .../flow` (deprecated), and `POST .../flow:validate`. Same shape as [CampaignFlow](/docs/reference/schemas/CampaignFlow/). See [Campaign setup](/docs/guides/campaign-setup/) and [Email sequences](/docs/concepts/sequences/).
Flow
Update campaign flow (deprecated alias)
Deprecated
/v1/campaigns/{id}/flowAuthorization
bearerAuth Use an account API key in the Authorization header: Authorization: Bearer f_....
In: header
Path Parameters
Campaign id.
uuidRequest Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
curl -X PUT "https://example.com/v1/campaigns/497f6eca-6276-4993-bfeb-53cbbbba6f08/flow" \ -H "Content-Type: application/json" \ -d '{ "nodes": [ { "id": "leadSource-1", "type": "leadSource", "position": { "x": 0, "y": 0 }, "data": { "label": "Lead Bucket", "customFieldKeys": [ "company" ], "mappedStandardFieldKeys": [ "email", "first_name", "last_name" ], "isRequired": true }, "deletable": false }, { "id": "email-1", "type": "email", "position": { "x": 220, "y": 0 }, "data": { "label": "Intro Email", "priority": false, "variants": [ { "id": "11111111-1111-4111-8111-111111111111", "label": "A", "subject": "Quick question for {{first_name}}", "template": "Hi {{first_name}} - reaching out about {{custom.company}}.", "isActive": true, "order": 0 }, { "id": "11111111-1111-4111-8111-111111111112", "label": "B", "subject": "Following up for {{first_name}}", "template": "Hi {{first_name}} - wanted to share a quick idea for {{custom.company}}.", "isActive": true, "order": 1 } ] } }, { "id": "waitTime-1", "type": "waitTime", "position": { "x": 460, "y": 0 }, "data": { "label": "Wait 1 day", "duration": "1", "unit": "days", "wait_duration_seconds": 86400 } }, { "id": "email-2", "type": "email", "position": { "x": 700, "y": 0 }, "data": { "label": "Reply Trigger", "priority": false, "variants": [ { "id": "22222222-2222-4222-8222-222222222221", "label": "A", "subject": "Checking back in, {{first_name}}", "template": "Hi {{first_name}} - just checking whether this is relevant for {{custom.company}}.", "isActive": true, "order": 0 } ] } }, { "id": "aiCategorizer-1", "type": "aiCategorizer", "position": { "x": 940, "y": 0 }, "data": { "label": "Categorizer", "use_ai": true } }, { "id": "email-3", "type": "email", "position": { "x": 1180, "y": -120 }, "data": { "label": "Interested Reply", "priority": true, "variants": [ { "id": "33333333-3333-4333-8333-333333333333", "label": "A", "subject": "", "template": "Thanks {{first_name}} - here are the details you asked for.", "isActive": true, "order": 0 } ] } }, { "id": "email-4", "type": "email", "position": { "x": 1180, "y": 120 }, "data": { "label": "Breakup", "priority": true, "variants": [ { "id": "44444444-4444-4444-8444-444444444444", "label": "A", "subject": "Closing the loop, {{first_name}}", "template": "No worries {{first_name}} - I’ll close the loop on my side.", "isActive": true, "order": 0 } ] } } ], "edges": [ { "id": "e1", "source": "leadSource-1", "target": "email-1" }, { "id": "e2", "source": "email-1", "target": "waitTime-1" }, { "id": "e3", "source": "waitTime-1", "target": "email-2" }, { "id": "e4", "source": "email-2", "target": "aiCategorizer-1" }, { "id": "e5", "source": "aiCategorizer-1", "sourceHandle": "interested", "target": "email-3" }, { "id": "e6", "source": "aiCategorizer-1", "sourceHandle": "not-interested", "target": "email-4" } ] }'{ "data": { "flow": { "nodes": [ { "id": "leadSource-1", "type": "leadSource", "position": { "x": 0, "y": 0 }, "data": { "label": "Lead Bucket", "customFieldKeys": [ "company" ], "mappedStandardFieldKeys": [ "email", "first_name", "last_name" ], "isRequired": true }, "deletable": false }, { "id": "email-1", "type": "email", "position": { "x": 220, "y": 0 }, "data": { "label": "Intro Email", "priority": false, "variants": [ { "id": "11111111-1111-4111-8111-111111111111", "label": "A", "subject": "Quick question for {{first_name}}", "template": "Hi {{first_name}} - reaching out about {{custom.company}}.", "isActive": true, "order": 0 }, { "id": "11111111-1111-4111-8111-111111111112", "label": "B", "subject": "Following up for {{first_name}}", "template": "Hi {{first_name}} - wanted to share a quick idea for {{custom.company}}.", "isActive": true, "order": 1 } ] } }, { "id": "waitTime-1", "type": "waitTime", "position": { "x": 460, "y": 0 }, "data": { "label": "Wait 1 day", "duration": "1", "unit": "days", "wait_duration_seconds": 86400 } }, { "id": "email-2", "type": "email", "position": { "x": 700, "y": 0 }, "data": { "label": "Follow-up", "priority": false, "variants": [ { "id": "22222222-2222-4222-8222-222222222221", "label": "A", "subject": "Bumping this for {{first_name}}", "template": "Hi {{first_name}} - circling back in case this is relevant for {{custom.company}}.", "isActive": true, "order": 0 }, { "id": "22222222-2222-4222-8222-222222222222", "label": "B", "subject": "Any thoughts, {{first_name}}?", "template": "Hi {{first_name}} - should I close the loop or send more detail?", "isActive": true, "order": 1 } ] } } ], "edges": [ { "id": "e1", "source": "leadSource-1", "target": "email-1" }, { "id": "e2", "source": "email-1", "target": "waitTime-1" }, { "id": "e3", "source": "waitTime-1", "target": "email-2" } ] }, "flow_revision": "string", "field_sync": { "declared_custom_added": [ "string" ], "declared_standard_added": [ "string" ] }, "change_kind": "none", "change_reasons": [ "string" ], "reactivated_count": 0 }}{ "error": { "type": "invalid_request_error", "code": "invalid_flow", "message": "Flow validation failed" }, "details": [ { "path": "nodes[1].data.variants[0].id", "code": "invalid_variant_id", "message": "Email variants must have a stable UUID id." } ]}{ "error": { "type": "authentication_error", "code": "invalid_api_key", "message": "A valid Furnace API key is required" }}{ "error": { "type": "permission_error", "code": "smartlead_read_only", "message": "Smartlead campaigns are read-only via the API" }}{ "error": { "type": "invalid_request_error", "code": "campaign_not_found", "message": "Campaign not found" }}{ "error": { "type": "rate_limit_error", "code": "rate_limit_exceeded", "message": "Rate limit exceeded for this account" }}{ "error": { "type": "api_error", "code": "internal_error", "message": "Internal server error" }}