FX-Port API
Flights

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

FieldDescription
order_idPreferred. Supplier order ID returned when the hold was created.
booking_idFX-Port booking ID
pnrAirline record locator — not unique, prefer order_id
payment_typeOptional. "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

FieldMeaning
paymentDetails.status"succeeded", "pending", or "failed" — the single source of truth for payment outcome
paymentDetails.paymentAmountAmount actually debited from agency balance = pricing.b2bPrice
paymentDetails.currencyThe agency currency of the debit
booking.voidableUntilVoid cutoff. Issued tickets can be voided until this UTC timestamp.
pricing.b2bPriceDebit amount = finalPrice − agencyCommission

Supplier cost and commission internals (net fare, kiosk/system commission) are never returned. Only agency-facing amounts are exposed.

On this page