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 ยท ACD documents

Get the ACD document state of a booking

Read what a booking needs for ACD, which travelers already have a passport on file, and whether you can upload.

POST/api/v1/flights/get_acd_documents

Requires an API key with Read permission; a Read+Write key works too.

Call it before every upload and use its traveler_id values and missing_traveler_ids: do not build traveler ids yourself.

A booking needs ACD passports when its fare has pricing.acd.applied: true (requiresACD: true on the offer and the booking): one passport copy for every traveler on the booking. acd_required of get_booking and acd.acd_required here say whether passports are still expected. The endpoint answers 200 for every booking of your agency, ACD or not: for a booking without ACD acd_required is false, can_upload is false and blocked_reason is ACD_NOT_REQUIRED. Travelers are listed either way. ticket_number of a traveler is null until the airline returns one (always for a hold).

booking_id takes the PNR, the supplier order id or the FX-Port UUID (order_id and pnr are other names of the same field). Only bookings of your agency in the environment of your key are found: a booking of another agency, a booking of the other environment and an id that does not exist all answer the same 404 BOOKING_NOT_FOUND, so an answer never tells whether a booking exists. The download_url of a document is a public address that needs no key: anybody who has it can open the passport, so treat it as sensitive.

curl https://api.fx-port.com/api/v1/flights/get_acd_documents \
  -H "Authorization: Bearer fxp_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "booking_id": "Y7IA34"
}'
Response200
{
  "environment": "sandbox",
  "success": true,
  "requestId": "8201f6f6",
  "booking_id": "Y7IA34",
  "acd": {
    "booking_id": "Y7IA34",
    "acd_required": true,
    "acd_waived": false,
    "acd_submitted": false,
    "acd_paid": false,
    "complete": false,
    "can_upload": true,
    "blocked_reason": null,
    "required_documents": 3,
    "uploaded_documents": 1,
    "missing_documents": 2,
    "missing_traveler_ids": [
      "1",
      "3"
    ],
    "travelers": [
      {
        "traveler_id": "1",
        "traveler_name": "JANE DOE",
        "traveler_type": "ADULT",
        "ticket_number": null,
        "status": "missing",
        "document": null
      },
      {
        "traveler_id": "2",
        "traveler_name": "JOHN DOE",
        "traveler_type": "ADULT",
        "ticket_number": null,
        "status": "uploaded",
        "document": {
          "filename": "john-passport.pdf",
          "content_type": "application/pdf",
          "size_bytes": 482113,
          "download_url": "https://s3.example.com/fx-port/acd_passports/Y7IA34/2/20261101142618_ec9632ab.pdf",
          "uploaded_at": "2026-11-01T14:26:18.120000+00:00",
          "replaced_count": 0
        }
      },
      {
        "traveler_id": "3",
        "traveler_name": "JAMES DOE",
        "traveler_type": "ADULT",
        "ticket_number": null,
        "status": "missing",
        "document": null
      }
    ],
    "unassigned_documents": [],
    "revision": 1,
    "limits": {
      "accepted_formats": [
        "avif",
        "bmp",
        "gif",
        "heif",
        "jp2",
        "jpeg",
        "jxl",
        "pdf",
        "png",
        "tiff",
        "webp"
      ],
      "accepted_extensions": [
        "avif",
        "bmp",
        "dib",
        "gif",
        "heic",
        "heif",
        "j2k",
        "jfif",
        "jp2",
        "jpeg",
        "jpg",
        "jpx",
        "jxl",
        "pdf",
        "pjp",
        "pjpeg",
        "png",
        "tif",
        "tiff",
        "webp"
      ],
      "max_file_size_bytes": 10485760,
      "max_request_size_bytes": 26214400,
      "max_documents_per_request": 3
    }
  }
}
Response200
{
  "environment": "sandbox",
  "success": true,
  "requestId": "8b5b5c52",
  "booking_id": "Y7HKJM",
  "acd": {
    "booking_id": "Y7HKJM",
    "acd_required": false,
    "acd_waived": false,
    "acd_submitted": false,
    "acd_paid": false,
    "complete": false,
    "can_upload": false,
    "blocked_reason": "ACD_NOT_REQUIRED",
    "required_documents": 0,
    "uploaded_documents": 0,
    "missing_documents": 0,
    "missing_traveler_ids": [],
    "travelers": [
      {
        "traveler_id": "1",
        "traveler_name": "JOHN SMITH",
        "traveler_type": "ADULT",
        "ticket_number": "124-2446977395",
        "status": "missing",
        "document": null
      }
    ],
    "unassigned_documents": [],
    "revision": 0,
    "limits": {
      "accepted_formats": [
        "avif",
        "bmp",
        "gif",
        "heif",
        "jp2",
        "jpeg",
        "jxl",
        "pdf",
        "png",
        "tiff",
        "webp"
      ],
      "accepted_extensions": [
        "avif",
        "bmp",
        "dib",
        "gif",
        "heic",
        "heif",
        "j2k",
        "jfif",
        "jp2",
        "jpeg",
        "jpg",
        "jpx",
        "jxl",
        "pdf",
        "pjp",
        "pjpeg",
        "png",
        "tif",
        "tiff",
        "webp"
      ],
      "max_file_size_bytes": 10485760,
      "max_request_size_bytes": 26214400,
      "max_documents_per_request": 1
    }
  }
}

Request

Body

Required, JSON.

booking_idstringrequired

The PNR, the supplier order id or the FX-Port booking UUID. Letters, digits and - _ . : = ~, up to 128 characters. order_id and pnr are accepted as other names of the same field.

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.

bookingIdstringdeprecated

Legacy name, still accepted. Use booking_id instead.

The older spelling of booking_id.

orderIdstringdeprecated

Legacy name, still accepted. Use booking_id instead.

The older spelling of booking_id.

agencyIdstringdeprecated

Legacy name, still accepted. Use agency_id instead.

The older spelling of agency_id.

Response

200The ACD state of the booking.

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

Always true here: a booking without ACD is a 200 too.

requestIdstringdeprecated

Legacy name, still accepted. Use request_id instead.

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

booking_idstringdeprecated

Legacy name, still accepted. Use pnr instead.

The PNR, whatever identifier you sent.

pnrstring

The PNR, whatever identifier you sent. The snake_case twin of booking_id, with the same value: use this name.

acdobject

The ACD state of a booking: what is needed, what was uploaded, and whether you can upload.

ShowHide 17 attributes
booking_idstringdeprecated

Legacy name, still accepted. Use pnr instead.

The PNR of the booking.

pnrstring

The PNR of the booking. The snake_case twin of booking_id, with the same value: use this name.

acd_requiredboolean

true when the booking needs ACD passports and FX-Port did not waive them.

acd_waivedboolean

true when FX-Port marked ACD as not required for this booking. No upload is accepted then. You cannot set it.

acd_submittedboolean

true once every traveler has a passport. Never null. Also true for a hold that has a complete set.

acd_paidboolean

true once FX-Port's team has marked the ACD amount of the booking as paid. You cannot set it.

completeboolean

Every required passport is uploaded. Always false when ACD is not required.

can_uploadboolean

Whether upload_acd_documents accepts files for this booking right now.

blocked_reasonstringnullable

Why can_upload is false. null otherwise.

One of ACD_NOT_REQUIRED, ACD_WAIVED, BOOKING_NOT_ELIGIBLE, TRAVELERS_NOT_AVAILABLE.

required_documentsinteger

The number of passports needed: one for each traveler of the booking. 0 when ACD is not required.

uploaded_documentsinteger

How many of the required passports are uploaded.

missing_documentsinteger

How many are still missing.

missing_traveler_idsarray of string

The travelers who still need a passport. Use these values in traveler_ids.

travelersarray of object

Every traveler of the booking.

ShowHide 6 attributes
traveler_idstring

The id to send in traveler_ids: the id of the passenger on the booking ("1", "2" for Amadeus Algeria, pas_... for Duffel).

traveler_namestring

The name on the booking.

traveler_typestring

The passenger type, for example ADULT.

ticket_numberstringnullable

The e-ticket number. null until the airline returns one: always for a hold, and for an instant booking whose number has not arrived.

statusstring

Whether this traveler has a passport.

One of uploaded, missing.

documentobjectnullable

The current passport file of a traveler.

ShowHide 6 attributes
filenamestringnullable

The file name you sent.

content_typestring

The type FX-Port detected from the content (for example application/pdf, image/jpeg), not the one you sent.

size_bytesinteger

The size of the stored file.

download_urlstring

A public address of the file: anyone who has it can download the passport. Treat it as sensitive.

uploaded_atstring

ISO 8601 UTC time of the upload, with +00:00.

replaced_countinteger

How many times the passport was replaced.

unassigned_documentsarray of object

Files that do not count as a traveler's passport.

ShowHide 1 attribute
download_urlstring

A public address of the file.

revisioninteger

Increases by one with each upload that stored a file. 0 for a booking without any.

limitsobject

The upload limits. Read them instead of hardcoding them.

ShowHide 5 attributes
accepted_formatsarray of string

The 11 accepted formats.

accepted_extensionsarray of string

The 20 extensions of those formats.

max_file_size_bytesinteger

The largest accepted file: 10485760 (10 MiB).

max_request_size_bytesinteger

The largest total size of the files of one request: 26214400 (25 MiB).

max_documents_per_requestinteger

The number of travelers of the booking: the most files one request can carry.

Errors

StatusCodeExample message
400MISSING_BOOKING_IDMissing required field: booking_id
400INVALID_BOOKING_ID`booking_id` is not a valid identifier (letters, digits and - _ . : = ~ only, up to 128 characters).
404BOOKING_NOT_FOUNDNo flight booking found for 'ZZZZZZ'.

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

Related guides

  • Upload ACD documents
PreviousConfirm the cancellation of an orderNext Upload ACD passport documents

ยฉ 2026 FX-Port

TermsPrivacy[email protected]