Publish a message to QStash via HTTP POST to https://qstash.upstash.io/v2/publish/YOUR_DESTINATION_URL with the Authorization header set to Bearer YOUR_TOKEN and the message body as the request body
Add a delay with the Upstash-Delay header (e.g., Upstash-Delay: 30s or 10m or 1h) or schedule with Upstash-Not-Before as a Unix timestamp
Set Upstash-Callback to a URL that QStash will POST to with the delivery result after the destination responds; use this for async confirmation
For scheduled recurring messages, use the QStash Schedules API: POST to /v2/schedules with Upstash-Cron header containing a cron expression
Verify incoming QStash requests in your endpoint by validating the Upstash-Signature header using the QStash signing key to prevent spoofed requests
Known gotchas
QStash retries delivery with exponential backoff if the destination returns a non-2xx response; ensure your endpoint is idempotent since it may receive the same message multiple times
The destination URL must be publicly reachable; localhost or private network URLs will fail unless you use a tunnel during development
QStash message size and retention limits apply; large payloads should be stored externally with only a reference in the QStash message body
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp