Merchant API

Checkout Deposits Webhook

Real-time webhook notifications sent when deposits are completed via KingPay's hosted deposit solution. These webhooks notify you when a customer has successfully made a deposit to your deposit link and you should credit their account.

Delivery & security

  • Webhooks are sent to the callback_url configured for the invoice (or project), with all your original query parameters preserved.
  • HTTP method: GET by default, POST when the invoice was created with post=1.
  • Content type: application/x-www-form-urlencoded by default, application/json when the invoice was created with json=1.
  • Webhooks are signed using HMAC-SHA256 with your project’s ipn_secret. Always verify the signature before trusting the payload.

Signature headers

  • X-CryptAPI-Signature — hex-encoded HMAC of the canonical JSON payload and timestamp.
  • X-CryptAPI-Signature-Alg — currently always HMAC-SHA256.
  • X-CryptAPI-Signature-Timestamp — Unix timestamp (seconds) used in the HMAC computation.

Sent for invoices with type = "deposit" whenever a reusable deposit link receives a payment. Each transaction to the deposit address generates its own webhook event.

Payload example
{
  "payment_id": "de2d1c9f4a3b8e7d1f2a9c3b4e6f8a1",
  "payment_url": "https://pay.yourdomain.com/deposit/de2d1c9f4a3b8e7d1f2a9c3b4e6f8a1",
  "txid": "0xabc...",
  "address": "0x18B211A1Ba5880C7d62C250B6441C2400d588589",
  "currency": "usd",
  "paid_amount": "100.00000000",
  "received_amount": "100.00000000",
  "paid_amount_fiat": "100.00",
  "received_amount_fiat": "100.00",
  "paid_coin": "bep20_usdt",
  "exchange_rate": 1.0,
  "type": "deposit",
  "status": "done",
  "payment_status": "completed",
  "invoice_status": "paid",
  "confirmations": 1,
  "required_confirmations": 1,
  "external_id": "12345",
  "customer_name": "John Doe",
  "customer_email": "[email protected]",
}

Key fields

  • payment_id — unique identifier for this deposit payment.
  • payment_url — hosted deposit page URL.
  • txid — transaction hash of your client's deposit.
  • address — deposit address that received the funds.
  • currency — fiat currency code.
  • paid_amount / paid_amount_fiat — incoming crypto in paid_coin / fiat in currency, before fees. Decimal strings in ordinary currency units; fiat can be null and falls back to the requested invoice amount, if available, when its stored valuation is missing.
  • received_amount / received_amount_fiat — distributed crypto / fiat equivalent after fees, as decimal strings, only at completed. Fiat falls back to incoming fiat when its net valuation is missing and can be null. No multiplication by 100; these webhooks do not contain value.
  • paid_coin — crypto used for the deposit.
  • exchange_rate — Exchange rate at the time of the payment.
  • type — always "deposit" for this webhook type.
  • status — "done" when the deposit is completed.
  • external_id — your payment identifier (External ID from params).