records array — one object per row — and GetDialed fans the flow out: one job for the trigger, and one execution per record, all running concurrently. It’s the natural fit for anything row-shaped: a parsed CSV, a CRM export, a nightly batch of leads.
How fan-out works
When youPOST /definitions/{id}/trigger with records:
- One job is created with
record_countequal to the number of records. - One execution is created per record. Each record becomes that execution’s
input_data, so your definition’s expressions read its fields via{{input.<column>}}— exactly as they would for a single trigger. - All executions run concurrently. Each succeeds or fails independently.
- When every execution finishes, the job gets an aggregate status.
| Job status | Meaning |
|---|---|
completed | Every execution succeeded |
partially_failed | Some executions succeeded, some failed |
failed | Every execution failed |
A single trigger accepts up to 15,000,000 records. Beyond that, the request is rejected with
422.Example: load a contact list
Say you have a contact CSV:{{input.first_name}}, {{input.last_name}}, and {{input.phone}}. Parse the file into one dict per row and send the rows as records:
Track the job and its executions
Fetch the job to see the aggregate picture —record_count confirms how many executions were fanned out:
partially_failed job means some rows made it and some didn’t. List just the failures to find out which:
input_data (the original record) and an error message — everything you need to fix the row and re-trigger just the failures as a new, smaller records array.
Defer the start with scheduled_at
To load records now but run them later — say, at the start of the calling window — addscheduled_at (ISO 8601):
"status": "scheduled" instead of "pending", and the executions start at the given time. Until then the job can still be cancelled with DELETE /jobs/{job_id} — only pending and scheduled jobs are cancellable.
Record provenance with source and metadata
Both fields are free-form and stored on the job, so you can answer “where did this run come from?” weeks later:| Field | Type | Default | Use it for |
|---|---|---|---|
source | string | "api" | The trigger origin — e.g. csv_upload, crm_sync, nightly_batch |
metadata | object | {} | Anything worth keeping with the job — filename, uploader, batch IDs, correlation IDs |
Trigger request reference
| Field | Type | Required | Description |
|---|---|---|---|
source | string | no | Trigger origin label. Default "api" |
metadata | object | no | Arbitrary provenance data stored on the job. Default {} |
input_data | object | no | Input for a single-execution trigger. Default {} |
records | array of objects | no | One object per row; if non-empty, one execution per record. Max 15,000,000 |
scheduled_at | string (ISO 8601) | no | Defer the start; job status becomes scheduled |
Next steps
Jobs and executions
The full lifecycle and every status in detail.
Batching
Aggregate records across executions into efficient platform calls.