---
title: "Alchemy settlement webhook (Routed + GPVRecorded)"
method: POST
path: "/webhooks/alchemy/{tenant_id}/routed"
tags: ["webhooks"]
---

# Alchemy settlement webhook (Routed + GPVRecorded)

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

## Request

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

Terminates Alchemy Custom (GraphQL) webhook deliveries for the Base RouterV2 `Routed` event and the GpvTracker `GPVRecorded` event (fee/plan-hash enrichment), republishing each occurrence onto its settlement topic. The path keeps its historical /routed name — one webhook carries both events. Authenticated by the X-Alchemy-Signature HMAC over the raw body — NOT by enforcer bearer/API-key auth. Returns 200 for anything Alchemy should not retry (including unparseable or foreign payloads), 401 on a missing/invalid 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-Alchemy-Signature` string, required

## Response `200`

accepted (or dropped as non-retryable)

## Other responses

- `400`: malformed tenant_id
- `401`: missing or invalid signature
- `413`: payload exceeds the server body limit
- `503`: transient publish failure — Alchemy 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)
