# StableSchedule API StableSchedule creates prepaid cron schedules that fire HTTP webhooks. A schedule stores the destination URL, HTTP method, headers, optional body, timeout, and cron expression. Each cron trigger consumes one prepaid run credit before the webhook is sent. When credits reach zero, StableSchedule pauses provider delivery and marks the schedule exhausted; top up to resume. Use `POST /api/schedule/create` first. It is paid and requires a `sku` run-credit pack plus `cron` and `request`. The returned `schedule.id` is used for all later calls. Use SIWX with the same paying wallet for management: - `GET /api/schedules` lists your schedules. - `GET /api/schedule?id=...` returns one schedule. - `GET /api/schedule/runs?schedule_id=...` returns recent delivery attempts. - `POST /api/schedule/pause`, `/resume`, and `/delete` manage an existing schedule. Use `POST /api/schedule/topup` when `credits.remaining` is low or the schedule is exhausted. Topup is paid and adds credits to the existing schedule. If the schedule was exhausted, topup resumes it automatically. Cron expressions are passed to Upstash QStash. UTC is the default. Use a `CRON_TZ=Area/City` prefix for timezone-aware schedules, for example `CRON_TZ=America/New_York 0 9 * * *`. Webhook body can be any JSON value. If the body is a string it is sent as-is; otherwise StableSchedule JSON stringifies it and defaults `content-type` to `application/json` unless you supplied one.