Schedule trigger
Configure a schedule trigger with cron syntax and a time zone, and see how scheduled runs behave when a workflow is deployed or offline.
A schedule trigger starts a run on a timetable: every weekday morning, on the first of the month, every four hours. For the Studio walkthrough, see Run a workflow on a schedule.
Configuration
Give either cron or interval. When both are set, cron wins.
{
"trigger": {
"type": "schedule",
"cron": "0 7 1 * *",
"timezone": "America/New_York"
}
}| Field | Type | Default | Meaning |
|---|---|---|---|
type | "schedule" | ||
cron | string | none | A five-field cron expression |
interval | { "value": number, "unit": "minutes" | "hours" | "days" | "weeks" } | none | A simple repeat, turned into a cron expression (below). value is 1 to 525,600 |
timezone | IANA time zone | UTC | The zone the cron expression is read in, such as Europe/London |
enabled | boolean | true | false keeps the schedule but stops it starting runs |
In Studio, the Schedule block has a Schedule field and a Timezone list with US Eastern, US Central, US Pacific, UTC, Europe/London and Asia/Tokyo. Through the API you can use any IANA zone.
Cron syntax
Five fields, read in timezone:
minute (0-59) hour (0-23) day of month (1-31) month (1-12) day of week (0-6, Sunday = 0)* means any value, , separates a list, - gives a range and / a step.
| When | Expression |
|---|---|
| Weekdays at 9:00 | 0 9 * * 1-5 |
| Mondays at 8:00 | 0 8 * * 1 |
| First day of each month at 7:00 | 0 7 1 * * |
| Last few days of the month, at 18:00 | 0 18 28-31 * * |
| First day of each quarter at 6:00 | 0 6 1 1,4,7,10 * |
| Every 15 minutes | */15 * * * * |
Cron has no "last day of the month". For month-end work, run on the first of the next month, or run on days 28 to 31 and check the date in a Condition step.
How intervals become cron
interval | Cron used |
|---|---|
| 1 minute | * * * * * |
| N minutes | */N * * * * |
| 1 hour | 0 * * * * |
| N hours | 0 */N * * * |
| 1 day | 0 0 * * * (midnight) |
| N days | 0 0 */N * * (counts days of the month, so it restarts each month) |
| Any number of weeks | 0 0 * * 0 (Sundays at midnight) |
Every number of weeks gives the same weekly schedule. For "every two weeks", use a weekly cron and skip alternate runs in a Condition step.
When the schedule exists
- Activation creates it. The schedule is set up when the workflow is activated (Deploy in Studio). Activating a schedule workflow with neither
cronnorintervalfails with400. - Pausing turns it off. A paused workflow's schedule is turned off, and a scheduled start that still fires is skipped while the workflow is not
active. - Archiving removes it.
- No catch-up runs. A scheduled time that passes while the workflow is paused or archived is skipped; it does not start a run later.
Run input
A scheduled run has triggerType: "schedule" and this input:
{
"_schedule": {
"scheduledTime": "2026-11-01T11:00:00.000Z",
"actualTime": "2026-11-01T11:00:00.412Z",
"timezone": "America/New_York"
}
}Read the time in steps with {{input._schedule.scheduledTime}}. It is an ISO time in UTC. A run started with POST /workflows/:id/schedule/trigger also has manualTrigger: true.
Manage the schedule through the API
| Call | Scope | What it does |
|---|---|---|
GET /workflows/:id/schedule | workflows:read | Returns the schedule: cronExpression, interval, timezone, enabled, nextRunAt, lastRunAt, runCount, consecutiveFailures, lastError. data is null when the workflow has no schedule |
PUT /workflows/:id/schedule | workflows:write | Changes cron, interval, timezone or enabled and saves them to the trigger. Returns nextRunAt |
POST /workflows/:id/schedule/trigger | workflows:execute | Starts one run now, for testing. The workflow must be active. Returns 202 with runId |
curl -X PUT https://workflow.loopfour.ai/api/v1/workflows/$WORKFLOW_ID/schedule \
-H "x-api-key: $LOOPFOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "cron": "0 6 * * 1-5", "timezone": "Europe/London" }'
Loopfour