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
- Create an account and verify your email, then create an organization.
- Create a project (e.g. “Payments, production”).
- Add a destination: the HTTPS URL on your server that should receive events. Copy the signing secret it shows once.
- 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
| Status | Meaning |
|---|---|
202 | Accepted 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). |
200 | Duplicate of an event already accepted inside the de-duplication window: {"id","status":"duplicate"}. Safe to treat as success. |
401 | Missing or wrong token / invalid provider signature. |
404 | Unknown or inactive endpoint (the same answer for both). |
413 | Body larger than the endpoint or platform limit. |
422 | Body does not match the endpoint’s JSON Schema. |
429 | Rate limit or delivery backlog. Honour Retry-After and resend. |
503 | Maintenance mode. Honour Retry-After. |