setTimeout() won't survive the deploy.

Dispatch is a webhook scheduler with one job: you POST a URL and a time, and your endpoint gets called at that time. No cron to babysit, no queue to operate, no in-memory timer that dies on restart.

api.dispatch.dev
$

01/how it works

The whole integration.

Three steps, two of which you only do once. There is no step four.

  1. 01

    Create a project, copy the key

    Every project gets its own API key. One for staging, one for production — revoke either without touching the other.

    key: dsp_live_4f8a2c9b51de
  2. 02

    POST the job

    A URL, a timestamp, and an optional payload. That is the entire schema — if you can send an HTTP request, you have finished integrating.

    { "url": "…", "run_at": "2026-06-12T09:30:00Z" }
  3. 03

    Dispatch fires the webhook

    At the scheduled second, your endpoint gets the request. If it fails, Dispatch retries with backoff and logs every attempt along the way.

    09:30:00.000 POST your-endpoint 200 OK · 142ms
  4. That's the whole loop.

    Create an account, grab a key, and your first webhook can be on the schedule in the next five minutes.

02/features

Everything it does.

Six things, on purpose. Scheduling infrastructure should be boring to integrate and boring to operate.

01

On time, to the second

Jobs fire at the timestamp you set. No polling loop between you and your deadline, no cron-resolution rounding, no drift.

scheduled 09:30:00 · fired 09:30:00
02

Retries with backoff

A 500 or a timeout doesn't end the story. Failed deliveries retry on an exponential schedule until they land or run out of attempts.

1s · 2s · 4s · 8s · 16s
03

Every attempt, logged

Status code, latency, and response body for every attempt — not just the last one. When an endpoint misbehaves, you can see exactly how.

attempt 1 → 503 · attempt 2 → 200
04

Projects, not piles

Separate projects with separate API keys. Staging can't fire production's webhooks, and rotating one key never breaks the other.

dsp_live_…9c / dsp_test_…a4
05

No SDK

It's an HTTP API. curl works, fetch works, and your language already ships a client for it. Nothing to install, nothing to keep upgraded.

curl · fetch · net/http · httpx
06

Yours to run

The whole service is open source under MIT. If scheduling has to live inside your infrastructure, run it there — same code, your box.

$ clone · build · pm2 start

03/open source

Read the source before you trust it.

You should know what's holding your schedule before you hand it your webhooks.

Dispatch is MIT-licensed — the same code that runs the hosted service, not a gutted community edition. Clone it, audit it, and if your scheduling has to stay inside your own infrastructure, run it there. Everything on this page works the same way, pointed at your own box.

And if one more hosted dependency is exactly what your stack doesn't need — fair. That instinct is why the repo is public in the first place.

self-hostMIT license
$ git clone https://github.com/imtiyazsayyidpro/dispatch
$ cd dispatch-backend && npm i && npm run build
$ pm2 start dist/src/index.js
✓ dispatch ready · API :4000 · dashboard :3000
point your POSTs at your own box