{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"f8b01138-e4e0-44fb-a4d8-6d1fe389fdfe","name":"Aeronology API v2","description":"The Aeronology API v2 provides a unified interface for air shopping, revalidation, and booking across multiple content sources including GDS, NDC and LCC channels.\n\n---\n\n## Base URL\n\n`https://apis.aeronologydev.io`\n\n## Authentication\n\nAll API requests require authentication. The flow is two-step:\n\n1. **Obtain an access token** by calling the `/xauth/session/authentication` endpoint with Basic Auth credentials.\n    \n2. **Use the returned** **`access_token`** as a `Bearer` token in the `Authorization` header for all subsequent requests.\n    \n\n| Header | Value |\n| --- | --- |\n| `Authorization` | `Bearer {access_token}` |\n| `Content-Type` | `application/json` |\n\n---\n\n## Endpoints Overview\n\n| # | Endpoint | Method | Path | Description |\n| --- | --- | --- | --- | --- |\n| 1 | **Authentication** | `POST` | `/xauth/session/authentication` | Obtain an access token using Basic Auth credentials |\n| 2 | **Search** | `POST` | `/aagw/api/flights/search` | Search for available flight offers across GDS and NDC sources |\n| 3 | **Revalidate** | `POST` | `/aagw/api/flights/revalidate` | Revalidate a selected offer to confirm pricing and availability before booking |\n| 4 | **Book** | `POST` | `/aagw/api/flights/book` | Create a booking (PNR) for a revalidated offer with passenger and payment details |\n\n---\n\n## Typical Workflow\n\n**① Authenticate** → Obtain access token → **② Search** → Get available flight offers → **③ Revalidate** → Confirm price & availability → **④ Book** → Create booking with passenger details\n\n---\n\n## 1\\. Authentication\n\nAuthenticates the client and returns an access token for subsequent API calls.\n\n**Endpoint:** `POST /xauth/session/authentication`\n\n**Headers**\n\n| Header | Value |\n| --- | --- |\n| `Authorization` | `Basic {base64(username:password)}` |\n| `Content-Type` | `application/json` |\n\n**Response**\n\n``` json\n{\n    \"access_token\": \"eyJhbGciOiJIUzM4NCJ9.eyJ1SWQiOiJhcGlfdXNlcjEi...\",\n    \"expiry\": 1776821150,\n    \"refresh_token\": \"e99008b3-0591-4f9d-bd6f-4c1092db3718\"\n}\n\n ```\n\n| Field | Type | Description |\n| --- | --- | --- |\n| `access_token` | string | JWT access token to use as Bearer token in all subsequent requests |\n| `expiry` | integer | Token expiration time as a Unix timestamp (seconds since epoch) |\n| `refresh_token` | string | UUID token used to obtain a new access token without re-authenticating |\n\n---\n\n## 2\\. Search\n\nSearch for available flight offers. Returns results from all configured content sources (GDS and NDC).\n\n**Endpoint:** `POST /aagw/api/flights/search`\n\n**Request Body**\n\n``` json\n{\n    \"journeys\": [\n        {\n            \"origin\": \"MEL\",\n            \"destination\": \"HKG\",\n            \"departure_date\": \"2026-05-03\"\n        }\n    ],\n    \"passengers\": {\n        \"ADT\": 2,\n        \"CHD\": 2,\n        \"INF\": 1\n    },\n    \"cabin_code\": \"Y\",\n    \"country_of_sale\": \"AU\"\n}\n\n ```\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `journeys` | array | Yes | List of journey legs (origin, destination, departure date) |\n| `journeys[].origin` | string | Yes | IATA airport code for departure |\n| `journeys[].destination` | string | Yes | IATA airport code for arrival |\n| `journeys[].departure_date` | string | Yes | Departure date in `YYYY-MM-DD` format |\n| `passengers` | object | Yes | Passenger counts by type (`ADT`, `CHD`, `INF`) |\n| `cabin_code` | string | No | Preferred cabin class (`Y` = Economy, `C` = Business, `F` = First) |\n| `country_of_sale` | string | Yes | ISO country code for point of sale |\n\n**Response**\n\nReturns an array of offer objects. Each offer contains fare details, journey/segment information, and fare breakdowns per passenger type.\n\n``` json\n[\n    {\n        \"provider\": \"QFNDC\",\n        \"fare_key\": \"XD4812A62-81F8...\",\n        \"plating_carrier\": \"QF\",\n        \"purchase_by\": \"2026-04-22T23:59:00\",\n        \"base_fare\": { \"amount\": 1367, \"currency\": \"AUD\" },\n        \"total_fare\": { \"amount\": 2946.04, \"currency\": \"AUD\" },\n        \"total_tax\": { \"amount\": 143.02, \"currency\": \"AUD\" },\n        \"journeys\": [ ... ],\n        \"fare_breakdown\": { ... },\n        \"status\": \"Success\"\n    }\n]\n\n ```\n\n**Key Response Fields**\n\n| Field | Type | Description |\n| --- | --- | --- |\n| `provider` | string | Content source identifier (e.g. `QFNDC`, `1W`) |\n| `fare_key` | string | Unique identifier for this offer |\n| `plating_carrier` | string | IATA code of the ticketing airline |\n| `purchase_by` | string | Last date/time to ticket this fare |\n| `base_fare` | object | Base fare amount and currency |\n| `total_fare` | object | Total fare including taxes |\n| `total_tax` | object | Total tax amount |\n| `journeys` | array | Flight itinerary with segment options |\n| `fare_breakdown` | object | Per-passenger-type fare details (ADT, CHD, INF) |\n| `status` | string | Result status (`Success` or error) |\n\n> **Note:** Response fields may vary by content source. NDC results include additional fields such as `offer_key`, `fare_families`, and `result_type`. GDS results include fields like `ticket_instructions`, `settlement_method`, and `penalties_per_pax`. All sources share the same core schema structure. \n  \n\n---\n\n## 3\\. Revalidate\n\nRevalidates a selected search offer to confirm that the price and availability are still current before proceeding to booking.\n\n**Endpoint:** `POST /aagw/api/flights/revalidate`\n\n**Request Body**\n\n``` json\n{\n    \"fare_key\": \"XD4812A62-81F8...\",\n    \"provider\": \"QFNDC\",\n    \"offer_key\": \"eyJTaG9wcGluZ1Jlc3Bv...\",\n    \"option_selectors\": [\n        \"eyJTaG9wcGluZ1Jlc3Bvbn...\"\n    ],\n    \"country_of_sale\": \"AU\"\n}\n\n ```\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `fare_key` | string | Yes | The `fare_key` from the search response |\n| `provider` | string | Yes | The `provider` value from the search response |\n| `offer_key` | string | Conditional | Required for NDC offers. The `offer_key` from the search response |\n| `option_selectors` | array | Yes | Array of `option_selector` values from selected segment options |\n| `country_of_sale` | string | Yes | ISO country code for point of sale |\n\n**Response**\n\nReturns the revalidated offer with confirmed pricing. The structure matches the search response but reflects the current fare and availability.\n\n---\n\n## 4\\. Book\n\nCreates a booking (PNR) for a revalidated offer with full passenger and contact details.\n\n**Endpoint:** `POST /aagw/api/flights/book`\n\n**Request Body**\n\n``` json\n{\n    \"fare_key\": \"XD4812A62-81F8...\",\n    \"provider\": \"QFNDC\",\n    \"offer_key\": \"eyJTaG9wcGluZ1Jlc3Bv...\",\n    \"option_selectors\": [\n        \"eyJTaG9wcGluZ1Jlc3Bvbn...\"\n    ],\n    \"passengers\": [\n        {\n            \"type\": \"ADT\",\n            \"title\": \"MR\",\n            \"first_name\": \"John\",\n            \"last_name\": \"Smith\",\n            \"date_of_birth\": \"1990-01-15\",\n            \"gender\": \"M\",\n            \"passport\": {\n                \"number\": \"PA1234567\",\n                \"country_of_issue\": \"AU\",\n                \"nationality\": \"AU\",\n                \"expiry_date\": \"2030-01-15\"\n            }\n        }\n    ],\n    \"contact\": {\n        \"email\": \"john.smith@example.com\",\n        \"phone\": \"+61412345678\"\n    },\n    \"country_of_sale\": \"AU\"\n}\n\n ```\n\n| Field | Type | Required | Description |\n| --- | --- | --- | --- |\n| `fare_key` | string | Yes | The `fare_key` from the revalidated response |\n| `provider` | string | Yes | Content source identifier |\n| `offer_key` | string | Conditional | Required for NDC offers |\n| `option_selectors` | array | Yes | Selected segment options |\n| `passengers` | array | Yes | Full passenger details including travel documents |\n| `passengers[].type` | string | Yes | Passenger type (`ADT`, `CHD`, `INF`) |\n| `passengers[].title` | string | Yes | Title (`MR`, `MRS`, `MS`, `MSTR`, `MISS`) |\n| `passengers[].first_name` | string | Yes | First/given name as per travel document |\n| `passengers[].last_name` | string | Yes | Last/family name as per travel document |\n| `passengers[].date_of_birth` | string | Yes | Date of birth in `YYYY-MM-DD` format |\n| `passengers[].gender` | string | Yes | Gender (`M` or `F`) |\n| `passengers[].passport` | object | Conditional | Required for international travel |\n| `contact` | object | Yes | Contact details for the booking |\n| `contact.email` | string | Yes | Email address for booking confirmation |\n| `contact.phone` | string | Yes | Phone number in international format |\n| `country_of_sale` | string | Yes | ISO country code for point of sale |\n\n**Response**\n\nReturns the created booking with a PNR reference and booking status.\n\n``` json\n{\n    \"pnr\": \"ABC123\",\n    \"status\": \"Confirmed\",\n    \"provider\": \"QFNDC\",\n    \"passengers\": [ ... ],\n    \"journeys\": [ ... ],\n    \"total_fare\": { \"amount\": 2946.04, \"currency\": \"AUD\" },\n    \"ticketing_deadline\": \"2026-04-22T23:59:00\"\n}\n\n ```\n\n---\n\n## Response Codes\n\n| Code | Description |\n| --- | --- |\n| `200` | Success |\n| `400` | Bad Request, invalid or missing parameters |\n| `401` | Unauthorized, missing or expired token |\n| `404` | Not Found, offer no longer available |\n| `422` | Unprocessable Entity, revalidation or booking failed |\n| `429` | Too Many Requests, rate limit exceeded |\n| `500` | Internal Server Error |\n\n---\n\n## Content Source Differences\n\nThe API normalises responses across content sources into a shared schema, but some fields are source-specific:\n\n| Field | GDS (Sabre/1W) | NDC (QF NDC) |\n| --- | --- | --- |\n| `result_type` | — | `\"NDC\"` |\n| `offer_key` | — | Present (required for revalidate/book) |\n| `fare_families` | — | Keyed map with text attributes |\n| `fare_family` | `name` + `code` + structured `brand_features` | `name` + text `attributes` |\n| `penalties_per_pax` | Structured penalty objects | — |\n| `changeFee` | — | Simple numeric value |\n| `ticket_instructions` | Present | — |\n| `is_refundable` | Present | — |\n| `seats_available` | Per segment | — |\n| `isPaid` (on taxes) | — | Present |\n\n---\n\n## Rate Limits\n\n| Plan | Requests / minute |\n| --- | --- |\n| Standard | 60 |\n| Premium | 300 |\n\nRate-limited responses return HTTP `429` with a `Retry-After` header.","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"9611142","team":621100,"collectionId":"f8b01138-e4e0-44fb-a4d8-6d1fe389fdfe","publishedId":"2sBXqFMNHa","public":true,"publicUrl":"https://docs.aeronologydev.io","privateUrl":"https://go.postman.co/documentation/9611142-f8b01138-e4e0-44fb-a4d8-6d1fe389fdfe","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"light","themes":[{"name":"dark","logo":null,"colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"FF6C37"}},{"name":"light","logo":null,"colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"}}]}},"version":"8.11.6","publishDate":"2026-07-02T23:32:17.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":null,"logoDark":null}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/21ceadb48e225967f68c9f9e306b1f3f778b00ff5c2e8c73ac534e95e88d22d9","favicon":"https://aeronologydev.io/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://docs.aeronologydev.io/view/metadata/2sBXqFMNHa"}