API Documentation

Management endpoints live under /api (Bearer auth, or a dashboard session). Ingest endpoints live under /ingest (signature-verified for supported providers).

Sinks

POST
/api/sinks Bearer or session
Create a new sink, owned by the authenticated account. Body: {"name":"...","provider":"stripe|github|shopify|linear|pagerduty|clerk|generic"}. All non-generic providers require webhook_secret. See per-provider setup at /providers/shopify, /providers/linear, /providers/pagerduty, /providers/clerk.
GET
/api/sinks Bearer
List sinks for the authenticated API key.
GET
/api/sinks/:id/events Bearer
Last 50 events with delivery attempts.

Routes

POST
/api/sinks/:id/routes Bearer
Add a destination URL. Body: {"url":"https://..."}
DELETE
/api/sinks/:id/routes/:routeId Bearer
Remove a route. Returns 204.

Billing

GET
/api/billing/status Bearer
Current tier, events used this month, and limit.
POST
/api/billing/checkout Bearer
Create a Polar checkout to upgrade to Starter ($9/mo). Returns {"url":"..."}.

Ingest

POST
/ingest/:sinkId Signature
Receive a webhook. FanHook verifies the provider signature (generic sinks are verified only when a webhook_secret is set) and fans out to all routes. Returns 429 when monthly limit is reached.

Response Codes

200
OK
201
Created
204
No Content
400
Bad Request
401
Unauthorized
429
Rate Limited