Webhook delivery infrastructure

Every event delivered. Zero retry crons.

RelayKit sits between your event sources and your endpoints. It queues, signs, and delivers: 12 attempts with exponential backoff over 72 hours, a log of every attempt, replay from any point.

  • [set measured uptime] uptime
  • SOC2: [set your status]
  • Self-host option: your infra

Delivering for event-driven teams

acme.dev norda helix.sh vantol quenby ostrel

Sample Placeholder wall: swap in your customers, or delete the section.

The delivery problem

You wrote a retry system once. It is still on call.

before Hand-rolled delivery

  • Events dropped every deploy: the worker restarts mid-send.
  • A cron named retry_failed_v3.sh that nobody will touch.
  • Replays at 3am: hand-edited SQL against the events table.
  • No attempt history when a customer asks what happened.
  • Signing secrets pasted across 5 repos.

after RelayKit in the path

  • Events queued at ingest: deploys and restarts lose nothing.
  • Backoff from 2s to 1h, 12 attempts, 72h window. Configured once.
  • Replay any delivery, range, or endpoint with 1 command.
  • Every attempt logged for 30 days: status, latency, response body.
  • Payloads signed per endpoint, secrets rotate without downtime.

What ships in the box

Three guarantees, each one inspectable.

retry schedule
# attempt delay
1 2s
2 8s
3 32s
...
12 1h cap

Retries that converge

Exponential backoff with jitter, capped at 1 hour, 12 attempts across 72 hours. Per-endpoint overrides when a consumer needs slower pacing.

verify a payload
$ relay verify --sig $SIG
algorithm hmac-sha256
timestamp skew 0.4s
valid

Signatures by default

Every payload is signed with a per-endpoint secret and a timestamp. Verify in 4 lines with the SDK, or 1 with the CLI. Rotation is zero-downtime.

replay a range
$ relay replay --since 2h
scope hooks.norda.io
queued 1,204 deliveries
replaying

Replay from any point

Deliveries persist for 30 days. Replay one event, a time range, or everything an endpoint missed while it was down. Idempotency keys ride along.

Quickstart

Integrated before the coffee cools.

These docs compile: type your route and host, every example below rewrites itself.

  1. step 01

    Send one event

    Point any producer at the ingest endpoint. This curl is the whole integration.

    shell
    $ curl -X POST https://in.relaykit.example/v1/events \
      -H "Authorization: Bearer $RELAY_KEY" \
      -d '{"route":"orders.paid","data":{"id":"ord_412"}}'
  2. step 02

    Add your endpoints

    Register consumers with a URL and a route filter. Each gets its own signing secret.

    shell
    $ relay endpoints add \
      --url https://api.acme.dev/hooks \
      --routes "orders.*"
    created ep_b1447a
  3. step 03

    Watch it deliver

    Tail deliveries live, or read the attempt log in the dashboard. That is the whole product.

    shell
    $ relay tail --live
    dlv_20cc19 orders.paid
    -> api.acme.dev 200 18ms

Numbers, not adjectives

The dashboard we would show you.

1.4Bevents relayed / yr sample
38msp99 ingest latency sample
99.98%delivery success sample
6.4KBJS on this page, gzipped: measured

Pricing

Priced per event. Sampled here, set by you.

-20% yearly

Hobby

Side projects and staging environments.

$0/mo

  • 50,000 events / month
  • 2 endpoints, 5 routes
  • 7-day attempt log
  • Community support
Start free

Scale

High volume, compliance, self-host option.

$99/mo

  • 50,000,000 events / month, then per-event
  • Unlimited endpoints
  • 90-day attempt log
  • Self-host relay workers on your infra
  • Priority support, 4 business hours
Talk volume

Sample Numbers are placeholders: set yours once in this section. Full tier comparison on the pricing page.

Sources in, endpoints out

Speaks the queues you already run.

HTTPS ingest Kafka topics RabbitMQ NATS Amazon SQS Google Pub/Sub Postgres CDC CLI tail + replay Node SDK Python SDK Go SDK Terraform provider

FAQ

Questions engineers actually ask.

relay faq --all : 6 answers
  1. Nothing is lost. Deliveries keep retrying on the backoff curve for 72 hours, then park as failed with the full attempt history. When the endpoint recovers, replay the parked range with one command: relay replay --since 24h.

  2. Per-route ordering is best effort: retries can reorder under failure, which is true of every delivery system that retries. We guarantee at-least-once and attach an idempotency key to every delivery so your consumer can dedupe in one line.

  3. Each request carries an hmac-sha256 signature over the body plus a timestamp header. The SDKs expose verify(payload, sig, secret); reject anything older than your skew window. Secrets are per endpoint and rotate with an overlap period, so verification never breaks mid-rotation.

  4. The Scale tier includes self-hosted relay workers: your events never leave your VPC, while the control plane stays managed. A fully air-gapped build is a conversation: email us with your compliance target.

  5. Typically under a day: point your producer at the ingest URL (step 01 of the quickstart), register your existing consumer URLs, and run both paths in parallel. The dashboard diffs deliveries so you can cut over with evidence instead of hope.

  6. Ingest accepts 1,000 events/s per key on Growth and 10,000 events/s on Scale, with burst headroom of 2x for 60 seconds. Delivery fan-out is not rate limited by us: your endpoints set the pace via response codes and Retry-After.

Changelog

Shipping is the trust signal.

  • v1.1.0 : palette, live docs, status, RSS

    Cmd+K jump palette on every page, quickstart examples that rewrite to your values, a /status route with uptime bars, and this changelog as an RSS feed. These dates are real build notes for this site.

  • v1.0.0 : first release

    RelayKit ships: streaming terminal hero, pricing digit roll, quickstart, FAQ, API-key form kit.

  • Delivery log choreography

    Hero terminal types 7 lines in CSS, then streams new deliveries every 2.2s in JS. Rests complete without JS and under reduced motion.

Full changelog : RSS

Get started

Ship the integration this week.

One curl to send, one command to consume. Request a key and you will have deliveries streaming before standup. Questions first? keys@relaykit.example answers within 1 business day.

Scripts are off, so submit posts this form straight to your mail client at keys@relaykit.example. If your machine has no mail client wired up, mail that address by hand or call [set your phone]. Either route reaches the same inbox.

While you type, this browser keeps the three fields above as a local draft so a reload does not cost you the entry. Composing the request deletes that draft, and you can delete it early by clearing the fields.