webhook_url — sends a signed POST request to your server.
You do not interact with Alchemy directly. Kibble manages the webhook infrastructure on your behalf. The outbound webhooks described on this page are the ones Kibble sends to you, not the other way around.
How payment detection works
When Alchemy detects a USDC transfer to a Kibble deposit address on Base, Kibble:- Validates that the transferred token is USDC on Base. Transfers of any other token are silently ignored.
- Compares the received amount to the
expected_amountfor the payment link or invoice. - Updates the payment status accordingly.
- Sends a merchant email notification confirming the payment.
- If the invoice has a
webhook_url, fires a signed POST to that URL with the event payload.
Payment classification
| Received vs. expected | Resulting status |
|---|---|
| Exactly equal | confirmed (payment links) / paid (invoices) |
| Less than expected | partial |
| More than expected | excess |
Outbound webhook payload
Kibble sends a signedPOST request to your webhook_url when an invoice reaches paid, partial, or excess status. The request body is JSON.
Headers
| Header | Value |
|---|---|
X-Kibble-Signature | sha256={hmac_hex} — HMAC-SHA256 signature of the raw request body |
Content-Type | application/json |
Payload fields
The event type. Currently always
"invoice.paid".The UUID of the invoice that was paid.
The human-readable invoice number (e.g.
"INV-0001").The invoice’s total expected amount in USDC (e.g.
"1500.00").The resulting payment status:
paid, partial, or excess.Example payload
Verifying the signature
Kibble signs each webhook request with thewebhook_secret returned when you created the invoice. Verify the X-Kibble-Signature header before processing any event.
Use the raw request body bytes — not a parsed object — when computing the HMAC. Parsing the JSON before verification will cause signature mismatches.