# DRCT API — full documentation for AI tools Generated: 2026-11-03T11:08:22.905Z API version: 2026-09-01 Source: https://docs.drct.aero Base URLs: - Sandbox: `https://sandbox-api.drct.aero` - Production: `https://api.drct.aero` Every request needs `Authorization: Bearer ` and a `DRCT-Version` header (current: `2026-09-01`). --- # DRCT API Search, price, book and issue airline tickets from one REST API — no SOAP, no GDS terminal. ``` # sandbox — same API as production, zero cost https://sandbox-api.drct.aero ``` --- # Sandbox vs. Production Sandbox runs on the exact same API as production, request for request — only the data behind it is different. - Same API, same responses. Sandbox returns real flight data for LOT, Lufthansa, Turkish Airlines and Wizz Air — production covers the major routes across every supported airline. - Wizz Air covers the low-cost side, so you can test everything specific to low-cost carriers before going live: branded fares via Upsell, baggage and other services, seat selection and the shorter 60-minute ticketing window. Other low-cost carriers behave the same way structurally, with windows of 15–60 minutes. - No financial risk either way: every booking and ticket in sandbox is fake, so test as much as you want — nothing costs money, and there's nothing to undo afterward. - The same holds once you're live: every booking or ticket made through the production API also shows up in your production cabinet — drct.aero — and vice versa. Production will accept a first or last name like "Test" or a lookalike (Testa, Testovich, Testo…) — but issuing a real ticket under one isn't allowed. That's exactly what sandbox is for. ### Ready for production? Going live means signing a contract and getting production keys. Already talking to a sales manager? Reach out to them. --- # Authentication Send your key in the Authorization header — bearer tokens only. Your sandbox key is issued right here — get your sandbox key — no account needed. See sandbox vs. production for how it compares to going live. `Authorization` string REQUIRED Bearer token. Example: Bearer sk_sandbox_9f2c4b… `DRCT-Version` string OPTIONAL Pins the response format, e.g. 2026-09-01. Omit it and your account default applies. See Versioning. Allowed values: 2021-06-01 2026-09-01 `Accept-Encoding` string RECOMMENDED Turns on gzip compression for large responses like Search Offers. Send gzip, deflate and we compress the body. `X-Trace-Id` string OPTIONAL Identifies a single request. Provide your own value, or omit it and we generate one — either way it's echoed back in the response. Hand it to support when you need help with a specific call. Sandbox keys don't expire. Regenerating one in the same popup revokes the old key immediately. Treat it like a password and keep it out of client-side code. #### Example: Authenticated request · cURL ``` curl -X POST "https://sandbox-api.drct.aero/ping" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" \ -d '{ "payload": "Keep it logically awesome" }' ``` #### Example: 200 OK ``` { "authenticated": true, "environment": "sandbox" } ``` #### Example: 401 ``` { "error": { "code": "unauthorized", "message": "API key is missing or invalid." } } ``` --- # Your First Request Four requests, start to ticket number, each explained as you go. Want to sell branded fares instead of the cheapest match? Slot Upsell Offer in between search and price — it's optional and doesn't change the rest of the flow. ### Search offers Post a route and a passenger list. You get back flights_options — flight combinations, each with one or more offers. An offer is a priced, bookable combination of fares from one channel. ### Price the offer Search prices are cached and can be stale. Pricing revalidates the offer against the channel and returns the amount you can actually sell, plus expire_at. ### Create an order Attach passenger names, contacts and documents to the offer. You receive a PNR locator and a cancel_before deadline. Nothing is paid yet. ### Issue tickets Payment happens here. The order moves to issued and each passenger gets a ticket number. If the price moved, you get price_changed — retry with reshop: true. #### Example: End-to-end · cURL · cURL ``` # 1 — search curl -X POST $API/offers_search \ -H "Authorization: Bearer $DRCT_API_KEY" \ -d '{"flights":[{"departure_airport_code":"WAW", "arrival_airport_code":"FRA", "departure_date":"2026-09-27"}], "passengers":[{"type":"ADT"}]}' # 2 — price the offer you picked curl -X PATCH $API/offers/$OFFER_ID/price \ -H "Authorization: Bearer $DRCT_API_KEY" # 3 — book curl -X POST $API/orders \ -H "Authorization: Bearer $DRCT_API_KEY" \ -d @passengers.json # 4 — issue curl -X POST $API/orders/$ORDER_ID/issue \ -H "Authorization: Bearer $DRCT_API_KEY" \ -d '{"reshop":false}' ``` --- # Compression Some responses, like offers search, can be huge so we added compression to handle it well. To enable compression, send an Accept-Encoding: gzip header. #### Example: Compressed request ``` curl -X POST https://sandbox-api.drct.aero/offers_search \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Accept-Encoding: gzip" \ -d '{ ... }' ``` --- # Response Times Response times depend on the channel and the method. Single-order calls — Price Offer, Create Order, Issue Order — are usually quick; Search Offers queries every enabled channel for the route, so it takes longer. A slower response from a channel under load is normal, not a failure — don't retry a call just because it took longer than you expected. ### Average 1.7 seconds the API's average response time, across every channel and method. --- # Idempotent Requests Retry any POST safely — attach the same Idempotency-Key and you get back the original response instead of a duplicate. Only Create Order and Issue Order support idempotency keys today. The key is client-generated — we recommend a V4 UUID, up to 255 characters. We store the first response, success or error, and replay it for any repeat within at least 4 hours; after that, the same key starts a fresh request. Reusing a live key with different parameters returns an error instead of running the request twice. Retrying is always safe when the endpoint never started processing — an invalid request or a conflicting concurrent call stores nothing. #### Example: Request · idempotent create order · cURL ``` curl -X POST https://sandbox-api.drct.aero/orders \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 5b1f9e2a-6e3a-4f2b-9d3e-2a6c7c1e4f0a" \ -d '{ "offer_id": "LH_6322c0cc1af833380f7e7bc5", "passengers": [ /* … */ ] }' ``` --- # Versioning Your account defaults to the latest version (2026-09-01) — no need to send one. To pin an older version, send a DRCT-Version header. We release a new version only when backward-incompatible changes are made. These are considered backward-compatible: - Adding new API resources. - Adding new optional request parameters to existing API methods. - Adding new attributes to existing API responses. - Changing the order of properties in existing API responses. - Changing the length or format of IDs. Track every release in the changelog. Version | Status 2026-09-01 | Current 2021-06-01 | Supported ### Content type application/json Reporting also serves application/xml. ### Identifiers Offer ids are channel-prefixed strings. Order ids are UUIDs. Treat both as opaque. #### Example: Request · ping · cURL ``` curl -X POST "https://sandbox-api.drct.aero/ping" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" \ -d '{ "payload": "Keep it logically awesome" }' ``` --- # Error codes Every failure returns the same envelope: an HTTP status plus error.code to branch on and error.message to log. Branch on the code, never on the message text. Status | Code & meaning 401 | `unauthorized` — Key missing, malformed, or used against the wrong environment. 404 | `not _ found` — The order does not exist, or was deleted after cancel_before. 422 | `validation _ error` — Body failed validation. The message names the offending path, e.g. passengers.0.document. 422 | `offer _ not _ found` — The offer expired or belongs to another search. Search and price again. 422 | `price _ changed` — Message carries old, new and currency. Show the new price, then re-issue with reshop: true. 422 | `channel _ not _ supported` — Returned by Upsell for channels that don't expose offer details. 422 | `refund _ unavailable` — Returned by Quote Order Refund / Refund Order when the channel doesn't support refunds, or the order can still be voided instead. 422 | `refund _ not _ allowed` — Returned by Refund Order when the order's refund state changed since it was last quoted — quote it again first. 422 | `channel _ is _ off` — Returned by View Seat Maps / Add Seats when the channel doesn't support seat maps, or ticketing is off for your agency — and by Shop Ancillaries / Confirm Ancillary when it doesn't support ancillaries at all. 422 | `invalid _ order _ status` — Returned by Add Seats when the order's status doesn't allow seat selection anymore (e.g. already issued) — and by Shop Ancillaries / Confirm Ancillary when the channel only supports ancillaries in a different order state (e.g. only after issue). 422 | `ancillary _ quantity _ not _ supported` — Returned by Confirm Ancillary when quantity is above 1 on a channel that sells baggage as fixed lots (WizzAir) — the lot size is already part of the ancillary id, so omit quantity or set it to 1. 422 | `issue _ required _ seats` — Returned by Issue Order when the fare requires a seat for every passenger and at least one hasn't been assigned yet — add seats with Add Seats first. 422 | `provider _ error` — Passed through as-is from the airline. Double-check your request against the offer, or contact support if it keeps happening. 501 | `not _ implemented _ error` — The channel does not support this operation — degrade gracefully rather than retrying. A 5xx means the failure is on our side. It's safe to retry with exponential backoff — nothing was applied. #### Example: Error envelope ``` { "error": { "code": "price_changed", "message": "{'old':186.9,'new':191.4,'currency':'EUR'}" } } ``` --- # Troubleshooting The five failures partners hit most often, and what to do about each. ### Search returns an empty array Check the date is in the future in local time, and that your account has a channel enabled for that route. A carrier filter with no matching inventory also returns empty. ### Offer expired between price and book Offers live 30 minutes at most. Re-run search, match the itinerary by segment ids, then price the new offer. Never cache offer ids across sessions. ### Issue timed out The ticket may still have been issued. Call Get Order and check status before retrying — a blind retry can double-issue. ### Name or document rejected at issue Latin characters only, no diacritics; names must match the document exactly. Some carriers require title and date_of_birth. ### Search is slow Send Accept-Encoding: gzip, narrow with filters.carriers, and avoid firing multi-city searches in parallel on one key. ### Still stuck Send us the X-Trace-Id from the response headers plus the timestamp — that’s enough to trace a call end to end. --- # Search Offers Endpoint: `POST /offers_search` Returns bookable flight combinations for the given routes and passengers in flights — one-way, round-trip and multi-city alike. Price the one you pick before creating an order. Segments, fares and passengers are de-duplicated: returned once at the top level, referenced by id from each option. No matches → 200 with an empty array, not an error. See the Flights Search guide. Sandbox only covers LOT (LO), Lufthansa (LH), Turkish Airlines (TK) and Wizz Air (W6) — other carriers return an empty flights array. See sandbox vs. production. ### Body parameters `flights` array of objects REQUIRED Origin–destination pairs, at least one. Order matters: item two is the return leg of a round trip. >= 1 items `flights[].departure_airport_code` string IATA 3-letter code. Example: WAW Match pattern: ^[A-Z]{3}$ `flights[].arrival_airport_code` string IATA 3-letter code. Example: FRA Match pattern: ^[A-Z]{3}$ `flights[].departure_date` date YYYY-MM-DD in the departure airport’s local time. Example: 2026-09-27 `passengers` array of objects REQUIRED One item per traveller, each with type: ADT adult, CHD child, INF infant. Max 9. No names at this stage. >= 1 items `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `filters` object A set of filters to reduce the response. `filters.carriers` array of strings IATA 2-letter carrier codes. Only options whose validating carrier is in the list are returned — the cheapest way to shrink a slow search. Example: ["LH"] Match pattern: ^[\dA-Z]{2}$ ### Response fields #### 201 CREATED `flights_options` array of objects REQUIRED One entry per bookable flight-and-price combination. Each option references flights, fares and passengers by id from the top-level arrays below rather than repeating them. `flights_options[].flights` array of objects REQUIRED The journey this option covers — one or more segments joined into a single flight, referenced by id. >= 1 items `flights_options[].flights[].id` string Identifier of the flight within this response. Example: F1 `flights_options[].flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `flights_options[].flights[].segments` array of strings REQUIRED Segment ids that make up this flight — look them up in the top-level segments array. >= 1 items Example: ["63299a951af83376ede02bb8"] `flights_options[].offers` array of objects REQUIRED The bookable prices for this flight, one per validating carrier or fare combination. Use an offer's id to price or book it. >= 1 items `flights_options[].offers[].id` string REQUIRED Identifies this offer. Use it in Price Offer and Create Order. Example: LH_6322c0cc1af833380f7e7bc5 `flights_options[].offers[].channel` string REQUIRED Name of the channel this offer came from, matching a channel on your DRCT account. Example: Lufthansa Group `flights_options[].offers[].expire_at` date-time When this offer stops being bookable. Depends on the channel; max TTL is 30 minutes. Example: 2022-09-20T14:46:15+03:00 `flights_options[].offers[].fares` array of objects REQUIRED The fares this offer is built from, referenced by id. `flights_options[].offers[].fares[].id` string Fare id — look it up in the top-level fares array for the full fare rules. Example: 6329a0ff1af83376ede02bc5 `flights_options[].offers[].fares[].segments` array of strings REQUIRED Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `flights_options[].offers[].price` object REQUIRED Total price for all passengers on this offer. `flights_options[].offers[].price.amount` number A positive number representing the amount of money. Example: 100.0 `flights_options[].offers[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `flights_options[].offers[].price_details` array of objects REQUIRED Price broken down by passenger type — how the total above is composed. `flights_options[].offers[].price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `flights_options[].offers[].price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `flights_options[].offers[].price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `flights_options[].offers[].price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `flights_options[].offers[].price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `flights_options[].offers[].price_details[].fare` object The fare portion of the price, excluding taxes. `flights_options[].offers[].price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `flights_options[].offers[].price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `flights_options[].offers[].price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `flights_options[].offers[].price_details[].taxes` object The tax portion of the price, excluding fare. `flights_options[].offers[].price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `flights_options[].offers[].price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `flights_options[].offers[].price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `passengers` array of objects REQUIRED The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object Present once identity details have been collected for this traveller. `passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passengers[].individual.title` string Personal title — required by some channels. Example: Mr `passengers[].individual.gender` string M or F. Allowed values: M F `passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `fares` array of objects REQUIRED The fare rules and cabin/baggage conditions for this booking. `fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `fares[].changes` object Whether and how this booking can be changed after issuance. `fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `segments` array of objects REQUIRED Every flown leg referenced by the options above — airports, carrier, and scheduled times, de-duplicated at the top level. `segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `segments[].departure_airport` object REQUIRED Airport this segment departs from. `segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `segments[].departure_city` object REQUIRED City this segment departs from. `segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `segments[].arrival_city` object REQUIRED City this segment arrives at. `segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `segments[].departure_terminal` string Departure terminal, when known. Example: D `segments[].arrival_terminal` string Arrival terminal, when known. Example: A `segments[].meal` string Meal code, airline-specific. Example: R `segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `segments[].stops[].airport` object REQUIRED Airport of the technical stop. `segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ #### 200 An empty array — no offers matched these parameters, nothing to describe. #### 422 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: validation_error `error.message` string REQUIRED A human-readable error description. Example: {'flights':['size cannot be less than 1']} #### Example: Request · One Way Flight ``` curl -X POST https://sandbox-api.drct.aero/offers_search \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "DRCT-Version: 2026-09-01" \ -H "Content-Type: application/json" \ -d '{ "flights": [ { "departure_airport_code": "WAW", "arrival_airport_code": "FRA", "departure_date": "2026-09-27" } ], "passengers": [{ "type": "ADT" }] }' ``` #### Example: Request · Round Trip Flights ``` curl -X POST https://sandbox-api.drct.aero/offers_search \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "DRCT-Version: 2026-09-01" \ -H "Content-Type: application/json" \ -d '{ "flights": [ { "departure_airport_code": "WAW", "arrival_airport_code": "FRA", "departure_date": "2026-09-27" }, { "departure_airport_code": "FRA", "arrival_airport_code": "WAW", "departure_date": "2026-09-28" } ], "passengers": [{ "type": "ADT" }] }' ``` #### Example: Request · Multi City Flights ``` curl -X POST https://sandbox-api.drct.aero/offers_search \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "DRCT-Version: 2026-09-01" \ -H "Content-Type: application/json" \ -d '{ "flights": [ { "departure_airport_code": "MUC", "arrival_airport_code": "FRA", "departure_date": "2026-09-27" }, { "departure_airport_code": "IST", "arrival_airport_code": "WAW", "departure_date": "2026-09-28" } ], "passengers": [{ "type": "ADT" }] }' ``` #### Example: Request · With Carrier Filter ``` curl -X POST https://sandbox-api.drct.aero/offers_search \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "DRCT-Version: 2026-09-01" \ -H "Content-Type: application/json" \ -d '{ "flights": [ { "departure_airport_code": "WAW", "arrival_airport_code": "FRA", "departure_date": "2026-09-27" } ], "passengers": [{ "type": "ADT" }], "filters": { "carriers": ["LH"] } }' ``` #### Example: 201 CREATED ``` { "flights_options": [ { "flights": [ { "id": "F1", "journey_time": 5400, "segments": ["63299a951af83376ede02bb8"] } ], "offers": [ { "id": "LH_6322c0cc1af833380f7e7bc5", "channel": "Lufthansa Group", "expire_at": "2026-09-27T14:46:15+03:00", "price": { "amount": 182.4, "currency": "EUR" } } ] } ], "segments": [ /* … */ ], "fares": [ /* … */ ], "passengers": [{ "id": "PAX1", "type": "ADT" }] } ``` #### Example: 200 ``` // nothing available for these parameters [] ``` #### Example: 422 ``` { "error": { "code": "validation_error", "message": "{'flights':['size cannot be less than 1']}" } } ``` --- # Price Offer Endpoint: `PATCH /offers/{id}/price` Revalidates an offer and returns the current price, full fare details and a fresh expire_at. Required before creating an order: search results are cached and can be stale. `id` path · string REQUIRED Offer id from Search Offers, e.g. LH_6322c0cc1af833380f7e7bc5. ### Response fields #### 200 OK `id` string REQUIRED Identifies this offer. Use it in Price Offer and Create Order. Example: LH_6322c0cc1af833380f7e7bc5 `channel` string REQUIRED Name of the channel this offer came from, matching a channel on your DRCT account. Example: Lufthansa Group `expire_at` date-time When this offer stops being bookable. Depends on the channel; max TTL is 30 minutes. Example: 2022-09-20T14:46:15+03:00 `price` object REQUIRED Total price for all passengers on this offer. `price.amount` number A positive number representing the amount of money. Example: 100.0 `price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details` array of objects REQUIRED Price broken down by passenger type — how the total above is composed. `price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare` object The fare portion of the price, excluding taxes. `price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `price_details[].taxes` object The tax portion of the price, excluding fare. `price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `passengers` array of objects REQUIRED The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). >= 1 items `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object Present once identity details have been collected for this traveller. `passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passengers[].individual.title` string Personal title — required by some channels. Example: Mr `passengers[].individual.gender` string M or F. Allowed values: M F `passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `flights` array of objects REQUIRED The journeys this offer covers, each with its own fully-detailed segments. >= 1 items `flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `flights[].segments` array of objects REQUIRED The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `flights[].segments[].departure_airport` object REQUIRED Airport this segment departs from. `flights[].segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].departure_city` object REQUIRED City this segment departs from. `flights[].segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `flights[].segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].arrival_city` object REQUIRED City this segment arrives at. `flights[].segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `flights[].segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `flights[].segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `flights[].segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `flights[].segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `flights[].segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `flights[].segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `flights[].segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `flights[].segments[].departure_terminal` string Departure terminal, when known. Example: D `flights[].segments[].arrival_terminal` string Arrival terminal, when known. Example: A `flights[].segments[].meal` string Meal code, airline-specific. Example: R `flights[].segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `flights[].segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `flights[].segments[].stops[].airport` object REQUIRED Airport of the technical stop. `flights[].segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ `fares` array of objects REQUIRED The fare rules and cabin/baggage conditions for this booking. >= 1 items `fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `fares[].changes` object Whether and how this booking can be changed after issuance. `fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ #### 422 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: validation_error `error.message` string REQUIRED A human-readable error description. Example: 'value' is not a valid offer_id Related: Upsell Offer lists branded fares for the same itinerary; Fare Rules returns the carrier’s rule text. #### Example: Request · cURL ``` curl -X PATCH \ https://sandbox-api.drct.aero/offers/LH_6322c0cc/price \ -H "Authorization: Bearer $DRCT_API_KEY" ``` #### Example: 200 OK ``` { "id": "LH_6322c0cc1af833380f7e7bc5", "channel": "Lufthansa Group", "expire_at": "2026-09-27T14:46:15+03:00", "price": { "amount": 186.9, "currency": "EUR" }, "price_details": [ { "type": "ADT", "count": 1, "price": { "amount": 186.9, "currency": "EUR" } } ], "fares": [ /* cabin_class, baggage, changes… */ ] } ``` #### Example: 422 ``` { "error": { "code": "validation_error", "message": "'value' is not a valid offer_id" } } ``` --- # Upsell Offer Endpoint: `GET /offers/{id}/upsell` Returns every branded fare (fare family) for an offer's itinerary — same flights, different baggage and change rules. Same response shape as Search Offers. See the Offer Upsell guide. ### Available on Search Offers already returns every fare on every other channel — Upsell only exists for channels where it doesn't. This list grows as more such channels are added. - Turkish - British Airways - Emirates - Finnair - Travelport - FlyNas - WizzAir - Flayer K (Ryanair) ### Response fields #### 200 OK `flights_options` array of objects REQUIRED One entry per bookable flight-and-price combination. Each option references flights, fares and passengers by id from the top-level arrays below rather than repeating them. `flights_options[].flights` array of objects REQUIRED The journey this option covers — one or more segments joined into a single flight, referenced by id. >= 1 items `flights_options[].flights[].id` string Identifier of the flight within this response. Example: F1 `flights_options[].flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `flights_options[].flights[].segments` array of strings REQUIRED Segment ids that make up this flight — look them up in the top-level segments array. >= 1 items Example: ["63299a951af83376ede02bb8"] `flights_options[].offers` array of objects REQUIRED The bookable prices for this flight, one per validating carrier or fare combination. Use an offer's id to price or book it. >= 1 items `flights_options[].offers[].id` string REQUIRED Identifies this offer. Use it in Price Offer and Create Order. Example: LH_6322c0cc1af833380f7e7bc5 `flights_options[].offers[].channel` string REQUIRED Name of the channel this offer came from, matching a channel on your DRCT account. Example: Lufthansa Group `flights_options[].offers[].expire_at` date-time When this offer stops being bookable. Depends on the channel; max TTL is 30 minutes. Example: 2022-09-20T14:46:15+03:00 `flights_options[].offers[].fares` array of objects REQUIRED The fares this offer is built from, referenced by id. `flights_options[].offers[].fares[].id` string Fare id — look it up in the top-level fares array for the full fare rules. Example: 6329a0ff1af83376ede02bc5 `flights_options[].offers[].fares[].segments` array of strings REQUIRED Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `flights_options[].offers[].price` object REQUIRED Total price for all passengers on this offer. `flights_options[].offers[].price.amount` number A positive number representing the amount of money. Example: 100.0 `flights_options[].offers[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `flights_options[].offers[].price_details` array of objects REQUIRED Price broken down by passenger type — how the total above is composed. `flights_options[].offers[].price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `flights_options[].offers[].price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `flights_options[].offers[].price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `flights_options[].offers[].price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `flights_options[].offers[].price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `flights_options[].offers[].price_details[].fare` object The fare portion of the price, excluding taxes. `flights_options[].offers[].price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `flights_options[].offers[].price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `flights_options[].offers[].price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `flights_options[].offers[].price_details[].taxes` object The tax portion of the price, excluding fare. `flights_options[].offers[].price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `flights_options[].offers[].price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `flights_options[].offers[].price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `passengers` array of objects REQUIRED The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object Present once identity details have been collected for this traveller. `passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passengers[].individual.title` string Personal title — required by some channels. Example: Mr `passengers[].individual.gender` string M or F. Allowed values: M F `passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `fares` array of objects REQUIRED The fare rules and cabin/baggage conditions for this booking. `fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `fares[].changes` object Whether and how this booking can be changed after issuance. `fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `segments` array of objects REQUIRED Every flown leg referenced by the options above — airports, carrier, and scheduled times, de-duplicated at the top level. `segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `segments[].departure_airport` object REQUIRED Airport this segment departs from. `segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `segments[].departure_city` object REQUIRED City this segment departs from. `segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `segments[].arrival_city` object REQUIRED City this segment arrives at. `segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `segments[].departure_terminal` string Departure terminal, when known. Example: D `segments[].arrival_terminal` string Arrival terminal, when known. Example: A `segments[].meal` string Meal code, airline-specific. Example: R `segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `segments[].stops[].airport` object REQUIRED Airport of the technical stop. `segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ #### 422 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: validation_error `error.message` string REQUIRED A human-readable error description. Example: 'value' is not a valid offer_id #### Example: 200 OK ``` { "flights_options": [ { "flights": [ { "id": "F1", "journey_time": 5400, "segments": ["63299a951af83376ede02bb8"] } ], "offers": [ { "id": "LH_6322c0cc1af833380f7e7bc5", "channel": "Lufthansa Group", "expire_at": "2026-09-27T14:46:15+03:00", "price": { "amount": 182.4, "currency": "EUR" } }, { "id": "LH_6322c0cc1af833380f7e7bc6", "channel": "Lufthansa Group", "expire_at": "2026-09-27T14:46:15+03:00", "price": { "amount": 238.9, "currency": "EUR" } } ] } ], "segments": [ /* … */ ], "fares": [ /* … */ ], "passengers": [{ "id": "PAX1", "type": "ADT" }] } ``` #### Example: 422 ``` { "error": { "code": "validation_error", "message": "'value' is not a valid offer_id" } } ``` --- # Fare Rules Endpoint: `GET /offers/{id}/fare_rules` Returns the provider's raw rule text, grouped by route and category, for showing change and refund conditions verbatim. Channels without it return 501 not_implemented_error — use fares.changes and fares.cancellation instead. For a booked order, use Order Fare Rules. ### Response fields #### 200 OK `[].route` string REQUIRED The departure–arrival airport pair this rule applies to. Example: FRA-CDG `[].name` string REQUIRED Short, provider-defined name of the rule. Example: Day and/or Time Application `[].category` string Provider-defined category code for the rule. Example: APP `[].text` string REQUIRED The rule's full text, verbatim from the provider — display as-is, don't parse it. Example: NO DAY/TIME TRAVEL RESTRICTIONS #### 422 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: validation_error `error.message` string REQUIRED A human-readable error description. Example: 'value' is not a valid offer_id #### 501 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_implemented_error `error.message` string REQUIRED A human-readable error description. Example: Method not implemented for current provider #### Example: 200 OK ``` [ { "route": "WAW-FRA", "category": "APP", "name": "Day and/or Time Application", "text": "NO DAY/TIME TRAVEL RESTRICTIONS" } ] ``` #### Example: 422 ``` { "error": { "code": "validation_error", "message": "'value' is not a valid offer_id" } } ``` #### Example: 501 ``` { "error": { "code": "not_implemented_error", "message": "Method not implemented for current provider" } } ``` --- # Shop Offer Ancillaries Endpoint: `GET /offers/{id}/ancillaries` Shop baggage for an priced offer before the order exists, then pass the chosen ids in Create Order 's ancillaries array. Channels without offer baggage return channel_is_off. ### Response fields #### 200 OK `ancillaries` array of objects REQUIRED The ancillary services available for the order. `ancillaries[].id` string REQUIRED Unique ancillary id — use it when confirming the ancillary. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `ancillaries[].name` string REQUIRED Name of the ancillary service. Example: Bag 20 KG `ancillaries[].type` string REQUIRED baggage for bags, service for any other extra (priority boarding, check-in, special assistance…). Allowed values: baggage service `ancillaries[].price` object REQUIRED Total price for all passengers on this offer. `ancillaries[].price.amount` number A positive number representing the amount of money. Example: 100.0 `ancillaries[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `ancillaries[].max_quantity` integer Maximum quantity per passenger, when reported by the provider. Example: 1 `ancillaries[].segments` array of strings REQUIRED Segment ids the ancillary is bound to. Empty in the shop list for a service that applies to the passenger on the whole order (e.g. special assistance); once confirmed, the order shows it with the flight's segments. `ancillaries[].passengers` array of strings Passenger ids the ancillary applies to, when the provider scopes it per passenger. Omitted otherwise. #### 422 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: validation_error `error.message` string REQUIRED A human-readable error description. Example: 'value' is not a valid offer_id #### Example: 200 OK ``` { "ancillaries": [ { "id": "STB1", "name": "Checked Bag 20 KG", "type": "baggage", "price": { "amount": 32.0, "currency": "EUR" }, "max_quantity": 2, "segments": ["SEG_M_1"], "passengers": ["PAX_1"] } ] } ``` #### Example: 422 ``` { "error": { "code": "validation_error", "message": "'value' is not a valid offer_id" } } ``` --- # Create Order Endpoint: `POST /orders` Creates a booking for one offer and up to nine passengers, and returns a PNR. Names must match the travel document exactly. The order is held until cancel_before, then deleted automatically. At least one phone number and one email address are required across the passenger list — not per passenger. See the Order Creation guide. ### Body parameters `offer_id` string REQUIRED The priced offer you are booking. Expired offers return offer_not_found. `passengers` array of objects · 1–9 REQUIRED Reuse the id and type returned by search or pricing. >= 1 items `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object REQUIRED first_name, last_name required; title, gender, date_of_birth required by some providers. `passengers[].phone` string Phone number for this passenger. Counts toward the at-least-one-phone requirement below. Example: +442079460000 `passengers[].email` string Email address for this passenger. Counts toward the at-least-one-email requirement below. Example: example@mail.com `passengers[].document` object Number, gender, citizenship, country of issue, expiration date. Optional for most channels, but send it whenever you have it — it prevents failures at issue time. `ancillaries` array of objects Baggage shopped on the offer via Shop Offer Ancillaries and confirmed together with the order. Supported only on channels with offer baggage enabled (e.g. FlyOne); other channels return channel_is_off. `ancillaries[].id` string REQUIRED Ancillary id obtained from the Shop Offer Ancillaries response. Example: STB1 `ancillaries[].passenger_id` string REQUIRED Passenger id from this order (passengers[].id). Example: PAX_1 `ancillaries[].quantity` integer Quantity for this passenger; must not exceed max_quantity. Optional, defaults to 1. Not supported by every provider — where unsupported, send a separate ancillaries entry per passenger instead. Example: 1 ### Response fields #### 201 CREATED `id` string REQUIRED Identifies this order. Example: 6e5257be-d8d4-484f-8db0-922df4c8402a `channel` string REQUIRED Name of the channel this order was booked through. Example: Lufthansa Group `locator` string REQUIRED The PNR locator supplied by the provider — what you'd read out to the passenger. Example: C57I60 `status` string REQUIRED Current lifecycle status of the order — changes as operations are applied to it. pending means the provider accepted the order for issuing but hasn't returned tickets yet; it becomes issued once they arrive. Only returned on DRCT-Version: 2026-09-01 — on 2021-06-01 the same order still reports as issued. Turns refunded once a confirmed refund settles — see the Refund guide. Allowed values: new pending voided issued refunded deleted `airline_locators` array of objects PNR locators supplied directly by the airlines involved, when different from the top-level locator. `airline_locators[].locator` string REQUIRED The airline's own PNR locator. Example: C57I60 `airline_locators[].carrier` string REQUIRED IATA 2-letter code of the airline that issued this locator. Example: LH Match pattern: ^[\dA-Z]{2}$ `cancel_before` date-time If the order isn't issued by this time, it's deleted automatically. Example: 2022-10-08T11:44:45.000+03:00 `price_expires_at` date-time When the guaranteed price expires — present only while the order is new. Past this time, re-quote via Reprice Order before issuing with reshop: true. Continuous-pricing channels never freeze a price, so this is set to the booking time (already in the past) as a standing signal to always re-quote first. Example: 2022-10-08T11:44:45.000+03:00 `passengers` array of objects The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). >= 1 items `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object Present once identity details have been collected for this traveller. `passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passengers[].individual.title` string Personal title — required by some channels. Example: Mr `passengers[].individual.gender` string M or F. Allowed values: M F `passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `flights` array of objects The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `flights[].segments` array of objects REQUIRED The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `flights[].segments[].departure_airport` object REQUIRED Airport this segment departs from. `flights[].segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].departure_city` object REQUIRED City this segment departs from. `flights[].segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `flights[].segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].arrival_city` object REQUIRED City this segment arrives at. `flights[].segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `flights[].segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `flights[].segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `flights[].segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `flights[].segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `flights[].segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `flights[].segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `flights[].segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `flights[].segments[].departure_terminal` string Departure terminal, when known. Example: D `flights[].segments[].arrival_terminal` string Arrival terminal, when known. Example: A `flights[].segments[].meal` string Meal code, airline-specific. Example: R `flights[].segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `flights[].segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `flights[].segments[].stops[].airport` object REQUIRED Airport of the technical stop. `flights[].segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ `fares` array of objects The fare rules and cabin/baggage conditions for this booking. >= 1 items `fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `fares[].changes` object Whether and how this booking can be changed after issuance. `fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `phones` array of objects Contact phone numbers collected for this order. >= 1 items `phones[].number` string REQUIRED International phone number. Example: +442079460000 `phones[].type` string A free-form label for the number. Example: Mobile `phones[].passengers` array of strings Passenger ids this number is associated with. >= 1 items Example: ["PAX1"] `emails` array of objects Contact email addresses collected for this order. >= 1 items `emails[].address` string REQUIRED A valid email address. Example: example@mail.com `emails[].type` string A free-form label for the address. Example: work `emails[].passengers` array of strings Passenger ids this address is associated with. >= 1 items Example: ["PAX1"] `tickets` array of objects Electronic tickets issued for this order, one per passenger per fare. `tickets[].number` string REQUIRED The airline's ticket number. Example: 2205740877684 `tickets[].passenger` string REQUIRED Passenger id this ticket was issued for. Example: PAX1 `tickets[].segments` array of strings REQUIRED Segment ids covered by this ticket. >= 1 items Example: ["63299a951af83376ede02bb8"] `tickets[].status` string REQUIRED Current ticket status. Example: TICKETED `tickets[].commission` number Agent commission applied to this ticket. Example: 10 `tickets[].nett_total` number The ticket's price before commission. Example: 4680.79 `tickets[].last_transaction_at` date-time When this ticket's status last changed. Example: 2022-10-07T12:32:21+03:00 `tickets[].ticketing_office` string Office id that issued the ticket. Example: AH89 `tickets[].booking_office` string Office id that created the order. Example: AH89 `documents` array of objects Identity documents collected for the passengers on this order. `documents[].passenger` string REQUIRED Passenger id this document belongs to. Example: PAX1 `documents[].number` string REQUIRED Document number. Example: AA234567 `documents[].citizenship` string REQUIRED ISO 3166-1 alpha-2 country code of citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].expiration_date` date REQUIRED Document expiration date. Example: 2026-09-11 `documents[].date_of_birth` date REQUIRED Passenger's date of birth, as stated on the document. Example: 1990-10-01 `documents[].gender` string REQUIRED M or F, as stated on the document. Allowed values: M F `documents[].country_of_issue` string Country the document was issued in, if different from citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].segments` array of strings Segment ids this document was submitted for. >= 1 items Example: ["63299a951af83376ede02bb8"] `documents[].action_code` string PNR action code returned by the airline for this document. Example: HK `documents[].carrier` string IATA 2-letter code of the airline that requested this document. Example: LH Match pattern: ^[\dA-Z]{2}$ `documents[].ssr_code` string PNR SSR code returned by the airline for this document. Example: DOCS `documents[].type` string Document type as returned by the airline, usually a short code. Example: P `ancillaries` array of objects Ancillary services confirmed on this order. `ancillaries[].id` string Unique ancillary id. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `ancillaries[].name` string REQUIRED Name of the ancillary service. Example: Bag 20 KG `ancillaries[].type` string REQUIRED baggage for bags, service for any other extra. Allowed values: baggage service `ancillaries[].price` object REQUIRED Total price for all passengers on this offer. `ancillaries[].price.amount` number A positive number representing the amount of money. Example: 100.0 `ancillaries[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `ancillaries[].segments` array of strings REQUIRED Segment ids the ancillary is bound to. `ancillaries[].passenger` string REQUIRED Passenger id the ancillary is assigned to. Example: PAX_1 `ancillaries[].status` string Status of the ancillary within the order. Allowed values: confirmed pending issued cancelled `seat_maps` array of objects Seats confirmed on this order, see the Seat Maps guide. `seat_maps[].passenger` string REQUIRED Passenger id the seat is assigned to. Example: PAX_1 `seat_maps[].segment` string REQUIRED Segment id the seat is on. Example: SEG_M_1 `seat_maps[].designator` string REQUIRED The chosen seat. Example: 12A `seat_maps[].price` object REQUIRED Total price for all passengers on this offer. `seat_maps[].price.amount` number A positive number representing the amount of money. Example: 100.0 `seat_maps[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `seat_maps[].status` string Status of the seat on the order, when reported. Example: issued `emds` array of objects Electronic documents (EMDs) issued on this order — e.g. a confirmed seat or a post-booking ancillary, once ticketed. `emds[].number` string REQUIRED EMD document number. Example: ZZ655S `emds[].name` string Human-readable name of the document (e.g. the seat or bag), when the provider reports it. Example: Seat 01A `emds[].passenger` string REQUIRED Passenger the EMD is issued for. Example: PAX_1 `emds[].price` object REQUIRED Total price for all passengers on this offer. `emds[].price.amount` number A positive number representing the amount of money. Example: 100.0 `emds[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `emds[].segments` array of strings REQUIRED Segment ids the EMD applies to. `price` object Total price for the order. `price.amount` number A positive number representing the amount of money. Example: 100.0 `price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details` array of objects Price broken down by passenger type. `price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare` object The fare portion of the price, excluding taxes. `price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `price_details[].taxes` object The tax portion of the price, excluding fare. `price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `deleted_at` date-time When the order was deleted, if it has been. Example: 2022-10-07T12:32:21+03:00 #### 422 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: validation_error `error.message` string REQUIRED A human-readable error description. Example: {'passengers':{'0':{'document':['is missing']}}} Creating an order does not hold the price. Between create and issue the channel may reprice — handle price_changed. #### Example: Request · cURL ``` curl -X POST https://sandbox-api.drct.aero/orders \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "offer_id": "LH_6322c0cc1af833380f7e7bc5", "passengers": [ { "id": "PAX1", "type": "ADT", "individual": { "first_name": "James", "last_name": "Watson", "title": "Mr", "gender": "M", "date_of_birth": "1990-10-01" }, "phone": "+442079460000", "email": "james@example.com", "document": { "number": "AA234567", "gender": "M", "citizenship": "UA", "country_of_issue": "UA", "expiration_date": "2030-09-11" } } ] }' ``` #### Example: 201 CREATED ``` { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "status": "new", "channel": "Lufthansa Group", "locator": "C57I60", "cancel_before": "2026-09-28T11:44:45+03:00", "price": { "amount": 186.9, "currency": "EUR" }, "passengers": [ { "id": "PAX1", "type": "ADT", "individual": { "first_name": "James", "last_name": "Watson", "title": "Mr", "gender": "M", "date_of_birth": "1990-10-01" } } ], "tickets": [] } ``` #### Example: 422 ``` { "error": { "code": "validation_error", "message": "{'passengers':{'0':{'document':['is missing']}}}" } } ``` --- # Issue Order Endpoint: `POST /orders/{id}/issue` Pays for the order and issues electronic tickets. Status becomes issued and every passenger gets a ticket number. This is the only irreversible call in the flow. See the Tickets Issuing guide. `reshop` boolean Send true to accept a new price after a price_changed error. With false the call fails instead of charging a different amount. Default: false `form_of_payment` object type: cash (default, settled against your DRCT balance) or credit_card with holder, number, expiry and CVV. Card payment is enabled per channel. `form_of_payment.type` string REQUIRED Type of payment source. Allowed values: cash credit_card Default: cash `form_of_payment.credit_card` object Credit card information to make payment. Should be passed only if type is credit_card. Currently available for specific channels. `form_of_payment.credit_card.holder` string REQUIRED Full cardholder name. Example: John Smith `form_of_payment.credit_card.number` string REQUIRED Full card number. Example: 5577810000000004 Match pattern: ^\d{12,19}$ `form_of_payment.credit_card.exp_month` string REQUIRED Expiration month of the card. Example: 07 Match pattern: ^\d{2}$ `form_of_payment.credit_card.exp_year` string REQUIRED Expiration year of the card. Example: 2027 Match pattern: ^\d{4}$ `form_of_payment.credit_card.cvv` string Verification code of the card. Could be required for some channels. Example: 033 Match pattern: ^\d{3,4}$ ### Response fields #### 200 OK `id` string REQUIRED Identifies this order. Example: 6e5257be-d8d4-484f-8db0-922df4c8402a `channel` string REQUIRED Name of the channel this order was booked through. Example: Lufthansa Group `locator` string REQUIRED The PNR locator supplied by the provider — what you'd read out to the passenger. Example: C57I60 `status` string REQUIRED Current lifecycle status of the order — changes as operations are applied to it. pending means the provider accepted the order for issuing but hasn't returned tickets yet; it becomes issued once they arrive. Only returned on DRCT-Version: 2026-09-01 — on 2021-06-01 the same order still reports as issued. Turns refunded once a confirmed refund settles — see the Refund guide. Allowed values: new pending voided issued refunded deleted `airline_locators` array of objects PNR locators supplied directly by the airlines involved, when different from the top-level locator. `airline_locators[].locator` string REQUIRED The airline's own PNR locator. Example: C57I60 `airline_locators[].carrier` string REQUIRED IATA 2-letter code of the airline that issued this locator. Example: LH Match pattern: ^[\dA-Z]{2}$ `cancel_before` date-time If the order isn't issued by this time, it's deleted automatically. Example: 2022-10-08T11:44:45.000+03:00 `price_expires_at` date-time When the guaranteed price expires — present only while the order is new. Past this time, re-quote via Reprice Order before issuing with reshop: true. Continuous-pricing channels never freeze a price, so this is set to the booking time (already in the past) as a standing signal to always re-quote first. Example: 2022-10-08T11:44:45.000+03:00 `passengers` array of objects The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). >= 1 items `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object Present once identity details have been collected for this traveller. `passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passengers[].individual.title` string Personal title — required by some channels. Example: Mr `passengers[].individual.gender` string M or F. Allowed values: M F `passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `flights` array of objects The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `flights[].segments` array of objects REQUIRED The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `flights[].segments[].departure_airport` object REQUIRED Airport this segment departs from. `flights[].segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].departure_city` object REQUIRED City this segment departs from. `flights[].segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `flights[].segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].arrival_city` object REQUIRED City this segment arrives at. `flights[].segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `flights[].segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `flights[].segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `flights[].segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `flights[].segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `flights[].segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `flights[].segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `flights[].segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `flights[].segments[].departure_terminal` string Departure terminal, when known. Example: D `flights[].segments[].arrival_terminal` string Arrival terminal, when known. Example: A `flights[].segments[].meal` string Meal code, airline-specific. Example: R `flights[].segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `flights[].segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `flights[].segments[].stops[].airport` object REQUIRED Airport of the technical stop. `flights[].segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ `fares` array of objects The fare rules and cabin/baggage conditions for this booking. >= 1 items `fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `fares[].changes` object Whether and how this booking can be changed after issuance. `fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `phones` array of objects Contact phone numbers collected for this order. >= 1 items `phones[].number` string REQUIRED International phone number. Example: +442079460000 `phones[].type` string A free-form label for the number. Example: Mobile `phones[].passengers` array of strings Passenger ids this number is associated with. >= 1 items Example: ["PAX1"] `emails` array of objects Contact email addresses collected for this order. >= 1 items `emails[].address` string REQUIRED A valid email address. Example: example@mail.com `emails[].type` string A free-form label for the address. Example: work `emails[].passengers` array of strings Passenger ids this address is associated with. >= 1 items Example: ["PAX1"] `tickets` array of objects Electronic tickets issued for this order, one per passenger per fare. `tickets[].number` string REQUIRED The airline's ticket number. Example: 2205740877684 `tickets[].passenger` string REQUIRED Passenger id this ticket was issued for. Example: PAX1 `tickets[].segments` array of strings REQUIRED Segment ids covered by this ticket. >= 1 items Example: ["63299a951af83376ede02bb8"] `tickets[].status` string REQUIRED Current ticket status. Example: TICKETED `tickets[].commission` number Agent commission applied to this ticket. Example: 10 `tickets[].nett_total` number The ticket's price before commission. Example: 4680.79 `tickets[].last_transaction_at` date-time When this ticket's status last changed. Example: 2022-10-07T12:32:21+03:00 `tickets[].ticketing_office` string Office id that issued the ticket. Example: AH89 `tickets[].booking_office` string Office id that created the order. Example: AH89 `documents` array of objects Identity documents collected for the passengers on this order. `documents[].passenger` string REQUIRED Passenger id this document belongs to. Example: PAX1 `documents[].number` string REQUIRED Document number. Example: AA234567 `documents[].citizenship` string REQUIRED ISO 3166-1 alpha-2 country code of citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].expiration_date` date REQUIRED Document expiration date. Example: 2026-09-11 `documents[].date_of_birth` date REQUIRED Passenger's date of birth, as stated on the document. Example: 1990-10-01 `documents[].gender` string REQUIRED M or F, as stated on the document. Allowed values: M F `documents[].country_of_issue` string Country the document was issued in, if different from citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].segments` array of strings Segment ids this document was submitted for. >= 1 items Example: ["63299a951af83376ede02bb8"] `documents[].action_code` string PNR action code returned by the airline for this document. Example: HK `documents[].carrier` string IATA 2-letter code of the airline that requested this document. Example: LH Match pattern: ^[\dA-Z]{2}$ `documents[].ssr_code` string PNR SSR code returned by the airline for this document. Example: DOCS `documents[].type` string Document type as returned by the airline, usually a short code. Example: P `ancillaries` array of objects Ancillary services confirmed on this order. `ancillaries[].id` string Unique ancillary id. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `ancillaries[].name` string REQUIRED Name of the ancillary service. Example: Bag 20 KG `ancillaries[].type` string REQUIRED baggage for bags, service for any other extra. Allowed values: baggage service `ancillaries[].price` object REQUIRED Total price for all passengers on this offer. `ancillaries[].price.amount` number A positive number representing the amount of money. Example: 100.0 `ancillaries[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `ancillaries[].segments` array of strings REQUIRED Segment ids the ancillary is bound to. `ancillaries[].passenger` string REQUIRED Passenger id the ancillary is assigned to. Example: PAX_1 `ancillaries[].status` string Status of the ancillary within the order. Allowed values: confirmed pending issued cancelled `seat_maps` array of objects Seats confirmed on this order, see the Seat Maps guide. `seat_maps[].passenger` string REQUIRED Passenger id the seat is assigned to. Example: PAX_1 `seat_maps[].segment` string REQUIRED Segment id the seat is on. Example: SEG_M_1 `seat_maps[].designator` string REQUIRED The chosen seat. Example: 12A `seat_maps[].price` object REQUIRED Total price for all passengers on this offer. `seat_maps[].price.amount` number A positive number representing the amount of money. Example: 100.0 `seat_maps[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `seat_maps[].status` string Status of the seat on the order, when reported. Example: issued `emds` array of objects Electronic documents (EMDs) issued on this order — e.g. a confirmed seat or a post-booking ancillary, once ticketed. `emds[].number` string REQUIRED EMD document number. Example: ZZ655S `emds[].name` string Human-readable name of the document (e.g. the seat or bag), when the provider reports it. Example: Seat 01A `emds[].passenger` string REQUIRED Passenger the EMD is issued for. Example: PAX_1 `emds[].price` object REQUIRED Total price for all passengers on this offer. `emds[].price.amount` number A positive number representing the amount of money. Example: 100.0 `emds[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `emds[].segments` array of strings REQUIRED Segment ids the EMD applies to. `price` object Total price for the order. `price.amount` number A positive number representing the amount of money. Example: 100.0 `price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details` array of objects Price broken down by passenger type. `price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare` object The fare portion of the price, excluding taxes. `price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `price_details[].taxes` object The tax portion of the price, excluding fare. `price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `deleted_at` date-time When the order was deleted, if it has been. Example: 2022-10-07T12:32:21+03:00 #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### 422 PRICE CHANGED `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: price_changed `error.message` string REQUIRED A human-readable error description. Example: {'old':186.9,'new':191.4,'currency':'EUR'} Issuing can take up to 60 seconds on some channels. Use a long client timeout and treat a timeout as unknown, not failed: re-read the order with Get Order before retrying. Some fares require a seat for every passenger before you can issue. If one hasn't been selected yet, this returns issue_required_seats — add it with Add Seats first. #### Example: Request · Default ``` curl -X POST https://sandbox-api.drct.aero/orders/6e5257be-d8d4-484f-8db0-922df4c8402a/issue \ -H "Authorization: Bearer $DRCT_API_KEY" \ -d '{ "reshop": false, "form_of_payment": { "type": "cash" } }' ``` #### Example: Request · Credit Card ``` curl -X POST https://sandbox-api.drct.aero/orders/6e5257be-d8d4-484f-8db0-922df4c8402a/issue \ -H "Authorization: Bearer $DRCT_API_KEY" \ -d '{ "reshop": false, "form_of_payment": { "type": "credit_card", "credit_card": { "holder": "John Smith", "number": "5577810000000004", "exp_month": "07", "exp_year": "2029", "cvv": "033" } } }' ``` #### Example: 200 OK ``` { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "status": "issued", "locator": "C57I60", "tickets": [ { "number": "2205740877684", "passenger": "PAX1", "status": "TICKETED", "nett_total": 176.9, "commission": 10 } ] } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` #### Example: 422 PRICE CHANGED ``` { "error": { "code": "price_changed", "message": "{'old':186.9,'new':191.4,'currency':'EUR'}" } } ``` --- # Get Order Endpoint: `GET /orders/{id}` Returns an order's current state: status, PNR locators, passengers, flights, fares, ancillaries and tickets. Treat it as the source of truth after any failed or timed-out call. GET /orders lists all your orders. ### Response fields #### 200 OK `id` string REQUIRED Identifies this order. Example: 6e5257be-d8d4-484f-8db0-922df4c8402a `channel` string REQUIRED Name of the channel this order was booked through. Example: Lufthansa Group `locator` string REQUIRED The PNR locator supplied by the provider — what you'd read out to the passenger. Example: C57I60 `status` string REQUIRED Current lifecycle status of the order — changes as operations are applied to it. pending means the provider accepted the order for issuing but hasn't returned tickets yet; it becomes issued once they arrive. Only returned on DRCT-Version: 2026-09-01 — on 2021-06-01 the same order still reports as issued. Turns refunded once a confirmed refund settles — see the Refund guide. Allowed values: new pending voided issued refunded deleted `airline_locators` array of objects PNR locators supplied directly by the airlines involved, when different from the top-level locator. `airline_locators[].locator` string REQUIRED The airline's own PNR locator. Example: C57I60 `airline_locators[].carrier` string REQUIRED IATA 2-letter code of the airline that issued this locator. Example: LH Match pattern: ^[\dA-Z]{2}$ `cancel_before` date-time If the order isn't issued by this time, it's deleted automatically. Example: 2022-10-08T11:44:45.000+03:00 `price_expires_at` date-time When the guaranteed price expires — present only while the order is new. Past this time, re-quote via Reprice Order before issuing with reshop: true. Continuous-pricing channels never freeze a price, so this is set to the booking time (already in the past) as a standing signal to always re-quote first. Example: 2022-10-08T11:44:45.000+03:00 `passengers` array of objects The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). >= 1 items `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object Present once identity details have been collected for this traveller. `passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passengers[].individual.title` string Personal title — required by some channels. Example: Mr `passengers[].individual.gender` string M or F. Allowed values: M F `passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `flights` array of objects The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `flights[].segments` array of objects REQUIRED The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `flights[].segments[].departure_airport` object REQUIRED Airport this segment departs from. `flights[].segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].departure_city` object REQUIRED City this segment departs from. `flights[].segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `flights[].segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].arrival_city` object REQUIRED City this segment arrives at. `flights[].segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `flights[].segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `flights[].segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `flights[].segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `flights[].segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `flights[].segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `flights[].segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `flights[].segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `flights[].segments[].departure_terminal` string Departure terminal, when known. Example: D `flights[].segments[].arrival_terminal` string Arrival terminal, when known. Example: A `flights[].segments[].meal` string Meal code, airline-specific. Example: R `flights[].segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `flights[].segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `flights[].segments[].stops[].airport` object REQUIRED Airport of the technical stop. `flights[].segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ `fares` array of objects The fare rules and cabin/baggage conditions for this booking. >= 1 items `fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `fares[].changes` object Whether and how this booking can be changed after issuance. `fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `phones` array of objects Contact phone numbers collected for this order. >= 1 items `phones[].number` string REQUIRED International phone number. Example: +442079460000 `phones[].type` string A free-form label for the number. Example: Mobile `phones[].passengers` array of strings Passenger ids this number is associated with. >= 1 items Example: ["PAX1"] `emails` array of objects Contact email addresses collected for this order. >= 1 items `emails[].address` string REQUIRED A valid email address. Example: example@mail.com `emails[].type` string A free-form label for the address. Example: work `emails[].passengers` array of strings Passenger ids this address is associated with. >= 1 items Example: ["PAX1"] `tickets` array of objects Electronic tickets issued for this order, one per passenger per fare. `tickets[].number` string REQUIRED The airline's ticket number. Example: 2205740877684 `tickets[].passenger` string REQUIRED Passenger id this ticket was issued for. Example: PAX1 `tickets[].segments` array of strings REQUIRED Segment ids covered by this ticket. >= 1 items Example: ["63299a951af83376ede02bb8"] `tickets[].status` string REQUIRED Current ticket status. Example: TICKETED `tickets[].commission` number Agent commission applied to this ticket. Example: 10 `tickets[].nett_total` number The ticket's price before commission. Example: 4680.79 `tickets[].last_transaction_at` date-time When this ticket's status last changed. Example: 2022-10-07T12:32:21+03:00 `tickets[].ticketing_office` string Office id that issued the ticket. Example: AH89 `tickets[].booking_office` string Office id that created the order. Example: AH89 `documents` array of objects Identity documents collected for the passengers on this order. `documents[].passenger` string REQUIRED Passenger id this document belongs to. Example: PAX1 `documents[].number` string REQUIRED Document number. Example: AA234567 `documents[].citizenship` string REQUIRED ISO 3166-1 alpha-2 country code of citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].expiration_date` date REQUIRED Document expiration date. Example: 2026-09-11 `documents[].date_of_birth` date REQUIRED Passenger's date of birth, as stated on the document. Example: 1990-10-01 `documents[].gender` string REQUIRED M or F, as stated on the document. Allowed values: M F `documents[].country_of_issue` string Country the document was issued in, if different from citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].segments` array of strings Segment ids this document was submitted for. >= 1 items Example: ["63299a951af83376ede02bb8"] `documents[].action_code` string PNR action code returned by the airline for this document. Example: HK `documents[].carrier` string IATA 2-letter code of the airline that requested this document. Example: LH Match pattern: ^[\dA-Z]{2}$ `documents[].ssr_code` string PNR SSR code returned by the airline for this document. Example: DOCS `documents[].type` string Document type as returned by the airline, usually a short code. Example: P `ancillaries` array of objects Ancillary services confirmed on this order. `ancillaries[].id` string Unique ancillary id. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `ancillaries[].name` string REQUIRED Name of the ancillary service. Example: Bag 20 KG `ancillaries[].type` string REQUIRED baggage for bags, service for any other extra. Allowed values: baggage service `ancillaries[].price` object REQUIRED Total price for all passengers on this offer. `ancillaries[].price.amount` number A positive number representing the amount of money. Example: 100.0 `ancillaries[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `ancillaries[].segments` array of strings REQUIRED Segment ids the ancillary is bound to. `ancillaries[].passenger` string REQUIRED Passenger id the ancillary is assigned to. Example: PAX_1 `ancillaries[].status` string Status of the ancillary within the order. Allowed values: confirmed pending issued cancelled `seat_maps` array of objects Seats confirmed on this order, see the Seat Maps guide. `seat_maps[].passenger` string REQUIRED Passenger id the seat is assigned to. Example: PAX_1 `seat_maps[].segment` string REQUIRED Segment id the seat is on. Example: SEG_M_1 `seat_maps[].designator` string REQUIRED The chosen seat. Example: 12A `seat_maps[].price` object REQUIRED Total price for all passengers on this offer. `seat_maps[].price.amount` number A positive number representing the amount of money. Example: 100.0 `seat_maps[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `seat_maps[].status` string Status of the seat on the order, when reported. Example: issued `emds` array of objects Electronic documents (EMDs) issued on this order — e.g. a confirmed seat or a post-booking ancillary, once ticketed. `emds[].number` string REQUIRED EMD document number. Example: ZZ655S `emds[].name` string Human-readable name of the document (e.g. the seat or bag), when the provider reports it. Example: Seat 01A `emds[].passenger` string REQUIRED Passenger the EMD is issued for. Example: PAX_1 `emds[].price` object REQUIRED Total price for all passengers on this offer. `emds[].price.amount` number A positive number representing the amount of money. Example: 100.0 `emds[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `emds[].segments` array of strings REQUIRED Segment ids the EMD applies to. `price` object Total price for the order. `price.amount` number A positive number representing the amount of money. Example: 100.0 `price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details` array of objects Price broken down by passenger type. `price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare` object The fare portion of the price, excluding taxes. `price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `price_details[].taxes` object The tax portion of the price, excluding fare. `price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `deleted_at` date-time When the order was deleted, if it has been. Example: 2022-10-07T12:32:21+03:00 #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### Example: 200 OK ``` { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "status": "issued", "locator": "C57I60", "airline_locators": [ { "locator": "C57I60", "carrier": "LH" } ], "flights": [ /* segments with times, terminals */ ], "ancillaries": [ { "name": "Bag 20 KG", "type": "baggage", "passenger": "PAX_1", "status": "issued" } ], "deleted_at": null } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` --- # List Orders Endpoint: `GET /orders` Returns all your orders as a JSON array, each shaped like a Get Order response. No filtering or pagination — to check one booking, call Get Order. ### Response fields The response is an array; every item is an order with the fields below. `[].id` string REQUIRED Identifies this order. Example: 6e5257be-d8d4-484f-8db0-922df4c8402a `[].channel` string REQUIRED Name of the channel this order was booked through. Example: Lufthansa Group `[].locator` string REQUIRED The PNR locator supplied by the provider — what you'd read out to the passenger. Example: C57I60 `[].status` string REQUIRED Current lifecycle status of the order — changes as operations are applied to it. pending means the provider accepted the order for issuing but hasn't returned tickets yet; it becomes issued once they arrive. Only returned on DRCT-Version: 2026-09-01 — on 2021-06-01 the same order still reports as issued. Turns refunded once a confirmed refund settles — see the Refund guide. Allowed values: new pending voided issued refunded deleted `[].airline_locators` array of objects PNR locators supplied directly by the airlines involved, when different from the top-level locator. `[].airline_locators[].locator` string REQUIRED The airline's own PNR locator. Example: C57I60 `[].airline_locators[].carrier` string REQUIRED IATA 2-letter code of the airline that issued this locator. Example: LH Match pattern: ^[\dA-Z]{2}$ `[].cancel_before` date-time If the order isn't issued by this time, it's deleted automatically. Example: 2022-10-08T11:44:45.000+03:00 `[].price_expires_at` date-time When the guaranteed price expires — present only while the order is new. Past this time, re-quote via Reprice Order before issuing with reshop: true. Continuous-pricing channels never freeze a price, so this is set to the booking time (already in the past) as a standing signal to always re-quote first. Example: 2022-10-08T11:44:45.000+03:00 `[].passengers` array of objects The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). >= 1 items `[].passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `[].passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `[].passengers[].individual` object Present once identity details have been collected for this traveller. `[].passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `[].passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `[].passengers[].individual.title` string Personal title — required by some channels. Example: Mr `[].passengers[].individual.gender` string M or F. Allowed values: M F `[].passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `[].passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `[].flights` array of objects The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `[].flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `[].flights[].segments` array of objects REQUIRED The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `[].flights[].segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `[].flights[].segments[].departure_airport` object REQUIRED Airport this segment departs from. `[].flights[].segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `[].flights[].segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `[].flights[].segments[].departure_city` object REQUIRED City this segment departs from. `[].flights[].segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `[].flights[].segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `[].flights[].segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `[].flights[].segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `[].flights[].segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `[].flights[].segments[].arrival_city` object REQUIRED City this segment arrives at. `[].flights[].segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `[].flights[].segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `[].flights[].segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `[].flights[].segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `[].flights[].segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `[].flights[].segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `[].flights[].segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `[].flights[].segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `[].flights[].segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `[].flights[].segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `[].flights[].segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `[].flights[].segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `[].flights[].segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `[].flights[].segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `[].flights[].segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `[].flights[].segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `[].flights[].segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `[].flights[].segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `[].flights[].segments[].departure_terminal` string Departure terminal, when known. Example: D `[].flights[].segments[].arrival_terminal` string Arrival terminal, when known. Example: A `[].flights[].segments[].meal` string Meal code, airline-specific. Example: R `[].flights[].segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `[].flights[].segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `[].flights[].segments[].stops[].airport` object REQUIRED Airport of the technical stop. `[].flights[].segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `[].flights[].segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `[].flights[].segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `[].flights[].segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `[].flights[].segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `[].flights[].segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ `[].fares` array of objects The fare rules and cabin/baggage conditions for this booking. >= 1 items `[].fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `[].fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `[].fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `[].fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `[].fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `[].fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `[].fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `[].fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `[].fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `[].fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `[].fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `[].fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `[].fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `[].fares[].changes` object Whether and how this booking can be changed after issuance. `[].fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `[].fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `[].fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `[].fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `[].fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `[].fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `[].fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `[].fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `[].fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `[].fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `[].fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `[].fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `[].fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `[].fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].phones` array of objects Contact phone numbers collected for this order. >= 1 items `[].phones[].number` string REQUIRED International phone number. Example: +442079460000 `[].phones[].type` string A free-form label for the number. Example: Mobile `[].phones[].passengers` array of strings Passenger ids this number is associated with. >= 1 items Example: ["PAX1"] `[].emails` array of objects Contact email addresses collected for this order. >= 1 items `[].emails[].address` string REQUIRED A valid email address. Example: example@mail.com `[].emails[].type` string A free-form label for the address. Example: work `[].emails[].passengers` array of strings Passenger ids this address is associated with. >= 1 items Example: ["PAX1"] `[].tickets` array of objects Electronic tickets issued for this order, one per passenger per fare. `[].tickets[].number` string REQUIRED The airline's ticket number. Example: 2205740877684 `[].tickets[].passenger` string REQUIRED Passenger id this ticket was issued for. Example: PAX1 `[].tickets[].segments` array of strings REQUIRED Segment ids covered by this ticket. >= 1 items Example: ["63299a951af83376ede02bb8"] `[].tickets[].status` string REQUIRED Current ticket status. Example: TICKETED `[].tickets[].commission` number Agent commission applied to this ticket. Example: 10 `[].tickets[].nett_total` number The ticket's price before commission. Example: 4680.79 `[].tickets[].last_transaction_at` date-time When this ticket's status last changed. Example: 2022-10-07T12:32:21+03:00 `[].tickets[].ticketing_office` string Office id that issued the ticket. Example: AH89 `[].tickets[].booking_office` string Office id that created the order. Example: AH89 `[].documents` array of objects Identity documents collected for the passengers on this order. `[].documents[].passenger` string REQUIRED Passenger id this document belongs to. Example: PAX1 `[].documents[].number` string REQUIRED Document number. Example: AA234567 `[].documents[].citizenship` string REQUIRED ISO 3166-1 alpha-2 country code of citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `[].documents[].expiration_date` date REQUIRED Document expiration date. Example: 2026-09-11 `[].documents[].date_of_birth` date REQUIRED Passenger's date of birth, as stated on the document. Example: 1990-10-01 `[].documents[].gender` string REQUIRED M or F, as stated on the document. Allowed values: M F `[].documents[].country_of_issue` string Country the document was issued in, if different from citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `[].documents[].segments` array of strings Segment ids this document was submitted for. >= 1 items Example: ["63299a951af83376ede02bb8"] `[].documents[].action_code` string PNR action code returned by the airline for this document. Example: HK `[].documents[].carrier` string IATA 2-letter code of the airline that requested this document. Example: LH Match pattern: ^[\dA-Z]{2}$ `[].documents[].ssr_code` string PNR SSR code returned by the airline for this document. Example: DOCS `[].documents[].type` string Document type as returned by the airline, usually a short code. Example: P `[].ancillaries` array of objects Ancillary services confirmed on this order. `[].ancillaries[].id` string Unique ancillary id. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `[].ancillaries[].name` string REQUIRED Name of the ancillary service. Example: Bag 20 KG `[].ancillaries[].type` string REQUIRED baggage for bags, service for any other extra. Allowed values: baggage service `[].ancillaries[].price` object REQUIRED Total price for all passengers on this offer. `[].ancillaries[].price.amount` number A positive number representing the amount of money. Example: 100.0 `[].ancillaries[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].ancillaries[].segments` array of strings REQUIRED Segment ids the ancillary is bound to. `[].ancillaries[].passenger` string REQUIRED Passenger id the ancillary is assigned to. Example: PAX_1 `[].ancillaries[].status` string Status of the ancillary within the order. Allowed values: confirmed pending issued cancelled `[].seat_maps` array of objects Seats confirmed on this order, see the Seat Maps guide. `[].seat_maps[].passenger` string REQUIRED Passenger id the seat is assigned to. Example: PAX_1 `[].seat_maps[].segment` string REQUIRED Segment id the seat is on. Example: SEG_M_1 `[].seat_maps[].designator` string REQUIRED The chosen seat. Example: 12A `[].seat_maps[].price` object REQUIRED Total price for all passengers on this offer. `[].seat_maps[].price.amount` number A positive number representing the amount of money. Example: 100.0 `[].seat_maps[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].seat_maps[].status` string Status of the seat on the order, when reported. Example: issued `[].emds` array of objects Electronic documents (EMDs) issued on this order — e.g. a confirmed seat or a post-booking ancillary, once ticketed. `[].emds[].number` string REQUIRED EMD document number. Example: ZZ655S `[].emds[].name` string Human-readable name of the document (e.g. the seat or bag), when the provider reports it. Example: Seat 01A `[].emds[].passenger` string REQUIRED Passenger the EMD is issued for. Example: PAX_1 `[].emds[].price` object REQUIRED Total price for all passengers on this offer. `[].emds[].price.amount` number A positive number representing the amount of money. Example: 100.0 `[].emds[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].emds[].segments` array of strings REQUIRED Segment ids the EMD applies to. `[].price` object Total price for the order. `[].price.amount` number A positive number representing the amount of money. Example: 100.0 `[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].price_details` array of objects Price broken down by passenger type. `[].price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `[].price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `[].price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `[].price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `[].price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].price_details[].fare` object The fare portion of the price, excluding taxes. `[].price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `[].price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `[].price_details[].taxes` object The tax portion of the price, excluding fare. `[].price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `[].price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `[].price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `[].deleted_at` date-time When the order was deleted, if it has been. Example: 2022-10-07T12:32:21+03:00 #### Example: 200 OK ``` [ { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "status": "issued", "locator": "C57I60", "airline_locators": [ { "locator": "C57I60", "carrier": "LH" } ], "flights": [ /* segments with times, terminals */ ], "deleted_at": null }, { /* … one object per order, same shape as Get Order */ } ] ``` --- # Reprice Order Endpoint: `GET /orders/{id}/reprice` Re-quotes the current price of an order and reports whether it changed. Call this once price_expires_at has passed, then issue with reshop: true to accept the new price. See the Price Change guide. ### Response fields #### 200 OK `old_price` object The order's price before this re-quote. `old_price.amount` number A positive number representing the amount of money. Example: 100.0 `old_price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `new_price` object The freshly quoted price — pass this to issue if price_changed is true. `new_price.amount` number A positive number representing the amount of money. Example: 100.0 `new_price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_changed` boolean REQUIRED Whether new_price actually differs from old_price. Example: true #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### Example: Request · cURL ``` curl https://sandbox-api.drct.aero/orders/6e5257be-d8d4-484f-8db0-922df4c8402a/reprice \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "DRCT-Version: 2026-09-01" ``` #### Example: 200 OK ``` { "old_price": { "amount": 182.40, "currency": "EUR" }, "new_price": { "amount": 198.90, "currency": "EUR" }, "price_changed": true } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` --- # Order Fare Rules Endpoint: `GET /orders/{id}/fare_rules` The same raw rule text as Fare Rules, for an existing order. Channels without it return 501 not_implemented_error — use the order's fares.changes and fares.cancellation instead. ### Response fields #### 200 OK `[].route` string REQUIRED The departure–arrival airport pair this rule applies to. Example: FRA-CDG `[].name` string REQUIRED Short, provider-defined name of the rule. Example: Day and/or Time Application `[].category` string Provider-defined category code for the rule. Example: APP `[].text` string REQUIRED The rule's full text, verbatim from the provider — display as-is, don't parse it. Example: NO DAY/TIME TRAVEL RESTRICTIONS #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### 501 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_implemented_error `error.message` string REQUIRED A human-readable error description. Example: Method not implemented for current provider #### Example: 200 OK ``` [ { "route": "FRA-CDG", "category": "APP", "name": "Day and/or Time Application", "text": "NO DAY/TIME TRAVEL RESTRICTIONS" } ] ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` #### Example: 501 ``` { "error": { "code": "not_implemented_error", "message": "Method not implemented for current provider" } } ``` --- # Cancel Order Endpoint: `DELETE /orders/{id}` Cancels an order and returns it with deleted_at set. Unissued orders cancel free; for issued tickets, fees follow fares.cancellation. Past the void window, refund it instead — see the the Refund guide. See the Order Cancellation guide. ### Response fields #### 200 OK `id` string REQUIRED Identifies this order. Example: 6e5257be-d8d4-484f-8db0-922df4c8402a `channel` string REQUIRED Name of the channel this order was booked through. Example: Lufthansa Group `locator` string REQUIRED The PNR locator supplied by the provider — what you'd read out to the passenger. Example: C57I60 `status` string REQUIRED Current lifecycle status of the order — changes as operations are applied to it. pending means the provider accepted the order for issuing but hasn't returned tickets yet; it becomes issued once they arrive. Only returned on DRCT-Version: 2026-09-01 — on 2021-06-01 the same order still reports as issued. Turns refunded once a confirmed refund settles — see the Refund guide. Allowed values: new pending voided issued refunded deleted `airline_locators` array of objects PNR locators supplied directly by the airlines involved, when different from the top-level locator. `airline_locators[].locator` string REQUIRED The airline's own PNR locator. Example: C57I60 `airline_locators[].carrier` string REQUIRED IATA 2-letter code of the airline that issued this locator. Example: LH Match pattern: ^[\dA-Z]{2}$ `cancel_before` date-time If the order isn't issued by this time, it's deleted automatically. Example: 2022-10-08T11:44:45.000+03:00 `price_expires_at` date-time When the guaranteed price expires — present only while the order is new. Past this time, re-quote via Reprice Order before issuing with reshop: true. Continuous-pricing channels never freeze a price, so this is set to the booking time (already in the past) as a standing signal to always re-quote first. Example: 2022-10-08T11:44:45.000+03:00 `passengers` array of objects The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). >= 1 items `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object Present once identity details have been collected for this traveller. `passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passengers[].individual.title` string Personal title — required by some channels. Example: Mr `passengers[].individual.gender` string M or F. Allowed values: M F `passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `flights` array of objects The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `flights[].segments` array of objects REQUIRED The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `flights[].segments[].departure_airport` object REQUIRED Airport this segment departs from. `flights[].segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].departure_city` object REQUIRED City this segment departs from. `flights[].segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `flights[].segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].arrival_city` object REQUIRED City this segment arrives at. `flights[].segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `flights[].segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `flights[].segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `flights[].segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `flights[].segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `flights[].segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `flights[].segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `flights[].segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `flights[].segments[].departure_terminal` string Departure terminal, when known. Example: D `flights[].segments[].arrival_terminal` string Arrival terminal, when known. Example: A `flights[].segments[].meal` string Meal code, airline-specific. Example: R `flights[].segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `flights[].segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `flights[].segments[].stops[].airport` object REQUIRED Airport of the technical stop. `flights[].segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ `fares` array of objects The fare rules and cabin/baggage conditions for this booking. >= 1 items `fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `fares[].changes` object Whether and how this booking can be changed after issuance. `fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `phones` array of objects Contact phone numbers collected for this order. >= 1 items `phones[].number` string REQUIRED International phone number. Example: +442079460000 `phones[].type` string A free-form label for the number. Example: Mobile `phones[].passengers` array of strings Passenger ids this number is associated with. >= 1 items Example: ["PAX1"] `emails` array of objects Contact email addresses collected for this order. >= 1 items `emails[].address` string REQUIRED A valid email address. Example: example@mail.com `emails[].type` string A free-form label for the address. Example: work `emails[].passengers` array of strings Passenger ids this address is associated with. >= 1 items Example: ["PAX1"] `tickets` array of objects Electronic tickets issued for this order, one per passenger per fare. `tickets[].number` string REQUIRED The airline's ticket number. Example: 2205740877684 `tickets[].passenger` string REQUIRED Passenger id this ticket was issued for. Example: PAX1 `tickets[].segments` array of strings REQUIRED Segment ids covered by this ticket. >= 1 items Example: ["63299a951af83376ede02bb8"] `tickets[].status` string REQUIRED Current ticket status. Example: TICKETED `tickets[].commission` number Agent commission applied to this ticket. Example: 10 `tickets[].nett_total` number The ticket's price before commission. Example: 4680.79 `tickets[].last_transaction_at` date-time When this ticket's status last changed. Example: 2022-10-07T12:32:21+03:00 `tickets[].ticketing_office` string Office id that issued the ticket. Example: AH89 `tickets[].booking_office` string Office id that created the order. Example: AH89 `documents` array of objects Identity documents collected for the passengers on this order. `documents[].passenger` string REQUIRED Passenger id this document belongs to. Example: PAX1 `documents[].number` string REQUIRED Document number. Example: AA234567 `documents[].citizenship` string REQUIRED ISO 3166-1 alpha-2 country code of citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].expiration_date` date REQUIRED Document expiration date. Example: 2026-09-11 `documents[].date_of_birth` date REQUIRED Passenger's date of birth, as stated on the document. Example: 1990-10-01 `documents[].gender` string REQUIRED M or F, as stated on the document. Allowed values: M F `documents[].country_of_issue` string Country the document was issued in, if different from citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].segments` array of strings Segment ids this document was submitted for. >= 1 items Example: ["63299a951af83376ede02bb8"] `documents[].action_code` string PNR action code returned by the airline for this document. Example: HK `documents[].carrier` string IATA 2-letter code of the airline that requested this document. Example: LH Match pattern: ^[\dA-Z]{2}$ `documents[].ssr_code` string PNR SSR code returned by the airline for this document. Example: DOCS `documents[].type` string Document type as returned by the airline, usually a short code. Example: P `ancillaries` array of objects Ancillary services confirmed on this order. `ancillaries[].id` string Unique ancillary id. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `ancillaries[].name` string REQUIRED Name of the ancillary service. Example: Bag 20 KG `ancillaries[].type` string REQUIRED baggage for bags, service for any other extra. Allowed values: baggage service `ancillaries[].price` object REQUIRED Total price for all passengers on this offer. `ancillaries[].price.amount` number A positive number representing the amount of money. Example: 100.0 `ancillaries[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `ancillaries[].segments` array of strings REQUIRED Segment ids the ancillary is bound to. `ancillaries[].passenger` string REQUIRED Passenger id the ancillary is assigned to. Example: PAX_1 `ancillaries[].status` string Status of the ancillary within the order. Allowed values: confirmed pending issued cancelled `seat_maps` array of objects Seats confirmed on this order, see the Seat Maps guide. `seat_maps[].passenger` string REQUIRED Passenger id the seat is assigned to. Example: PAX_1 `seat_maps[].segment` string REQUIRED Segment id the seat is on. Example: SEG_M_1 `seat_maps[].designator` string REQUIRED The chosen seat. Example: 12A `seat_maps[].price` object REQUIRED Total price for all passengers on this offer. `seat_maps[].price.amount` number A positive number representing the amount of money. Example: 100.0 `seat_maps[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `seat_maps[].status` string Status of the seat on the order, when reported. Example: issued `emds` array of objects Electronic documents (EMDs) issued on this order — e.g. a confirmed seat or a post-booking ancillary, once ticketed. `emds[].number` string REQUIRED EMD document number. Example: ZZ655S `emds[].name` string Human-readable name of the document (e.g. the seat or bag), when the provider reports it. Example: Seat 01A `emds[].passenger` string REQUIRED Passenger the EMD is issued for. Example: PAX_1 `emds[].price` object REQUIRED Total price for all passengers on this offer. `emds[].price.amount` number A positive number representing the amount of money. Example: 100.0 `emds[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `emds[].segments` array of strings REQUIRED Segment ids the EMD applies to. `price` object Total price for the order. `price.amount` number A positive number representing the amount of money. Example: 100.0 `price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details` array of objects Price broken down by passenger type. `price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare` object The fare portion of the price, excluding taxes. `price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `price_details[].taxes` object The tax portion of the price, excluding fare. `price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `deleted_at` date-time When the order was deleted, if it has been. Example: 2022-10-07T12:32:21+03:00 #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### Example: Request · cURL ``` curl -X DELETE https://sandbox-api.drct.aero/orders/6e5257be-d8d4-484f-8db0-922df4c8402a \ -H "Authorization: Bearer $DRCT_API_KEY" ``` #### Example: 200 OK ``` { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "status": "deleted", "locator": "C57I60", "deleted_at": "2026-09-27T12:32:21+03:00" } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` --- # Quote Order Refund Endpoint: `GET /orders/{id}/refund_quote` Asks the airline what a refund would return, without refunding. Nothing moves until you confirm with POST /orders/ {id} /refund. Safe to repeat — every call re-quotes. See the Refund guide. ### Response fields #### 200 OK `locator` string REQUIRED The PNR locator supplied by the provider. Example: C57I60 `total` object REQUIRED What lands back on your balance — the penalty is already deducted from it, don't subtract it again. `total.amount` number A positive number representing the amount of money. Example: 100.0 `total.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `penalty` object REQUIRED What the airline keeps. Zero when the fare is fully refundable. `penalty.amount` number A positive number representing the amount of money. Example: 100.0 `penalty.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fare` object The fare half of total. Omitted when the provider doesn't break the refund down. `fare.amount` number A positive number representing the amount of money. Example: 100.0 `fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `taxes` object The taxes half of total. Omitted when the provider doesn't break the refund down. `taxes.amount` number A positive number representing the amount of money. Example: 100.0 `taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### 422 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: refund_unavailable `error.message` string REQUIRED A human-readable error description. Example: Refund is not available for this channel. #### Example: Request · cURL ``` curl https://sandbox-api.drct.aero/orders/6e5257be-d8d4-484f-8db0-922df4c8402a/refund_quote \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "DRCT-Version: 2026-09-01" ``` #### Example: 200 OK ``` { "locator": "C57I60", "total": { "amount": 350.00, "currency": "EUR" }, "penalty": { "amount": 100.00, "currency": "EUR" }, "fare": { "amount": 300.00, "currency": "EUR" }, "taxes": { "amount": 50.00, "currency": "EUR" } } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` #### Example: 422 ``` { "error": { "code": "refund_unavailable", "message": "Refund is not available for this channel." } } ``` --- # Refund Order Endpoint: `POST /orders/{id}/refund` Confirms the refund quoted by GET /orders/ {id} /refund_quote: the tickets are refunded with the airline and your balance is topped up. A document not yet REFUNDED is still processing — poll GET /orders/ {id} for the final state. See the Refund guide. ### Response fields #### 200 OK `id` string REQUIRED Identifies the order this refund belongs to. Example: 6e5257be-d8d4-484f-8db0-922df4c8402a `locator` string REQUIRED The PNR locator supplied by the provider. Example: C57I60 `channel` string REQUIRED Name of the channel this order was booked through. Example: Turkish `status` string REQUIRED The order's status after confirming the refund — the documents below may still be processing individually. Example: refunded `total` object The total returned to your balance, covering documents the airline has already processed. Omitted while every document is still pending, or when they were refunded in different currencies. `total.amount` number A positive number representing the amount of money. Example: 100.0 `total.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `penalty` object The total penalty held back, on the same terms as total. `penalty.amount` number A positive number representing the amount of money. Example: 100.0 `penalty.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `tickets` array of objects REQUIRED Every ticket the refund covered. `tickets[].number` string REQUIRED The ticket or EMD number issued by the airline. Example: 2205740877684 `tickets[].passenger` string Passenger id this document belongs to. Example: PAX1 `tickets[].status` string REQUIRED REFUNDED once the airline has processed it — any other value means the refund is accepted but still in progress. Example: REFUNDED `tickets[].total` object What this document refunded. Omitted while it's still pending. `tickets[].total.amount` number A positive number representing the amount of money. Example: 100.0 `tickets[].total.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `tickets[].penalty` object The penalty held back for this document. `tickets[].penalty.amount` number A positive number representing the amount of money. Example: 100.0 `tickets[].penalty.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `emds` array of objects Refunded EMDs — present only when the order had ancillaries. `emds[].number` string REQUIRED The ticket or EMD number issued by the airline. Example: 2205740877684 `emds[].passenger` string Passenger id this document belongs to. Example: PAX1 `emds[].status` string REQUIRED REFUNDED once the airline has processed it — any other value means the refund is accepted but still in progress. Example: REFUNDED `emds[].total` object What this document refunded. Omitted while it's still pending. `emds[].total.amount` number A positive number representing the amount of money. Example: 100.0 `emds[].total.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `emds[].penalty` object The penalty held back for this document. `emds[].penalty.amount` number A positive number representing the amount of money. Example: 100.0 `emds[].penalty.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### 422 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: refund_not_allowed `error.message` string REQUIRED A human-readable error description. Example: Refund is not permitted for the order. #### Example: Request · cURL ``` curl -X POST https://sandbox-api.drct.aero/orders/6e5257be-d8d4-484f-8db0-922df4c8402a/refund \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "DRCT-Version: 2026-09-01" ``` #### Example: 200 OK ``` { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "locator": "C57I60", "channel": "Turkish", "status": "refunded", "total": { "amount": 350.00, "currency": "EUR" }, "penalty": { "amount": 100.00, "currency": "EUR" }, "tickets": [ { "number": "2205740877684", "passenger": "PAX1", "status": "REFUNDED", "total": { "amount": 350.00, "currency": "EUR" }, "penalty": { "amount": 100.00, "currency": "EUR" } } ] } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` #### Example: 422 ``` { "error": { "code": "refund_not_allowed", "message": "Refund is not permitted for the order." } } ``` --- # Ancillaries Endpoint: `GET /orders/{id}/ancillaries` Ancillaries guide: which channels sell ancillaries, what each offers and when. Lists the extras you can add to an existing order: bags and services such as priority boarding, check-in or special assistance. ### Response fields #### 200 OK `ancillaries` array of objects REQUIRED The ancillary services available for the order. `ancillaries[].id` string REQUIRED Unique ancillary id — use it when confirming the ancillary. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `ancillaries[].name` string REQUIRED Name of the ancillary service. Example: Bag 20 KG `ancillaries[].type` string REQUIRED baggage for bags, service for any other extra (priority boarding, check-in, special assistance…). Allowed values: baggage service `ancillaries[].price` object REQUIRED Total price for all passengers on this offer. `ancillaries[].price.amount` number A positive number representing the amount of money. Example: 100.0 `ancillaries[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `ancillaries[].max_quantity` integer Maximum quantity per passenger, when reported by the provider. Example: 1 `ancillaries[].segments` array of strings REQUIRED Segment ids the ancillary is bound to. Empty in the shop list for a service that applies to the passenger on the whole order (e.g. special assistance); once confirmed, the order shows it with the flight's segments. `ancillaries[].passengers` array of strings Passenger ids the ancillary applies to, when the provider scopes it per passenger. Omitted otherwise. #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### Example: 200 OK ``` { "ancillaries": [ { "id": "ANCILLARY_42622140D81C-0DG-5", "name": "Bag 20 KG", "type": "baggage", "price": { "amount": 35.0, "currency": "EUR" }, "max_quantity": 2, "segments": ["SEG_M_1"], "passengers": ["PAX_1"] } ] } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` --- # Confirm Ancillary Endpoint: `POST /orders/{id}/ancillaries` Adds ancillaries to the order — one item per ancillary per passenger, several per request. Returns the updated order with an ancillaries array, as in Get Order. Some channels sell ancillaries only before issue, others only after. In the wrong order state you get invalid_order_status. See the Ancillaries guide. ### Body parameters `ancillaries` array of objects REQUIRED One item per ancillary being confirmed. Batch several — for different passengers or ancillaries — in a single request. `ancillaries[].id` string REQUIRED Ancillary id obtained from the Shop Ancillaries response. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `ancillaries[].passenger_id` string REQUIRED Passenger id from the order. Example: PAX_1 `ancillaries[].quantity` integer Quantity for this passenger. Optional, defaults to 1 and must not exceed max_quantity. Channels that sell baggage as fixed lots (WizzAir) reject a value above 1 with ancillary_quantity_not_supported. Example: 1 ### Response fields #### 201 CREATED `id` string REQUIRED Identifies this order. Example: 6e5257be-d8d4-484f-8db0-922df4c8402a `channel` string REQUIRED Name of the channel this order was booked through. Example: Lufthansa Group `locator` string REQUIRED The PNR locator supplied by the provider — what you'd read out to the passenger. Example: C57I60 `status` string REQUIRED Current lifecycle status of the order — changes as operations are applied to it. pending means the provider accepted the order for issuing but hasn't returned tickets yet; it becomes issued once they arrive. Only returned on DRCT-Version: 2026-09-01 — on 2021-06-01 the same order still reports as issued. Turns refunded once a confirmed refund settles — see the Refund guide. Allowed values: new pending voided issued refunded deleted `airline_locators` array of objects PNR locators supplied directly by the airlines involved, when different from the top-level locator. `airline_locators[].locator` string REQUIRED The airline's own PNR locator. Example: C57I60 `airline_locators[].carrier` string REQUIRED IATA 2-letter code of the airline that issued this locator. Example: LH Match pattern: ^[\dA-Z]{2}$ `cancel_before` date-time If the order isn't issued by this time, it's deleted automatically. Example: 2022-10-08T11:44:45.000+03:00 `price_expires_at` date-time When the guaranteed price expires — present only while the order is new. Past this time, re-quote via Reprice Order before issuing with reshop: true. Continuous-pricing channels never freeze a price, so this is set to the booking time (already in the past) as a standing signal to always re-quote first. Example: 2022-10-08T11:44:45.000+03:00 `passengers` array of objects The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). >= 1 items `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object Present once identity details have been collected for this traveller. `passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passengers[].individual.title` string Personal title — required by some channels. Example: Mr `passengers[].individual.gender` string M or F. Allowed values: M F `passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `flights` array of objects The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `flights[].segments` array of objects REQUIRED The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `flights[].segments[].departure_airport` object REQUIRED Airport this segment departs from. `flights[].segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].departure_city` object REQUIRED City this segment departs from. `flights[].segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `flights[].segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].arrival_city` object REQUIRED City this segment arrives at. `flights[].segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `flights[].segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `flights[].segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `flights[].segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `flights[].segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `flights[].segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `flights[].segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `flights[].segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `flights[].segments[].departure_terminal` string Departure terminal, when known. Example: D `flights[].segments[].arrival_terminal` string Arrival terminal, when known. Example: A `flights[].segments[].meal` string Meal code, airline-specific. Example: R `flights[].segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `flights[].segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `flights[].segments[].stops[].airport` object REQUIRED Airport of the technical stop. `flights[].segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ `fares` array of objects The fare rules and cabin/baggage conditions for this booking. >= 1 items `fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `fares[].changes` object Whether and how this booking can be changed after issuance. `fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `phones` array of objects Contact phone numbers collected for this order. >= 1 items `phones[].number` string REQUIRED International phone number. Example: +442079460000 `phones[].type` string A free-form label for the number. Example: Mobile `phones[].passengers` array of strings Passenger ids this number is associated with. >= 1 items Example: ["PAX1"] `emails` array of objects Contact email addresses collected for this order. >= 1 items `emails[].address` string REQUIRED A valid email address. Example: example@mail.com `emails[].type` string A free-form label for the address. Example: work `emails[].passengers` array of strings Passenger ids this address is associated with. >= 1 items Example: ["PAX1"] `tickets` array of objects Electronic tickets issued for this order, one per passenger per fare. `tickets[].number` string REQUIRED The airline's ticket number. Example: 2205740877684 `tickets[].passenger` string REQUIRED Passenger id this ticket was issued for. Example: PAX1 `tickets[].segments` array of strings REQUIRED Segment ids covered by this ticket. >= 1 items Example: ["63299a951af83376ede02bb8"] `tickets[].status` string REQUIRED Current ticket status. Example: TICKETED `tickets[].commission` number Agent commission applied to this ticket. Example: 10 `tickets[].nett_total` number The ticket's price before commission. Example: 4680.79 `tickets[].last_transaction_at` date-time When this ticket's status last changed. Example: 2022-10-07T12:32:21+03:00 `tickets[].ticketing_office` string Office id that issued the ticket. Example: AH89 `tickets[].booking_office` string Office id that created the order. Example: AH89 `documents` array of objects Identity documents collected for the passengers on this order. `documents[].passenger` string REQUIRED Passenger id this document belongs to. Example: PAX1 `documents[].number` string REQUIRED Document number. Example: AA234567 `documents[].citizenship` string REQUIRED ISO 3166-1 alpha-2 country code of citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].expiration_date` date REQUIRED Document expiration date. Example: 2026-09-11 `documents[].date_of_birth` date REQUIRED Passenger's date of birth, as stated on the document. Example: 1990-10-01 `documents[].gender` string REQUIRED M or F, as stated on the document. Allowed values: M F `documents[].country_of_issue` string Country the document was issued in, if different from citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].segments` array of strings Segment ids this document was submitted for. >= 1 items Example: ["63299a951af83376ede02bb8"] `documents[].action_code` string PNR action code returned by the airline for this document. Example: HK `documents[].carrier` string IATA 2-letter code of the airline that requested this document. Example: LH Match pattern: ^[\dA-Z]{2}$ `documents[].ssr_code` string PNR SSR code returned by the airline for this document. Example: DOCS `documents[].type` string Document type as returned by the airline, usually a short code. Example: P `ancillaries` array of objects Ancillary services confirmed on this order. `ancillaries[].id` string Unique ancillary id. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `ancillaries[].name` string REQUIRED Name of the ancillary service. Example: Bag 20 KG `ancillaries[].type` string REQUIRED baggage for bags, service for any other extra. Allowed values: baggage service `ancillaries[].price` object REQUIRED Total price for all passengers on this offer. `ancillaries[].price.amount` number A positive number representing the amount of money. Example: 100.0 `ancillaries[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `ancillaries[].segments` array of strings REQUIRED Segment ids the ancillary is bound to. `ancillaries[].passenger` string REQUIRED Passenger id the ancillary is assigned to. Example: PAX_1 `ancillaries[].status` string Status of the ancillary within the order. Allowed values: confirmed pending issued cancelled `seat_maps` array of objects Seats confirmed on this order, see the Seat Maps guide. `seat_maps[].passenger` string REQUIRED Passenger id the seat is assigned to. Example: PAX_1 `seat_maps[].segment` string REQUIRED Segment id the seat is on. Example: SEG_M_1 `seat_maps[].designator` string REQUIRED The chosen seat. Example: 12A `seat_maps[].price` object REQUIRED Total price for all passengers on this offer. `seat_maps[].price.amount` number A positive number representing the amount of money. Example: 100.0 `seat_maps[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `seat_maps[].status` string Status of the seat on the order, when reported. Example: issued `emds` array of objects Electronic documents (EMDs) issued on this order — e.g. a confirmed seat or a post-booking ancillary, once ticketed. `emds[].number` string REQUIRED EMD document number. Example: ZZ655S `emds[].name` string Human-readable name of the document (e.g. the seat or bag), when the provider reports it. Example: Seat 01A `emds[].passenger` string REQUIRED Passenger the EMD is issued for. Example: PAX_1 `emds[].price` object REQUIRED Total price for all passengers on this offer. `emds[].price.amount` number A positive number representing the amount of money. Example: 100.0 `emds[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `emds[].segments` array of strings REQUIRED Segment ids the EMD applies to. `price` object Total price for the order. `price.amount` number A positive number representing the amount of money. Example: 100.0 `price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details` array of objects Price broken down by passenger type. `price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare` object The fare portion of the price, excluding taxes. `price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `price_details[].taxes` object The tax portion of the price, excluding fare. `price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `deleted_at` date-time When the order was deleted, if it has been. Example: 2022-10-07T12:32:21+03:00 #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### Example: Confirm · request · cURL ``` curl -X POST https://sandbox-api.drct.aero/orders/6e5257be-d8d4-484f-8db0-922df4c8402a/ancillaries \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ancillaries": [ { "id": "ANCILLARY_42622140D81C-0DG-5", "passenger_id": "PAX_1", "quantity": 1 } ] }' ``` #### Example: 201 CREATED ``` { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "status": "issued", "locator": "C57I60", "ancillaries": [ { "id": "ANCILLARY_42622140D81C-0DG-5", "name": "Bag 20 KG", "type": "baggage", "price": { "amount": 35.0, "currency": "EUR" }, "segments": ["SEG_M_1"], "passenger": "PAX_1", "status": "issued" } ] } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` --- # View Seat Maps Endpoint: `GET /orders/{id}/seat_maps` Returns the seat map for an existing order, one per passenger per segment. Unavailable seats are included, so you can render the whole cabin. Channel | When seats can be added Flayer K (Ryanair) | On an unissued order, before issue WizzAir | On an unissued order, before issue If the channel doesn't support seat maps, both this request and Add Seats return channel_is_off. See the Seat Maps guide. ### Response fields #### 200 OK `seat_maps` array of objects REQUIRED One entry per passenger per segment. `seat_maps[].segment` string REQUIRED Segment id the map is built for (matches Get Order). Example: SEG_M_1 `seat_maps[].passenger` string REQUIRED Passenger id the map is built for. Example: PAX_1 `seat_maps[].cabin` string REQUIRED The cabin this map covers. Example: Economy `seat_maps[].rows` array of objects REQUIRED The physical rows of the cabin. `seat_maps[].rows[].number` integer REQUIRED The physical row number. Example: 12 `seat_maps[].rows[].seats` array of objects REQUIRED Every seat in this row, available or not. `seat_maps[].rows[].seats[].designator` string REQUIRED The seat designator — use it when adding the seat. Example: 12A `seat_maps[].rows[].seats[].available` boolean REQUIRED Whether the seat can be booked. Unavailable seats are still returned, so the full cabin can be rendered. Example: true `seat_maps[].rows[].seats[].characteristics` array of objects IATA seat characteristics (e.g. window, exit row, extra legroom). Empty when the provider reports none. `seat_maps[].rows[].seats[].characteristics[].code` string REQUIRED IATA seat characteristic code. Example: L `seat_maps[].rows[].seats[].characteristics[].description` string REQUIRED Human-readable description of the code. Example: Leg space seat `seat_maps[].rows[].seats[].price` object REQUIRED Total price for all passengers on this offer. `seat_maps[].rows[].seats[].price.amount` number A positive number representing the amount of money. Example: 100.0 `seat_maps[].rows[].seats[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### Example: 200 OK ``` { "seat_maps": [ { "segment": "SEG_M_1", "passenger": "PAX_1", "cabin": "Economy", "rows": [ { "number": 1, "seats": [ { "designator": "1A", "available": true, "characteristics": [ { "code": "E", "description": "Exit and emergency exit" }, { "code": "L", "description": "Leg space seat" } ], "price": { "amount": 29.6, "currency": "EUR" } }, { "designator": "1B", "available": false, "characteristics": [], "price": { "amount": 29.6, "currency": "EUR" } } ] } ] } ] } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` --- # Add Seats Endpoint: `POST /orders/{id}/seat_maps` Assigns seats to the order, one item per passenger per segment. Returns the updated order with the seats in seat_maps; once issued, each also appears in emds. Some fares require a seat for every passenger before you can issue. If one hasn't been selected yet, Issue Order returns issue_required_seats — add seats first. See the Seat Maps guide. ### Body parameters `seat_maps` array of objects REQUIRED One item per seat you're assigning. `seat_maps[].passenger_id` string REQUIRED Passenger id from the order. Example: PAX_1 `seat_maps[].segment_id` string REQUIRED Segment id from the order / seat map. Example: SEG_M_1 `seat_maps[].designator` string REQUIRED Seat designator from the View Seat Maps response. Example: 12A ### Response fields #### 200 OK `id` string REQUIRED Identifies this order. Example: 6e5257be-d8d4-484f-8db0-922df4c8402a `channel` string REQUIRED Name of the channel this order was booked through. Example: Lufthansa Group `locator` string REQUIRED The PNR locator supplied by the provider — what you'd read out to the passenger. Example: C57I60 `status` string REQUIRED Current lifecycle status of the order — changes as operations are applied to it. pending means the provider accepted the order for issuing but hasn't returned tickets yet; it becomes issued once they arrive. Only returned on DRCT-Version: 2026-09-01 — on 2021-06-01 the same order still reports as issued. Turns refunded once a confirmed refund settles — see the Refund guide. Allowed values: new pending voided issued refunded deleted `airline_locators` array of objects PNR locators supplied directly by the airlines involved, when different from the top-level locator. `airline_locators[].locator` string REQUIRED The airline's own PNR locator. Example: C57I60 `airline_locators[].carrier` string REQUIRED IATA 2-letter code of the airline that issued this locator. Example: LH Match pattern: ^[\dA-Z]{2}$ `cancel_before` date-time If the order isn't issued by this time, it's deleted automatically. Example: 2022-10-08T11:44:45.000+03:00 `price_expires_at` date-time When the guaranteed price expires — present only while the order is new. Past this time, re-quote via Reprice Order before issuing with reshop: true. Continuous-pricing channels never freeze a price, so this is set to the booking time (already in the past) as a standing signal to always re-quote first. Example: 2022-10-08T11:44:45.000+03:00 `passengers` array of objects The travellers this applies to, each with a stable id you'll reference in later steps (pricing, booking). >= 1 items `passengers[].id` string REQUIRED Stable identifier for this passenger — reuse it in later requests. Example: PAX1 `passengers[].type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `passengers[].individual` object Present once identity details have been collected for this traveller. `passengers[].individual.first_name` string REQUIRED First name, must match the travel document. Example: James `passengers[].individual.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passengers[].individual.title` string Personal title — required by some channels. Example: Mr `passengers[].individual.gender` string M or F. Allowed values: M F `passengers[].individual.date_of_birth` date Date of birth. Example: 1990-10-01 `passengers[].infant_ref` string Id of the adult passenger this infant is associated with — only set for INF passengers. Example: PAX2 `flights` array of objects The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].journey_time` integer REQUIRED Time in seconds from departure of the first segment to arrival of the last. Example: 9600 `flights[].segments` array of objects REQUIRED The journeys booked on this order, each with its own fully-detailed segments. >= 1 items `flights[].segments[].id` string REQUIRED Identifies this segment. Example: 6329a0ff1af83376ede02bc5 `flights[].segments[].departure_airport` object REQUIRED Airport this segment departs from. `flights[].segments[].departure_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].departure_city` object REQUIRED City this segment departs from. `flights[].segments[].departure_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].departure_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].arrival_airport` object REQUIRED Airport this segment arrives at. `flights[].segments[].arrival_airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].arrival_city` object REQUIRED City this segment arrives at. `flights[].segments[].arrival_city.code` string REQUIRED IATA 3-letter city code — usually the same as the airport code. Example: IEV Match pattern: ^[A-Z]{3}$ `flights[].segments[].arrival_city.name` string REQUIRED City name. Example: Kyiv `flights[].segments[].carrier` object REQUIRED The airline whose designator code appears on the ticket — who actually sells it. `flights[].segments[].carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].operating_carrier` object The airline that operates the aircraft, when different from the selling carrier (codeshare). `flights[].segments[].operating_carrier.airline_code` string REQUIRED IATA 2-letter airline code. Example: LH Match pattern: ^[\dA-Z]{2}$ `flights[].segments[].operating_carrier.airline_name` string REQUIRED Airline name. Example: Lufthansa `flights[].segments[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 11:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].flight_number` string REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `flights[].segments[].duration` integer Time in seconds between this segment's departure and arrival. Example: 9600 `flights[].segments[].change_of_airport` boolean Whether the arrival airport differs from the next connecting segment's departure airport. Example: false `flights[].segments[].next_day` boolean Whether the arrival date differs from the departure date. Example: false `flights[].segments[].transfer_time` integer Layover time in seconds before the next connecting segment. Example: 1000 `flights[].segments[].status` string The airline's PNR status code for this segment, e.g. confirmed or waitlisted. Example: HK `flights[].segments[].departure_terminal` string Departure terminal, when known. Example: D `flights[].segments[].arrival_terminal` string Arrival terminal, when known. Example: A `flights[].segments[].meal` string Meal code, airline-specific. Example: R `flights[].segments[].aircraft` string Aircraft type operating this segment. Example: Airbus A320 `flights[].segments[].stops` array of objects Technical stops along this segment (fuel, crew change) that aren't separate connections — usually none or one. `flights[].segments[].stops[].airport` object REQUIRED Airport of the technical stop. `flights[].segments[].stops[].airport.code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `flights[].segments[].stops[].airport.name` string REQUIRED Full airport name. Example: Boryspil International Airport `flights[].segments[].stops[].departure_date` date REQUIRED Departure date. Example: 2022-10-27 `flights[].segments[].stops[].departure_time` string REQUIRED 24-hour departure time, H:M. Example: 14:15 Match pattern: ^\d{2}:\d{2}$ `flights[].segments[].stops[].arrival_date` date REQUIRED Arrival date. Example: 2022-10-27 `flights[].segments[].stops[].arrival_time` string REQUIRED 24-hour arrival time, H:M. Example: 12:15 Match pattern: ^\d{2}:\d{2}$ `fares` array of objects The fare rules and cabin/baggage conditions for this booking. >= 1 items `fares[].id` string Identifies this fare. Example: 6329a0ff1af83376ede02bc5 `fares[].segments` array of strings Segment ids this fare applies to. >= 1 items Example: ["63299a951af83376ede02bb8"] `fares[].passengers` array of strings Passenger ids this fare applies to. >= 1 items Example: ["PAX1"] `fares[].price_class_name` string REQUIRED Channel-defined marketing name for the price class. Example: Basic `fares[].fare_basis_code` string The fare's identifier within the channel. Example: SSAVP0 `fares[].class_of_service` string The channel's internal identifier for this fare group. Example: L `fares[].cabin_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `fares[].baggage` array of objects REQUIRED Baggage allowance for this fare — by piece count, by weight, or both. `fares[].baggage[].quantity` integer REQUIRED Number of pieces allowed. If 0 and max_weight is present, any number of pieces up to that weight is allowed. Example: 1 `fares[].baggage[].type` string REQUIRED checked or carry-on. Allowed values: checked carry-on `fares[].baggage[].max_weight` object Caps the allowance by weight rather than (or in addition to) piece count, when present. `fares[].baggage[].max_weight.value` integer REQUIRED Maximum weight allowed. Example: 8 `fares[].baggage[].max_weight.unit` string REQUIRED Unit the weight is measured in. Example: KG `fares[].changes` object Whether and how this booking can be changed after issuance. `fares[].changes.changeable` boolean REQUIRED Whether the booking can be changed at all. `fares[].changes.fee_applies` boolean Whether a fee applies when changing the booking. `fares[].changes.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].changes.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].changes.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].changes.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].changes.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation` object Whether and how this booking can be cancelled after issuance. `fares[].cancellation.cancelable` boolean REQUIRED Whether the booking can be cancelled at all. `fares[].cancellation.fee_applies` boolean Whether a fee applies when cancelling the booking. `fares[].cancellation.before_departure` object Fee charged when this happens before the flight's departure, if any. `fares[].cancellation.before_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.before_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fares[].cancellation.after_departure` object Fee charged when this happens after the flight's departure, if any. `fares[].cancellation.after_departure.amount` number A positive number representing the amount of money. Example: 100.0 `fares[].cancellation.after_departure.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `phones` array of objects Contact phone numbers collected for this order. >= 1 items `phones[].number` string REQUIRED International phone number. Example: +442079460000 `phones[].type` string A free-form label for the number. Example: Mobile `phones[].passengers` array of strings Passenger ids this number is associated with. >= 1 items Example: ["PAX1"] `emails` array of objects Contact email addresses collected for this order. >= 1 items `emails[].address` string REQUIRED A valid email address. Example: example@mail.com `emails[].type` string A free-form label for the address. Example: work `emails[].passengers` array of strings Passenger ids this address is associated with. >= 1 items Example: ["PAX1"] `tickets` array of objects Electronic tickets issued for this order, one per passenger per fare. `tickets[].number` string REQUIRED The airline's ticket number. Example: 2205740877684 `tickets[].passenger` string REQUIRED Passenger id this ticket was issued for. Example: PAX1 `tickets[].segments` array of strings REQUIRED Segment ids covered by this ticket. >= 1 items Example: ["63299a951af83376ede02bb8"] `tickets[].status` string REQUIRED Current ticket status. Example: TICKETED `tickets[].commission` number Agent commission applied to this ticket. Example: 10 `tickets[].nett_total` number The ticket's price before commission. Example: 4680.79 `tickets[].last_transaction_at` date-time When this ticket's status last changed. Example: 2022-10-07T12:32:21+03:00 `tickets[].ticketing_office` string Office id that issued the ticket. Example: AH89 `tickets[].booking_office` string Office id that created the order. Example: AH89 `documents` array of objects Identity documents collected for the passengers on this order. `documents[].passenger` string REQUIRED Passenger id this document belongs to. Example: PAX1 `documents[].number` string REQUIRED Document number. Example: AA234567 `documents[].citizenship` string REQUIRED ISO 3166-1 alpha-2 country code of citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].expiration_date` date REQUIRED Document expiration date. Example: 2026-09-11 `documents[].date_of_birth` date REQUIRED Passenger's date of birth, as stated on the document. Example: 1990-10-01 `documents[].gender` string REQUIRED M or F, as stated on the document. Allowed values: M F `documents[].country_of_issue` string Country the document was issued in, if different from citizenship. Example: UA Match pattern: ^[A-Z]{2}$ `documents[].segments` array of strings Segment ids this document was submitted for. >= 1 items Example: ["63299a951af83376ede02bb8"] `documents[].action_code` string PNR action code returned by the airline for this document. Example: HK `documents[].carrier` string IATA 2-letter code of the airline that requested this document. Example: LH Match pattern: ^[\dA-Z]{2}$ `documents[].ssr_code` string PNR SSR code returned by the airline for this document. Example: DOCS `documents[].type` string Document type as returned by the airline, usually a short code. Example: P `ancillaries` array of objects Ancillary services confirmed on this order. `ancillaries[].id` string Unique ancillary id. Example: ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5 `ancillaries[].name` string REQUIRED Name of the ancillary service. Example: Bag 20 KG `ancillaries[].type` string REQUIRED baggage for bags, service for any other extra. Allowed values: baggage service `ancillaries[].price` object REQUIRED Total price for all passengers on this offer. `ancillaries[].price.amount` number A positive number representing the amount of money. Example: 100.0 `ancillaries[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `ancillaries[].segments` array of strings REQUIRED Segment ids the ancillary is bound to. `ancillaries[].passenger` string REQUIRED Passenger id the ancillary is assigned to. Example: PAX_1 `ancillaries[].status` string Status of the ancillary within the order. Allowed values: confirmed pending issued cancelled `seat_maps` array of objects Seats confirmed on this order, see the Seat Maps guide. `seat_maps[].passenger` string REQUIRED Passenger id the seat is assigned to. Example: PAX_1 `seat_maps[].segment` string REQUIRED Segment id the seat is on. Example: SEG_M_1 `seat_maps[].designator` string REQUIRED The chosen seat. Example: 12A `seat_maps[].price` object REQUIRED Total price for all passengers on this offer. `seat_maps[].price.amount` number A positive number representing the amount of money. Example: 100.0 `seat_maps[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `seat_maps[].status` string Status of the seat on the order, when reported. Example: issued `emds` array of objects Electronic documents (EMDs) issued on this order — e.g. a confirmed seat or a post-booking ancillary, once ticketed. `emds[].number` string REQUIRED EMD document number. Example: ZZ655S `emds[].name` string Human-readable name of the document (e.g. the seat or bag), when the provider reports it. Example: Seat 01A `emds[].passenger` string REQUIRED Passenger the EMD is issued for. Example: PAX_1 `emds[].price` object REQUIRED Total price for all passengers on this offer. `emds[].price.amount` number A positive number representing the amount of money. Example: 100.0 `emds[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `emds[].segments` array of strings REQUIRED Segment ids the EMD applies to. `price` object Total price for the order. `price.amount` number A positive number representing the amount of money. Example: 100.0 `price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details` array of objects Price broken down by passenger type. `price_details[].type` string REQUIRED ADT, CHD or INF — which passenger type this breakdown row covers. Allowed values: ADT CHD INF `price_details[].count` integer REQUIRED Number of passengers of this type included in the total price. Example: 1 `price_details[].price` object REQUIRED Total price (fare + taxes) for this passenger type. `price_details[].price.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare` object The fare portion of the price, excluding taxes. `price_details[].fare.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].fare.equivalent_price` object The same amount converted to the channel's settlement currency, when it differs. `price_details[].taxes` object The tax portion of the price, excluding fare. `price_details[].taxes.amount` number A positive number representing the amount of money. Example: 100.0 `price_details[].taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `price_details[].taxes.breakdown` array of objects Individual taxes making up the total above, each with a channel-defined code, amount and currency. `deleted_at` date-time When the order was deleted, if it has been. Example: 2022-10-07T12:32:21+03:00 #### 404 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: not_found `error.message` string REQUIRED A human-readable error description. Example: We have not found such a resource. #### 422 `error` object REQUIRED The single error this response carries. `error.code` string REQUIRED An identifier of an error type inside the API — branch on this, never on the message text. Example: validation_error `error.message` string REQUIRED A human-readable error description. Example: {"seat_maps":["must be filled"]} #### Example: Add Seats · request · cURL ``` curl -X POST https://sandbox-api.drct.aero/orders/6e5257be-d8d4-484f-8db0-922df4c8402a/seat_maps \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "seat_maps": [ { "passenger_id": "PAX_1", "segment_id": "SEG_M_1", "designator": "12A" } ] }' ``` #### Example: 200 OK ``` { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "status": "issued", "locator": "C57I60", "seat_maps": [ { "passenger": "PAX_1", "segment": "SEG_M_1", "designator": "12A", "price": { "amount": 29.6, "currency": "EUR" }, "status": "issued" } ] } ``` #### Example: 404 ``` { "error": { "code": "not_found", "message": "We have not found such a resource." } } ``` #### Example: 422 ``` { "error": { "code": "validation_error", "message": "{\"seat_maps\":[\"must be filled\"]}" } } ``` --- # List Reporting Tickets Endpoint: `GET /reporting/tickets` Returns every ticket from issued orders for back-office reconciliation — nett totals, commission, ticketing office and last transaction time. JSON or XML. ### Query parameters `date_from` date-time Defaults to the start of today. Filters by last transaction time. Example: 2022-09-16T00:00:00+03:00 `date_to` date-time Defaults to the end of today. Example: 2022-09-16T23:59:59+03:00 `number` string Ticket number. Used only when locator is blank. Example: 5661234567890 `locator` string Booking reference (PNR). Takes precedence over number and the date range. Example: ABCDE12 ### Response fields `id` string REQUIRED Identifies this ticket. Example: fca3a393-1f4b-4fd3-952b-a4a5df3fe61d `number` string REQUIRED The electronic document number issued by the airline. Example: 2205740877684 `status` string REQUIRED Current document status — changes as operations are applied to it. refund means a confirmed refund covered this ticket — see the Refund guide. Allowed values: issued void reissued refund exchanged `locator` string REQUIRED The PNR locator supplied by the provider — what you'd read out to the passenger. `type` string REQUIRED Ticket or EMD (electronic miscellaneous document). Allowed values: Ticket EMD `booked_at` date-time REQUIRED When the order this ticket belongs to was created. Example: 2022-10-07T12:32:21+03:00 `last_transaction_at` date-time REQUIRED When this ticket's status last changed. Example: 2022-10-07T12:32:21+03:00 `total_price` object REQUIRED Total price of the ticket. `total_price.amount` number A positive number representing the amount of money. Example: 100.0 `total_price.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `fare` object REQUIRED The fare portion of the price, excluding taxes. `fare.amount` number A positive number representing the amount of money. Example: 100.0 `fare.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `taxes` object The tax portion of the price, excluding fare. `taxes.amount` number A positive number representing the amount of money. Example: 100.0 `taxes.currency` string ISO 4217 3-letter currency code. Example: EUR Match pattern: ^[A-Z]{3}$ `commission` number Agent commission applied to this document. Example: 10 `commission_equivalent` number Agent commission applied to this document, converted to the account's settlement currency. Example: 10 `originator` object REQUIRED The user who issued this document. `originator.id` string REQUIRED DRCT identifier of the user. Example: ZZ7YQ6 Match pattern: ^[A-Z\d]{6}$ `originator.name` string REQUIRED The user's full name. Example: John Watson `company` object REQUIRED The company this document was issued under. `company.id` string REQUIRED DRCT identifier of the company. Example: ZZ7YQ6 Match pattern: ^[A-Z\d]{6}$ `company.name` string REQUIRED The company's name. Example: Travel Gods `ticketing_office` string Office id that issued the ticket. Example: AH89 `booking_office` string Office id that created the order. Example: AH89 `channel` string REQUIRED Name of the channel this order was booked through. Example: Lufthansa Group `passsenger` object REQUIRED The passenger this document was issued for. `passsenger.first_name` string REQUIRED First name, must match the travel document. Example: James `passsenger.last_name` string REQUIRED Last name, must match the travel document. Example: Watson `passsenger.type` string REQUIRED Name of a group of passengers. Allowed values: ADT CHD INF `segments` array of objects REQUIRED The flown legs covered by this document. `segments[].validating_carrier` string REQUIRED IATA 2-letter code of the airline that issued the ticket. Example: LH Match pattern: ^[\dA-Z]{2}$ `segments[].carrier` string REQUIRED IATA 2-letter code of the airline operating this segment. Example: LH Match pattern: ^[\dA-Z]{2}$ `segments[].flight_number` integer REQUIRED The numeric part of the flight designator that appears after the airline code. Example: 441 Match pattern: ^\d{1,4}$ `segments[].departure_airport_code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `segments[].departure_airport_name` string REQUIRED Full airport name. Example: Boryspil International Airport `segments[].arrival_airport_code` string REQUIRED IATA 3-letter airport code. Example: KBP Match pattern: ^[A-Z]{3}$ `segments[].arrival_airport_name` string REQUIRED Full airport name. Example: Boryspil International Airport `segments[].departured_at` string REQUIRED Departure time, local to the departure airport, without a timezone offset. Example: 2022-08-07T08:11:40 `segments[].arrived_at` string REQUIRED Arrival time, local to the arrival airport, without a timezone offset. Example: 2022-08-07T09:11:40 `segments[].duration` string REQUIRED Time between departure and arrival, as H:M. Example: 02:40 `segments[].fare_basis` string The fare's identifier within the channel. Example: SSAVP0 `segments[].booking_class` string The channel's internal identifier for this fare group. Example: L `segments[].flight_class` string REQUIRED The cabin the passenger travels in. Allowed values: Economy Premium Economy Business First `segments[].co2e` number Estimated CO2 equivalent emissions for this segment, in kg. Example: 113.019 #### Example: Request · cURL ``` curl -G https://sandbox-api.drct.aero/reporting/tickets \ -H "Authorization: Bearer $DRCT_API_KEY" \ -d "date_from=2026-07-01T00:00:00+03:00" \ -d "date_to=2026-07-31T23:59:59+03:00" ``` #### Example: 200 OK ``` [ { "id": "fca3a393-1f4b-4fd3-952b-a4a5df3fe61d", "number": "2205740877684", "status": "issued", "locator": "C57I60", "type": "Ticket", "booked_at": "2026-07-07T12:32:21+03:00", "last_transaction_at": "2026-07-07T12:32:21+03:00", "total_price": { "amount": 186.9, "currency": "EUR" }, "fare": { "amount": 176.9, "currency": "EUR" }, "taxes": { "amount": 10.0, "currency": "EUR" }, "commission": 10, "originator": { "id": "ZZ7YQ6", "name": "John Watson" }, "company": { "id": "ZZ7YQ6", "name": "Travel Gods" }, "channel": "Lufthansa Group", "passsenger": { "first_name": "James", "last_name": "Watson", "type": "ADT" }, "segments": [ /* … */ ] } ] ``` --- # Flights Search ### Search for flights To make a search you need to provide details of the desired flight and information about the passengers. Here is an example: ❗ Depending on the airline, an offer lives up to 30 minutes after it was created from Search Offers. Testing tip: sandbox only covers LOT, Lufthansa, Turkish Airlines and Wizz Air. See sandbox vs. production. #### Example: Request · search · cURL ``` curl --compressed -X POST "https://sandbox-api.drct.aero/offers_search" \ -H "Accept: application/json" \ -H "Accept-Encoding: gzip" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" \ -d '{ "flights": [ { "departure_airport_code": "KBP", "arrival_airport_code": "TBS", "departure_date": "2026-09-27" } ], "passengers": [{ "type": "ADT" }] }' ``` ### Price an offer Search prices are cached, so always price the offer before booking to get the current price. Full reference: Price Offer reference. #### Example: Request · price · cURL ``` curl --compressed -X PATCH "https://sandbox-api.drct.aero/offers/$OFFER_ID/price" \ -H "Accept: application/json" \ -H "Accept-Encoding: gzip" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" ``` --- # Order Creation Now you can order your flight 👨‍💻 To make an order you need: - the ID of the offer you’d like to book; - basic necessary information about the passengers. ❗ Airlines allow at most three orders per passenger on the same route; more can incur penalties. ❗ Use real names. Carriers treat fake names or random letters as test bookings and charge penalties. 💡 Some providers require more data to create an order (e.g. date of birth, title). In that case you will receive a validation_error with an appropriate message. We strongly encourage sending a unique Idempotency-Key header in a request. #### Example: Request · cURL ``` curl --compressed -X POST "https://sandbox-api.drct.aero/orders" \ -H "Accept: application/json" \ -H "Accept-Encoding: gzip" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" \ -d '{ "offer_id": "'"$OFFER_ID"'", "passengers": [ { "id": "PAX1", "type": "ADT", "individual": { "title": "Mr", "first_name": "James", "last_name": "Watson", "date_of_birth": "1990-10-01" }, "phone": "+14840000000", "email": "example@mail.com", "document": { "number": "AA9999", "gender": "M", "citizenship": "UA", "country_of_issue": "UA", "expiration_date": "2023-09-08" } } ] }' ``` --- # Tickets Issuing To issue tickets you need the id of the order. If you still haven’t learned how to create an order, begin from the quickstart guide. ❗ You have a time limit, cancel_before, at which the airline may release your seats and you won’t be able to issue the order. ### Payment We support cash and credit card payments. Cash payments will be processed via your BSP according to your contracts with airlines. Cash is the default. Card payment works on some channels only; elsewhere you get channel_not_supported. Ask support for the list. For specification and examples, see the Issue Order reference. ### Request issue 👉 #### Example: Request · issue · cURL ``` curl -X POST "https://sandbox-api.drct.aero/orders/$ORDER_ID/issue" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" ``` ### Price changed Prices can change with currency rates, typically when you create an order one day and issue it the next. Issuing at the old price returns price_changed. To proceed with issuing, send the issue request again with a { "reshop": true } body. #### Example: Error · price_changed ``` { "error": { "code": "price_changed", "message": "{'old':100.0,'new':105.0,'currency':'USD'}" } } ``` #### Example: Request · reshop · cURL ``` curl -X POST "https://sandbox-api.drct.aero/orders/$ORDER_ID/issue" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" \ -d '{ "reshop": true }' ``` ### Delayed tickets Some providers do not return tickets in the issue response. In that case you still receive an issued status, but tickets appear later in the Get Order response. It usually takes up to 3 minutes to receive tickets. If you have not received tickets within an hour, contact support. --- # Order Cancellation To perform a cancellation you need the id of the order you would like to cancel. If you still haven’t learned how to create an order, look at the quickstart guide. ❗ Some airlines do not support cancellation of an order with tickets. In this case we return a not_implemented_error. ### Cancellation process Cancellation works for orders without tickets as well as with tickets. When an order has tickets, our system voids them first and then cancels the order. Voiding only works inside the ticketing window — once an order is past it, this endpoint stops accepting it. Refund it instead: see the Refund guide. You need to understand two attributes to perform cancellation correctly: - cancel_before and cancellation in fares; - cancel_before is the time before which you can safely cancel an order without tickets; - cancellation shows the cancellation policy for orders with tickets. ### Order without tickets Generally, you can safely cancel an order anytime without additional fees. But some airlines may fine you if you do not cancel before the time in cancel_before. 💡 All timings are based on the time of the Point of Sale (POS) of the order — for a UA POS that means 23:59 GMT+3. ❗ If you cancel an order less than three hours before your flight, the airline may fine you. ### Cancellation request 👉 #### Example: Request · cURL ``` curl -X DELETE "https://sandbox-api.drct.aero/orders/$ORDER_ID" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" ``` --- # Refund A refund is two calls: quote it to see what you get back and what the airline keeps, then confirm it. Nothing moves until you confirm. ``` GET /orders/{id}/refund_quote → what you would get back POST /orders/{id}/refund → take it ``` ⚠️ An order that can still be voided must be voided, not refunded — void returns the full amount. Cancel it with DELETE /orders/{id}; while void is possible, a refund returns refund_unavailable. ### Availability Refund is available on the channels whose airline supports it — the same list the DRCT board offers, no separate API opt-in: Aegean Airlines, Air France-KLM NDC, Ajet, British Airways, Finnair, Flydubai, FlyOne, Lot, Lufthansa Group, Pegasus, Qatar Airways, Riyadh Air, Saudia, Singapore Airlines, Turkish Airlines. The order must also be issued and past its void window. And if a channel restricts refunds to DRCT staff, the API answers refund_unavailable there too — same rule as the board. ### Quote the Refund Field notes: - total — what lands back on your balance. The penalty is already deducted from it; don't subtract it a second time. - penalty — what the airline keeps. 0 when the fare is fully refundable. - fare / taxes — the two halves of total. Omitted when the airline does not break the refund down, so treat them as optional. 💡 A quote never refunds anything — hence a GET. Call it again whenever you need the current figure: every call re-asks the airline, so don't cache the response. #### Example: Request · quote · cURL ``` curl -X GET https://sandbox-api.drct.aero/orders/$ORDER_ID/refund_quote \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" ``` #### Example: Response ``` { "locator": "C57I60", "total": { "amount": 350.00, "currency": "EUR" }, "penalty": { "amount": 100.00, "currency": "EUR" }, "fare": { "amount": 300.00, "currency": "EUR" }, "taxes": { "amount": 50.00, "currency": "EUR" } } ``` ### Confirm the Refund Field notes: - status — the order status after the refund. - tickets / emds — every document the refund covered. emds is present only when the order had ancillaries. - total / penalty at the top level — the totals across the documents the airline has already processed. Once every document is REFUNDED, we cancel the booking with the airline for you, as DELETE /orders/{id} would. The order is then read-only — no issue, ancillaries or second refund — and GET /orders/{id} shows status: "refunded". #### Example: Request · confirm · cURL ``` curl -X POST https://sandbox-api.drct.aero/orders/$ORDER_ID/refund \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" ``` #### Example: Response ``` { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "locator": "C57I60", "channel": "Turkish", "status": "refunded", "total": { "amount": 350.00, "currency": "EUR" }, "penalty": { "amount": 100.00, "currency": "EUR" }, "tickets": [ { "number": "2205740877684", "passenger": "PAX1", "status": "REFUNDED", "total": { "amount": 350.00, "currency": "EUR" }, "penalty": { "amount": 100.00, "currency": "EUR" } } ] } ``` ### Pending Documents and Totals While a document is still pending we leave it out of the totals rather than reporting a settled zero. So a response can legitimately look like this: No total, no penalty — nothing has settled yet. The same happens when an order's documents were refunded in different currencies: the per-document amounts are there, because summing them would mean us picking an exchange rate on your behalf. ``` { "status": "refunded", "tickets": [ { "number": "2205740877684", "passenger": "PAX1", "status": "TICKETED" } ] } ``` ### Errors Code | When refund_unavailable | You cannot refund this order. Either the channel does not support refunds (or restricts them to DRCT staff), or the order is not in a refundable state — most often it can still be voided, so cancel it with DELETE /orders/{id}, or it was never issued. The message says which. not_found | The order id is malformed or unknown, or the order belongs to another agency. A refusal from the airline itself is passed through with the provider's own code and message, so you see what the airline said rather than a generic error. --- # Offer Upsell On some channels a search returns one representative offer per itinerary. Upsell expands it into every branded fare for the same flights — from Economy Basic to Business — each with its own price and offer id to price and book. ### Availability Only these channels need Upsell — everywhere else, Search Offers already returns every fare: - Turkish - British Airways - Emirates - Finnair - Travelport - FlyNas - WizzAir - Flayer K (Ryanair) ### Flow overview - Search offers (Search Offers). - Take an offer id from the search response (flights_options[].offers[].id). - Retrieve the upsell fares (GET /offers/:id/upsell). - Pick a fare, then continue with Price Offer / Create Order using the offer id from the upsell response — not the original search offer. ### Get Offer Upsell Returns all bookable fares available for the specified offer. Full reference: Upsell Offer. The response is identical to a Search Offers response — the same flights_options / fares / segments / passengers, listing every bookable branded fare for the itinerary. 💡 Use the offer id from this response (flights_options[].offers[].id) for Price Offer / Create Order — it replaces the offer id from the original search. #### Example: Request · cURL ``` curl -X GET "https://sandbox-api.drct.aero/offers/$OFFER_ID/upsell" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" ``` --- # Ancillaries To add ancillaries you need the id of the order you would like to extend. If you still haven’t learned how to create an order, look at the quickstart guide. ### Availability Ancillaries are not available on every channel or in every order state. Availability is driven by the order’s channel and its status. Channel | When ancillaries can be added | EMD issuance Flayer K (Ryanair) | Before the order is issued | Confirmed together with the issued order WizzAir | Before the order is issued — baggage and other services (priority boarding, check-in, special assistance) | Confirmed together with the issued order Lufthansa Group | After the order is issued | Asynchronous — see Pending Ancillaries Turkish | After the order is issued | Synchronous — issued immediately FlyOne | Before the order exists — shopped on the offer via Shop Offer Ancillaries | Confirmed together with the order If the channel supports ancillaries only for a different order state (e.g. only after issue), you will get invalid_order_status. If the channel does not support ancillaries at all, you will get channel_is_off. ### Flow overview - Create an order (Create Order). - Issue the order (Issue Order) — if required. - Retrieve available ancillaries (GET /orders/:id/ancillaries). - Add selected ancillaries to the order (POST /orders/:id/ancillaries). ### Shop Ancillaries Returns a list of ancillaries available for the specified order. Full reference: Shop Ancillaries. Field notes: - id — unique ancillary id; use it when confirming. - type — baggage for bags, service for any other extra. Branch on this rather than on the provider's free-text name. - segments — segment ids the ancillary is bound to (match Get Order). Empty in the shop list for a service that applies to the passenger on the whole order (e.g. special assistance); once confirmed, the order shows it with the flight's segments. - max_quantity — maximum quantity per passenger, when the provider reports it. - passengers — passenger ids the ancillary applies to, when the provider scopes it per passenger. Otherwise omitted, and you choose the passenger at confirm. #### Example: Request · shop · cURL ``` curl -X GET "https://sandbox-api.drct.aero/orders/$ORDER_ID/ancillaries" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" ``` #### Example: Response · shop ``` { "ancillaries": [ { "id": "ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5", "name": "Bag 20 KG", "type": "baggage", "segments": ["SEG_M_1"], "passengers": ["PAX_1"], "price": { "amount": 20.20, "currency": "EUR" } } ] } ``` ### Confirm Ancillary Adds selected ancillaries to the order. Full reference: Confirm Ancillary. Request body: - ancillaries[].id — ancillary id obtained from the Shop Ancillaries response. - ancillaries[].passenger_id — passenger id from the order. - ancillaries[].quantity — quantity for this passenger. Optional, defaults to 1 and must not exceed max_quantity. Channels that sell baggage as fixed lots (WizzAir) reject a value above 1 with ancillary_quantity_not_supported. Several ancillaries can be added in a single request. After successfully adding ancillaries, the API returns a full order (see Get Order). The response includes an ancillaries section. 💡 In the shop response the passenger binding is a list (passengers), while on a confirmed ancillary it is the single assigned passenger. A confirmed ancillary also carries a status — see Pending Ancillaries. #### Example: Request · confirm · cURL ``` curl -X POST "https://sandbox-api.drct.aero/orders/$ORDER_ID/ancillaries" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" \ -d '{ "ancillaries": [ { "id": "ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5", "passenger_id": "PAX_1", "quantity": 1 } ] }' ``` #### Example: Response · order.ancillaries ``` { "...": "...", "ancillaries": [ { "id": "ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5", "name": "Bag 20 KG", "type": "baggage", "passenger": "PAX_1", "segments": ["SEG_M_1"], "price": { "amount": 20.20, "currency": "EUR" }, "status": "issued" } ] } ``` ### Pending Ancillaries Some channels issue the ancillary's EMD synchronously: it's issued as soon as you confirm. Others confirm with the provider first — the ancillary comes back pending, and its EMD is issued once the provider confirms. The state is exposed via the status field on a confirmed ancillary in the order: Status | Meaning confirmed | Added to the order and confirmed by the provider; EMD not issued yet. pending | Awaiting provider confirmation; EMD issuance in progress. issued | The ancillary EMD has been issued. cancelled | The ancillary was cancelled / could not be issued. ### How it works - You confirm the ancillary (POST /orders/:id/ancillaries). On an asynchronous channel (Lufthansa Group) the returned ancillary has "status": "pending". - Our system polls the provider and issues the EMD automatically once the ancillary is confirmed — no extra call is required from you. - Poll the order until the ancillary status becomes issued (or cancelled if issuance failed). ❗ On asynchronous channels the ancillary is not fully issued at confirm time. Do not treat pending as final — re-fetch the order to get the final status. 💡 An ancillary normally resolves from pending to issued within a few minutes. If it is still pending after ~15 minutes, contact support with the order id — do not retry the confirm request. #### Example: Request · poll order · cURL ``` curl -X GET "https://sandbox-api.drct.aero/orders/$ORDER_ID" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" ``` #### Example: Response · still pending ``` { "...": "...", "ancillaries": [ { "id": "ANCILLARY_42622140D81C4F8DBFCD3A724E0BA4EE-0DG-5", "name": "Bag 20 KG", "type": "baggage", "passenger": "PAX_1", "segments": ["SEG_M_1"], "price": { "amount": 20.20, "currency": "EUR" }, "status": "pending" } ] } ``` --- # Seat Maps Seats belong to an existing order, so you need its id: add them after the order is created and before it is issued. There's no offer-stage seat endpoint. ### Availability Seat maps are not available on every channel. Availability is driven by the order's channel. Channel | When seats can be added Flayer K (Ryanair) | On an unissued order, before issue WizzAir | On an unissued order, before issue If the channel does not support seat maps, both View Seat Maps and Add Seats return channel_is_off. Some fares require a seat to be issued. Bundled fares (e.g. Ryanair Regular/Plus, WIZZ PLUS) reject issuing with issue_required_seats until a seat is selected for every passenger. Add seats before issuing the order. ### View Seat Maps GET /orders/{id}/seat_maps returns the cabin layout — one map per passenger per segment (a seat's price and availability can differ per passenger), each with the cabin and its rows. Field notes: - segment / passenger — the segment and passenger this map is built for; they match the ids in the order. Because price and availability can differ per passenger, there is one map per passenger per segment. - number — the physical row number. - designator — the seat designator (e.g. 12A); use it when adding the seat. - available — whether the seat can be booked. Unavailable seats are included so you can render the full cabin; they just cannot be selected. - characteristics — IATA seat characteristics as { code, description } (see the table below). Empty when the provider reports none. - price — the final price to select the seat, as { amount, currency }. Any agency markup is already included; no breakdown is exposed. #### Example: Response ``` { "seat_maps": [ { "segment": "SEG_M_1", "passenger": "PAX_1", "cabin": "Economy", "rows": [ { "number": 1, "seats": [ { "designator": "1A", "available": true, "characteristics": [ { "code": "E", "description": "Exit and emergency exit" }, { "code": "L", "description": "Leg space seat" } ], "price": { "amount": 29.60, "currency": "EUR" } }, { "designator": "1B", "available": false, "characteristics": [], "price": { "amount": 29.60, "currency": "EUR" } } ] } ] } ] } ``` ### Seat characteristics Every code comes from the IATA seat-characteristic catalog, so the vocabulary is the same for every airline. The table lists the codes seen in current responses across the channels we've checked: Code | Description 1 | Restricted seat - General 8 | No seat at this location 9 | Center seat (not window, not aisle) A | Aisle seat B | Seat with bassinet facility CH | Chargeable seat E | Exit and emergency exit FC | Front of cabin class/compartment H | Seat with facilities for handicapped/incapacitated passenger IE | Seat not suitable for child L | Leg space seat LS | Left side of aircraft M | Seat without a movie view MS | Middle seat N | No smoking seat O | Preferential seat OW | Over wing seat(s) RS | Right side of aircraft U | Seat suitable for unaccompanied minors V | Seat to be left vacant or offered last W | Window seat 1A | Seat not allowed for infant 1B | Seat not allowed for medical 1C | Seat not allowed for unaccompanied minor 1D | Restricted recline seat 72 | Undesirable seat Codes that mark a passenger restriction (1, 1A, IE, 1C) describe who may not take the seat; the seat is still returned, but it comes back available: false for the passenger it does not suit. ### Add Seats POST /orders/{id}/seat_maps adds the chosen seats. Each entry assigns one seat to one passenger on one segment. - passenger_id — passenger id from the order. - segment_id — segment id from the order / seat map. - designator — seat designator from the View Seat Maps response (row number + seat letter, e.g. 12A). The response is the updated order. Confirmed seats appear in the order's seat_maps section (and, once the order is issued, each also surfaces as an electronic document, EMD): - passenger / segment — the passenger and segment the seat is assigned to. - designator — the chosen seat. - price — the final price paid for the seat, as { amount, currency }. - status — the seat's status on the order, when the channel reports it. #### Example: Request ``` { "seat_maps": [ { "passenger_id": "PAX_1", "segment_id": "SEG_M_1", "designator": "12A" } ] } ``` #### Example: Response ``` { "...": "...", "seat_maps": [ { "passenger": "PAX_1", "segment": "SEG_M_1", "designator": "12A", "price": { "amount": 29.60, "currency": "EUR" }, "status": "issued" } ] } ``` ### Errors Code | When channel_is_off | The channel does not support seat maps, or ticketing is off for your agency. invalid_order_status | The order status does not allow seats (e.g. already issued). validation_error | The seat_maps payload is invalid (empty list, or a bad designator). not_found | The order id is unknown or the order was cancelled. --- # Price Change On most channels a quoted price holds until the order's cancel_before — though currency rates can move it overnight. A few channels guarantee the fare only until price_expires_at and re-price continuously. Either way, watch price_expires_at on the order. If the price moves, issuing returns price_changed; issue again with { "reshop": true } to accept the new price. ### Price Expires At Continuous pricing is driven by the offer's channel and fare — not every offer on these channels carries it. Always trust the price_expires_at field on the order rather than assuming by channel. Channels where the price can carry an expiry: - Lufthansa Group - Aegean Airlines - Qatar Airways - Saudia - British Airways - American Airlines - Emirates - United Airlines - Finnair - Singapore Airlines If price_expires_at is absent, the order isn't continuously priced — the normal cancel_before time limit applies and there is nothing extra to do. Aegean Airlines never freezes a price. For this channel price_expires_at comes back in the past, which is the signal to re-quote before every issue. Treat "expired" as the default here, not the exception. ### Read the Expiry price_expires_at is returned on the order (present only while the order is new). Field notes: - price_expires_at — after this moment the quoted price is no longer guaranteed. - cancel_before — unrelated: it's when the order is auto-cancelled. The price can expire well before that. ``` { "id": "6e5257be-d8d4-484f-8db0-922df4c8402a", "status": "new", "channel": "Lufthansa Group", "cancel_before": "2026-09-12T18:00:00.000+03:00", "price_expires_at": "2026-09-11T18:00:00.000+03:00", "price": { "amount": 420.00, "currency": "EUR" }, "...": "..." } ``` ### Re-quote the Price Ask for a fresh quote and compare it to the current order price. Field notes: - price_changed — true when the re-quoted price differs from the current order price. When false, nothing moved and you can issue normally. - old_price / new_price — omitted when the airline reports no change. #### Example: Request · cURL ``` curl "https://sandbox-api.drct.aero/orders/$ORDER_ID/reprice" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" ``` #### Example: Response ``` { "old_price": { "amount": 420.00, "currency": "EUR" }, "new_price": { "amount": 435.00, "currency": "EUR" }, "price_changed": true } ``` ### Price Changed Prices can change with currency rates, typically when you create an order one day and issue it the next. Issuing at the stale price returns price_changed. To proceed, send the issue request again with a { "reshop": true } body to accept the new price. Issue Order returns the full order with tickets, priced at the amount you accepted. #### Example: Error ``` { "error": { "code": "price_changed", "message": "{'old':100.0,'new':105.0,'currency':'USD'}" } } ``` #### Example: Reissue with the new price ``` curl -X POST "https://sandbox-api.drct.aero/orders/$ORDER_ID/issue" \ -H "Accept: application/json" \ -H "Authorization: Bearer $DRCT_API_KEY" \ -H "Content-Type: application/json" \ -H "DRCT-Version: 2026-09-01" \ -d '{ "reshop": true }' ``` ### Errors Code | When price_changed | You tried to issue at a stale price without accepting the change. Re-issue with { "reshop": true }. not_found | The order id doesn't exist in your account. --- # Working with Charters We have a channel to sell charters, with a slightly different flow. ### Issuing After issuing, wait for the provider to confirm. Once confirmed, tickets appear in Get Order; if rejected, Get Order returns a cancelled_order error with HTTP 404. ### Confirmation time Issued during the provider's support hours (6 a.m. – 3 p.m. UTC), an order is confirmed or rejected in about 15 minutes on average; otherwise, on the next working day. If the provider is silent for an hour, our support contacts them — there's no guaranteed response time. ### Carriers filter With a carriers filter in Search Offers, include our code CSH to get charters — the default filter leaves them out. ### Documents Documents are required for all passengers at the Create Order step. ### Charter cheat sheet --- # Changelog Every release, grouped by the month it shipped and tagged with the DRCT-Version it shipped under — see Versioning for how that header works. 🔥 Major updates ⚠️ Breaking changes ### November 2026 #### Wizz Air (W6) in sandbox (Sandbox) — major update Sandbox now returns real Wizz Air flights next to LOT, Lufthansa and Turkish Airlines, so you can test the whole low-cost flow before going live: branded fares via Upsell Offer, baggage and other services via Shop Ancillaries, seat selection via View Seat Maps and the 60-minute ticketing window. See Sandbox vs. Production. #### Services beyond baggage for Wizz Air (W6), and an ancillary type (Ancillaries) — major update Shop Ancillaries for Wizz Air now lists other services next to bags — priority boarding, Wizz Flex, check-in, sport equipment and special assistance. Every ancillary, in the shop list and on the order, carries a new type field: baggage or service, so you no longer need to guess from the name. Special-assistance services apply to the passenger on the whole order: they come with an empty segments list when shopped and with the flight's segments once confirmed on the order. Some of them can't be bought alone — Wizz Air rejects a guide dog without a matching assistance service (e.g. blind) in the same request. See the Ancillaries guide. ### October 2026 #### Seat selection at booking (Seat Maps) — major update Seats could only be chosen on the airline's website after booking, and some fares can't be booked without a seat at all. Now you can show the traveller the seat map and confirm a seat through the API before the ticket is issued. Available after Create Order and before Issue Order: GET /orders/{id}/seat_maps returns the map with available seats and prices, and POST /orders/{id}/seat_maps confirms the selection. On channels without seat selection, the API returns channel_is_off. Available for Wizz Air (W6) and Flayer K (Ryanair). Full flow in the Seat Maps guide. #### Checked baggage for Wizz Air (W6) (Ancillaries) Wizz Air sells checked baggage only as a paid add-on, and through the API you could previously book only the flight. Now the bag can be added through the API before the ticket is issued — see Shop Ancillaries and Confirm Ancillary, or follow the Ancillaries guide. Available after Create Order and before Issue Order. The ancillary id already includes the number of bags, so confirm each id once — quantity above 1 is rejected. #### All fares for Ryanair (FR) and Wizz Air (W6) (Upsell Offer) For Ryanair and Wizz Air, search returned only the basic fare. Now you can get every fare bundle for the flight, from basic up to bundles with baggage and flexible changes — call Upsell Offer after Search Offers and use the offer id from its response in Price Offer and Create Order. Some higher Ryanair fares require seat selection at booking. Full flow in the Offer Upsell guide. #### Fixed booking after Fare Rules on Turkish Airlines (TK) (Turkish Airlines (TK)) On Turkish Airlines, a Fare Rules request made the offer unusable, and Create Order then failed. This is fixed — Create Order no longer fails with Shop offer not found after Fare Rules. You don't need to change anything. ### September 2026 New API version — 2026-09-01 #### Delayed ticketing: new pending status (Get Order) — breaking change Some airlines confirm the booking first and issue the tickets later. Get Order used to report these orders as issued straight away, before any ticket existed. Now they stay pending until the airline actually issues the tickets. Applies only on DRCT-Version 2026-09-01 — pending switches to issued once ticket numbers appear on the order; treat it as a normal in-progress state, not an error. On DRCT-Version 2021-06-01, nothing changes. #### Continuous pricing: fares can change before the time limit (Reprice Order) — major update On many NDC channels the airline guarantees the price for less time than the order's ticketing time limit. The order looked valid until then, but by issue time the fare may already have changed. Now you can see when the price expires and get the current one before issuing. Such orders return price_expires_at. Once it passes, call Reprice Order, then issue with reshop: true to accept the new price. If the field is absent, the price holds until cancel_before. Full flow in the Price Change guide. #### Refund issued tickets via the API (Cancellation) — major update Once the void window closed, issued tickets could only be refunded through DRCT support. Now you can refund them directly through the API via Quote Order Refund and Refund Order, and see the amount and the airline's penalty before you confirm. Refund takes two calls: quote, then confirm — nothing is refunded until you confirm. While a ticket can still be voided, use Cancel Order instead. Available on 15 channels, listed in the Refund guide. ### August 2026 #### Introduced Pre-Booking baggage purchase (Shop Offer Ancillaries) — major update Paid checked baggage can now be chosen at the offer stage too — before an order exists. Shop it with the new Shop Offer Ancillaries endpoint, then confirm the selection by passing the ancillary ids into Create Order 's own ancillaries array. Available for FlyOne. #### Introduced Post-Booking baggage purchase (Ancillaries) — major update For an existing order, a traveller can now shop and add paid checked baggage after booking — see Shop Ancillaries and Confirm Ancillary, or follow the full flow in the Ancillaries guide. Available for Turkish Airlines (TK) and the Lufthansa Group. ### July 2026 #### Introduced Offer Upsell Request to receive all fares (Upsell Offer) — major update Some channels' Search Offers responses exclude certain fares — for example, returning only Economy. There was previously no way to retrieve the rest. You can now send an additional Upsell Offer request against a priced offer to get every branded fare available for it, not just the ones the original search returned. #### Adds a TEEN passenger type for FR passengers aged 12–17 (Search Offers) The FR channel previously returned passengers aged 12–17 as CHD, the same type used for younger children. It now returns a dedicated TEEN type for that age range instead. If you branch on passenger type for FR bookings in Search Offers or order responses, update that logic — CHD no longer covers ages 12–17 on this channel. #### Fixes flight segment order in U5 offers (Search Offers) Multi-city and round-trip itineraries priced through the SkyUp (U5) channel could return segments out of chronological order inside flights_options[].flights. Segments are now always sorted by departure time, matching every other channel. #### Adds hand baggage allowance display for U5, LO, QR, GL, LWC (Ancillaries) Search Offers and Price Offer responses now include carry-on baggage allowance in fares[].baggage for five more channels: SkyUp (U5), LOT (LO), Qatar Airways (QR), Travelport (GL), and Low-cost (LWC).