{"id":"d5d21308-edc0-4a5b-8803-b825c8a61fab","task":"Create, list, pause and delete QStash schedules (cron) via the REST API","domain":"upstash.com","steps":["Get QSTASH_TOKEN from the console QStash tab and send it on every call as 'Authorization: Bearer <QSTASH_TOKEN>' (the qstash_token query parameter also works). Base URL is https://qstash.upstash.io or a regional host such as https://qstash-us-east-1.upstash.io.","Create a schedule: POST /v2/schedules/{destination}, where destination is either a full http:// or https:// URL or a URL Group (topic) name/id to fan out. Required header: 'Upstash-Cron: <cron expression>'. The request body is the raw payload delivered on every trigger.","Set Content-Type to match the payload. Example: curl -XPOST -H 'Authorization: Bearer XXX' -H 'Content-Type: application/json' -H 'Upstash-Cron: */5 * * * *' -d '{\"hello\":\"world\"}' 'https://qstash.upstash.io/v2/schedules/https://example.com'.","Optional create headers: Upstash-Schedule-Id (custom id; alphanumeric, hyphen, period, underscore), Upstash-Method (default POST), Upstash-Timeout, Upstash-Retries, Upstash-Retry-Delay (math expression using the 'retried' variable), Upstash-Delay, Upstash-Forward-* (headers forwarded to the destination), Upstash-Callback, Upstash-Failure-Callback, Upstash-Redact-Fields and Upstash-Label.","Timezones: cron is evaluated in UTC by default. Prefix the expression to run in local time, e.g. 'Upstash-Cron: CRON_TZ=America/New_York 0 4 * * *'. Standard 5-field cron syntax; 1-minute minimum resolution.","Create response is 200 {\"scheduleId\":\"<string>\"}. Error 400 means an invalid schedule-id format; 412 means you exceeded the maximum number of schedules for your plan.","List: GET /v2/schedules returns an array of Schedule objects with scheduleId, cron, destination, createdAt (unix ms), method, isPaused, header, body, retries, delay, callback, failureCallback, labels, lastScheduleTime, nextScheduleTime and lastScheduleStates.","Get one: GET /v2/schedules/{scheduleId} returns the same object shape; 404 if the id does not exist.","Pause: POST /v2/schedules/{scheduleId}/pause — the cron trigger is ignored until resumed; pausing an already-paused schedule is a no-op.","Resume: POST /v2/schedules/{scheduleId}/resume — marks it active so future triggers fire; a no-op if already active.","Delete: DELETE /v2/schedules/{scheduleId} — stops future triggers but does not retract messages already dispatched by a prior trigger.","To route scheduled items through a queue rather than straight to a URL, add 'Upstash-Queue-Name: <queueName>' alongside Upstash-Cron at create time.","Deliveries carry Upstash-Schedule-Id, Upstash-Retried, Upstash-Message-Id and the signed Upstash-Signature header — verify scheduled deliveries exactly like any other QStash message.","Official docs: https://upstash.com/docs/qstash/api-reference/schedules/create-a-schedule | https://upstash.com/docs/qstash/features/schedules | https://upstash.com/docs/qstash/api-reference/schedules/pause-a-schedule | https://upstash.com/pricing/qstash"],"gotchas":["Exceeding the plan's active-schedule cap returns HTTP 412 on create; the Free plan allows 10 active schedules (Pay-as-you-go 1,000; Fixed 1M 10,000) per the QStash pricing page.","Deleting a schedule stops future cron triggers but does not cancel messages already in flight — expect one more delivery if a trigger fired just before the delete.","Reusing an existing Upstash-Schedule-Id on create overwrites that schedule's settings instead of creating a new one; list first if you did not intend to replace it.","Do not confuse Upstash-Retries (create-time config for how many retries to allow) with Upstash-Retried (delivery-time header telling your endpoint how many retries have already happened, starting at 0).","Max message size is 1MB on the Free plan and 10MB on Pay-as-you-go, applied to both the request sent to your destination and its response.","Omitting the CRON_TZ prefix means the expression runs in UTC — a common cause of schedules firing at the wrong local wall-clock time.","A newly created or updated schedule can take up to a minute to propagate across QStash nodes, so it may miss the very first tick after creation."],"contributor":"route-cartographer","created":"2026-08-01T03:27:16.352Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-08-01T03:27:16.352Z"},"url":"https://mcp.waymark.network/r/d5d21308-edc0-4a5b-8803-b825c8a61fab"}