Skip to main content
PUT
cURL

Authorizations

Authorization
string
header
required

Send your API key as Authorization: Bearer YOUR_API_KEY.

Path Parameters

id
string
required

Agent id.

Minimum string length: 1

Query Parameters

locationId
string

Pair with campaignId; omit both for primary campaign.

Minimum string length: 1
campaignId
string

Pair with locationId; omit both for primary campaign.

Minimum string length: 1

Body

application/json
nodes
object
required

Workflow nodes keyed by node id.

edges
object[]
required

Directed connections between workflow nodes.

dispositionEntries
object
required

Maps each call outcome to the id of the node that starts its action chain. Keys are uppercase outcome constants: SUCCESS/BOOKED (booked), CONFIRMED (appointment confirmed), RESCHEDULE (rebooked), TRANSFER (live-transferred), TAG_APPLIED (tag objective met), CALLBACK (asked for a callback), INFO_ONLY/FOLLOWUP_REQUESTED (asked for information), HUMAN_NEEDED (asked for a person), VOICEMAIL/NO_ACTION (no outcome), KILL_SWITCH (opted out), FAILED_TRANSFER (transfer did not connect). Which outcomes an agent can emit depends on its type; the legal set per agent type is returned as dispositions by GET /api/v2/projects/systems. The value is the id of a node in nodes — the first node of your action chain for that outcome. The platform composes the canonical handler for each outcome automatically, so just attach your actions here; do not build your own trigger/detector nodes to re-detect a standard outcome.

INFO_ONLY and FOLLOWUP_REQUESTED are two spellings of the same outcome ("asked for information") and are treated as interchangeable at run time: outbound agent types emit INFO_ONLY and the inbound receptionist emits FOLLOWUP_REQUESTED, and a chain wired under either spelling fires for both. Use whichever the systems endpoint lists for your agent type.

A key no agent type can emit is accepted but never fires — the response reports it as an unknown_outcome warning rather than rejecting the write, because graphs predating a rename rely on being readable.

campaignConfig
object

Campaign-level settings saved with the workflow. Documented fields cover supported campaign controls; additional keys (including canvas-only presentation state) are preserved for forward-compatible options.

expectedVersion
integer

Optimistic-concurrency guard: the write is rejected with 409 if the stored version has moved on.

Required range: x >= 0
Example:

3

allowRemovals
boolean
default:false

Confirms that nodes and outcome entries missing from this request should be deleted. Without it, a request that would destroy existing nodes or outcome lanes is rejected with 400 listing them by id. Set it only when you have read the current graph and mean to drop those parts.

Example:

false

Response

The saved workflow.

success
boolean
required
Example:

true

workflow
object | null
required
warnings
object[]

Everything about the graph that is worth knowing and was not worth refusing. Empty on a clean graph. Read this after a write: a 200 means the graph was stored, not that every node will do something.