{"openapi":"3.1.0","info":{"title":"Emirin Flights","version":"3.0.2","description":"Emirin Flights v3.0.2 stable contract generated from the same internal API_SPEC used by GET /guide.","x-emirin-contract-source":"API_SPEC","x-emirin-release-status":"stable"},"servers":[{"url":"https://flights.emirin.uk"}],"paths":{"/":{"get":{"operationId":"getServiceInfo","summary":"Service discovery","responses":{"200":{"description":"Service identity and endpoint links"}}}},"/about":{"get":{"operationId":"getAbout","summary":"Human-readable service discovery page","responses":{"200":{"description":"HTML service information"}}}},"/guide":{"get":{"operationId":"getGuide","summary":"AI/client operational guide","responses":{"200":{"description":"Current operational contract"}}}},"/openapi.json":{"get":{"operationId":"getOpenApi","summary":"OpenAPI contract","responses":{"200":{"description":"OpenAPI 3.1 contract"}}}},"/openapi.action.json":{"get":{"operationId":"getActionOpenApi","summary":"Reduced OpenAPI contract for ChatGPT Actions","responses":{"200":{"description":"ChatGPT Action OpenAPI contract"}}}},"/version":{"get":{"operationId":"getVersion","summary":"Service version","responses":{"200":{"description":"Version and build metadata"}}}},"/health":{"get":{"operationId":"getHealth","summary":"Service health","responses":{"200":{"description":"Configuration and timeout policy"}}}},"/probe":{"get":{"operationId":"probeReachability","summary":"Zero-SerpApi client/CDN reachability probe","responses":{"200":{"description":"Reachability diagnostics"}}}},"/search":{"get":{"operationId":"searchFlightsGet","summary":"Conventional GET flight search","security":[{"bearerAuth":[]},{"queryToken":[]}],"parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":false,"schema":{"type":"integer"}},{"name":"trip_type","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}},{"name":"date","in":"query","required":false,"schema":{"type":"string"}},{"name":"return_from","in":"query","required":false,"schema":{"type":"string"}},{"name":"return_to","in":"query","required":false,"schema":{"type":"string"}},{"name":"return_date","in":"query","required":false,"schema":{"type":"string"}},{"name":"currency","in":"query","required":false,"schema":{"type":"string"}},{"name":"travel_class","in":"query","required":false,"schema":{"type":"integer"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string"}},{"name":"adults","in":"query","required":false,"schema":{"type":"integer"}},{"name":"children","in":"query","required":false,"schema":{"type":"integer"}},{"name":"infants_in_seat","in":"query","required":false,"schema":{"type":"integer"}},{"name":"infants_on_lap","in":"query","required":false,"schema":{"type":"integer"}},{"name":"bags","in":"query","required":false,"schema":{"type":"integer"}},{"name":"resolve","in":"query","required":false,"schema":{"type":"integer"}},{"name":"scan_limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"verify","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"verify_below","in":"query","required":false,"schema":{"type":"number"}},{"name":"serpapi_no_cache","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"stops","in":"query","required":false,"schema":{"type":"integer"}},{"name":"max_stops","in":"query","required":false,"schema":{"type":"integer"}},{"name":"include_airlines","in":"query","required":false,"schema":{"type":"string"}},{"name":"exclude_airlines","in":"query","required":false,"schema":{"type":"string"}},{"name":"max_duration","in":"query","required":false,"schema":{"type":"integer"}},{"name":"layover_duration","in":"query","required":false,"schema":{"type":"string"}},{"name":"exclude_conns","in":"query","required":false,"schema":{"type":"string"}},{"name":"max_price","in":"query","required":false,"schema":{"type":"number"}},{"name":"emissions","in":"query","required":false,"schema":{"type":"integer"}},{"name":"depart_after","in":"query","required":false,"schema":{"type":"string"}},{"name":"depart_before","in":"query","required":false,"schema":{"type":"string"}},{"name":"arrive_after","in":"query","required":false,"schema":{"type":"string"}},{"name":"arrive_before","in":"query","required":false,"schema":{"type":"string"}},{"name":"return_depart_after","in":"query","required":false,"schema":{"type":"string"}},{"name":"return_depart_before","in":"query","required":false,"schema":{"type":"string"}},{"name":"return_arrive_after","in":"query","required":false,"schema":{"type":"string"}},{"name":"return_arrive_before","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Search completed"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"504":{"description":"Upstream or overall time budget exhausted"}}},"post":{"operationId":"searchFlights","summary":"Structured canonical flight search","security":[{"bearerAuth":[]},{"queryToken":[]}],"parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string"},"description":"URL authentication fallback. Prefer Authorization: Bearer <MONITOR_TOKEN>."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}}},"responses":{"200":{"description":"Search completed"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"504":{"description":"Upstream or overall time budget exhausted"}}}},"/search/one-way/{from}/{to}/{date}":{"get":{"operationId":"searchFlightsPrettyOneWay","summary":"Pretty one-way flight search","description":"Optional /scope/key/value suffixes are governed by x-emirin-pretty-scopes and GET /guide.","security":[{"bearerAuth":[]},{"queryToken":[]}],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"}},{"name":"to","in":"path","required":true,"schema":{"type":"string"}},{"name":"date","in":"path","required":true,"schema":{"type":"string","format":"date"}},{"name":"token","in":"query","required":false,"schema":{"type":"string"},"description":"URL authentication fallback. Prefer Authorization: Bearer <MONITOR_TOKEN>."}],"responses":{"200":{"description":"Search completed"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"504":{"description":"Upstream or overall time budget exhausted"}}}},"/search/round-trip/{from}/{to}/{date}/{return_date}":{"get":{"operationId":"searchFlightsPrettyRoundTrip","summary":"Pretty round-trip flight search","description":"Optional /scope/key/value suffixes are governed by x-emirin-pretty-scopes and GET /guide.","security":[{"bearerAuth":[]},{"queryToken":[]}],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"}},{"name":"to","in":"path","required":true,"schema":{"type":"string"}},{"name":"date","in":"path","required":true,"schema":{"type":"string","format":"date"}},{"name":"return_date","in":"path","required":true,"schema":{"type":"string","format":"date"}},{"name":"token","in":"query","required":false,"schema":{"type":"string"},"description":"URL authentication fallback. Prefer Authorization: Bearer <MONITOR_TOKEN>."}],"responses":{"200":{"description":"Search completed"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"504":{"description":"Upstream or overall time budget exhausted"}}}},"/search/open-jaw/{from}/{to}/{date}/{return_from}/{return_to}/{return_date}":{"get":{"operationId":"searchFlightsPrettyOpenJaw","summary":"Pretty open-jaw flight search","description":"Optional /scope/key/value suffixes are governed by x-emirin-pretty-scopes and GET /guide.","security":[{"bearerAuth":[]},{"queryToken":[]}],"parameters":[{"name":"from","in":"path","required":true,"schema":{"type":"string"}},{"name":"to","in":"path","required":true,"schema":{"type":"string"}},{"name":"date","in":"path","required":true,"schema":{"type":"string","format":"date"}},{"name":"return_from","in":"path","required":true,"schema":{"type":"string"}},{"name":"return_to","in":"path","required":true,"schema":{"type":"string"}},{"name":"return_date","in":"path","required":true,"schema":{"type":"string","format":"date"}},{"name":"token","in":"query","required":false,"schema":{"type":"string"},"description":"URL authentication fallback. Prefer Authorization: Bearer <MONITOR_TOKEN>."}],"responses":{"200":{"description":"Search completed"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"504":{"description":"Upstream or overall time budget exhausted"}}}},"/verify":{"post":{"operationId":"verifyFlightItinerary","summary":"Verify a selected one-way or two-leg itinerary","security":[{"bearerAuth":[]},{"queryToken":[]}],"parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string"},"description":"URL authentication fallback. Prefer Authorization: Bearer <MONITOR_TOKEN>."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Verification completed"},"400":{"description":"Invalid request"},"401":{"description":"Unauthorized"},"504":{"description":"SerpApi timeout"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"},"queryToken":{"type":"apiKey","in":"query","name":"token"}},"schemas":{"SearchRequest":{"type":"object","additionalProperties":false,"required":["trip_type","legs"],"properties":{"trip_type":{"type":"string","enum":["ONE_WAY","ROUND_TRIP","OPEN_JAW","MULTI_CITY"]},"currency":{"type":"string","default":"MYR","pattern":"^[A-Z]{3}$"},"travel_class":{"type":"integer","enum":[1,2,3,4],"default":1},"passengers":{"type":"object","additionalProperties":false,"properties":{"adults":{"type":"integer","minimum":1,"default":1},"children":{"type":"integer","minimum":0,"default":0},"infants_in_seat":{"type":"integer","minimum":0,"default":0},"infants_on_lap":{"type":"integer","minimum":0,"default":0}}},"bags":{"type":"integer","minimum":0,"default":0,"description":"Number of carry-on bags. Emirin Flights explicitly defaults this to SerpApi's native value 0."},"legs":{"type":"array","minItems":1,"maxItems":8,"items":{"$ref":"#/components/schemas/SearchLeg"}},"filters":{"type":"object","additionalProperties":false,"properties":{"sort_by":{"type":"string","enum":["top_flights","price","departure_time","arrival_time","duration","emissions"],"default":"price","description":"SerpApi native sort: 1 Top flights, 2 Price, 3 Departure time, 4 Arrival time, 5 Duration, 6 Emissions. Emirin Flights intentionally defaults to Price."},"include_airlines":{"type":["string","null"]},"exclude_airlines":{"type":["string","null"]},"stops":{"type":"integer","enum":[0,1,2,3],"default":0,"description":"SerpApi native stops value: 0 any stops, 1 nonstop, 2 one stop or fewer, 3 two stops or fewer."},"max_stops":{"type":["integer","null"],"enum":[0,1,2,null]},"max_duration":{"type":["integer","null"],"minimum":1},"layover_duration":{"type":["string","null"],"pattern":"^\\d+,\\d+$"},"exclude_conns":{"type":["string","null"]},"max_price":{"type":["number","null"],"exclusiveMinimum":0},"emissions":{"type":["integer","null"],"enum":[1,null]}}},"results":{"type":"object","additionalProperties":false,"properties":{"limit":{"type":"integer","minimum":1,"maximum":5,"default":3},"scan_limit":{"type":"integer","minimum":1,"maximum":25}}},"verification":{"type":"object","additionalProperties":false,"properties":{"requested":{"type":"boolean","default":false,"description":"Set true only for unconditional verification, e.g. 'verify this fare' or 'always verify'. For 'verify below X', leave requested=false and set below=X."},"below":{"type":["number","null"],"minimum":0,"description":"Conditional verification threshold. Verify only when the cheapest complete fare is at or below this amount unless requested=true. Do not also set requested=true for a threshold-only request."}}},"diagnostics":{"type":"object","additionalProperties":false,"properties":{"serpapi_no_cache":{"type":"boolean","default":false}}}}},"SearchLeg":{"type":"object","additionalProperties":false,"required":["from","to","date"],"properties":{"id":{"type":"string"},"from":{"type":"string","pattern":"^[A-Z]{3}$"},"to":{"type":"string","pattern":"^[A-Z]{3}$"},"date":{"type":"string","format":"date"},"filters":{"type":"object","additionalProperties":false,"properties":{"depart_after":{"type":["string","null"],"pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"depart_before":{"type":["string","null"],"pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"arrive_after":{"type":["string","null"],"pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"arrive_before":{"type":["string","null"],"pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"max_duration":{"type":["integer","null"],"minimum":1},"max_stops":{"type":["integer","null"],"enum":[0,1,2,null]},"layover_duration":{"type":["string","null"],"pattern":"^\\d+,\\d+$"},"exclude_conns":{"type":["string","null"]}}}}},"SelectedFlight":{"type":"object","additionalProperties":false,"required":["flight_number","from","to","departure_time"],"properties":{"flight_number":{"type":"string"},"from":{"type":"string","pattern":"^[A-Z]{3}$"},"to":{"type":"string","pattern":"^[A-Z]{3}$"},"departure_time":{"type":"string"}}},"VerifyRequest":{"type":"object","required":["outbound"],"properties":{"currency":{"type":"string","default":"MYR"},"adults":{"type":"integer","minimum":1,"default":1},"children":{"type":"integer","minimum":0,"default":0},"infants_in_seat":{"type":"integer","minimum":0,"default":0},"infants_on_lap":{"type":"integer","minimum":0,"default":0},"travel_class":{"type":"integer","enum":[1,2,3,4],"default":1},"bags":{"type":"integer","minimum":0,"default":0},"serpapi_no_cache":{"type":["boolean","string","integer"]},"outbound":{"type":"array","minItems":1,"items":{"$ref":"#/components/schemas/SelectedFlight"}},"return":{"type":["array","null"],"minItems":1,"items":{"$ref":"#/components/schemas/SelectedFlight"}}}}}},"x-emirin-pretty-scopes":{"all":["currency","travel_class","sort_by","adults","children","infants_in_seat","infants_on_lap","bags","include_airlines","exclude_airlines","stops","max_stops","max_duration","layover_duration","exclude_conns","max_price","emissions"],"out":["depart_after","depart_before","arrive_after","arrive_before","max_duration","max_stops","layover_duration","exclude_conns"],"return":["depart_after","depart_before","arrive_after","arrive_before","max_duration","max_stops","layover_duration","exclude_conns"],"results":["limit","scan_limit"],"verify":["requested","below"],"diagnostics":["serpapi_no_cache"]},"x-emirin-fetch-compatibility":true}