Skip to main content
A webhook source gives you a URL. Any system that can send an HTTP request can send events to it.
The default source of a project has the same ID as the project.

Send an event

hooksnode keeps the body byte for byte, and keeps the request headers. The body can be up to 4 MiB. It does not have to be JSON, but filters and transforms need a JSON object.

Responses

Most providers retry on 5xx and 429. Do not drop an event when you get these codes.

Check signatures on the way in

You can make hooksnode refuse events that are not signed with a secret. Use this for your own senders.
  1. Open the source and turn on Signing. hooksnode makes a secret.
  2. In your sender, compute an HMAC-SHA256 of the raw body with the secret.
  3. Send it in the X-Webhook-Signature header as sha256=<hex>.
A missing or wrong signature gets 401.
For Paystack, Flutterwave, Stripe or Meta, pick that provider’s signature preset and paste its secret. hooksnode checks the provider’s own header. For Paystack, paste the webhook signing secret (whsec_…) or the secret key (sk_…) as given. Paystack-Signature is checked when present (t=<unix>, v1=<key id>:<hex HMAC-SHA512 of "<t>.<body>">, 300 seconds, several v1 values during rotation). x-paystack-signature (HMAC-SHA512 of the body) is checked only when Paystack-Signature is absent. Presets are in internal/service/sigverify/sigverify.go. hooksnode still forwards those signature headers. It does not forward Cookie, Authorization or X-Forwarded-*. Set those on the destination if you need them. See Destination rules.

Old /proxy URLs

POST /proxy/:userID is removed. Callers get 410 Gone. Point them at POST /p/<source-id> instead. The default source id is the project id.

Rate limit

Each source takes up to 1,000 events a minute by default. On a Pro project you can raise the limit up to 1,000,000 a minute. Over the limit, hooksnode answers 429 with Retry-After: 60.