Create a workflow
Create a workflow from its inputs, steps, and connections.
inputs: what a run takes,[{name, type, required, default, description, example}].steps: in the same JSON the app saves,[{id, name, type, config, on_error, retries}]. A skill step names the skill inconfig.skill; a workflow step inconfig.target_workflow_id. Steps read inputs as{{inputs.<name>}}.connections:[{from_step, to_step}]. Leave empty to run the steps in order.workspace_id: a workspace you belong to. Default: your personal workspace.
422 lists every problem and nothing is saved. It does not run the workflow.
The easiest way to build steps is the Brain on the canvas. See Build a workflow. To copy an existing workflow’s steps, read it with Get a workflow and include_graph=true.
A key limited to some workflows cannot create one. Needs workflows:write. MCP tool: create_workflow.Authorizations
API key with the vd_sk_ prefix, as Authorization: Bearer vd_sk_.... Create keys in Settings → API Keys.
Headers
Any unique string (such as your order id). Resending the same request with the same key within 24 hours returns the first answer (with Idempotent-Replayed: true) and does nothing twice; the same key with a different request is a 422 idempotency_key_reused.
1 - 255Body
1 - 50010000The inputs a run takes (the API trigger): [{name, type, required, default, description, example}]; type is string, number, integer, boolean, array or object.
The steps, in the same JSON the app saves: [{id, name, type, config, on_error, retries}]. type is one of the executor's step types (skill, workflow, http, code, transform, agent, ...). A skill step names the skill in config.skill; a workflow step in config.target_workflow_id. Steps read inputs as {{inputs.}}.
Edges between steps: [{from_step, to_step}]. Leave empty for a straight line (steps run in order).
A workspace you belong to; default your personal workspace.
Response
The new workflow.
A workflow as an API: what it takes and returns, its track record and endpoints.
The graph's steps (on create, change and GET with include_graph=true).
How many saved versions came before this one.

