Skip to main content
A flow is a JSON document with three main sections: metadata, trigger, and nodes.

Basic Structure

{
  "id": "uuid",
  "name": "Flow Name",
  "slug": "flow-name",
  "trigger": {
    "type": "http",
    "config": { ... }
  },
  "nodes": [
    { "id": "node1", "type": "...", "config": { ... } },
    { "id": "node2", "type": "...", "config": { ... } }
  ]
}

Trigger Types

Triggers define how a flow is invoked.

HTTP Trigger

The most common trigger type. Creates a REST endpoint.
{
  "trigger": {
    "type": "http",
    "config": {
      "method": "POST",
      "path": "/payments"
    }
  }
}
FieldTypeRequiredDescription
methodstringYesHTTP method: GET, POST, PUT, DELETE, PATCH
pathstringYesURL path for the endpoint

Cron Trigger

Schedule flows to run at specific times.
{
  "trigger": {
    "type": "cron",
    "config": {
      "schedule": "0 9 * * *",
      "timezone": "America/New_York"
    }
  }
}
FieldTypeRequiredDescription
schedulestringYesCron expression
timezonestringNoIANA timezone (default: UTC)

Queue Trigger

Process messages asynchronously with automatic retries.
{
  "trigger": {
    "type": "queue",
    "config": {
      "name": "order-processing",
      "parallelism": 1,
      "retries": 5,
      "timeout": "30s",
      "backoff": {
        "strategy": "exponential",
        "initial": "1s",
        "max": "1h"
      }
    }
  }
}
FieldTypeRequiredDescription
namestringYesQueue name (unique per project)
parallelismnumberNoConcurrent consumers (1 = strict FIFO)
retriesnumberNoMax retry attempts (0 = no retries)
timeoutstringNoHandler execution timeout
backoffobjectNoRetry backoff strategy
See Queue Trigger for full documentation.

Node Structure

Every node has the same base structure:
{
  "id": "unique_node_id",
  "type": "node_type",
  "config": { }
}
FieldTypeRequiredDescription
idstringYesUnique identifier within the flow
typestringYesOne of the 12 node types
configobjectYesType-specific configuration

Execution Order

By default, nodes execute sequentially in the order they appear in the nodes array.
Node 1 -> Node 2 -> Node 3 -> Response

Branching

Control flow nodes (condition, switch) can branch execution:
Node 1 -> Condition
              |
    +---------+---------+
    |                   |
  (then)              (else)
    |                   |
  Node 2              Node 3
    |                   |
    +---------+---------+
              |
           Node 4
Branches are specified by node IDs in the then and else arrays.

Parallel Execution

The parallel node runs multiple branches concurrently:
Node 1 -> Parallel
              |
    +---------+---------+
    |         |         |
 Branch 1  Branch 2  Branch 3
    |         |         |
    +---------+---------+
              |
           Node 5

Context

Every flow execution has a context - a data store that nodes read from and write to.

Initial Context

When a flow starts, context is seeded with trigger data:
{
  "request": {
    "method": "POST",
    "path": "/payments",
    "headers": { "Authorization": "Bearer xxx" },
    "query": { "debug": "true" },
    "body": { "amount": 1000 }
  },
  "env": {
    "environment": "production"
  }
}

Node Outputs

After each node executes, its output is written to context:
Node "fetch_user" runs -> context["fetch_user.output"] = { ... }
Node "transform"  runs -> context["transform.output"] = { ... }
Access outputs using template expressions:
{{fetch_user.output.body.name}}
{{transform.output.total}}

Flow States

Flows have a status that controls execution:
StatusDescription
draftIn development, not executable
publishedLive and accepting requests
disabledTemporarily stopped
archivedSoft deleted

Versioning

Flows maintain version history for rollback:
  • current_version - Latest saved version
  • published_version - Currently deployed version
You can deploy specific versions to different environments (production, staging).

Next Steps