{"openapi":"3.1.0","info":{"title":"Emirin Flights — ChatGPT Action","version":"3.0.2","description":"Direct ChatGPT Action contract for Emirin Flights v3.0.2. Uses Bearer authentication and structured POST /search to avoid web-search/cache transport. For threshold-only requests such as 'verify below RM3000', set verification.requested=false and verification.below=3000; requested=true means unconditional verification.","x-emirin-contract-source":"API_SPEC","x-emirin-release-status":"stable"},"servers":[{"url":"https://flights.emirin.uk"}],"paths":{"/health":{"get":{"operationId":"getEmirinFlightsHealth","summary":"Service health","responses":{"200":{"description":"Configuration and timeout policy"}}}},"/version":{"get":{"operationId":"getEmirinFlightsVersion","summary":"Service version","responses":{"200":{"description":"Version and build metadata"}}}},"/search":{"post":{"operationId":"searchFlights","summary":"Structured canonical flight search","security":[{"bearerAuth":[]}],"parameters":[],"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"}}}},"/verify":{"post":{"operationId":"verifyFlightItinerary","summary":"Verify a selected one-way or two-leg itinerary","security":[{"bearerAuth":[]}],"parameters":[],"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"}},"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-action-transport":true,"x-emirin-action-guidance":{"verification_threshold_only":{"requested":false,"below":"user threshold"},"unconditional_verification":{"requested":true,"below":null},"default_sort_by":"price","default_bags":0,"default_stops":0},"x-emirin-source-contract":"https://flights.emirin.uk/openapi.json"}