Replace the entire workflow
Replaces the whole workflow graph in one write, including any change someone else made after you read it. To add, change or remove one step, use POST /outcomes/{outcome}/nodes, PATCH /workflow or DELETE /nodes/{nodeId}. Use this one to save a node with incomplete settings, or to change if and switch nodes.
If the campaign has no workflow yet, this creates one. It replaces nodes, edges and dispositionEntries in one write. The graph holds only your own actions. Built-in steps for the agent type, such as outcome tags, scheduling the next call and alerts, run on every call and are not part of it. Node types, links and branches are checked, and loops are refused. A node may have incomplete settings, and each gap is listed in warnings.
Omitting a field does not clear it. campaignConfig and a node’s position are kept as stored when the request leaves them out, so a read-modify-write never silently discards settings you did not send. Send "campaignConfig": null to clear it on purpose.
Omitting a node does not delete it. A request that drops a node or an outcome entry that currently exists is rejected with 400 unless you pass "allowRemovals": true.
Concurrency. Send the workflow version you read as expectedVersion. If the workflow changed since then, the save is refused with 409 and nothing is overwritten. Without it, an API key or OAuth caller is refused only when another save lands while this request runs.
Required API key scope: campaign_workflows:write.
Authorizations
Query Parameters
Body
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, on a GoHighLevel sub-account), 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, and an outcome the type cannot emit is refused with 400. 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.
A key no agent type can emit is accepted but never fires. The response reports it as an unknown_outcome warning and does not reject the write, because graphs saved before a rename must stay readable.
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. Set it only when you have read the current graph and mean to drop those parts.
false
Response
The saved workflow.
