records array — one object per row — and GetDialed fans the flow out: one batch for the trigger, one job per record, and one execution per job, 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 /flows/definitions/{id}/trigger with records:
- One batch is created with
record_countequal to the number of records. - One job is created per record — the per-record audit point. Each record becomes that job’s
input_data. - Each job runs one execution, so your definition’s expressions read the record’s fields via
{{input.<column>}}— exactly as they would for a single trigger. All executions run concurrently and succeed or fail independently. - When every execution finishes, the batch gets an aggregate status.
Per-record inputs live on jobs, not on the batch. To read the individual records after triggering, list the batch’s jobs with
GET /flows/jobs?batch_id=<batch_id> — the batch object itself only carries the record_count rollup.A single trigger accepts up to 10,000 inline records. Beyond that, upload a record set and trigger with
record_set_id — see Bulk ingestion. An inline array over the cap 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 batch and its executions
Fetch the batch to see the aggregate picture —record_count confirms how many executions were fanned out:
partially_failed batch 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.
To inspect the records themselves — the per-record inputs that used to be embedded on the batch — list the batch’s jobs:
input_data and its per-record status. Filter to just the failures with ?batch_id=batch_55667788&status=failed.
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 batch can still be cancelled with DELETE /flows/batches/{batch_id} — only pending and scheduled batches are cancellable.
Record provenance with source and metadata
Both fields are free-form provenance labels you attach at trigger time, so you can answer “where did this run come from?” weeks later.source is filterable on the account-wide runs feed (GET /flows/batches?source=...):
Neither affects execution; they exist purely for auditing and filtering on your side.
Trigger request reference
Next steps
Bulk ingestion
Past 10,000 records — upload a record set in chunks and trigger by reference.
Batches and executions
The full lifecycle and every status in detail.
Batching
Aggregate records across executions into efficient platform calls.