What if your agent never dropped a task?

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 }

Fire and forget

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.

Durable, queryable results

Every response is stored durably. Query the request status, response body, and duration. Results outlive sessions. A different agent or process can check them hours later.

Your agent's async layer

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.

How it works

Three steps. Five minutes. No infrastructure.

Your Request
POST /v1/jobs
DispatchQ
Delivers
Retries
Stores
Your Endpoint
receives request
GET /v1/jobs/:id
check status
1 Enqueue a job

POST your job, get an ID back instantly

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 }
  }'
2 Delivered with HMAC signature

DispatchQ POSTs to your endpoint securely

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 }
3 Check the result

Every response stored and retrievable

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
}

Built for real workflows

From background processing to AI agents. DispatchQ handles async work so you don't have to.

Claude Code + DispatchQ MCP

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 }

One agent enqueues, another checks

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.

Human-in-the-loop approval

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

Reliable retries for flaky APIs

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

Everything you need

A complete job queue in 10 endpoints. Nothing more, nothing less.

🔄

Retries & backoff

Exponential backoff from 20s to 1h. Configurable max attempts per job.

Cron schedules

Standard cron expressions with IANA timezones. Create, update, pause, delete.

Human approval

Pause jobs for sign-off before execution. Built for agents doing consequential work.

🔑

Deduplication

Dedupe keys prevent duplicate jobs. Idempotency headers for safe retries.

🤖

MCP server + CLI

MCP tools for AI agents. Full CLI for developers. Enqueue, check, approve, and schedule from anywhere.

🔐

HMAC signatures

Every request signed with SHA-256 HMAC. Verify deliveries are from DispatchQ.

Delayed jobs

Schedule delivery in 30s, 5m, 1h, or 1d. Simple string format, no cron needed.

📡

Callback URLs

Optionally get POSTed when a job completes. Simple JSON, not base64-encoded.

Built by a developer, for developers

"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."
J
Jay Hickey
Founder, DispatchQ

Simple, predictable pricing

Per job, not per message. No surprise bills.

Free

$0 /mo

Perfect for prototypes & hobbies

Get started
  • 500 jobs/month
  • 3 cron schedules
  • 24-hour history
  • 1 API key
  • All core features
  • MCP server + CLI
Most popular

Pro

$29 /mo

For production apps & startups

Get started
  • 25,000 jobs/month
  • 50 cron schedules
  • 30-day history
  • 5 API keys
  • Email support
  • + $1 per 1,000 extra jobs

Team

$79 /mo

For growing teams & high volume

Get started
  • 100,000 jobs/month
  • Unlimited schedules
  • 90-day history
  • Unlimited API keys
  • 99.9% uptime SLA
  • Priority support
  • + $0.75 per 1,000 extra jobs

All 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.

Try it in 30 seconds

Free tier. No credit card. Just an API key and a curl command.

Get started for free