Hosted HTTP delivery queue

Send us a job. We call your URL back.

Stafett hosts the queue and delivery machinery for you. Send us a payload and an HTTPS callback URL; we handle retries, exponential backoff, Standard Webhooks signing, delivery history, and the dead-letter queue.

curl -X POST https://api.stafett.dev/enqueue \
  -H 'Authorization: Bearer stf_…' \
  -H 'Content-Type: application/json' \
  -d '{"callback_url":"https://api.example.com/hooks/ship","payload":{"order":42}}'

Delivery is at-least-once: a callback can arrive more than once, so your handler must be idempotent.

Control plane Documentation
How it works
  1. 01
    You enqueue with us. POST https://api.stafett.dev/enqueue returns 202 with a job id and a status URL. Set delay_seconds to schedule it for later.
  2. 02
    We deliver. Stafett POSTs your payload to the HTTPS callback you supplied and signs the request. A 2xx means delivered.
  3. 03
    We retry what deserves it. Connection failures, timeouts, 429 and 5xx back off exponentially: one second, doubling, capped at five minutes. Any other response is your rejection and goes straight to the dead-letter queue.
  4. 04
    Nothing disappears. A job that runs out of attempts lands in the dead-letter queue with every attempt logged. Fix the endpoint, replay, and it gets a fresh set of retries.
What you get
Retries and backoff

Five attempts by default, exponential backoff, applied only to failures worth repeating. Every attempt records its status code, latency, and response.

Signed callbacks

Standard Webhooks HMAC over the exact bytes we send. Verify with an off-the-shelf library, not hand-rolled crypto.

Dead-letter queue

Exhausted jobs are held, not dropped. Replay one or a whole selection once the endpoint is healthy again.

Status you can poll

GET /jobs/{id} reports queued, delivering, delivered, retrying, or dead. Call now, fetch later.

A control plane

Inspect the queue we run for you: live throughput and failure metrics, a searchable job ledger, delivery logs, and dead-letter replay.

Boring limits, stated

HTTPS-only callbacks. Payloads up to 1 MiB of JSON. Up to 50 forwarded headers. API tokens are shown once and revocable.

Verifying a callback

Every delivery carries the three Standard Webhooks headers. The webhook-id is the job id and stays the same across retries: use it as your idempotency key.

POST /hooks/ship HTTP/1.1
webhook-id: 018f3b7c-6c4a-7b32-9f21-2c0a5e4d9b11
webhook-timestamp: 1770000000
webhook-signature: v1,g0hM9SsE+OTPJTGt/tmIKtSyZlE3uFJELVlNIOLJ1OE=
content-type: application/json

{"order":42}
When not to use Stafett

Stafett is a delivery queue, not a compute platform or a workflow engine. We store the job and POST to your HTTPS callback; your service does the work. Reach for something else when you need:

Pre-alpha. Delivery is at-least-once, so make your handlers idempotent. About Stafett Get started →