Send any URL and a payload. DispatchQ delivers it with retries, stores the result, and lets your agent check back when it's ready.
// 1. Enqueue a job via MCP
create_job({
url: "https://myapp.com/process",
payload: { user_id: 42 }
})
// => { id: "job_Xk9mP2nQ4rT1vW", state: "pending" }
// 2. DispatchQ delivers it with retries and stores the result.
// 3. Check the result anytime
get_job({ id: "job_Xk9mP2nQ4rT1vW" })
// => { state: "completed", response_code: 200,
// response_body: { processed: true }, duration_ms: 4230 } POST any URL and payload. Get a job ID back instantly. DispatchQ delivers it with retries and exponential backoff. You never think about it again.
Every response is stored durably. GET /v1/jobs/:id returns the status, response body, and duration. Results outlive sessions. A different agent or process can check them hours later.
The only job queue with an MCP server and a CLI. AI agents enqueue work via MCP, developers manage jobs from the terminal, and both get human approval and stored results.
Three steps. Five minutes. No infrastructure.
Send a target URL and payload. Optionally add a delay, dedupe key, or require human approval. DispatchQ stores it and returns immediately.
curl -X POST https://api.dispatchq.dev/v1/jobs \
-H "Authorization: Bearer dq_live_sk7Rm..." \
-d '{
"url": "https://myapp.com/process",
"delay": "5m",
"payload": { "user_id": 42 }
}' Your endpoint receives the payload with a cryptographic signature for verification. If it fails, DispatchQ retries with exponential backoff.
POST /process HTTP/1.1
X-DispatchQ-Signature: sha256=9f86d08...
X-DispatchQ-Job-Id: job_Xk9mP2nQ4rT1vW
X-DispatchQ-Attempt: 1
{ "user_id": 42 } No callback endpoints to set up. GET the job and see the full response. Status code, body, duration.
GET /v1/jobs/job_Xk9mP2nQ4rT1vW
{
"id": "job_Xk9mP2nQ4rT1vW",
"state": "completed",
"response_code": 200,
"response_body": {
"processed": true,
"records": 15000
},
"duration_ms": 4230,
"attempts": 1,
"max_attempts": 3
} From background processing to AI agents. DispatchQ handles async work so you don't have to.
Add DispatchQ as an MCP server in Claude Code. Your coding agent can fire off async work (run tests, call APIs, process data) and check results later without blocking.
// Claude Code with DispatchQ MCP server
create_job({
url: "https://ci.myapp.com/run-tests",
payload: { branch: "feature/auth" }
})
// => { id: "job_R7kLm3pQ9xYz", state: "pending" }
// Claude Code continues working...
// Later:
get_job({ id: "job_R7kLm3pQ9xYz" })
// => { state: "completed",
// response_code: 200,
// response_body: { passed: 47, failed: 0 },
// duration_ms: 12450 } Agent A enqueues a deploy and goes to sleep. Agent B wakes up hours later and checks the result. The caller and the checker don't need to be the same agent, or even the same session. DispatchQ is the shared coordination layer between them.
// Research agent: scrape competitor data
create_job({
url: "https://scraper.internal/competitors",
payload: { targets: ["qstash", "trigger"] }
})
// => { id: "job_Wn4vK8tJ2sHd", state: "pending" }
// Research agent's session ends.
// Reporting agent (next morning):
get_job({ id: "job_Wn4vK8tJ2sHd" })
// => { state: "completed",
// response_code: 200,
// response_body: { results: [...] },
// duration_ms: 8320 }
// Picks up where the other left off. An agent wants to charge a credit card or deploy to production. DispatchQ pauses the job until a human approves. The agent asks, you decide, the job executes.
// Agent needs human approval first
create_job({
url: "https://api.stripe.com/v1/charges",
payload: { amount: 5000, currency: "usd" },
requires_approval: true
})
// => { id: "job_Qp6xN1rF5mBg", state: "awaiting_approval" }
// Agent: "Charge $50 to Visa 4242?"
// You: "Approved."
approve_job({ id: "job_Qp6xN1rF5mBg" })
// => { state: "pending" }
// Job executes, result stored Set max_attempts and let exponential backoff handle the rest. Every attempt is logged. The final result is always stored, whether it succeeded or failed.
POST /v1/jobs
{
"url": "https://partner-api.example.com/sync",
"payload": { "account_id": "acct_12345" },
"max_attempts": 5
}
# DispatchQ retries with backoff:
# Attempt 1: immediate
# Attempt 2: +20s
# Attempt 3: +40s
# Attempt 4: +80s
# Attempt 5: +160s A complete job queue in 10 endpoints. Nothing more, nothing less.
Exponential backoff from 20s to 1h. Configurable max attempts per job.
Standard cron expressions with IANA timezones. Create, update, pause, delete.
Pause jobs for sign-off before execution. Built for agents doing consequential work.
Dedupe keys prevent duplicate jobs. Idempotency headers for safe retries.
MCP tools for AI agents. Full CLI for developers. Enqueue, check, approve, and schedule from anywhere.
Every request signed with SHA-256 HMAC. Verify deliveries are from DispatchQ.
Schedule delivery in 30s, 5m, 1h, or 1d. Simple string format, no cron needed.
Optionally get POSTed when a job completes. Simple JSON, not base64-encoded.
"I built DispatchQ because I needed a simple way to run background jobs for my AI agent. Every existing option was either too complex (Temporal, Trigger.dev) or buried inside a larger platform (QStash). I wanted something dead simple: POST a URL, get a job ID back, and check the result later. No SDK required. No workers to deploy. No Redis to manage. So I built the job queue I wanted to use. Then I added an MCP server so AI agents could use it natively, and a CLI so I could manage everything from the terminal. If you've ever wired up a background job system and thought 'there has to be a simpler way,' this is it."
Per job, not per message. No surprise bills.
Perfect for prototypes & hobbies
Get startedFor production apps & startups
Get startedFor growing teams & high volume
Get startedAll plans include HTTP delivery, stored results, retries, delayed jobs, deduplication, human approval, MCP server, and CLI.
No credit card required. Get your API key in 30 seconds.
Free tier. No credit card. Just an API key and a curl command.
Get started for free