Skip to main content
When you trigger a definition, GetDialed records the run as a trigger — the immutable audit anchor — plus one batch for the triggering event and one or more executions for the actual runs. You never create batches or executions directly — they’re always produced by a trigger.

Batches

A batch represents one triggering event and groups every execution it produced. Key fields:
trigger_type and trigger_source are two independent dimensions. Type is the deterministic entry point (api_call / webhook / schedule / event); source is the free-form caller label you pass at trigger time. Filter or group on either one. See Triggers for the full model.

Batch status lifecycle

A batch moves pending → running → completed | partially_failed | failed. Passing scheduled_at at trigger time inserts a scheduled stage before running. Only pending or scheduled batches can be cancelled (DELETE /batches/{id}) — anything already running returns 409.

Account-wide runs feed

GET /batches lists every batch across all of your definitions, newest first — the backing feed for a “recent runs” screen. GET /definitions/{id}/batches is the same feed scoped to a single definition. The response is the converged Page envelope — items, total, limit, skip, and next_cursor. This is a data-family feed, so total is always null; page forward until next_cursor is null, which signals no more rows. Only your own account’s batches are ever returned.

Executions

An execution is one durable run processing one set of inputs. Each belongs to exactly one batch:

Execution status lifecycle

An execution moves pending → running → completed | failed. List a batch’s executions with GET /batches/{batch_id}/executions and fetch one with GET /executions/{id}.

Per-step run detail

GET /executions/{id} embeds a per-step breakdown so a run-detail screen renders in one call — the step list is bounded by the definition’s task chain, so there is no pagination and no per-step endpoint. Two fields carry it: steps_source is always set on the detail route so a client can distinguish “this run genuinely has no steps” from “step detail isn’t available for this run”:
steps and steps_source are populated only on the single-execution detail route (GET /executions/{id}). The executions list route leaves them null — it isn’t the run-detail consumer.

Single-record vs. multi-record triggers

A trigger creates executions in one of two shapes:
  • Single-record — pass input_data. The batch has record_count: 1 and one execution that receives your input_data.
  • Multi-record (fan-out) — pass a records array (up to 15,000,000 records). One execution is created per record, each receiving that record as its input. The batch’s record_count is the array length, and its final status aggregates all children: all succeed → completed, all fail → failed, a mix → partially_failed.
See triggering with records for a walkthrough.

Recurring triggers: schedules

To run a definition on a repeating cadence, create a schedule with POST /schedules. Each fire creates a normal batch — visible under GET /definitions/{id}/batches with trigger_type: "schedule" and a schedule_id pointing back at the schedule — so the batch and execution lifecycle above applies unchanged.
Cron expressions are UTC-only and 5-field syntax only. Six-field expressions (with seconds), aliases like @hourly, and any timezone field are rejected with 422.
Fire behavior is fixed: if a previous fire is still running when the next tick arrives, that tick is skipped, not queued. Missed fires during downtime are replayed only within a 60-second catch-up window. Manage schedules with PATCH /schedules/{id} (change the cron expression, pause/resume with enabled, update input_data) and DELETE /schedules/{id} — deleting a schedule never affects batches it already fired.