Skip to content
catchook

Getting started

Quickstart

Create an endpoint, point a provider at it, and receive your first verified webhook.

This walks through the API. Everything here is also doable from the dashboard.

1. Get an API key

API keys are scoped to a project, and every organization gets a default project when it is created. Keys look like ck_… and are shown once, at creation.

export CATCHOOK_API_KEY=ck_live_...

Every request below authenticates with it:

curl https://api.catchook.com/projects \
  -H "Authorization: Bearer $CATCHOOK_API_KEY"

Your organization is never passed explicitly — it is resolved from the key.

2. Create an endpoint

An endpoint is the URL the provider will post to. It needs the provider and how incoming requests should be verified:

curl -X POST https://api.catchook.com/endpoints \
  -H "Authorization: Bearer $CATCHOOK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Stripe production",
    "provider": "stripe",
    "verification_method": "hmac_sha256"
  }'

The response carries the id and the receiving URL:

{
  "data": {
    "id": "end_60e42bf9513149f2b89dddaa779079a4",
    "name": "Stripe production",
    "provider": "stripe",
    "verification_method": "hmac_sha256",
    "url": "https://events.catchook.com/e/end_60e42bf9513149f2b89dddaa779079a4",
    "paused": false
  },
  "timestamp": "2026-08-29T10:04:11.284Z"
}

3. Give it the provider’s signing secret

Catchook verifies the provider’s signature before doing anything else, so it needs the same secret the provider signs with — whsec_… in Stripe’s case. Set it on the endpoint, then paste the endpoint URL into the provider’s webhook settings.

See Signature verification for what each method expects.

4. Add a destination

Nothing is delivered anywhere until an endpoint has at least one destination:

curl -X POST https://api.catchook.com/endpoints/end_60e4.../destinations \
  -H "Authorization: Bearer $CATCHOOK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "API",
    "receiver_url": "https://api.example.com/webhooks/stripe",
    "retry_max_attempts": 5
  }'

The response includes a catchook_secret. Catchook signs every delivery to this destination with it, so your handler can confirm the request came from Catchook and not from someone who guessed the URL — see Verifying deliveries.

5. Send a test event

Trigger a real webhook from the provider’s dashboard. Within a second or so it is queryable:

curl "https://api.catchook.com/events?limit=5" \
  -H "Authorization: Bearer $CATCHOOK_API_KEY"

If nothing arrives, the usual causes, in order: the endpoint is paused, the signing secret does not match the provider’s, or the provider is still pointed at the old URL.

Next

Run catchook listen to put those same webhooks on your laptop while you write the handler.