Retryx Docs

Quick start

Retryx receives webhooks on your behalf, stores every one durably, delivers it to your servers at least once with automatic retries, and lets you inspect and replay anything that failed. Five minutes from zero to a delivered event.

1. Create an organization, project, destination and endpoint

  1. Create an account and verify your email, then create an organization.
  2. Create a project (e.g. “Payments, production”).
  3. Add a destination: the HTTPS URL on your server that should receive events. Copy the signing secret it shows once.
  4. Create an ingestion endpoint and attach the destination. Pick Stripe, GitHub, Shopify, a generic signed source, or Custom HTTP. You get an endpoint URL like https://<your-domain>/v1/ingest/<endpoint-id>.

2. Send a webhook

Custom HTTP endpoints authenticate with the endpoint token. Provider endpoints (Stripe, GitHub, Shopify, generic) are authenticated by verifying the provider’s signature, so paste the endpoint URL into the provider and you are done.

curl -X POST "$RETRYX_URL" \
  -H "Authorization: Bearer $RETRYX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"id":"evt_123","type":"order.created","amount":4200}'

Set RETRYX_URL to the endpoint URL and RETRYX_TOKEN to the token. A 202 means the event is durably stored; delivery happens asynchronously and never blocks your sender.

3. Receive it

Retryx POSTs the original body to your destination with these headers, signed so you can prove it came from us. Verify the signature and de-duplicate on Idempotency-Key, because delivery is at-least-once. Respond with any 2xx within the destination’s timeout (default 10 s).

4. Inspect and replay

Every event, delivery and attempt (status code, duration, response body, resolved IP) is in the Events explorer. If your server was down, fix it and replay: failed deliveries can be retried one by one, in bulk, or by time range. Replays never overwrite history.

Ingestion responses

StatusMeaning
202Accepted and durably stored: {"id","status":"accepted","deliveries":n}. Also returned for events dropped by the endpoint’s event-type filter ({"status":"filtered"}; not stored, not billed).
200Duplicate of an event already accepted inside the de-duplication window: {"id","status":"duplicate"}. Safe to treat as success.
401Missing or wrong token / invalid provider signature.
404Unknown or inactive endpoint (the same answer for both).
413Body larger than the endpoint or platform limit.
422Body does not match the endpoint’s JSON Schema.
429Rate limit or delivery backlog. Honour Retry-After and resend.
503Maintenance mode. Honour Retry-After.
Prefer machine-readable docs? The full API reference (Swagger UI) is generated from the same schemas the server validates with; the raw spec is at /v1/openapi.json.