Skip to content
FX-Port/Docs
GuidesAPI referenceChangelog
Get API keys
  • Overview
  • Error object

Search and price

  • Search flightsPOST
  • Flexible datesPOST
  • Price an offerPOST
  • Airport autocompleteGET
  • Most searched airportsGET

Book, pay and cancel

  • Book an offerPOST
  • Quote a held orderPOST
  • Pay a held orderPOST
  • Cancel a held orderPOST

After booking

  • Get a bookingPOST
  • Ticket PDFPOST
  • Ticket numberPOST
  • Quote a refundPOST
  • Confirm a cancellationPOST

ACD documents

  • Get the document statePOST
  • Upload passportsPOST

Objects

  • Flight offer
  • Flight booking

Flights ยท Book, pay and cancel

Pay a held order and issue the tickets

Pay for a held booking and issue the tickets.

POST/api/v1/flights/pay_order

Requires an API key with Read+Write permission: a Read key is refused with read_write_permission_required.

The agency balance is debited by pricing.b2bPrice; in the sandbox no money moves.

The amount and the currency come from the stored booking: do not send currency (400 bad_request); an amount is ignored. Send one of order_id (the supplier's order id, preferred), booking_id and pnr. payment_type is balance (default), card or arc_bsp_cash; only Duffel reads it, Amadeus Algeria pays from the balance whatever you send. A Duffel order that was bought instantly cannot be paid later.

A refusal of the supplier is HTTP 200 with success: false and paymentSucceeded: false: the status alone is not enough, read both. error.code is a number as text for Amadeus (4926: the order is already issued; 9112: the reservation is cancelled or expired) and a name for Duffel. Do not retry a payment blindly: read the booking with get_booking first. A second pay_order for an order that is paid answers 4926, which is harmless. The exception is 503 balance_lock_timeout (live only): another operation of your agency held the balance for a moment, the payment never started, and the same request can be sent again after a few seconds.

curl https://api.fx-port.com/api/v1/flights/pay_order \
  -H "Authorization: Bearer fxp_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "order_id": "eJzTd9ePNA9wdA0FAAs8AmE",
  "payment_type": "balance"
}'
Response200
{
  "environment": "sandbox",
  "success": true,
  "paymentSucceeded": true,
  "requestId": "1ad06b56",
  "orderId": "eJzTd9ePNA9wdA0FAAs8AmE",
  "processingTime": 2.981,
  "paymentDetails": {
    "paymentId": null,
    "status": "succeeded",
    "type": "issuance",
    "paymentAmount": 4925.44,
    "currency": "DZD",
    "createdAt": "2026-11-01T15:26:21.896668",
    "message": "Payment successful! Tickets have been issued."
  },
  "booking": {
    "reference": "eJzTd9ePNA9wdA0FAAs8AmE",
    "status": "confirmed",
    "pnr": "Y7PAEU",
    "type": "instant",
    "createdAt": "2026-11-01T15:26:21.896668",
    "cancelledAt": null,
    "content": "managed",
    "syncedAt": "2026-11-01T15:26:21.896668",
    "availableActions": [],
    "voidableUntil": "2026-11-01T23:00:00Z",
    "cancellation": null
  },
  "supplier": {
    "id": "amadeus_aqc_dz_1",
    "technology": "amadeus_aqc",
    "name": "Amadeus AQC",
    "offerId": "1"
  },
  "agency": {
    "currency": "DZD"
  },
  "pricing": {
    "supplierCurrency": "DZD",
    "agencyCurrency": "DZD",
    "basePrice": 3160,
    "taxesAndFees": 1765.44,
    "agencyCommission": 4.93,
    "finalPrice": 4930.37,
    "b2bPrice": 4925.44,
    "additionalServices": [],
    "acd": {
      "applied": false
    }
  },
  "payment": {
    "status": "paid",
    "paidAt": "2026-11-01T15:26:21.896710",
    "paymentRequiredBy": null,
    "priceGuaranteeExpiresAt": null,
    "awaitingPayment": false
  },
  "documents": [
    {
      "type": "electronic_ticket",
      "documentType": "ETICKET",
      "uniqueIdentifier": "124-2446977397",
      "status": "ISSUED",
      "passengerIds": [
        "1"
      ],
      "segmentIds": [
        "1"
      ]
    }
  ],
  "bookingReferences": [
    {
      "pnr": "Y7PAEU",
      "carrier": {
        "iataCode": "AH",
        "name": "Air Algerie",
        "logoUrl": "https://assets.duffel.com/img/airlines/for-light-background/full-color-logo/AH.svg",
        "logoLockupUrl": "https://assets.duffel.com/img/airlines/for-light-background/full-color-lockup/AH.svg"
      }
    }
  ],
  "passengers": [
    {
      "id": "1",
      "type": "ADULT",
      "title": "mr",
      "givenName": "JAMES",
      "familyName": "SMITH",
      "gender": "male",
      "bornOn": "1988-06-15",
      "email": "[email protected]",
      "phoneNumber": "15555550123",
      "infantPassengerId": null,
      "loyaltyProgrammeAccounts": [],
      "ticketNumber": "124-2446977397"
    }
  ],
  "travelerPricing": [
    {
      "travelerId": "1",
      "travelerType": "ADULT",
      "fareOption": "STANDARD",
      "price": {
        "supplierCurrency": "DZD",
        "agencyCurrency": "DZD",
        "base": 3160,
        "total": 4930.37,
        "b2bPrice": 4925.44
      },
      "fareDetailsBySegment": [
        {
          "segmentId": "1",
          "cabin": "ECONOMY",
          "fareBasis": "Y",
          "brandedFare": "STANDARD",
          "brandedFareLabel": "STANDARD",
          "bookingClass": "Y",
          "includedCheckedBags": {
            "quantity": 1
          },
          "includedCabinBags": {
            "quantity": 1
          },
          "amenities": []
        }
      ]
    }
  ],
  "itinerary": [
    {
      "direction": "outbound",
      "duration": "PT1H",
      "stops": 0,
      "fareBrandName": "",
      "origin": {
        "airportCode": "ALG",
        "airportName": "Houari Boumediene Airport",
        "cityName": "Algiers",
        "countryCode": "DZ",
        "timeZone": "Africa/Algiers"
      },
      "destination": {
        "airportCode": "ORN",
        "airportName": "Oran International Airport",
        "cityName": "Oran",
        "countryCode": "DZ",
        "timeZone": "Africa/Algiers"
      },
      "segments": [
        {
          "id": "1",
          "departure": {
            "airportCode": "ALG",
            "airportName": "Houari Boumediene Airport",
            "cityName": "Algiers",
            "countryCode": "DZ",
            "terminal": "1",
            "datetime": "2026-12-22T19:45:00",
            "timeZone": "Africa/Algiers"
          },
          "arrival": {
            "airportCode": "ORN",
            "airportName": "Oran International Airport",
            "cityName": "Oran",
            "countryCode": "DZ",
            "terminal": null,
            "datetime": "2026-12-22T20:45:00",
            "timeZone": "Africa/Algiers"
          },
          "flight": {
            "carrierCode": "AH",
            "carrierName": "Air Algerie",
            "carrierLogoUrl": "https://assets.duffel.com/img/airlines/for-light-background/full-color-logo/AH.svg",
            "flightNumber": "6106",
            "aircraftCode": "73H",
            "aircraftName": null,
            "operatingCarrier": "AH",
            "operatingCarrierName": "Air Algerie",
            "operatingFlightNumber": "6106"
          },
          "duration": "PT1H",
          "distance": null,
          "stops": [],
          "cabin": "ECONOMY",
          "cabinMarketingName": "Economy",
          "fareBasis": "Y",
          "brandedFare": "",
          "brandedFareLabel": "",
          "passengerDetails": [
            {
              "passengerId": "1",
              "cabin": "ECONOMY",
              "cabinMarketingName": "Economy",
              "seat": null,
              "checkedBags": {
                "quantity": 1
              },
              "cabinBags": {
                "quantity": 1
              }
            }
          ]
        }
      ],
      "conditions": {
        "changeBeforeDeparture": {
          "allowed": true
        }
      }
    }
  ],
  "conditions": {
    "refundBeforeDeparture": {
      "allowed": true
    },
    "changeBeforeDeparture": {
      "allowed": true
    }
  },
  "owner": {
    "id": null,
    "iataCode": "AH",
    "name": "Air Algerie",
    "logoUrl": "https://assets.duffel.com/img/airlines/for-light-background/full-color-logo/AH.svg",
    "logoLockupUrl": "https://assets.duffel.com/img/airlines/for-light-background/full-color-lockup/AH.svg",
    "conditionsOfCarriageUrl": null
  },
  "services": [],
  "internalBooking": {
    "bookingId": "Y7PAEU",
    "internalId": "711371c3-00aa-4be2-b790-9f0ca2ccfdb7"
  },
  "fareRules": {
    "refund": {
      "allowed": true
    },
    "exchange": {
      "allowed": true
    },
    "agencyCurrency": "DZD"
  },
  "meta": {
    "paymentStatus": "succeeded",
    "orderConfirmed": true,
    "supportHold": true,
    "supportVoid": true,
    "voidDeadline": "2026-11-01T23:00:00Z",
    "voidWindowEndsAt": null,
    "airlineInitiatedChanges": [],
    "changes": [],
    "users": [],
    "orderMetadata": null
  },
  "postProcessing": {
    "bucketLink": null,
    "emailSent": false
  }
}
Response200
{
  "environment": "sandbox",
  "paymentSucceeded": false,
  "requestId": "a63285ae",
  "orderId": "eJzTd9ePNPfw9vIFAAs8AmA",
  "processingTime": 0.799,
  "error": {
    "message": "The flightOrder is already issued",
    "code": "4926",
    "type": "INVALID DATA RECEIVED",
    "details": [
      {
        "status": 400,
        "code": 4926,
        "title": "INVALID DATA RECEIVED",
        "detail": "The flightOrder is already issued"
      }
    ]
  },
  "supplier": {
    "id": "amadeus_aqc_dz_1",
    "technology": "amadeus_aqc",
    "name": "Amadeus AQC"
  },
  "agency": {
    "currency": "DZD"
  },
  "meta": {
    "supportHold": true,
    "supportVoid": true,
    "voidDeadline": "2026-11-01T23:00:00Z",
    "supplierStatusCode": 400,
    "request_id": "a63285ae",
    "status": 200
  },
  "success": false,
  "errors": [
    {
      "code": "4926",
      "type": "supplier_error",
      "title": "Invalid data received",
      "message": "The flightOrder is already issued",
      "field": null,
      "details": {
        "supplier_type": "INVALID DATA RECEIVED",
        "supplier_details": [
          {
            "status": 400,
            "code": 4926,
            "title": "INVALID DATA RECEIVED",
            "detail": "The flightOrder is already issued"
          }
        ]
      },
      "documentation_url": "https://fx-port.com/docs/errors#4926"
    }
  ],
  "request_id": "a63285ae"
}

Request

Body

Required, JSON.

order_idstring

The supplier's order id (booking.reference of the booking response). Preferred.

booking_idstring

The PNR of the booking.

pnrstring

The airline record locator.

payment_typestring

Only Duffel reads it; Amadeus Algeria and Travelport pay from the balance whatever you send. Default balance.

One of balance, card, arc_bsp_cash. Default balance.

three_d_secure_session_idstring

For a Duffel card payment that needs 3-D Secure.

price_guaranteedboolean

Default true: pay the price of the hold. Leave it out.

supplier_idstring

Only used when the booking has no supplier of its own.

agency_idstring

Not needed: the agency of a call is always the one of your API key. The field is accepted so that older clients keep working, and it is ignored.

orderIdstringdeprecated

Legacy name, still accepted. Use order_id instead.

The previous spelling of order_id: The supplier's order id (booking.reference of the booking response).

bookingIdstringdeprecated

Legacy name, still accepted. Use booking_id instead.

The previous spelling of booking_id: The PNR of the booking.

paymentTypestringdeprecated

Legacy name, still accepted. Use payment_type instead.

The previous spelling of payment_type: Only Duffel reads it; Amadeus Algeria and Travelport pay from the balance whatever you send.

threeDSecureSessionIdstringdeprecated

Legacy name, still accepted. Use three_d_secure_session_id instead.

The previous spelling of three_d_secure_session_id: For a Duffel card payment that needs 3-D Secure.

priceGuaranteedbooleandeprecated

Legacy name, still accepted. Use price_guaranteed instead.

The previous spelling of price_guaranteed: Default true: pay the price of the hold.

supplierIdstringdeprecated

Legacy name, still accepted. Use supplier_id instead.

The previous spelling of supplier_id: Only used when the booking has no supplier of its own.

agencyIdstringdeprecated

Legacy name, still accepted. Use agency_id instead.

The previous spelling of agency_id: Not needed: the agency of a call is always the one of your API key.

Response

200The paid order. success: false with paymentSucceeded: false and error when the supplier refused the payment.

environmentstring

The environment of the key that made the call: sandbox for fxp_test_ keys, live for fxp_live_ keys. Present in every JSON body.

One of sandbox, live.

request_idstring

The id of the request, also in the X-Request-Id header.

warningsarray of object

Present only when the request used a previous spelling of a field or something the endpoint ignored.

ShowHide 5 attributes
codestring

What the warning is about.

One of deprecated_field, ignored_field, coerced_value, deprecated_value, deprecated_endpoint.

fieldstring

The request field the warning is about.

replacementstring

The name to use instead, for deprecated_* warnings.

messagestring

A sentence that says what happened and what to do.

documentation_urlstring

Where the naming rules are explained.

successboolean

true when the order was created (booking) or paid (payment).

requestIdstringdeprecated

Legacy name, still accepted. Use request_id instead.

The id of this request, 8 characters, for support.

paymentSucceededboolean

pay_order only: whether the payment succeeded. Read it together with success.

searchIdstringdeprecated

Legacy name, still accepted. Use search_id instead.

book_flight only: the search_id you sent.

search_idstring

book_flight only: the search_id you sent. The snake_case twin of searchId, with the same value: use this name.

offerIdstringdeprecated

Legacy name, still accepted. Use offer_id instead.

book_flight only: the offer_id you sent.

offer_idstring

book_flight only: the offer_id you sent. The snake_case twin of offerId, with the same value: use this name.

orderIdstringdeprecated

Legacy name, still accepted. Use order_id instead.

pay_order only: the supplier's order id.

order_idstring

pay_order only: the supplier's order id. The snake_case twin of orderId, with the same value: use this name.

processingTimenumberdeprecated

Legacy name, still accepted. Use processing_time instead.

Seconds spent.

processing_timenumber

Seconds spent. The snake_case twin of processingTime, with the same value: use this name.

paymentDetailsobject

pay_order only: paymentId, status, type (issuance), paymentAmount, currency, createdAt, message.

bookingobject

The order as the supplier knows it.

ShowHide 12 attributes
referencestringdeprecated

Legacy name, still accepted. Use order_id instead.

The supplier's order id (ord_... for Duffel, a base64-like text for Amadeus; for a cancelled hold of Amadeus Algeria the PNR). Send it as order_id to pay_order, cancel_order and cancel_quote.

order_idstring

The supplier's order id (ord_... for Duffel, a base64-like text for Amadeus; for a cancelled hold of Amadeus Algeria the PNR). Send it as order_id to pay_order, cancel_order and cancel_quote. The snake_case twin of reference, with the same value: use this name.

statusstring

confirmed, pending (a hold that is not paid yet), awaiting_payment, cancelled, failed or partial_refund.

pnrstring

The airline record locator. Not unique across suppliers and airlines.

typestring

instant: ticketed at once. hold: reserved, not paid.

One of instant, hold.

createdAtstring

When the order was created.

cancelledAtstringnullable

When the order was cancelled.

contentstring

Who manages the order: managed.

syncedAtstring

When FX-Port last synchronised the order with the supplier.

availableActionsarray of string

What can still be done with the order.

voidableUntilstringnullable

ISO 8601 UTC end of the same-day void window.

cancellationobjectnullable

How the order was cancelled: type, deleted, deletedAt.

supplierobject

The supplier of the order.

ShowHide 7 attributes
idstringdeprecated

Legacy name, still accepted. Use supplier_id instead.

Id of the supplier.

supplier_idstring

Id of the supplier. The snake_case twin of id, with the same value: use this name.

technologystring

The technology of the supplier: amadeus_aqc or duffel.

namestringdeprecated

Legacy name, still accepted. Use supplier_name instead.

Name of the supplier.

supplier_namestring

Name of the supplier. The snake_case twin of name, with the same value: use this name.

offerIdstringnullabledeprecated

Legacy name, still accepted. Use supplier_offer_id instead.

The supplier's own id of the offer.

supplier_offer_idstringnullable

The supplier's own id of the offer. The snake_case twin of offerId, with the same value: use this name.

agencyobject

Your agency. The id of the agency is not returned: you know it.

ShowHide 1 attribute
currencystring

ISO 4217 currency of your agency. Every amount of the response is in it.

pricingobject

The agency-facing price of an offer, a booking or a quote. Every amount is in agencyCurrency; the rate, when the currencies differ, is exchangeRate at the top level of the response.

ShowHide 17 attributes
supplierCurrencystring

ISO 4217 currency in which the supplier prices the fare.

agencyCurrencystring

ISO 4217 currency of your agency. Every amount of the block is in it.

basePricenumberdeprecated

Legacy name, still accepted. Use base_price instead.

The airline's base fare, before taxes, in the agency currency.

base_pricenumber

The airline's base fare, before taxes, in the agency currency. The snake_case twin of basePrice, with the same value: use this name.

taxesAndFeesnumberdeprecated

Legacy name, still accepted. Use taxes_and_fees instead.

Taxes plus the platform's fees, folded together. Excludes your agency commission.

taxes_and_feesnumber

Taxes plus the platform's fees, folded together. Excludes your agency commission. The snake_case twin of taxesAndFees, with the same value: use this name.

agencyCommissionnumberdeprecated

Legacy name, still accepted. Use agency_commission instead.

The commission of your agency on this sale.

agency_commissionnumber

The commission of your agency on this sale. The snake_case twin of agencyCommission, with the same value: use this name.

finalPricenumberdeprecated

Legacy name, still accepted. Use final_price instead.

What the traveler pays: basePrice + taxesAndFees + agencyCommission.

final_pricenumber

What the traveler pays: basePrice + taxesAndFees + agencyCommission. The snake_case twin of finalPrice, with the same value: use this name.

b2bPricenumberdeprecated

Legacy name, still accepted. Use b2b_price instead.

The amount debited from your agency balance: finalPrice - agencyCommission.

b2b_pricenumber

The amount debited from your agency balance: finalPrice - agencyCommission. The snake_case twin of b2bPrice, with the same value: use this name.

totalAmountnumber

Order quote only: an alias of b2bPrice.

taxAmountnumber

Order quote of a Duffel order only: the airline's taxes in your agency currency.

originalTaxAmountnumber

Order quote of a Duffel order only: the same taxes in the supplier currency.

additionalServicesarray of object

Paid extras. A list in the offers of a search (empty for most offers).

acdobject

Whether the fare is an ACD fare. Present on the offers of Amadeus Algeria, absent on Duffel offers. An ACD fare carries more keys with the amounts of the adjustment: they are informational, can change without notice and are not part of the contract.

ShowHide 4 attributes
appliedboolean

true for an ACD fare: the booking needs one passport copy for every traveler, sent with upload_acd_documents. false for an ordinary fare.

scenariostring

Only on an ACD fare: the rule that adjusted the price. Informational.

One of A, B.

exemptboolean

true when the search named an ACD-exempt company of your agency: the fare is priced without ACD.

reasonstring

Only on some ACD fares: why the rule applied. Informational; the wording can change.

requiresACDboolean

Present only when true: the booking needs one passport copy for every traveler: see upload_acd_documents.

paymentobject

The payment state of the order.

ShowHide 5 attributes
statusstring

awaiting_payment for a hold, paid once ticketed.

paidAtstringnullable

When the order was paid.

paymentRequiredBystringnullable

The payment deadline of a hold, when the supplier gives one.

priceGuaranteeExpiresAtstringnullable

Until when the price is guaranteed.

awaitingPaymentboolean

true for a hold that still has to be paid.

documentsarray of object

The e-tickets. Empty for a hold.

ShowHide 6 attributes
typestring

electronic_ticket.

uniqueIdentifierstring

The ticket number (Duffel sandbox: the text 1).

passengerIdsarray of string

The passengers the document is for.

documentTypestring

ETICKET.

statusstring

ISSUED.

segmentIdsarray of string

The segments the document covers.

bookingReferencesarray of object

The record locators.

ShowHide 2 attributes
pnrstring

The airline record locator.

carrierobject

The airline that issued the record locator.

ShowHide 4 attributes
iataCodestring

IATA code of the airline.

namestring

Name of the airline.

logoUrlstring

Address of the logo.

logoLockupUrlstringnullable

Address of the wide logo.

passengersarray of object

The passengers.

ShowHide 18 attributes
idstringdeprecated

Legacy name, still accepted. Use passenger_id instead.

Id of the passenger on the order: "1" (Amadeus) or pas_... (Duffel).

passenger_idstring

Id of the passenger on the order: "1" (Amadeus) or pas_... (Duffel). The snake_case twin of id, with the same value: use this name.

typestringdeprecated

Legacy name, still accepted. Use passenger_type instead.

ADULT, CHILD, INFANT_WITHOUT_SEAT ... as the supplier writes it.

passenger_typestring

ADULT, CHILD, INFANT_WITHOUT_SEAT ... as the supplier writes it. The snake_case twin of type, with the same value: use this name.

titlestring

mr, mrs ... derived from the gender.

givenNamestringdeprecated

Legacy name, still accepted. Use first_name instead.

Given name, as stored (Amadeus writes it in upper case).

first_namestring

Given name, as stored (Amadeus writes it in upper case). The snake_case twin of givenName, with the same value: use this name.

familyNamestringdeprecated

Legacy name, still accepted. Use last_name instead.

Family name, as stored.

last_namestring

Family name, as stored. The snake_case twin of familyName, with the same value: use this name.

genderstring

male or female.

bornOnstringdeprecated

Legacy name, still accepted. Use date_of_birth instead.

Date of birth, YYYY-MM-DD.

date_of_birthstring

Date of birth, YYYY-MM-DD. The snake_case twin of bornOn, with the same value: use this name.

emailstring

The e-mail of the contact.

phoneNumberstringdeprecated

Legacy name, still accepted. Use phone_number instead.

The phone number of the contact.

phone_numberstring

The phone number of the contact. The snake_case twin of phoneNumber, with the same value: use this name.

infantPassengerIdstringnullable

The id of the lap infant this adult carries.

loyaltyProgrammeAccountsarray of object

Frequent-flyer accounts.

ticketNumberstringnullable

The ticket number of this passenger. null until the airline returns it.

travelerPricingarray of object

The price of each traveler.

ShowHide 7 attributes
travelerIdstringdeprecated

Legacy name, still accepted. Use passenger_id instead.

"1", "2" ... for Amadeus, pas_... for Duffel.

passenger_idstring

"1", "2" ... for Amadeus, pas_... for Duffel. The snake_case twin of travelerId, with the same value: use this name.

travelerTypestringdeprecated

Legacy name, still accepted. Use passenger_type instead.

ADULT, SENIOR, YOUNG, CHILD, SEATED_INFANT or HELD_INFANT (a lap infant).

passenger_typestring

ADULT, SENIOR, YOUNG, CHILD, SEATED_INFANT or HELD_INFANT (a lap infant). The snake_case twin of travelerType, with the same value: use this name.

fareOptionstring

The fare option, for example STANDARD.

priceobject

The price of one traveler.

ShowHide 5 attributes
supplierCurrencystring

ISO 4217 currency in which the supplier prices the fare.

agencyCurrencystring

ISO 4217 currency of your agency.

basenumber

The traveler's base fare in the agency currency.

totalnumber

The traveler's final price: what this traveler pays. The totals of all travelers add up to pricing.finalPrice.

b2bPricenumber

The traveler's share of the amount debited from your balance.

fareDetailsBySegmentarray of object

The fare of this traveler on every segment.

ShowHide 9 attributes
segmentIdstring

The id of the segment this fare detail is about.

cabinstring

Cabin of the fare on this segment.

One of ECONOMY, PREMIUM_ECONOMY, BUSINESS, FIRST.

fareBasisstringnullable

Fare basis code.

brandedFarestringnullable

Fare family code.

brandedFareLabelstringnullable

Display label of the fare family.

bookingClassstringnullable

Booking class letter.

includedCheckedBagsobject

The checked baggage included in the fare.

ShowHide 1 attribute
quantityinteger

Number of checked bags included in the fare.

includedCabinBagsobject

The cabin baggage included in the fare.

ShowHide 1 attribute
quantityinteger

Number of cabin bags included in the fare.

amenitiesarray of object

What else the fare includes or sells (seat, bag, meal, Wi-Fi ...).

itineraryarray of object

The flights of the order.

ShowHide 8 attributes
directionstring

outbound, return ...

durationstring

ISO 8601 duration.

stopsinteger

Number of stops.

fareBrandNamestring

Name of the fare brand.

originobject

Where this direction starts.

ShowHide 5 attributes
airportCodestring

IATA code of the airport.

airportNamestring

Name of the airport.

cityNamestring

Name of the city.

countryCodestring

ISO 3166-1 alpha-2 country code.

timeZonestring

IANA time zone.

destinationobject

Where this direction ends.

ShowHide 5 attributes
airportCodestring

IATA code of the airport.

airportNamestring

Name of the airport.

cityNamestring

Name of the city.

countryCodestring

ISO 3166-1 alpha-2 country code.

timeZonestring

IANA time zone.

segmentsarray of object

The flights of this direction.

ShowHide 8 attributes
idstring

Id of the segment.

departureobject

Where and when a segment leaves or arrives.

ShowHide 7 attributes
airportCodestring

IATA code of the airport.

airportNamestring

Name of the airport.

cityNamestring

Name of the city.

countryCodestring

ISO 3166-1 alpha-2 country code.

terminalstringnullable

Terminal, when the supplier says.

datetimestring

Local date and time at the airport, YYYY-MM-DDTHH:MM:SS, without a time zone.

timeZonestring

IANA time zone of the airport.

arrivalobject

Where and when a segment leaves or arrives.

ShowHide 7 attributes
airportCodestring

IATA code of the airport.

airportNamestring

Name of the airport.

cityNamestring

Name of the city.

countryCodestring

ISO 3166-1 alpha-2 country code.

terminalstringnullable

Terminal, when the supplier says.

datetimestring

Local date and time at the airport, YYYY-MM-DDTHH:MM:SS, without a time zone.

timeZonestring

IANA time zone of the airport.

flightobject

The airline and the number of the flight.

ShowHide 3 attributes
carrierCodestring

IATA code of the marketing airline.

flightNumberstring

The flight number.

operatingCarrierstring

IATA code of the operating airline.

durationstring

ISO 8601 duration.

cabinstring

The cabin.

fareBasisstringnullable

Fare basis code.

passengerDetailsarray of object

What each passenger has on this segment.

conditionsobjectnullable

What the fare allows before departure. Indicative only. A Duffel order can carry null for both when the airline does not say.

ShowHide 2 attributes
refundBeforeDepartureobjectnullable

What the fare says about a refund before departure.

ShowHide 1 attribute
allowedboolean

Whether a refund is allowed before departure. Indicative, not a promise: the fare rules of the airline decide.

changeBeforeDepartureobjectnullable

What the fare says about a change before departure.

ShowHide 1 attribute
allowedboolean

Whether a change is allowed before departure. Indicative, not a promise: the fare rules of the airline decide.

conditionsobject

What the fare allows before departure. Indicative only. A Duffel order can carry null for both when the airline does not say.

ShowHide 2 attributes
refundBeforeDepartureobjectnullable

What the fare says about a refund before departure.

ShowHide 1 attribute
allowedboolean

Whether a refund is allowed before departure. Indicative, not a promise: the fare rules of the airline decide.

changeBeforeDepartureobjectnullable

What the fare says about a change before departure.

ShowHide 1 attribute
allowedboolean

Whether a change is allowed before departure. Indicative, not a promise: the fare rules of the airline decide.

fareRulesobject

What exchange, refund and revalidation allow.

ownerobject

The airline that owns the order.

ShowHide 6 attributes
idstringnullable

Duffel's id of the airline.

iataCodestring

IATA code of the airline that owns the order.

namestring

Name of the airline.

logoUrlstring

Address of the logo.

logoLockupUrlstringnullable

Address of the wide logo.

conditionsOfCarriageUrlstringnullable

Address of the conditions of carriage.

servicesarray of object

Extra services of the order (bags, seats). Empty.

metaobject

Capabilities of the order and what the supplier reports about it.

ShowHide 11 attributes
supportHoldbooleandeprecated

Legacy name, still accepted. Use support_hold instead.

Whether the supplier can hold.

support_holdboolean

Whether the supplier can hold. The snake_case twin of supportHold, with the same value: use this name.

supportVoidbooleandeprecated

Legacy name, still accepted. Use support_void instead.

Whether the supplier can void the ticket the same day.

support_voidboolean

Whether the supplier can void the ticket the same day. The snake_case twin of supportVoid, with the same value: use this name.

voidDeadlinestringnullabledeprecated

Legacy name, still accepted. Use void_deadline instead.

End of the same-day void window.

void_deadlinestringnullable

End of the same-day void window. The snake_case twin of voidDeadline, with the same value: use this name.

voidWindowEndsAtstringnullable

End of the void window, when the supplier gives it.

airlineInitiatedChangesarray of object

Schedule changes the airline made.

changesarray of object

Changes of the order.

usersarray of object

Users of the order.

orderMetadataobjectnullable

Supplier-specific metadata of the order.

exchangeRatenumberdeprecated

Legacy name, still accepted. Use exchange_rate instead.

Only when the supplier's currency is not your agency's.

exchange_ratenumber

Only when the supplier's currency is not your agency's. The snake_case twin of exchangeRate, with the same value: use this name.

internalBookingobject

The FX-Port identifiers of the booking.

ShowHide 2 attributes
bookingIdstring

The PNR.

internalIdstring

The FX-Port id of the booking (a UUID), the same as postProcessing.bookingDbId of the booking call.

postProcessingobject

What FX-Port did after the supplier call.

ShowHide 5 attributes
bookingDbIdstring

The FX-Port id of the booking (a UUID). The best key to store: it is accepted as booking_id by get_booking.

bucketLinkstringnullable

Address of the PDF of the ticket, null until it is generated. A public link.

emailSentboolean

Whether the confirmation e-mail went out.

bookingStatusUpdatedboolean

cancel_order: whether the FX-Port booking was updated.

refundMethodstring

confirm_cancel: where the refund went: balance.

balanceDebitedboolean

book_flight only. Always false in the sandbox: nothing is charged.

transactionCreatedboolean

book_flight only. Always false in the sandbox.

payoutCreatedboolean

book_flight only. Always false in the sandbox.

errorobject

Only when success is false: the refusal of the supplier for pay_order.

ShowHide 5 attributes
messagestring

The supplier's message.

codestring

The supplier's code: a number as text for Amadeus (4926), a name for Duffel (order_not_cancellable).

typestring

The supplier's error type.

detailsarray of object

The supplier's details, in its own format.

userMessagestring

A sentence the supplier wrote for the traveler, when there is one.

errorsarray of object

Only when success is false: the unified error list. errors[0].code is the supplier's code in lower case and errors[0].type is supplier_error.

ShowHide 7 attributes
codestring

Stable, machine-readable code in snake_case. Branch on this, never on the message.

typestring

The family of the error: tells you how to react.

One of authentication_error, permission_error, validation_error, not_found, conflict, payment_error, rate_limit_error, supplier_error, internal_error.

titlestring

A short label of the error.

messagestring

A sentence for a human: what is wrong and how to fix it. Wording can change; the code does not.

fieldstringnullable

The request field the error is about, when there is one.

detailsobjectnullable

Structured extras of the error (for example available and required for an insufficient balance).

documentation_urlstring

The documentation of this error code.

Errors

StatusCodeExample message
400bad_requestMissing required parameter: order_id (or booking_id / pnr)
400invalid_booking_id`order_id` is not a valid identifier (letters, digits and - _ . : = ~ only, up to 128 characters).
400bad_requestDo not pass 'currency'. Currency is resolved automatically from booking/supplier context.
402insufficient_balanceAgency balance is insufficient. Available: 120.0 DZD, Required: 29876.81 DZD.
403read_write_permission_requiredThis endpoint requires an API key with read_write permission.
404not_foundBooking not found for order_id: ZZZZZZ
503balance_lock_timeoutThe agency balance is busy with another operation. Retry in a few seconds.

The shape of the error body depends on the endpoint. See Errors for every shape and code.

Related guides

  • Pay for a held order
  • Get an order quote
  • Booking flows
PreviousGet the current quote of an orderNext Cancel a held reservation

ยฉ 2026 FX-Port

TermsPrivacy[email protected]