Skip to main content
Every webhook uses the envelope {"eventId": "...", "event": "...", "data": {...}}. This page describes data for each event. See Webhooks for registration, delivery and security.
Payloads list a stable public subset of fields. Additional fields may be present; ignore fields you don’t recognise. Monetary amounts are strings unless stated otherwise.

Supported events

Subscribe using these exact names (lowercase, case-sensitive). You can also fetch them from GET /v1/api/webhook/events.
There are no webhooks for payouts, conversions or on-ramp orders created through the API. Poll GET /v1/api/payout/{id}, GET /v1/api/conversions/{id} and GET /v1/api/onramp/{reference} instead.

Payment events

transaction_requested

Fires when a payment is initiated through initiate payment or initiate payment by currency. data matches the initiate response, with IDs as strings.

Payment status events

transaction_completed, transaction_overpayment, transaction_partially_paid and transaction_partial_fulfilled all carry the same payment object, which is also what validate payment returns.

transaction_completed

Fires once, when the amount received reaches the amount due. status is completed.

transaction_overpayment

Fires once, when the payer sends more than the amount due. status is overpayment. Compare amountReceived with amount to find the excess.

transaction_partially_paid

Fires when a payment receives less than the amount due. status is partial-payment. The payment is re-checked periodically, so this event may repeat while the payment stays partially paid, with updated amountReceived and balanceRequired. If the balance arrives, you’ll receive transaction_completed or transaction_overpayment.

transaction_partial_fulfilled

Fires once, when a partially paid payment is accepted as final and no further funds are expected. This happens automatically 24 hours after the payment became partially paid, or earlier if Tender accepts it at your request. status stays partial-payment; isFulfilled is true, and fulfilledAt and fulfilledBy (expiry, merchant or admin) are set.

Payment object fields

A transaction_partially_paid payload has the same shape, for example with "status": "partial-payment", "isPartialPayment": true, "amountReceived": "5" and "balanceRequired": "5.15".

transaction_cancelled

Fires when a pending payment is cancelled, for example with cancel payment. Cancelling an already-cancelled payment doesn’t send it again.

Subwallet events

sub_user_wallet_transaction_detected

Fires when a deposit to one of your subwallet addresses is detected on-chain, and again each time its confirmation count changes. Deduplicate on depositKey, and credit the deposit only once confirmed is true.

sub_user_wallet_transfer_confirmed

Fires once when an outgoing subwallet transfer is confirmed. On-chain transfer:
Gasless transfer:

sub_user_wallet_transfer_failed

Fires once when an outgoing gasless subwallet transfer ends in failure. The payload matches the gasless sub_user_wallet_transfer_confirmed payload, with "status": "failed". txHash is usually empty.

Off-ramp order events

offramp_order_completed, offramp_order_cancelled and offramp_order_failed are sent for off-ramp orders created in the Tender merchant dashboard (selling crypto to a bank account through Tender’s off-ramp partner). They aren’t sent for API payouts.

Reserved event names

GET /v1/api/webhook/events also returns transaction_reserved. It is reserved and not currently sent; subscribing to it has no effect.