When an invoice changes status, PawPayments POSTs an invoice snapshot (JSON) to the merchant’sDocumentation Index
Fetch the complete documentation index at: https://docs.pawpayments.com/llms.txt
Use this file to discover all available pages before exploring further.
notify_url (per-invoice override) or to the merchant-level
callback_url. Delivery is automatic and idempotent — every merchant
receives at most one webhook per terminal transition of each invoice.
Delivery guarantees
- Automatic. Fires on every status change of an invoice created via
POST /api/v2/invoices(and on auto-created invoices bound to permanent addresses). - Persistent retries. Delivery attempts run as a durable background job,
so they survive process restarts.
On 2xx → done. On 4xx (except
408/425/429) → give up immediately (merchant is presumed misconfigured). Otherwise the job is retried with exponential backoff: 30s, 1m, 2m, 5m, 10m, 20m, 40m, 80m, 160m — up to 10 attempts total (≈5h wall-clock). - URL safety. Each attempt DNS-resolves the callback and refuses to deliver if the host is private, loopback, link-local, or unresolvable. These refusals are logged as attempts too (with a human-readable reason).
- Audit log. Every delivery attempt is recorded: URL, status code,
response body (first 500 chars), attempt number, and timestamp. Inspect
via
GET /api/v2/notificationsor replay a specific invoice on demand viaPOST /api/v2/invoices/{id}/notify.
Headers
| Header | Purpose |
|---|---|
Content-Type: application/json | Body is a single JSON object. |
User-Agent: Mozilla/5.0 (compatible; PawWebhook/2.0; ...) | Identifies the sender. |
X-Paw-Signature | HMAC-SHA256 of the exact raw body keyed with the merchant’s API key (hex-encoded). |
Payload
The payload is the same invoice shape returned byGET /api/v2/invoices/{id}
(see the API Reference for the canonical schema). Authenticity is established
exclusively by the X-Paw-Signature header — there is no signature field
inside the JSON body.
Key fields for merchant processing:
| Field | Meaning |
|---|---|
order_id | Unique 24-char hex id of the invoice. |
external_id | Public checkout id (UUID) used in the hosted-checkout URL. |
status | One of created, confirming, partially_paid, paid_over, success, failed, high_risk, cancelled. |
billing_type | STATIC or VARY — see Billing types. |
asset / type | Crypto asset (usdt_tron, eth_eth, …) and native/token. |
amount / initial_amount | Requested crypto amount (immutable). |
fiat_amount / initial_fiat_amount | Cumulative paid fiat / originally requested fiat (STATIC partial-pay makes these differ). |
address_to / address_from | Deposit address and (when known) sender. |
received_amount / txid | Last on-chain payment details. |
expires_at | Unix timestamp when the invoice stops accepting deposits. |
processed_at | Unix timestamp of the terminal transition. |
metadata | Arbitrary key/value dict passed on invoice creation. |
success, paid_over, failed, high_risk,
cancelled) carries the authoritative payment state — treat it as the
source of truth and disregard any earlier confirming / partially_paid
deliveries for the same invoice.
Verification (Node.js)
Verification (PHP)
Replay and introspection
POST /api/v2/invoices/{id}/notify— re-fires the webhook for the invoice on demand (useful for recovery or local-dev testing).GET /api/v2/notifications— paginated audit log of every delivery attempt (successful, retrying, or given up).

