1 · Origins
List origin airports.
What: the origin airports you can fly from, canonicalised to IATA.
When: to build the “from” field of a search form, or a route picker.
How: POST with a JSON body { tripType? }. No query params.
Trip kind: leave tripType out to list every kind — airports with one-way flights AND airports that only round-trip packages leave from (the same meaning as /search without tripType). Send ONE_WAY or ROUND_TRIP to list only that kind. Round trips are asked only of suppliers that sell round-trip packages. Send the same tripType (or none) to discovery and to /search: a picker that lists every kind but a search that asks for one kind offers dates the search then finds nothing on.
After: POST /destinations (body { origin }) to get where you can fly to.
Each airport carries inventoryCategories — the inventory kinds YOU can book there (the kinds of your suppliers that list it): ["SERIES"] = pre-purchase/special fares, ["ONLINE"] = live online/GDS, [] = none/unknown. Render a badge, or show only series airports by keeping rows whose inventoryCategories include SERIES.
sources is optional. Omit it to use every supplier you have switched on. Send a subset to narrow the picker, and send the SAME list to /search so the routes and dates a user can pick match the suppliers that will be searched. Get the codes from GET /v1/flights/suppliers; a code your key is not switched on for returns 403.
Scope: this returns only YOUR bookable origins. For the full searchable airport master (reference data — every airport, with timezone/geo/ICAO) call GET /v1/airports/*.
Supplier health: meta.suppliers[] has one entry per supplier Kitionz considered, for each trip kind it was asked about: { sourceCode, tripType, status, tookMs }. With no tripType in the request, a supplier that sells round trips has two entries (ONE_WAY and ROUND_TRIP). status = ok, not_asked, or a classified error code. not_asked (with reason = ORIGIN_NOT_LISTED or DEST_NOT_LISTED) means the supplier was not called because its own saved list for the previous step did not contain the airport — an answer, not a fault; treat only error codes as failures, and treat an unrecognised status as opaque. If a supplier fails (or is backing off after rate-limiting Kitionz) and Kitionz holds a recent good answer from it, that answer is still included and its entry carries stale: true + staleAgeMs (route lists up to 24 h old, date lists up to 2 h old with past dates removed). Route lists are cached for up to 2 h and date lists for up to 15 min: a list is served from the cache inside its window and fetched again on the first request after it.
Example — request (an empty body lists every trip kind):
Response (trimmed) — data is the airport array; meta.count is the total:
Authentication
Your Kitionz API key, sent as Authorization: Bearer keyId:secret. Create it in your Kitionz console under API → API keys.
Request
ONE_WAY or ROUND_TRIP lists only that kind of trip. Leave it out to list every kind: one-way flights and round-trip packages together (as /search does).
Optional. Leave it out to use every supplier your account has switched on. Send a list of sourceCodes only to narrow this call to some of them; a code you cannot use is refused (403), and blank entries are ignored.