Triggered when the underlying send has reached a terminal status (completed, failed, expired, or canceled). You receive at most one payout.terminal_state per external_send_id.
tx_hashmay arrive on a follow-up eventIf a send is
completedbut the on-chain transaction has not yet confirmed at dispatch time,tx_hashis omitted. A secondpayout.terminal_statefor the sameexternal_send_idmay follow once the hash lands ā treat the later event as authoritative fortx_hash.
Envelope
Carries the standard event envelope. Payout identifiers: payout_order_uuid, recipient_email, external_send_id (see Payout events ā Identifiers).
Event-specific fields
| Field | Type | Value |
|---|---|---|
tx_hash | String (optional) | Present when status == "completed" and the on-chain confirmation has landed. |
failure_reason | String (optional) | Present when status == "failed". |
data | Hash | Full send-request snapshot. See Payout events ā data shape. |
Examples
Completed:
{
"event": "payout.terminal_state",
"status": "completed",
"occurred_at": "2026-05-25T10:04:17Z",
"recipient_email": "[email protected]",
"external_send_id": "123456",
"payout_order_uuid": "11111111-2222-3333-4444-555555555555",
"tx_hash": "0x1111111111111111111111111111111111111111111111111111111111111111",
"data": {
"id": 123456,
"status": "completed",
"purpose": "Gifq payout to [email protected]",
"created_at": "2026-05-25T10:00:00.000Z",
"input_amount": "100.00",
"input_currency": {
"id": 33,
"kind": "crypto",
"title": "USDC",
"symbol": "USDC",
"enabled": true,
"disabled_message": null
},
"sending_amount": "100.00",
"sending_currency": {
"id": 33,
"kind": "crypto",
"title": "USDC",
"symbol": "USDC",
"enabled": true,
"disabled_message": null
},
"input_to_sending_rate": "1.0",
"balance_debit_amount": "0.047778",
"balance_debit_currency": {
"id": 5,
"kind": "crypto",
"title": "Ethereum",
"symbol": "ETH",
"enabled": true,
"disabled_message": null
},
"sending_to_balance_debit_rate": "2092.89",
"fees": {
"service_fee": {
"amount": "0.00056141",
"currency": {
"id": 5,
"kind": "crypto",
"title": "Ethereum",
"symbol": "ETH",
"enabled": true,
"disabled_message": null
}
},
"conversion_fee": {
"amount": "0.000478",
"currency": {
"id": 5,
"kind": "crypto",
"title": "Ethereum",
"symbol": "ETH",
"enabled": true,
"disabled_message": null
}
}
},
"blockchain_transactions": [
{
"id": 7000001,
"txid": "0x1111111111111111111111111111111111111111111111111111111111111111",
"amount": "100.00",
"status": "confirmed",
"network_confirmations": 1,
"currency": {
"id": 33,
"title": "USDC",
"symbol": "USDC",
"platform": {
"id": 21,
"title": "Solana"
}
}
}
],
"requires_2fa_confirmation": false
}
}Failed:
{
"event": "payout.terminal_state",
"status": "failed",
"occurred_at": "2026-05-25T10:04:17Z",
"recipient_email": "[email protected]",
"external_send_id": "123456",
"payout_order_uuid": "11111111-2222-3333-4444-555555555555",
"failure_reason": "insufficient_funds"
}What to do on receipt
- Treat this as the authoritative, final outcome for the
external_send_id. - On
completed, iftx_hashis absent, wait for a follow-uppayout.terminal_statecarrying the hash before marking funds confirmed on chain. - For the source of truth on a payout, cross-check via the GIFQ API rather than relying on the webhook body alone.
- No further events fire for this
external_send_idafter a terminal event.