Webhooks notify your server when events happen — user KYC status changes, card transactions, wallet deposits, and collateral updates.Documentation Index
Fetch the complete documentation index at: https://docs.getplu.com/llms.txt
Use this file to discover all available pages before exploring further.
Setup
Configure your webhook endpoint using the Set Webhook endpoint. You’ll receive awebhookSecret (prefixed whsec_) that you’ll use to verify webhook signatures.
Events
KYC Events
| Event | Status | Description |
|---|---|---|
user.kyc-event | approved | User KYC approved — user can now create cards |
user.kyc-event | denied | User KYC denied — includes reason with one or more denial codes |
user.kyc-event | needsVerification | Additional verification required — includes verificationLink |
Transaction Events
| Event | Type | Description |
|---|---|---|
card.transaction-event | debit | Card transaction approved |
card.transaction-event | debit (declined) | Card transaction declined — includes declinedReason |
card.transaction-event | cross-border | FX fee charged for non-USD merchant transactions |
card.transaction-event | credit (reversed) | Card transaction reversed |
Wallet Events
| Event | Description |
|---|---|
wallet.deposit.crypto | USDC deposit received and credited to your wallet balance |
wallet.deposit.card-withdrawal | Funds from a card withdrawal (or liquidation) landed in your partner wallet. data.reference echoes the value passed on POST /partner/card/withdraw. |
wallet.withdrawal.crypto | Withdrawal request reached a terminal state — data.status is completed, cancelled, or rejected |
Card Events
| Event | Description |
|---|---|
card.deposit.crypto | USDC deposit received and credited to a crypto card’s balance |
Payload Format
All webhooks are delivered asPOST requests with a JSON body.
KYC Webhook
Approved
Denied
Needs Verification
Transaction Webhooks
Successful debit (USD merchant)cross-border FX fee webhook.
FX Fee (follows the debit)
The FX fee transaction ID is the original transaction ID with
_fx appended. Use this to correlate the fee with its parent transaction.| Field | Type | Description |
|---|---|---|
serviceCardId | string | The card that received the reversal credit |
serviceTransactionId | string | Original transaction ID with _rev appended |
amount | number | USD amount credited back to the card |
fxFee | number | Always 0 for reversals |
status | string | Always reversed |
type | string | Always credit (funds returned to the card) |
description | string | Original merchant name |
The reversal transaction ID is the original transaction ID with
_rev appended. Use this to correlate the reversal with the original debit. If the original transaction had an FX fee, only the debit is reversed — the FX fee is not refunded.Crypto Deposit Webhook
Sent when a USDC transfer to your deposit address is confirmed and credited to your wallet balance.| Field | Type | Description |
|---|---|---|
partnerId | string | Your partner service ID |
amount | number | USD amount credited to your wallet |
txHash | string | On-chain transaction hash — use this to verify on a block explorer |
chain | string | Blockchain network (base in production, base-sepolia in staging) |
token | string | Token received (currently always usdc) |
fromAddress | string | Sender’s wallet address |
toAddress | string | Your deposit address that received the funds |
Your wallet balance is credited automatically when the deposit is confirmed on-chain. You can check your updated balance via the Get Balance endpoint.
Card Withdrawal Wallet Credit Webhook
Sent when a card withdrawal (POST /partner/card/withdraw) or full card liquidation (DELETE /partner/card/terminate/:serviceCardId) credits funds back to your partner wallet. Use data.reference to match the credit to the originating user transaction on your side.
Withdrawal
Liquidation
| Field | Type | Description |
|---|---|---|
partnerId | string | Your partner service ID |
serviceCardId | string | The card the funds were withdrawn from |
serviceTransactionId | string | The card transaction ID — also returned synchronously from the withdraw call |
amount | number | Gross amount withdrawn from the card (USD) |
fee | number | Withdrawal fee charged by Bitmama |
netAmount | number | Amount actually credited to your partner wallet (amount - fee) |
currency | string | Always USD |
source | string | undefined | Present and equal to "liquidation" only when the credit came from a card termination; absent for normal withdrawals |
reference | string | undefined | Echoes the reference you passed on the withdraw/terminate request. Required on /withdraw, optional on /terminate |
This event also fires for partner card liquidations when the terminated card has a positive balance. Use the
source field to distinguish liquidations from regular withdrawals.Crypto Withdrawal Webhook
Sent when a withdrawal request reaches a terminal state. Thedata.status field tells you which:
completed— USDC was sent on-chain. IncludestxHashandexplorerUrl.cancelled— You cancelled the request via Cancel Withdrawal. Wallet was refunded.rejected— An admin rejected the request. Wallet was refunded.reasonmay be present.
Completed
Cancelled
Rejected
| Field | Type | Description |
|---|---|---|
withdrawalId | string | The withdrawal record id |
amount | number | Total USD amount debited from your wallet |
fee | number | Flat fee deducted ($0.50) |
netAmount | number | USDC actually sent on-chain (only meaningful for completed) |
toAddress | string | Destination address provided in the request |
chain | string | Always base |
token | string | Always usdc |
status | string | One of completed, cancelled, rejected |
txHash | string | On-chain transaction hash. Present only for completed |
explorerUrl | string | Basescan link. Present only for completed |
reason | string | Admin reason. May be present for rejected |
Pre-terminal transitions (
pending → approved) do not fire webhooks. You only receive a webhook when the withdrawal reaches a terminal state.Card Crypto Deposit Webhook
Sent when a USDC transfer to a crypto card’s deposit address is confirmed and credited to the card’s balance.| Field | Type | Description |
|---|---|---|
serviceCardId | string | The card that received the deposit |
partnerId | string | Your partner service ID |
amount | number | USD amount credited to the card |
txHash | string | On-chain transaction hash |
chain | string | Blockchain network (base in production, base-sepolia in staging) |
token | string | Token received (currently always usdc) |
fromAddress | string | Sender’s wallet address |
toAddress | string | Card’s deposit address that received the funds |
Signature Verification
Every webhook includes anX-Webhook-Signature header containing an HMAC-SHA256 hex digest. Always verify this signature before processing the webhook.
Retry Policy
If your endpoint doesn’t respond with a2xx status code, the webhook is automatically retried with exponential backoff:
| Attempt | Delay after failure | Cumulative wait |
|---|---|---|
| 1st retry | 1 minute | ~1 min |
| 2nd retry | 5 minutes | ~6 min |
| 3rd retry | 15 minutes | ~21 min |
| 4th retry | 1 hour | ~81 min |
Retries are processed automatically every 30 seconds. If your endpoint comes back online within the retry window, pending webhooks will be delivered on the next retry cycle without any manual intervention.