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.
Five attempts, exponential backoff, applied only to failures worth repeating. Every attempt records its status code, latency, and response.
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.
Exhausted jobs are held, not dropped. Replay one or a whole selection once the endpoint is healthy again.
GET /jobs/{id} reports queued, delivering, delivered, retrying, or dead. Call now, fetch later.
Inspect the queue we run for you: live throughput and failure metrics, a searchable job ledger, delivery logs, and dead-letter replay.
HTTPS-only destinations. Payloads up to 1 MiB of JSON. Up to 50 forwarded headers. API tokens are shown once and revocable.
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}
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: