RelayHQ Documentation
RelayHQ is a reliable webhook infrastructure layer. It gives you permanent inbound webhook URLs, queues every request durably, fans them out to any number of destination services, and retries failures automatically — all with full observability through the dashboard.
This page covers the quick-start guide, core concepts, a full REST API reference, and dashboard usage tips.
Quick Start
Get from zero to receiving webhooks in under 5 minutes.
1. Create an account
Sign up at dashboard.relayhq.org with your email, Google, or GitHub account. A workspace is created for you automatically.
2. Create your first endpoint
In the dashboard, click New endpoint and give it a name (e.g. "Stripe Payments"). You'll immediately get a permanent relay URL:
https://hooks.relayhq.org/in/<your-endpoint-token>
3. Add a destination
Destinations are the services RelayHQ will forward webhooks to. Add one from the endpoint modal or the endpoint detail page. Example:
https://api.myapp.com/webhooks/stripe
You can optionally add custom HTTP headers (e.g. Authorization: Bearer ...).
4. Point your provider at the relay URL
Go to Stripe (or GitHub, Shopify, etc.) and set the webhook endpoint to your relay URL. RelayHQ will confirm receipt with a 200 OK in under 50ms.
5. Verify delivery
Open the endpoint in the dashboard → Request logs. Every inbound request appears there with full headers, body, and source IP. Click any request to expand it and see per-destination delivery attempts.
Authentication
The RelayHQ dashboard uses session-based authentication (cookies). For programmatic API access, use an API key.
Creating an API key
Go to Settings → API Keys → Create key. Copy the key immediately — it is shown only once.
Using an API key
Pass the key as a Bearer token in the Authorization header on every request:
Authorization: Bearer rhk_live_xxxxxxxxxxxx
API keys are workspace-scoped. All operations performed with a key act on the workspace that created it.
Endpoints
An endpoint is a named, permanent inbound webhook URL. Each endpoint gets a unique token (e.g. abc123) used in the relay URL hooks.relayhq.org/in/<token>.
Endpoints can be paused (stops delivery to destinations without losing requests) or deleted. Deleting an endpoint also removes all associated destinations, requests, and delivery history.
Destinations
A destination is a URL that RelayHQ forwards incoming webhooks to. Each endpoint can have unlimited destinations. When a webhook arrives, RelayHQ fans it out to all active destinations simultaneously.
Destinations support custom request headers (e.g. for authorization) and can be individually enabled/disabled without deleting them.
Routing Rules
Routing rules let you conditionally forward webhooks to a destination based on the request payload or headers. A destination with routing rules only receives webhooks that match the rules.
Each rule has a field (JSON path like $.type or header name like x-event-type), an operator (eq, neq, contains, startsWith, exists), and a value. Multiple rules on a destination are combined with AND/OR logic.
Field: $.type Operator: startsWith Value: payment_intent Logic: AND
Request Logs
Every inbound webhook is stored as a request with:
- Full HTTP headers
- Raw request body (any content type)
- Source IP address
- HTTP method
- Received timestamp
Requests are retained according to your plan (7 days on Free, up to 1 year on Team). You can filter, search, and replay any request.
Delivery Attempts
For each destination, RelayHQ records every delivery attempt with: HTTP status code, response time (ms), attempt number, and timestamp. You can view the last 15 attempts per destination directly in the dashboard.
Retries & Exponential Backoff
If a destination responds with a non-2xx status (or times out), RelayHQ automatically retries with exponential backoff:
Attempt 1: immediately Attempt 2: 30 seconds later Attempt 3: 5 minutes later Attempt 4: 30 minutes later Attempt 5: 2 hours later After 5 failures: marked as failed, alert sent
After all retries are exhausted, you can still manually replay the request from the dashboard at any time.
API Reference
The RelayHQ REST API is available at:
Base URL: https://api.relayhq.org
All requests must include an Authorization: Bearer <api-key> header or a valid session cookie. All request bodies are JSON (Content-Type: application/json). All responses are JSON.
Workspaces
/workspaces/me🔒 Auth requiredReturns the authenticated user's current workspace, including plan, request count, and member list.
Response
{
"id": "ws_abc123",
"name": "My Workspace",
"slug": "my-workspace",
"plan": "starter",
"requestCount": 4821,
"createdAt": "2026-01-15T09:00:00Z"
}/workspaces/:id🔒 Auth requiredUpdate the workspace name.
Parameters
:idstringrequiredWorkspace IDRequest body
{
"name": "Acme Corp"
}Response
{
"id": "ws_abc123",
"name": "Acme Corp",
"slug": "acme-corp"
}Endpoints
/workspaces/:id/endpoints🔒 Auth requiredList all endpoints in the workspace.
Parameters
:idstringrequiredWorkspace IDResponse
[
{
"id": "ep_xxx",
"name": "Stripe Payments",
"token": "abc123",
"paused": false,
"createdAt": "2026-01-20T10:00:00Z"
}
]/workspaces/:id/endpoints🔒 Auth requiredCreate a new endpoint. Optionally create initial destinations in the same request.
Parameters
:idstringrequiredWorkspace IDRequest body
{
"name": "Stripe Payments",
"destinations": [
{
"url": "https://api.myapp.com/webhooks/stripe",
"headers": { "Authorization": "Bearer sk_live_xxx" }
}
]
}Response
{
"id": "ep_xxx",
"name": "Stripe Payments",
"token": "abc123",
"paused": false,
"relayUrl": "https://hooks.relayhq.org/in/abc123"
}/endpoints/:id🔒 Auth requiredUpdate an endpoint's name or paused state.
Parameters
:idstringrequiredEndpoint IDRequest body
{
"name": "Stripe (Production)",
"paused": true
}/endpoints/:id🔒 Auth requiredPermanently delete an endpoint and all associated destinations, requests, and delivery history.
Parameters
:idstringrequiredEndpoint IDDestinations
/endpoints/:id/destinations🔒 Auth requiredList all destinations for an endpoint.
Parameters
:idstringrequiredEndpoint IDResponse
[
{
"id": "dst_xxx",
"url": "https://api.myapp.com/webhooks/stripe",
"enabled": true,
"headers": { "Authorization": "Bearer sk_live_xxx" },
"createdAt": "2026-01-20T10:00:00Z"
}
]/endpoints/:id/destinations🔒 Auth requiredAdd a new destination to an endpoint.
Parameters
:idstringrequiredEndpoint IDRequest body
{
"url": "https://api.myapp.com/webhooks/stripe",
"headers": {
"Authorization": "Bearer sk_live_xxx",
"X-Custom-Header": "value"
}
}Response
{
"id": "dst_xxx",
"url": "https://api.myapp.com/webhooks/stripe",
"enabled": true
}/destinations/:id🔒 Auth requiredUpdate a destination's URL, headers, or enabled state.
Parameters
:idstringrequiredDestination IDRequest body
{
"url": "https://api.myapp.com/webhooks/stripe-v2",
"enabled": false,
"headers": {}
}/destinations/:id🔒 Auth requiredRemove a destination from an endpoint.
Parameters
:idstringrequiredDestination ID/destinations/:id/attempts🔒 Auth requiredFetch the last 15 delivery attempts for a destination.
Parameters
:idstringrequiredDestination IDResponse
[
{
"id": "att_xxx",
"status": "delivered",
"httpStatus": 200,
"durationMs": 142,
"attempt": 1,
"createdAt": "2026-05-28T11:30:00Z"
},
{
"id": "att_yyy",
"status": "failed",
"httpStatus": 503,
"durationMs": 30000,
"attempt": 2,
"createdAt": "2026-05-28T11:00:30Z"
}
]Routing Rules
/destinations/:id/rules🔒 Auth requiredList all routing rules for a destination.
Parameters
:idstringrequiredDestination IDResponse
[
{
"id": "rr_xxx",
"field": "$.type",
"operator": "startsWith",
"value": "payment_intent",
"logic": "AND",
"enabled": true
}
]/destinations/:id/rules🔒 Auth requiredAdd a routing rule to a destination.
Parameters
:idstringrequiredDestination IDRequest body
{
"field": "$.type",
"operator": "eq",
"value": "payment_intent.succeeded",
"logic": "AND"
}Supported operators: eq, neq, contains, startsWith, endsWith, exists. Use $. prefix for JSON body paths, or a plain header name for header matching.
/routing-rules/:id🔒 Auth requiredUpdate a routing rule's field, operator, value, or enabled state.
Parameters
:idstringrequiredRouting rule IDRequest body
{
"enabled": false
}/routing-rules/:id🔒 Auth requiredDelete a routing rule.
Parameters
:idstringrequiredRouting rule IDRequests
/endpoints/:id/requests🔒 Auth requiredList the last 50 inbound requests for an endpoint, ordered by most recent.
Parameters
:idstringrequiredEndpoint IDResponse
[
{
"id": "req_xxx",
"method": "POST",
"sourceIp": "54.187.174.169",
"headers": { "content-type": "application/json", "stripe-signature": "..." },
"receivedAt": "2026-05-28T11:30:00Z"
}
]/requests/:id🔒 Auth requiredGet full details of a single request, including the decoded body.
Parameters
:idstringrequiredRequest IDResponse
{
"id": "req_xxx",
"method": "POST",
"sourceIp": "54.187.174.169",
"headers": { "content-type": "application/json" },
"body": "{ "type": "payment_intent.succeeded", "data": { "amount": 4999 } }",
"receivedAt": "2026-05-28T11:30:00Z"
}/requests/:id/replay🔒 Auth requiredReplay a stored request — re-enqueues it for delivery to all active destinations as if it had just arrived.
Parameters
:idstringrequiredRequest IDResponse
{ "queued": true }API Keys
/workspaces/:id/api-keys🔒 Auth requiredList all API keys in the workspace (key values are never returned after creation).
Parameters
:idstringrequiredWorkspace IDResponse
[
{
"id": "key_xxx",
"name": "CI/CD Pipeline",
"prefix": "rhk_live_xxxx",
"createdAt": "2026-04-01T00:00:00Z",
"lastUsedAt": "2026-05-28T10:00:00Z"
}
]/workspaces/:id/api-keys🔒 Auth requiredCreate a new API key. The full key value is returned once — store it securely.
Parameters
:idstringrequiredWorkspace IDRequest body
{
"name": "CI/CD Pipeline"
}Response
{
"id": "key_xxx",
"name": "CI/CD Pipeline",
"key": "rhk_live_xxxxxxxxxxxxxxxxxxxx"
}/api-keys/:id🔒 Auth requiredRevoke an API key. Any requests using this key will immediately start receiving 401.
Parameters
:idstringrequiredAPI key IDCreating an Endpoint
- Open the dashboard → Endpoints page.
- Click New endpoint.
- Enter a name and optionally add one or more destination URLs.
- Click Create endpoint.
- Copy your relay URL (e.g.
hooks.relayhq.org/in/abc123).
Adding Destinations
From the endpoint card on the Endpoints page, click Add destination. Or open the endpoint detail page and go to the Destinations tab.
Each destination has its own delivery log, routing rules, and enable/disable toggle accessible directly from the endpoint detail view.
Viewing Logs
Click any endpoint name to open its detail page. The Request logs tab shows every inbound request. Click a row to expand the full headers and body. Switch to the Destinations tab to see per-destination delivery history.
Replaying Requests
In the request detail panel, click the Replay button. RelayHQ re-enqueues the original request and delivers it to all currently active destinations. The new delivery attempts appear in the destination logs within seconds.
Replay is useful after fixing a bug in your service — replay all failed requests in bulk using the API: POST /requests/:id/replay.