POST /api/v1/flights/pay_order
Pay a held order, issue tickets, and debit the agency balance. Requires Read+Write permission.
Pay for a held booking and issue the tickets. Charges the agency balance by pricing.b2bPrice.
Permission: Read+Write
The charge amount and currency are resolved server-side from the stored booking. Do not
send amount or currency — the endpoint rejects them.
Identifying the booking
| Field | Description |
|---|---|
order_id | Preferred. Supplier order ID returned when the hold was created. |
booking_id | FX-Port booking ID |
pnr | Airline record locator — not unique, prefer order_id |
payment_type | Optional. "balance" (default), "card", or "arc_bsp_cash" |
PNRs are not globally unique across suppliers/GDS/airlines. Prefer order_id to
unambiguously identify the booking you intend to pay for.
Payment cannot revive an expired hold. pay_order fails if the PNR has expired or was
cancelled, the payment deadline is in the past, or the airline released the hold early. Airlines
can expire a PNR before the expected date or time. Treat paymentSucceeded and
paymentDetails.status from this response as the source of truth; do not confirm the traveler or
charge them in your system until payment succeeds.
Request example
curl --request POST \
--url https://api.fx-port.com/api/v1/flights/pay_order \
--header 'Authorization: Bearer fxp_live_YOUR_KEY' \
--header 'Content-Type: application/json' \
--data '{
"order_id": "eJzTd9ePcDWJdHYCAAs9AlU",
"payment_type": "balance"
}'Response example
{
"environment": "sandbox",
"success": true,
"paymentSucceeded": true,
"requestId": "a1b2c3d4",
"orderId": "ord_0000B9UietU1vZwsABCD",
"supplierCurrency": "USD",
"agencyCurrency": "DZD",
"exchangeRate": 250.0,
"paymentDetails": {
"paymentId": null,
"status": "succeeded",
"type": "balance",
"paymentAmount": 11096.8,
"currency": "DZD",
"message": "Payment successful! Tickets have been issued."
},
"booking": {
"reference": "ord_0000B9UietU1vZwsABCD",
"status": "confirmed",
"pnr": "EDJP6K",
"type": "instant",
"createdAt": "2026-08-18T09:14:00Z",
"voidableUntil": null
},
"pricing": {
"supplierCurrency": "USD",
"agencyCurrency": "DZD",
"basePrice": 6170.0,
"taxesAndFees": 4926.8,
"agencyCommission": 11.1,
"finalPrice": 11107.9,
"b2bPrice": 11096.8,
"additionalServices": []
},
"bookingReferences": [
{
"pnr": "EDJP6K",
"carrier": {
"iataCode": "AF",
"name": "Air France"
}
}
],
"documents": [
{
"type": "electronic_ticket",
"documentType": "ETICKET",
"uniqueIdentifier": "057-1234567890",
"status": "ISSUED"
}
],
"meta": {
"supportHold": false,
"supportVoid": false,
"voidDeadline": null
},
"postProcessing": {
"bucketLink": null,
"emailSent": false
}
}Field meanings
| Field | Meaning |
|---|---|
paymentDetails.status | "succeeded", "pending", or "failed" — the single source of truth for payment outcome |
paymentDetails.paymentAmount | Amount actually debited from agency balance = pricing.b2bPrice |
paymentDetails.currency | The agency currency of the debit |
booking.voidableUntil | Void cutoff. Issued tickets can be voided until this UTC timestamp. |
pricing.b2bPrice | Debit amount = finalPrice − agencyCommission |
Supplier cost and commission internals (net fare, kiosk/system commission) are never returned. Only agency-facing amounts are exposed.