API reference / Schedules
Schedules
A schedule creates a new job on a recurring basis according to a cron expression evaluated in an IANA timezone. Each firing produces an ordinary job that follows the schedule's retry policy and appears in the jobs list. The minimum interval is 30 seconds, and schedule names are unique per environment. Active schedule limits depend on your plan, from 10 on Hobby to 5,000 on Scale.
The schedule object
| Field | Type | Description |
|---|---|---|
id | string | Unique schedule identifier, prefixed sch_. Immutable. |
name | string | Human-readable name, unique within the project and environment. |
cron | string | Cron expression that defines when the schedule fires. |
timezone | string | IANA timezone used to evaluate the expression, such as America/Denver. Defaults to UTC. |
target_url | string | HTTPS URL that receives the payload on every firing. |
payload | object | JSON delivered on every firing. Maximum 256 KB. |
paused | boolean | When true, the schedule does not fire. Missed firings are not replayed on resume. |
next_run_at | string (ISO 8601) | The next time the schedule will fire, or null when paused. |
created_at | string (ISO 8601) | Timestamp of schedule creation, in UTC. |
#Create a schedule
POST /v2/schedules
Creates a recurring schedule from a cron expression and timezone. Malformed expressions or unknown timezones return invalid_cron_expression, and expressions that would fire more often than every 30 seconds return interval_too_short. Reusing an existing name returns schedule_name_taken.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
name | body | string | yes | Unique schedule name within the environment. |
cron | body | string | yes | Cron expression, for example 0 6 * * 1-5. |
target_url | body | string | yes | HTTPS URL that receives the payload on each firing. |
timezone | body | string | no | IANA timezone name. Defaults to UTC. |
payload | body | object | no | JSON payload delivered on each firing. |
retry_policy | body | object | no | Retry settings applied to every job the schedule creates. |
curl -X POST https://api.tendcomputer.com/v2/schedules \
-H "Authorization: Bearer tnd_live_8fQ2xLm9Zc41" \
-H "Content-Type: application/json" \
-d '{"name":"weekday-report","cron":"0 6 * * 1-5","timezone":"America/Denver","target_url":"https://reports.example-shop.dev/generate","payload":{"report":"daily-sales"}}'{
"id": "sch_01J0A4F8C3",
"name": "weekday-report",
"cron": "0 6 * * 1-5",
"timezone": "America/Denver",
"target_url": "https://reports.example-shop.dev/generate",
"payload": { "report": "daily-sales" },
"paused": false,
"next_run_at": "2026-05-14T12:00:00Z",
"created_at": "2026-05-13T14:30:12Z"
}#Update a schedule
PATCH /v2/schedules/{schedule_id}
Changes one or more fields of an existing schedule; omitted fields keep their current values. Setting paused to true stops future firings without deleting the schedule. Firings missed while paused are not replayed on resume.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
schedule_id | path | string | yes | The schedule ID, beginning with sch_. |
cron | body | string | no | New cron expression. |
timezone | body | string | no | New IANA timezone name. |
payload | body | object | no | Replacement payload. Replaces the object entirely rather than merging. |
paused | body | boolean | no | Pause or resume the schedule. |
curl -X PATCH https://api.tendcomputer.com/v2/schedules/sch_01J0A4F8C3 \
-H "Authorization: Bearer tnd_live_8fQ2xLm9Zc41" \
-H "Content-Type: application/json" \
-d '{"paused":true}'{
"id": "sch_01J0A4F8C3",
"name": "weekday-report",
"cron": "0 6 * * 1-5",
"timezone": "America/Denver",
"target_url": "https://reports.example-shop.dev/generate",
"payload": { "report": "daily-sales" },
"paused": true,
"next_run_at": null,
"created_at": "2026-05-13T14:30:12Z"
}#List schedules
GET /v2/schedules
Returns all schedules in the current environment, newest first, with cursor-based pagination. Use limit (default 50, maximum 200) and next_cursor to page through results. Filter by paused to find schedules that are not currently firing.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
limit | query | integer | no | Page size. Default 50, maximum 200. |
cursor | query | string | no | The next_cursor value from the previous response. |
paused | query | boolean | no | When set, returns only paused or only active schedules. |
curl "https://api.tendcomputer.com/v2/schedules?paused=false&limit=50" \
-H "Authorization: Bearer tnd_live_8fQ2xLm9Zc41"{
"data": [
{
"id": "sch_01J0A6R2W9",
"name": "cache-warm",
"cron": "*/5 * * * *",
"timezone": "UTC",
"target_url": "https://api.example-shop.dev/cache/warm",
"paused": false,
"next_run_at": "2026-05-13T14:35:00Z",
"created_at": "2026-05-13T14:31:48Z"
},
{
"id": "sch_01J0A4F8C3",
"name": "weekday-report",
"cron": "0 6 * * 1-5",
"timezone": "America/Denver",
"target_url": "https://reports.example-shop.dev/generate",
"paused": false,
"next_run_at": "2026-05-14T12:00:00Z",
"created_at": "2026-05-13T14:30:12Z"
}
],
"next_cursor": null
}#Delete a schedule
DELETE /v2/schedules/{schedule_id}
Permanently deletes a schedule so it never fires again. Jobs the schedule already created are unaffected and continue through their normal lifecycle. Deletion cannot be undone, but the name becomes available for reuse immediately.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
schedule_id | path | string | yes | The schedule ID, beginning with sch_. |
curl -X DELETE https://api.tendcomputer.com/v2/schedules/sch_01J0A6R2W9 \
-H "Authorization: Bearer tnd_live_8fQ2xLm9Zc41"{
"id": "sch_01J0A6R2W9",
"deleted": true
}