payout.terminal_state

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_hash may arrive on a follow-up event

If a send is completed but the on-chain transaction has not yet confirmed at dispatch time, tx_hash is omitted. A second payout.terminal_state for the same external_send_id may follow once the hash lands — treat the later event as authoritative for tx_hash.

Envelope

Carries the standard event envelope. Payout identifiers: payout_order_uuid, recipient_email, external_send_id (see Payout events → Identifiers).

Event-specific fields

FieldTypeValue
tx_hashString (optional)Present when status == "completed" and the on-chain confirmation has landed.
failure_reasonString (optional)Present when status == "failed".
dataHashFull 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, if tx_hash is absent, wait for a follow-up payout.terminal_state carrying 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_id after a terminal event.