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 thisWhen 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"frompayout.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.
| Field | Value on this event |
|---|---|
input_to_sending_rate | The locked rate. Never "1.0". |
fees.conversion_fee | Present, 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_progressorpayout.processingnext, thenpayout.completed. - If you display the rate to your users, this body carries the final one. The rate on
quote_createdwas indicative.