Skip to main content

Running Workflows

Asynchronously (POST /run)

Enqueues the workflow and returns immediately with a job object. The job is processed in the background.

POST /workflows/42/run
Authorization: Bearer <token>
Content-Type: application/json

{}

Response — the job is created with status: "pending":

{
"success": true,
"data": {
"id": 123,
"slug": "job-my-search-workflow-1712345678901",
"status": "pending",
"workflowId": 42,
...
}
}

Use GET /workflows/42/latest-job or GET /workflows/42/jobs to poll for completion and retrieve results.

Overriding the Graph at Runtime

Pass nodes and/or edges to override the stored graph for a single execution without modifying the saved workflow:

POST /workflows/42/run
Authorization: Bearer <token>
Content-Type: application/json

{
"nodes": [ ... ],
"edges": [ ... ]
}

Synchronously (POST /run-sync)

Enqueues the workflow and blocks until the job completes or times out. The response contains the full job with all node outputs populated.

POST /workflows/42/run-sync
Authorization: Bearer <token>
Content-Type: application/json

{
"timeout": 120
}

Request Body

FieldTypeDefaultMaxDescription
nodesarray?stored nodesOverride the workflow's nodes for this execution
edgesarray?stored edgesOverride the workflow's edges for this execution
timeoutnumber?300600Seconds to wait before returning a timeout error

Response — Success

The job is returned with status: "completed" and all node outputs populated:

{
"success": true,
"data": {
"id": 123,
"slug": "job-my-search-workflow-1712345678901",
"status": "completed",
"nodes": [
{
"id": "fetchEntries",
"data": {
"isExecuted": true,
"outputs": [
{ "id": 1, "title": "Introduction to embeddings", ... },
{ "id": 2, "title": "Semantic search at scale", ... }
],
"errors": []
},
...
}
],
...
}
}

Response — Timeout (HTTP 408)

If the job does not complete within the timeout window, a 408 Request Timeout is returned. The job continues running in the background.

{
"success": false,
"message": "Job execution timeout: the job is still running but exceeded the wait time.",
"data": {
"job_id": 123,
"slug": "job-my-search-workflow-1712345678901",
"status": "pending",
"timeout": 120,
"elapsed_seconds": 120
}
}

You can retrieve the final result later using GET /workflows/42/latest-job once the job finishes.

Response — Failure

If the job fails, it is returned with status: "failed". Errors are attached to the specific node that failed in data.errors.


Choosing Between run and run-sync

runrun-sync
ReturnsImmediatelyAfter job completes (or timeout)
Response containsJob ID and initial statusFull job with all outputs
Use whenYou don't need the result inlineYou need the output in the same request
Max wait600 seconds