Skip to main content
A schedule fires a definition on a recurring cron schedule. Each schedule is backed by a managed cron; every fire creates a normal batch — visible under GET /definitions/{definition_id}/batches with trigger_type: "schedule" and a schedule_id linking back to the schedule that produced it. The batch and execution lifecycle is otherwise identical to a manual trigger.
Create the schedule once; the platform re-fires it on every cron tick with no further calls from you.

The schedule object

Cron expressions are UTC-only and 5-field syntax only. Six-field expressions (with seconds), aliases like @reboot/@hourly/@daily/@weekly/@monthly/@yearly, and any timezone / tz field are rejected with 422. There is no per-schedule timezone — convert your local cadence to UTC before you set the expression.

Fire policy

The fire policy is fixed and not configurable:
  • Overlap = SKIP. If a previous fire is still running when the next cron tick arrives, that tick is dropped, not queued — a slow run never stacks up a backlog of overlapping fires.
  • 60-second catch-up window. Missed fires during downtime are replayed only within a 60-second window; anything older is skipped, so recovering from an outage never triggers a thundering herd of stale fires.

Managing schedules

All management endpoints require authentication and operate only on your organization’s schedules. Mutating endpoints require an admin-role caller (an X-API-Key is admin-equivalent). Creating one:
The target definition must be active. POST /schedules rejects a definition whose status is not active with 400 "Definition is not active" — matching the manual trigger contract, so you never schedule a definition that could not be fired on demand. A missing or cross-tenant definition_id still returns 404 (never 403); the active-status check runs after that ownership gate.
PATCH updates the backing schedule in place — a new cron_expression re-times future fires, and toggling enabled pauses or unpauses the schedule, but neither resets the fire history. DELETE is idempotent: if the backing cron is already gone, the record is still removed and the call returns 204.
next_fire_at is derived from the cron expression every time you read the object, so it always reflects the current cadence even immediately after a PATCH. Poll last_fired_at / last_fire_status to confirm a schedule is firing as expected.

Next steps

Schedule a flow

A step-by-step walkthrough: create, pause, and re-time a recurring schedule.

Batches and executions

Follow the batches each fire produces through their execution lifecycle.