Skip to content

Initial Data

Initial data is the shape of the input a workflow expects, plus any defaults. You define it in Workflow Settings → Initial Input Schema and read the values back at runtime as {{ initial.key }}.

There’s only one entry point. However a run starts, the incoming values land in the same initial object. You model the shape once and it holds for every caller.

Modeling the shape pays off while you build. If a webhook will send { orderId, items }, declare it here and wire steps against {{ initial.orderId }} before the first request arrives. You write the shape as short type prefixes, not JSON Schema by hand.

One definition does three jobs: it’s the contract a caller reads, it fills in defaults when a caller omits a field, and it seeds the test data a manual run starts from.

Every way a workflow can start feeds the same initial:

How the run startsWhat becomes initial
Sub-workflow stepThe inputs the parent workflow passes
Agent tool callThe arguments the AI agent supplies
WebhookThe request body (with headers, query, and params under initial.webhook)
Scheduled / event triggerThe payload configured on the trigger
Manual run (Play)The editable test data, which starts from the values you set here
API callThe data the caller provides
The Test Data dialog for a manual run, pre-seeded with the values defined in the Initial Input Schema and editable as Properties or JSON before pressing Play.

There is no separate trigger, event, or payload namespace at the root. Trigger-specific extras live in sub-keys like initial.webhook and initial.form. For the exact runtime shape of each trigger type, see Template Syntax → Initial Data.

Defining a field in the Initial Input Schema does two things:

  1. It declares the contract. The fields, their types, and which are required describe what a caller should pass in. When your workflow is used as a sub-workflow or an agent tool, this contract is exactly what the caller sees: the sub-workflow step renders an input form from it, and an AI agent reads it as the tool’s parameter spec. Get the types right and those callers render the inputs correctly.

    A sub-workflow call is also validated against the schema. A missing required field or a wrong type fails the call with a validation error. An agent tool is not validated at run time: the schema tells the model what to send, but a mismatch is not rejected. Webhook and direct runs are not validated either.

  2. It can supply a default. Pin a field with the pin button and its value becomes a real default: the workflow uses it whenever a caller omits that field.

A Sub-Workflow step rendering an input form generated from a called workflow's Initial Input Schema — each field, its type, and whether it is required come straight from the contract.

In Properties mode, the PATH column is the field name and the VALUE column describes the field. A bare value is just a string. To type a field, prefix the value:

ValueResult
valuestring (the default)
number: Quantity orderednumber, described as “Quantity ordered”
boolean: Dry run flagtrue/false
string[]: Tag listarray of strings
object[]: Line itemsarray of generic objects
send|book|cancel: The actionenum (one of the listed values)
number.optional: Page sizeappend .optional to any type to make it optional

Everything after the colon is the field’s description, not a default value. It tells a caller (or the LLM, for agent tools) what the field is for.

By default, a field with a type prefix is required. Add .optional to make it optional.

The Initial Input Schema editor in Properties mode: a PATH column of field names beside a VALUE column of type-prefixed descriptions, such as 'number: Quantity ordered' and 'string.optional: The name of the file'.

For an enum, the description is optional: send|book|cancel on its own is a valid enum. You can also write it with an explicit enum: prefix, consistent with the other types: enum: send | book | cancel. Add .optional to either form (send|book|cancel.optional or enum.optional: send | book | cancel).

Use dot-notation in the PATH to nest fields:

metadata.orgId → string: Owning org
metadata.source → string: Where the record came from

For a typed array of objects, declare each field of the first item with bracket notation:

lineItems[0].product → string: Product name
lineItems[0].qty → number: Quantity

For anything deeper or more complex, switch to JSON mode and write the structure directly.

The Initial Input Schema editor in JSON mode — a Monaco editor showing a nested initial-data structure with syntax highlighting and line numbers.

Under the editor, the Resolved Schema panel shows the exact contract your entries compile to: every field, its type, whether it is required or optional, enum values, and descriptions. It updates as you type, so you can see the shape a caller will receive without leaving the dialog. Use the copy button to grab the raw JSON Schema.

The Resolved Schema panel showing the compiled contract — each field with its type chip, a required or optional badge, and its description, nested under their parent fields.

You can also edit from the preview. Click a field’s type to pick a different one, or click its required / optional badge to flip it. The change is written back into the VALUE box, so you can shape the contract by clicking instead of memorizing the prefixes.

Editing from the Resolved Schema preview — a field's type dropdown is open, offering string, number, boolean, object, and array types to swap in without retyping the prefix. The Resolved Schema panel flagging a typo: a value that looks like a typed annotation but didn't parse is called out with a warning, having been saved as a literal default instead of a typed field.

Wherever a step takes a template, reference initial data by key:

{{ initial.orgId }}
{{ initial.lineItems[0].product }}
{{ initial.webhook.query.page }}

The full per-trigger structure (webhook, form, and the rest) is documented in Template Syntax → Initial Data.