---
title: "CDP settlement webhook (Routed)"
method: POST
path: "/webhooks/cdp/{tenant_id}/routed"
tags: ["webhooks"]
---

# CDP settlement webhook (Routed)

`POST /webhooks/cdp/{tenant_id}/routed`

## Request

- Base URL: `https://api.instruxi.dev/api/v1/enforcer`
- URL: `https://api.instruxi.dev/api/v1/enforcer/webhooks/cdp/{tenant_id}/routed`
- Auth: none declared. Required headers: `X-Hook0-Signature`

Terminates Coinbase/CDP (Hook0) webhook deliveries for the RouterV2 `Routed` event and republishes the raw, pre-decoded body onto the settlement topic. Authenticated by the X-Hook0-Signature header (HMAC verified against the tenant's sealed secret, 5m/30s replay window) — NOT by enforcer bearer/API-key auth. Returns 200 for anything CDP should not retry, 401 on a missing/invalid/expired signature, and 503 only for a transient publish failure that warrants redelivery. Success and 401/503 bodies are plain status text; only the 400 is JSON.

## Path parameters

- `tenant_id` string, required

## Headers

- `X-Hook0-Signature` string, required

## Response `200`

accepted

## Other responses

- `400`: malformed tenant_id
- `401`: missing, invalid, or replay-window-expired signature
- `413`: payload exceeds the server body limit
- `503`: transient publish failure — CDP should redeliver

---

[API](https://skmtc.dev/instruxi/apis/enforcer-api.md) · [All operations](https://skmtc.dev/instruxi/apis/enforcer-api/llms.txt) · [OpenAPI document](https://skmtc.dev/instruxi/apis/enforcer-api/revisions/fa82bc1becc0?raw)
