Start with the schema.
GET /api/v1/workflows/schema returns every trigger and node type with its provider, the config fields each needs, the outputs it exposes to later nodes, plan requirements and the graph rules.Scopes
Endpoints
Building a graph
Nodes may carry akey of your choosing so edges can reference them before they have ids; ids are assigned on save. trigger_config mirrors the trigger node ({ provider, form_id } for form triggers) and is derived from it when omitted.
Installed apps as steps
Apps installed in the workspace that offer workflow actions are listed byGET /api/v1/workflows/schema under app_actions, each with its app (id, name) and actions (id, key, name, inputs). Use one as a destination node:
inputs maps each input key the action declares to a template; required inputs must be mapped before the workflow can be activated. The step delivers to the app signed with the app’s secret and fails, without retry, if the workspace has since uninstalled the app.
Record-change triggers
Besides forms and meetings, a workflow can start when records change. Each trigger’s config is listed byGET /api/v1/workflows/schema:
Every one takes
enrollment (every_time, the default, or once per record) and change_sources (people, api, workflows, imports; imports are off unless listed). Runs receive the record’s fields (for example deal_id, deal_name, stage_name and the primary contact’s email for deals) plus record_type, record_id and change_source. A workflow acts for its creator: a change to a record outside the creator’s record access (or in a pipeline they can’t see) starts nothing, and a schedule evaluates the view as the creator sees it, up to 10,000 records per run (with once, later runs continue with the records that have not run yet).
Loop protection, for these triggers and for Deal Stage Changed: a workflow never starts on a change its own steps made, a chain of workflows starting each other stops after three, and one record starts a workflow at most ten times an hour. Changes refused this way show in the workflow’s runs as cancelled, with the reason.
Record steps write through the same rules as the API: update_deal (fields, move_stage with stage_id, lost_reason_template; a stage move follows the pipeline’s rules), create_company, update_company, link_records (contact_company, deal_contact, deal_company), rotate_owner (round robin over user_ids, remembered per step), complete_task and add_line_item (Add Product to Deal: product_id, with optional quantity, unit_price, discount and discount_type as numbers or {{fields}}, and set_deal_amount to make the deal amount follow its line items; see Products, line items and quotes). A step that can’t act on the run’s record (no deal in the run, a pipeline rule refusing the move, a value that doesn’t fit a field) is skipped with the reason, which the run’s steps show; skips never count toward pausing the workflow. Database errors fail the step and are retried.
Publishing, pausing, resuming
A workflow is created as a draft.PATCH with { "status": "active" } validates the graph (missing config, unconnected nodes, plan limits), publishes it and starts running it on its trigger; the response carries the validation problems when it is not ready. Edits to an active workflow are saved as a draft (has_unpublished_changes: true) until status: "active" is sent again. { "status": "paused" } stops new runs; sending "active" again resumes it, and process_queue (all, skip, none) says what happens to submissions queued while it was paused.
Pass expected_updated_at (the updated_at you last read) with a PATCH to have the save refused with 409 conflict when someone changed the workflow meanwhile.
Running
POST /api/v1/workflows/:id/run with contact_ids starts one run per contact (the trigger must be Contact Added or Form Submission); the same contact_ids with the same idempotency_key never run twice. With trigger_data the workflow runs once with that data; the response carries a trigger_key, and GET /api/v1/workflows/:id/runs?trigger_key=... finds that run. Both respond 202: runs execute in the background, so poll the run for its status and per-node steps. Runs can send email, call integrations and change CRM data.
CRM API
The objects workflows create and update
MCP tools
The same operations as MCP tools