Give us a job. We push it to the endpoint you want.

Stafett hosts the queue and delivery machinery for you. Enqueue a payload and any HTTPS destination (your app, or someone else's API) and 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 '{"url":"https://api.example.com/hooks/ship","payload":{"order":42}}'

Deliveries typically arrive exactly once. When an attempt fails in a way we cannot verify (a timeout, or a dropped connection after the request went out), Stafett retries rather than risk losing the job, so the same job can occasionally arrive more than once (at-least-once). Idempotent handlers, or an idempotency key the remote API accepts, make repeats harmless.

Control plane Documentation Pricing
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 queue.delay_seconds to schedule it for later.
  2. 02
    We deliver. Stafett POSTs your payload to the HTTPS url you named (with any headers you supply) 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 a 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, exponential backoff, applied only to failures worth repeating. Every attempt records its status code, latency, and response.

Signed deliveries

Standard Webhooks HMAC over the exact bytes we send. Verify when the destination is yours; third-party APIs ignore the headers and use the auth you pass in headers.

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 destinations. Payloads up to 1 MiB of JSON. Up to 50 forwarded headers. API tokens are shown once and revocable.

Verifying a delivery

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 when you own the endpoint.

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 the HTTPS URL you named; the destination does the work. Reach for something else when you need:

Pre-alpha. Typically delivered once; retried when in doubt, so destinations must tolerate repeats. About Stafett Get started →