Skip to main content
When a payment on one of your invoices is confirmed on Base, Kibble sends an HTTP POST request to a URL you supply. This lets your backend react immediately — updating order records, triggering fulfillment, or sending receipts — without polling the API.
Webhooks are configured per invoice, not at the account level. Each invoice can have its own webhook_url.

How to configure a webhook

Pass a webhook_url when you create an invoice. Kibble generates a unique webhook_secret for that invoice and returns it in the API response.
The response includes a webhook_secret. Store it securely — you will need it to verify the signature on every incoming request.
The webhook_secret is returned only once, at creation time. It is never exposed again through the API. Treat it like a password.

What triggers a webhook

Kibble fires the webhook when on-chain payment activity changes the invoice status. The possible trigger states are: Kibble does not fire a webhook for draft or sent status changes.

Webhook payload

The POST body is a JSON object with the following fields:

Signature header

Every request includes an X-Kibble-Signature header. The value is the HMAC-SHA256 digest of the raw request body, prefixed with sha256=:
Always verify this signature before trusting the payload. See Webhook verification for code examples.

Retry behavior

Kibble makes a single attempt to deliver each webhook. Your endpoint should return a 2xx response as quickly as possible. If processing takes time, acknowledge the request immediately and handle the work asynchronously.
Log the raw request body and X-Kibble-Signature header during development to make signature debugging easier.