Authentication
Send an API key as a bearer token. The key must carry the sites.view permission; a key without it is refused with 403, not 404.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X POST https://api.zinndigital.com/v1/sites/{siteId}/scheduled-tasks \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ "schedule": <string>, "command": <string> }'Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
Adds one cron job. The schedule and the command are validated **before** the vendor is called: a five- or six-field crontab expression, no newline anywhere (a crontab is lines, so one embedded newline is a second job the customer never wrote), and a command within the length the vendor's crond accepts. Each refusal is a `422` carrying our sentence and naming the fix. ⛔ `enabled` is accepted for symmetry with `updateSiteScheduledTask` and **ignored here** — a newly created task is always active. Pause it with a subsequent `updateSiteScheduledTask` carrying the whole row. `404` for a site with no managed hosting package. Requires `sites.view` and `sites.panel_access`.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
siteId (path) | Uuid | Yes | Site ID (UUIDv7). |
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
schedule | string | Yes | A five- or six-field crontab expression. Validated before the vendor is called; ⛔ a newline anywhere in it is refused, because a crontab is lines and one embedded newline is a s… |
command | string | Yes | The command to run. Capped at the length the vendor's crond accepts — anything longer belongs in a script file the task then schedules. |
email_output | string | No | Where to mail the task's output. An email address, or empty to mail it nowhere — which is why this carries no `format: email`: the empty string is a valid value here and a forma… |
enabled | boolean | No | Whether the task runs. ⛔ Honoured by `updateSiteScheduledTask` and **ignored by `createSiteScheduledTask`** — a newly created task is always active, and pausing one is a subsequ… |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
id | string | Yes | The task's identifier at the vendor, used to update or delete it. |
schedule | string | Yes | The crontab expression, carried **verbatim**. A customer who typed `*/15 * * * *` sees exactly that back, never a normalised rewriting of it. |
command | string | Yes | The command the vendor runs, as the site's own user. |
enabled | boolean | Yes | Whether the task currently runs. ⛔ An absent vendor flag reads as `false`, never `true` — reporting a paused job as running is how a customer stops investigating the thing that… |
email_output | string | Yes | Where the task's output is mailed, or `""` when the vendor mails it nowhere. |
Errors this endpoint can return
401 · 403 · 404 · 409 · 422 · 429 · 503