Management API

Base URL https://api.samhooks.com. Auth: Authorization: Bearer <token> on every route except demo feeds, /status.json, RSS capability URLs, and token recovery.

The matching contract (binding)

A filter is {"naics": [...], "set_asides": [...], "keywords": [...]}. Each list may be empty; at least one must be non-empty (else HTTP 400). An empty list is a wildcard for that dimension.

Routes

RouteWhat it does
POST /v1/filtersCreate (10-filter cap → HTTP 402). Returns the filter + RSS capability URL (once).
GET /v1/filters, GET /v1/filters/:idList / fetch.
PUT /v1/filters/:idUpdate. Any successful PUT resets the consecutive-failure counter and re-enables a disabled endpoint.
DELETE /v1/filters/:idDelete filter and its feed.
POST /v1/test-deliveryFires a sample signed payload at your webhook URL; returns its status code. Works while disabled.
GET /v1/statusYour last 100 delivery attempts + endpoint states.
POST /v1/token/rotateNew token (shown once); old token dies immediately.
POST /v1/token/recoverLost-token reissue — see below.

Lost your token?

POST /v1/token/recover with {"invoice_id": "in_...", "email": "you@example.com"}. The invoice ID is on every Stripe receipt email and in the Stripe customer portal. If the invoice belongs to your active subscription and the email matches, you get a fresh token (shown once; the old one is invalidated). Any mismatch returns a uniform 404. Limited to 5 attempts/hour/IP.

Cancellation

Manage or cancel via the Stripe customer portal link on your receipt. On cancellation your token, webhooks, and feeds stop at the end of the billing period.