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

PUT/v1/campaigns/{id}/flow

Authorization

bearerAuth
AuthorizationBearer <token>

Use an account API key in the Authorization header: Authorization: Bearer f_....

In: header

Path Parameters

idstring

Campaign id.

Formatuuid

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

nodesarray<FlowNode>
edgesarray<FlowEdge>
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"  }}