Routing And Destinations
Routing is where a single webhook becomes a small event gateway. Hooksbase keeps one default destination, lets you add named destinations, and then evaluates an ordered route-to-one rule set that chooses exactly one destination per accepted delivery.
Routing model
The routing model is intentionally narrow:
- exactly one default destination per webhook
- optional named destinations for cutovers, canaries, or sink-type changes
- first enabled matching rule wins by ascending
priority - unmatched traffic falls back to the default destination
- no fan-out, no header mutation, and no URL rewriting from the routing layer
Accepted deliveries persist the resolved destination snapshot. Retries, replay, DLQ re-drive, and bulk replay keep using that saved destination config even after the live routing table changes.
Auth model
- Name
Public API- Type
- project API key
- Description
Use
/v1/webhooks/{id}/destinationsand/v1/webhooks/{id}/routingfor the canonical route and destination surface.
- Name
Dashboard- Type
- session auth
- Description
The dashboard provides the same destination and routing controls as a UI — add destinations, reorder rules, and preview matches from the browser.
- Name
SDK / CLI- Description
Routing and destination management are not wrapped by the first-party SDK or CLI. Use raw HTTP for this surface.
Destinations
Every webhook starts with one default destination. The current destination types are:
-
webhook -
aws_sqs -
aws_eventbridge -
gcp_pubsub -
object_storage
Operational rules:
- the default destination cannot be deleted
- deleting a destination that is still referenced by a routing rule returns
409 - non-webhook destination types are Pro+ features
- paused or missing resolved destinations fail ingest admission with
400
Replace the routing table
curl https://api.hooksbase.com/v1/webhooks/wh_123/routing \
-X PUT \
-H "Authorization: Bearer swk_..." \
-H "Content-Type: application/json" \
-d '{
"defaultDestinationId": "dest_default",
"rules": [
{
"name": "priority-orders",
"enabled": true,
"priority": 1,
"matchMode": "all",
"destinationId": "dest_orders",
"conditions": [
{ "source": "headers.x-tenant", "operator": "eq", "value": "acme" },
{ "source": "payload.kind", "operator": "eq", "value": "order.created" }
]
}
]
}'
Route-to-one rules
Each rule compares condition sources against literal values. The
supported sources are:
contentType— the request'sContent-Typeheaderheaders.<name>— any inbound header, lower-casedpayload.<path>— dot-path into parsed JSON, including numeric array indexes (e.g.payload.items.0.sku)provider.name,provider.sourceId,provider.eventType, andprovider.verified— normalized metadata from a configured provider pack
Supported operators:
eq,neq— strict equalitycontains,starts_with— substring on stringsexists— value is present (novalueneeded)in— value appears in the array supplied asvaluegt,gte,lt,lte— numeric comparison
Other limits that matter:
- up to
200rules per webhook - up to
25conditions per rule matchModeisall(AND) orany(OR)- omitted priorities default from submitted array order, but final priorities must still be unique
Routing always evaluates the original source payload before any
payload transform runs. If a rule references
payload.<path> and the body is not JSON, the rule simply
does not match.
Related routes
-
GET /v1/webhooks/{id}/destinations -
POST /v1/webhooks/{id}/destinations -
PATCH /v1/webhooks/{id}/destinations/{destinationId} -
DELETE /v1/webhooks/{id}/destinations/{destinationId} -
GET /v1/webhooks/{id}/routing -
PUT /v1/webhooks/{id}/routing
Common mistakes
- Expecting routing to fan out to multiple destinations. Routing is route-to-one only.
- Forgetting that the first matching enabled rule wins, even if a later rule is more specific.
- Assuming replay will use today's routing table instead of the saved destination snapshot.
- Pointing destinations back at Hooksbase ingest or form endpoints instead of a real downstream target.