Scheduler
Scheduler runs work at a time you choose: once, on a rate, or on a cron. It delivers a payload to a queue or publishes an event. Use this for hourly reports, delayed retries, and other jobs that should not live in your application process.
Status: Preview. See the API action reference for the full command list.
Create your first schedule
Before this command, create the destination event bus or queue, sign in with skippr-cloud login, and ensure your policy allows scheduler:CreateSchedule. The same schedule is CLI, Terraform, CDKTF TypeScript, or CDKTF Python. Terraform and CDKTF declare an events target (target_source). Queue targets remain available on the CLI. For provider credentials and the shared cloud provider block, see Terraform and CDKTF.
skippr-cloud scheduler create-schedule --input - <<JSON
{
"name": "hourly-report",
"scheduleExpression": "rate(1 hours)",
"state": "ENABLED",
"target": {
"source": "app.scheduler",
"detailType": "report.due",
"detail": "{\"report\":\"hourly\"}"
}
}
JSONresource "cloud_schedule" "hourly_report" {
name = "hourly-report"
expression = "rate(1 hours)"
target_source = "app.scheduler"
target_detail_type = "report.due"
target_detail = jsonencode({ report = "hourly" })
}import { CloudProvider, CloudSchedule } from "@skippr/provider-cloud";
const cloud = new CloudProvider(this, "cloud", { region: "eu-central-1" });
new CloudSchedule(this, "hourly-report", {
name: "hourly-report",
expression: "rate(1 hours)",
targetSource: "app.scheduler",
targetDetailType: "report.due",
targetDetail: JSON.stringify({ report: "hourly" }),
provider: cloud,
});import json
from skippr_cdktf import CloudProvider, CloudSchedule
cloud = CloudProvider(self, "cloud", region="eu-central-1")
CloudSchedule(
self,
"hourly-report",
name="hourly-report",
expression="rate(1 hours)",
target_source="app.scheduler",
target_detail_type="report.due",
target_detail=json.dumps({"report": "hourly"}),
provider=cloud,
)The response includes the normalized target, state, and next fireAt.
Timing and target rules
All schedule expressions use UTC.
| Form | Example | Behavior |
|---|---|---|
at() | at(2026-08-03T14:30:00) | Fires once, then becomes COMPLETED |
rate() | rate(15 minutes) | Repeats in minutes, hours, or days |
cron() | cron(0 9 * * *) | Five fields: minute, hour, day of month, month, day of week |
Seconds-based rates are not supported. There is no time-zone field or daylight-saving adjustment; convert local times to UTC before creating the schedule.
Queue target
{
"target": {
"queueName": "report-jobs",
"messageBody": "{\"report\":\"hourly\"}"
}
}Events target
{
"target": {
"source": "app.scheduler",
"detailType": "report.due",
"detail": "{\"report\":\"daily\"}"
}
}Streams targets are rejected in Preview. A schedule has one target.
Operations by task
Create and change timing
| Operation | Use it to |
|---|---|
CreateSchedule | Create a named schedule with expression, target, and optional state |
UpdateSchedule | Change its expression, target, state, or description |
Use DISABLED to retain a schedule without firing it. Valid states are ENABLED, DISABLED, and COMPLETED.
Inspect
| Operation | Use it to |
|---|---|
GetSchedule | Read the full schedule and next fireAt |
ListSchedules | List schedule names |
Remove
| Operation | Use it to |
|---|---|
DeleteSchedule | Permanently remove the schedule |
Limits and delivery contract
| Contract | Value |
|---|---|
| Schedules per account | 1,000 |
| Time zone | UTC only |
| Cron syntax | Five fields |
| Rate units | Minutes, hours, days |
| Targets | Queue or events |
| Delivery | At least once |
The scheduler claims a due fire, delivers to queue or events, then records a receipt before advancing the next fire time. Delivery is at least once: a crash during delivery may deliver more than once, so queue consumers and event handlers should be idempotent. Create with immediate: true is due immediately and is delivered by the worker on the next tick, not on the Create response.
Errors
| Code or status | Meaning |
|---|---|
ResourceNotFoundException | The schedule does not exist |
InvalidParameterValue | Invalid state or schedule expression |
ValidationException | Missing fields, schedule quota reached, unsupported target, or an update while a fire is in progress (schedule is firing; retry when Idle). Terraform retries that last case until the schedule is Idle. |
InternalServerError | Delivery or service storage failed |
401 / 403 | Missing authentication or a policy denial |
