payout.quote_confirmed

The recipient confirmed a cross-currency FX quote.

Triggered when the recipient confirmed the FX exchange on a cross-currency quote and the exchange actually executed.

payout_type is always crypto.

🚧

Same-currency sends never emit this

When input and sending currency match there is no exchange to confirm, so GIFQ skips the provider call and suppresses this event. Do not block your state machine waiting for it.

If you need to know whether to expect it, gate on input_to_sending_rate != "1.0" from payout.quote_created.

Body

The crypto body. data is the send request as returned by the confirm call, passed through verbatim, and the same shape as payout.quote_created.

This event only fires on cross-currency sends, so two fields that may be absent elsewhere are reliably populated here.

FieldValue on this event
input_to_sending_rateThe locked rate. Never "1.0".
fees.conversion_feePresent, carrying the FX conversion fee.

Example

{
  "event": "payout.quote_confirmed",
  "payout_type": "crypto",
  "data": {
    "id": 354,
    "status": "in_progress",
    "purpose": "Gifq payout to [email protected]",
    "created_at": "2026-05-25T10:00:00.000Z",
    "input_amount": "100.0",
    "input_currency": {
      "id": 2, "kind": "fiat", "title": "Euro", "symbol": "EUR"
    },
    "sending_amount": "0.049422",
    "sending_currency": {
      "id": 5, "kind": "crypto", "title": "Ethereum", "symbol": "ETH"
    },
    "input_to_sending_rate": "0.00049422",
    "sending_to_balance_debit_rate": "40.3258",
    "balance_debit_amount": "0.00122557",
    "balance_debit_currency": {
      "id": 1, "kind": "crypto", "title": "Bitcoin", "symbol": "BTC"
    },
    "fees": {
      "service_fee": {
        "amount": "1.016086",
        "currency": { "id": 2, "kind": "fiat", "title": "Euro", "symbol": "EUR" }
      },
      "conversion_fee": {
        "amount": "0.5",
        "currency": { "id": 2, "kind": "fiat", "title": "Euro", "symbol": "EUR" }
      }
    },
    "blockchain_transactions": [],
    "requires_2fa_confirmation": false,
    "actions_required": null
  }
}

What to do on receipt

  • The exchange has settled and the rate is locked for data.id.
  • Nothing has moved on chain yet. Expect payout.in_progress or payout.processing next, then payout.completed.
  • If you display the rate to your users, this body carries the final one. The rate on quote_created was indicative.