Flight prices for one date, or the cheapest day in a whole month
The Flights API returns flight search and fare data as clean JSON.
5 active endpoints, on 1 and 2 credit tiers.
- POST/flights/v1/search_flights
- POST/flights/v1/search_places
- POST/flights/v1/airport_info
- POST/flights/v1/price_graph
- POST/flights/v1/seat_info
What Flights endpoints does ReefAPI ship?
5 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Flights API
3 of 5 endpoints, ready to run
Ranked itineraries for a route and a date, each with every segment spelled out — carrier, flight number, both airports, local and UTC times — plus the total for the whole party and a booking link.
{ "ok": true, "meta": { "api": "flights", "endpoint": "search_flights", "mode": "live", "latency_ms": 1211.5, "record_count": 10, "cache_hit": false, "completeness_pct": 100 }, "data": { "flights": [ { "id": "ItineraryOneWay:eyJwcm92aWRlcnMiOiJLSVdJLUJBU0lDOktJV0kiLCJyb3V0ZV9kYXRhIjoiRlI6NTMzOlNUTjoxODEzMDU2MDAwOkdETjoxODEzMDYzNTAwOmVjb25vbXk6RmFsc2U6OjpSUnxGSTo1NTM6R0ROOjE4MTMwNzEzMDA6S0VGOjE4MTMwODU3MDA6ZWNvbm9teTpUcnVlOjpUcnVlOkZJfEZJOjYxOTpLRUY6MTgxMzA4OTAwMDpKRks6MTgxMzExMTUwMDplY29ub215OkZhbHNlOjo6RkkiLCJwcmljZSI6IjQwMSJ9", "type": "oneway", "price": { "amount": 401, "currency": "USD" }, "price_eur": { "amount": 344.36829, "currency": "eur" }, "duration_seconds": 55500, "cabin_classes": [ "ECONOMY" ], "booking_url": "https://www.kiwi.com/en/booking/?direct=true&locale=en¤cy=usd&passengers=1-0-0&token=H_k3pUxey8fNgPPWVj6zvqLoySaUDr-laOYnNyjLuQIkXUoJjnaBar5RQbhm3emOv-igyLjWpNduNGwV5HMb41oj1QoNlISwjkaBogYWNsobfXiPD3QK2oryhWxNMIqPlj_5XfyHHp_w1xAqWjIfwtIO7NdJSpno1RF1TXrVhOoq4zbR-c7l6PoWv1Mq8L27l91XV62Pnga3Fqb44-sfqf3KqoYFY2ADAR_c67HTkXPTsph4x9wVPIhNBA4SR7qtn4561V25y6xjbXPHFVfWbfRiLykfs6-j4YGEPDAUArlBJgMBQWK3mBU38OVV1nwsZqXpiqj4YeyQMk9VlRCB4UMoNsSjjlc5TU3-udnIckZp96aERZcXegZ55Xfe3150Umasuyv8VQx1ypX41KH0E3npVw7CKty2BhjbE3UWCe54B-9KahCP1merSla1RL1lz7MU83BKj0la-rKultTGiTEesKkstFmbOSKmoySf2jpE7cYJn9Ms4hqiVGSggIqU618b_zxiO_RPTT7c1SdpNBExnbSCthREG-dqqtrFt_VhTAHIk_Np2cI-nDeSCUCU79EpCE-ItJGU38zGPqzxfscF9-ttroU56LBKwVvMQo4bCqKr4Y4PigfW1xj9SM82HTikPEq_kRj14JNyZcW9tjyCQ4-9qUknr5FItb0XuQ3HbV66TM-DusjuLImBJ9p1UK0Erd4qXNzE6S3GXpNuO6CVomJG_o249K3085wMNUWrAxk-62VD1IF8UJgXwr0pOc_BbHVnZ-9Xcj4t3vXusI25QaMSs6vPHJ-yYk3u93C0e3FxZBt3DksNz5mgpR8cTQD6wciODPjD6xz4iNQip1je3p9czStFYFtxJXEpZXhSwaWiTiKiJf3KymTuaY2m6-l8spvF6kwPjLwXsrcDP_fsR67FlKuSN773Fu676hQpldIsWjyO_6sy5LSzsvMlvqtMnhE-_AhPhqy0mPXhI-QTHmv6l-U2NY3bZDY34OeskT3QEm7p43b0ZbBXKo8fknJaDPCP75LxuG74Jp7-tsD9aZX8xBuUp6B90ZAe150LSNBqTvSdyLygqWh_kowKPDyLGXmhPj1ZQnQR_NgXjGpXLnkJJQGtFTScJ0mkX2bD5VWzTXh0u9UM_LW-BcsbaFZhk4FNwwi6XQByrtStcG20y7Dw8L_brYttv7yil2i8pE2FCk8pJpuMF01tSN4Zp3XkxpOogypzwALswQIbJCbTrSLuDyfL8WlyX90ADoQI%3D&searchType=oneWay&searchBags=0.0", "origin": "STN", "destination": "JFK", "departure": "2027-06-15T11:40:00", "arrival": "2027-06-15T22:05:00", "stops": 2, "segments": [ { "carrier": "Ryanair", "carrier_code": "FR", "flight_no": "FR533", "operating_carrier": "Buzz", "from": "STN", "from_name": "London Stansted", "from_city": "London", "to": "GDN", "to_name": "Gdańsk Lech Wałęsa", "to_city": "Gdańsk", "departure": "2027-06-15T11:40:00", "arrival": "2027-06-15T14:45:00", "departure_utc": "2027-06-15T10:40:00", "arrival_utc": "2027-06-15T12:45:00", "duration_seconds": 7500 }, { "carrier": "Icelandair", "carrier_code": "FI", "flight_no": "FI553", "operating_carrier": null, "from": "GDN", "from_name": "Gdańsk Lech Wałęsa", "from_city": "Gdańsk", "to": "KEF", "to_name": "Keflavík International", "to_city": "Reykjavik", "departure": "2027-06-15T16:55:00", "arrival": "2027-06-15T18:55:00", "departure_utc": "2027-06-15T14:55:00", "arrival_utc": "2027-06-15T18:55:00", "duration_seconds": 14400 }, { "carrier": "Icelandair", "carrier_code": "FI", "flight_no": "FI619", "operating_carrier": null, "from": "KEF", "from_name": "Keflavík International", "from_city": "Reykjavik", "to": "JFK", "to_name": "John F. Kennedy International", "to_city": "New York", "departure": "2027-06-15T19:50:00", "arrival": "2027-06-15T22:05:00", "departure_utc": "2027-06-15T19:50:00", "arrival_utc": "2027-06-16T02:05:00", "duration_seconds": 22500 } ], "carriers": [ "FI", "FR" ] }, { "id": "ItineraryOneWay:eyJwcm92aWRlcnMiOiJLSVdJLUJBU0lDOktJV0kiLCJyb3V0ZV9kYXRhIjoiRlI6MTQ1OlNUTjoxODEzMDYyOTAwOkJFUjoxODEzMDY5MjAwOmVjb25vbXk6RmFsc2U6OjpNV3xBWToxNDM4OkJFUjoxODEzMDgyNzAwOkhFTDoxODEzMDg5NjAwOmVjb25vbXk6VHJ1ZTo6VHJ1ZTpBWXxBWToxNTpIRUw6MTgxMzEzOTcwMDpKRks6MTgxMzE3MTUwMDplY29ub215OkZhbHNlOjo6QVkiLCJwcmljZSI6IjQxNiJ9", "type": "oneway", "price": { "amount": 416, "currency": "USD" }, "price_eur": { "amount": 357.249897, "currency": "eur" }, "duration_seconds": 108600, "cabin_classes": [ "ECONOMY" ], "booking_url": "https://www.kiwi.com/en/booking/?direct=true&locale=en¤cy=usd&passengers=1-0-0&token=HxY29Sg05Tx6qA-sKPfOgnJq8W6lNxixXOQ4XEmTQDD78pwCz3GfBQAwQ4SgeZkxdprOUOaO2NQpBglzKrS2LNtQYxMg4OVHjH9Mjiiilpno52AwHEKNW-6wsODOR5GTOynRfPFdU2F5m9Abg3npnKLHs2hJmQTyli1NWINuQjef0XIz46rffuibo_5iqLqdM1_rUo3xAmTuJmUMmvxygzwe0BUNFXlDIt-cVpArd_sEoGLS8DNV6TKrcomp183N2FVLy8Ukce-YoZzXbw5Oyaif7HPD9j1g1GqLfG6hOr2H7mThWYFUD8OA7i0tEd56gSPN6Bx5OwhCIiUSdQW0TZlDPH80oZgfvGB0L7j0JpjGAnKsHxhhAZiuC9Y6d2U3POy77sW9u_YdkVc0hrYCntJT8Wvif-lk2GeSr_ciBRF19kez-U8rItnUyv4YUbW35D6knOvtQsoCrWkR4Ev0zy9cFJ0hrs42qwA3eNLdnl54ikiRZDPINGeC_f0-irU8AY9ybMw8WWB52mGC199ymw4BCRH_pArNoS5chW-MLLw4eVg-F2kpkT_YRS8vSu_cjf-yYxZb1fX5ku3FTnFgIc4IoFY5jaVmKfz7402F6Ndab6sdmP8RhowbeUZXvCFRRFdn5qUkfxzfqfUHfG_eFq7k84vELK567Xn10b7VRAQ_W6_U7b7UNvOzLtXpkOgLUJqoiM7YbJ_b6yAl-rj77cOm6dUU4mu6UUEFy-980LPVsun602djmHQgNbzBUts_FNJCBUWWUSQA1N5dOEJBSSed6Cjam-9_72vzq94VIjmE05cohVb-2VPycnzb09YaETKwYjs2_Chu0xe8egbiegh2xfE6TVF2SRIfqkocH4ibJ4hiwzwhXMt4oDQST1dKzqKqQMFHz8J-F-2bOVuTa5Y3rEnO8e0llUPbDFTHP8mdGj5dTXINGJ5oaJo3LuyPsvyrhaEHSHqWqEEcIl0j_Fn-l3a5AHzOcCl5--lzO6JhhyWC5xsJYyOvQs0UflNMN3R-sAiQKqjSDXyYns20-ovOxMXMnN9-NJC3SrF4qpw_u5tdGld2P-GVgIrA8I4htZGVXUH7up1ha8gmTgE93c3nSMIWQsSvjtSeERjDAkXUKBgxI9M8fcs_mZ6VxGzcRJRCKs0r7upLkR-guwPMmHupZbI9C_UZX6i7ATyXzYNat4ZO9hh0y2GwLjkgEg6tGSpDf8NmKq5tGOB-PVVLfKSaEzUwJa9uydUEZGsR-X3k%3D&searchType=oneWay&searchBags=0.0", "origin": "STN", "destination": "JFK", "departure": "2027-06-15T13:35:00", "arrival": "2027-06-16T14:45:00", "stops": 2, "segments": [ { "carrier": "Ryanair", "carrier_code": "FR", "flight_no": "FR145", "operating_carrier": "Malta Air", "from": "STN", "from_name": "London Stansted", "from_city": "London", "to": "BER", "to_name": "Berlin Brandenburg", "to_city": "Berlin", "departure": "2027-06-15T13:35:00", "arrival": "2027-06-15T16:20:00", "departure_utc": "2027-06-15T12:35:00", "arrival_utc": "2027-06-15T14:20:00", "duration_seconds": 6300 }, { "carrier": "Finnair", "carrier_code": "AY", "flight_no": "AY1438", "operating_carrier": null, "from": "BER", "from_name": "Berlin Brandenburg", "from_city": "Berlin", "to": "HEL", "to_name": "Helsinki", "to_city": "Helsinki", "departure": "2027-06-15T20:05:00", "arrival": "2027-06-15T23:00:00", "departure_utc": "2027-06-15T18:05:00", "arrival_utc": "2027-06-15T20:00:00", "duration_seconds": 6900 }, { "carrier": "Finnair", "carrier_code": "AY", "flight_no": "AY15", "operating_carrier": null, "from": "HEL", "from_name": "Helsinki", "from_city": "Helsinki", "to": "JFK", "to_name": "John F. Kennedy International", "to_city": "New York", "departure": "2027-06-16T12:55:00", "arrival": "2027-06-16T14:45:00", "departure_utc": "2027-06-16T09:55:00", "arrival_utc": "2027-06-16T18:45:00", "duration_seconds": 31800 } ], "carriers": [ "AY", "FR" ] }, { "id": "ItineraryOneWay:eyJwcm92aWRlcnMiOiJLSVdJLUJBU0lDOktJV0kiLCJyb3V0ZV9kYXRhIjoiVzY6MTYwMjpMVE46MTgxMzA0NDYwMDpHRE46MTgxMzA1MjcwMDplY29ub215OkZhbHNlOjo6fEZJOjU1MzpHRE46MTgxMzA3MTMwMDpLRUY6MTgxMzA4NTcwMDplY29ub215OlRydWU6OlRydWU6Rkl8Rkk6NjE5OktFRjoxODEzMDg5MDAwOkpGSzoxODEzMTExNTAwOmVjb25vbXk6RmFsc2U6OjpGSSIsInByaWNlIjoiNDI3In0=", "type": "oneway", "price": { "amount": 427, "currency": "USD" }, "price_eur": { "amount": 366.696409, "currency": "eur" }, "duration_seconds": 66900, "cabin_classes": [ "ECONOMY" ], "booking_url": "https://www.kiwi.com/en/booking/?direct=true&locale=en¤cy=usd&passengers=1-0-0&token=HhcNPk16scMOmaxWAvTxgVEn2aFK5EoFUrBZ5CsfnRUIW0aW119ofTMU7fPsC2fW_6M538j3ksL-mqLV7uxm3OZby5SxXyUwckdtvac5RVUoBsQa5yvTHE5_Qj8fBuBBkFz5byOvXWP8MrhOujMG2d-JPTzEjUsJWC6f0QFowWL2Q9BsvvDUyTb2qQJZ4T8tZkVC5n29jHbJBhYF_Lx34yNXqgl_Cvv4u1Osm4bMx1dDkO5P_rFWChv59Pdresw7y9Hk2jWxJGCI01FhpBKmOE_LDfCJ403WTmO2tMrb_d1mVuiNqxo_E_TdG4Kc6DJwww57J67Yi53xXs9vtMhZgQ11Il_IR2lT6H4hE592zUCOtX0ZjE6dyo_P0fr-4ItAaYuhjirKfpvlHXFLP7JuWkjbkWjH-_35NUi-JWT_mb3pQd_FN7WKMN8HaKgg_mou2TC4iLDP59GtS1Mf7Ns_38CVqGqz_2wdBb_wTb7f-48jWzKKUPpe5ypD25sODsVE7QTJGyk7YeHlxtUp2EBgjV5WBkWMQAKZaMmvmiQ779yGAwJgMVXnHHkQPOK8hPd8TX1f6ZxnSz8mTB3HsgnLMuHcymqQSvYbCw2Y9r1Q_7SqJwkryu3T741X98Uy9bg9-Js3UHGxotEmokxoioi0vh2GEOJ0RbZPGN7-UEbU6FQh7V2QIbKudy7c__QwwHS9LUiGboXsosQ-Kc2CmTTAJgx4uzkbv8pW_ewPiAngw7rvomhBPsGc-tfssFSyDgB-cE6zZHJwsf7j-vhlT0Dm1-OCK9klQfDovU1izm4w9PPZ0x8jIx8bYgZR1Q9ojBFOqab0nyd5IXGPVspIyTDr5cMFMoOE0Ycu4mJ-ICI5YfDEKwx4-qHUlZncz9CDBmyZ9wklMDj0C7LayfJjEjLWu2ps9_mn-mx8aWG8Ekq38H3QIiteycGC3BEtw6oAusjxREIopjmQeueq__vof6XT7E5Ke0n5cQ3RJwM1MkidqJKqpfcrwi6veakonEQyogh30D8bcjFxDpTr75-y2vQBucBkLf6MaAM2vRULySGG8ivZQQ12YGb039lrrSvUMzSBWYz0xx-JyJ2NKFJoBkf8XPtYORRtE8T4K_vOU89HuedrII3y72l1uAJej1LISx01U8NE-7iMGYu49wuq9PVVVOPrC_K9gDywuX3eWzWn17G9oRvTaxJD_LCtL4q2VBeZcWQhA_mEfNsmhsHrTeIZTzH7KAiCY7KAhklB0d7bHljk%3D&searchType=oneWay&searchBags=0.0", "origin": "LTN", "destination": "JFK", "departure": "2027-06-15T08:30:00", "arrival": "2027-06-15T22:05:00", "stops": 2, "segments": [ { "carrier": "Wizz Air", "carrier_code": "W6", "flight_no": "W61602", "operating_carrier": null, "from": "LTN", "from_name": "Luton", "from_city": "London", "to": "GDN", "to_name": "Gdańsk Lech Wałęsa", "to_city": "Gdańsk", "departure": "2027-06-15T08:30:00", "arrival": "2027-06-15T11:45:00", "departure_utc": "2027-06-15T07:30:00", "arrival_utc": "2027-06-15T09:45:00", "duration_seconds": 8100 }, { "carrier": "Icelandair", "carrier_code": "FI", "flight_no": "FI553", "operating_carrier": null, "from": "GDN", "from_name": "Gdańsk Lech Wałęsa", "from_city": "Gdańsk", "to": "KEF", "to_name": "Keflavík International", "to_city": "Reykjavik", "departure": "2027-06-15T16:55:00", "arrival": "2027-06-15T18:55:00", "departure_utc": "2027-06-15T14:55:00", "arrival_utc": "2027-06-15T18:55:00", "duration_seconds": 14400 }, { "carrier": "Icelandair", "carrier_code": "FI", "flight_no": "FI619", "operating_carrier": null, "from": "KEF", "from_name": "Keflavík International", "from_city": "Reykjavik", "to": "JFK", "to_name": "John F. Kennedy International", "to_city": "New York", "departure": "2027-06-15T19:50:00", "arrival": "2027-06-15T22:05:00", "departure_utc": "2027-06-15T19:50:00", "arrival_utc": "2027-06-16T02:05:00", "duration_seconds": 22500 } ], "carriers": [ "FI", "W6" ] } ], "count": 10, "trip_type": "oneway", "origin": { "input": "LON", "id": "City:london_gb", "name": "London", "code": "LON", "type": "City", "slug": "london-united-kingdom", "resolved_from": "places" }, "destination": { "input": "JFK", "id": "Station:airport:JFK", "name": "John F. Kennedy International", "code": "JFK", "type": "Station", "slug": "john-f-kennedy-international-new-york-city-new-york-united-states", "resolved_from": "places" }, "currency": "USD", "total_available": 47 } }
How the Flights API works
Flights is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Ask the month first, then price the day it points at
Searching one date at a time is the expensive way to find a cheap flight. The graph answers a whole month in one call and hands you the date to search properly. Measured on London to New York while writing this.
{"origin": "LON", "destination": "JFK", "depart_date": "2026-10-01", "depart_date_end": "2026-10-31", "currency": "USD"}Thirty-one days in 3.8 seconds, each with a price and a CHEAP / AVERAGE / EXPENSIVE tag — eight cheap, nineteen average, four expensive — and a cheapest block naming 31 October at $361.
{"origin": "LON", "destination": "JFK", "depart_date": "<the cheapest date>", "currency": "USD", "limit": 10}Ten ranked itineraries in 1.4 seconds with every segment named — carrier, flight number, both airport codes and names, local and UTC times — plus the stop count, the total journey duration and a direct booking link.
{"carrier": "BA", "flight_number": "177", "source": "LHR", "destination": "JFK", "date": "2026-10-15"}Seat pitch 78 cm, width 43 cm, recline 10 cm, AC and USB power, wifi and in-flight entertainment — the comfort half of the decision, keyed on a flight number you took from the itinerary above.
The cheapest day of a month, the actual itineraries on it, and how much legroom you would be buying — three calls and no scraping of your own.
curl -X POST https://api.reefapi.com/flights/v1/search_flights \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"origin":"London","destination":"New York","depart_date":"2026-09-27","limit":5}'{
"ok": true,
"data": { … },
"meta": {
"api": "flights",
"endpoint": "search_flights",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What a flights price, time and code actually mean
Three things get misread here: whether the price covers one seat or the whole booking, whether a timestamp is local or UTC, and whether a code is one airport or a whole city. Every row below was measured on 2026-08-27 against London to New York and LHR to JFK for a 2026-09-25 departure.
| Field or parameter | What it actually holds | Measured 2026-08-27 |
|---|---|---|
| price.amount | Total for the whole booking in the requested currency, not per passenger | Same LHR-JFK flight VY6653: 580 USD with adults=1, 1160 USD with adults=2 |
| price_eur | A second euro figure returned next to price on every itinerary | 580.0 USD came back alongside 498.064846 eur |
| departure / arrival | Local wall-clock at that airport, written without an offset | Norse Z0701 departs Gatwick at 2026-09-25T13:05:00 |
| departure_utc / arrival_utc | The same instant in UTC, per segment | That 13:05 Gatwick departure is 12:05 UTC |
| origin as a city name | Resolved to a city id that covers all of its airports | "London" resolved to City:london_gb (code LON); one search returned departures from LGW, STN and LHR |
| flights[].id | Prefix ItineraryOneWay: or ItineraryReturn: followed by base64 | ItineraryOneWay:eyJwcm92aWRlcnMiOiJLSVdJ... |
| segments vs outbound/inbound | One-way puts segments at the top of the itinerary; a return nests them under outbound and inbound instead | Return LHR-JFK: outbound VS25, inbound VS138, no top-level segments array |
| operating_carrier | null when the marketing airline flies it, a name when someone else does | FR3002 came back with operating_carrier "Malta Air"; VS25 came back null |
| cabin_class | economy, premium_economy, business, first. An unknown value is not rejected, it silently becomes economy | cabin_class=luxury returned ok:true with meta.cabin_class ECONOMY |
| price_graph rating | CHEAP, AVERAGE or EXPENSIVE, one label per departure date | 2026-09-25 was 462 USD AVERAGE; the cheapest day, 2026-10-09, was 414 USD CHEAP |
| seat_info pitch / width / recline | Strings, with the unit in a sibling field (CM in every measured response) | BA177 economy pitch "78" CM; the same flight in business, "182" CM |
duration_seconds covers the whole itinerary including layovers, so a one-stop LON-NYC came back at 59,100 seconds against 28,200 for the nonstop. search_flights caps what it returns with limit, while meta.total_available reports how many itineraries the search found: 50 on the measured London to New York run.
What the price counts, which surface disagrees with which, and where the reference data thins out
Measured on 2026-08-28 against London to New York across four dates, two currencies and two passenger counts. Three of these lines go against us.
Worth stating first because the two get confused. Nothing here carries a live position, a gate, a terminal or an actual departure time — those are the flightaware engine next door, which in turn carries no price. Use this before the ticket is bought and that one after.
Two identical searches minutes apart returned the same ten itineraries in the same order at the same ten prices, from $426 to $465, with nothing reshuffled. Together with the car-sharing engine this is the most reproducible surface in the travel category, which means a price change you observe is a real one.
Against anyone who reads it as a fare. The same route and date with one adult returned $426 and with two adults returned $902 — not $426 with a passenger count beside it. Divide by your passenger count for a per-seat figure, as the FAQ on this page does on an itinerary that doubled exactly. Our two runs did not double exactly, and the reason is worth knowing: the cheapest itinerary for two passengers was a different itinerary from the cheapest for one, with two stops instead of three. Compare a specific itinerary across passenger counts, never the cheapest row against the cheapest row.
Against us. On the same route, date and currency, within the same few minutes, the itinerary search returned $426 as its cheapest and the price graph reported $464 for that same day. The graph is a survey built to be comparable across a month; the search is a live shop of specific itineraries. Use the graph to choose a date and the search to quote a number, and never quote the graph.
The graph returned thirty-one dates in a single 3.8-second call, each carrying a price and a CHEAP / AVERAGE / EXPENSIVE tag — eight, nineteen and four of them respectively — plus a cheapest block naming the winning date. Add nights_min and nights_max and the same call becomes a return-trip graph: five to nine nights turned it into a 28 October departure returning 2 November at $542.
Asking for direct flights only did not filter ten rows down to a shorter ten — it moved total_available from 50 to 16 and moved the cheapest price from $426 up to $464. A stop limit is a different market, so measure it as one.
total_available reported 50 for a date with no stop filter, and asking for limit 50 returned exactly 50 rows. The default is 20. There is no cursor, so ask for what you want in one call rather than paging for it.
Asking in EUR instead of USD returned the same market at €366 against $426. Every row also carries a price_eur alongside its own currency — $426 came with €365.84 attached — so a euro comparison never needs a second call.
Against us. Looking up London returned airports_count 6 for the city and then listed exactly one airport, Gatwick. Read the count as the true number, and resolve individual airports through search_places, which returned Heathrow correctly as a station with its own id. The rest of the reference block was right: IATA and ICAO codes, coordinates, timezone and country, and it correctly separated London in England from London in Ontario.
BA177 from Heathrow to JFK in economy came back with a seat pitch of 78 cm, a width of 43 cm and 10 cm of recline, with power reported as AC and USB, wifi present and in-flight entertainment present, and a found flag saying the record was actually located rather than guessed.
Public fare quotes, the full segment structure behind each one, cheapest-day surveys, airport reference data and seat specifications. Not a booking, not a seat map with which seats are taken, not a passenger record, and no airline account of yours in the path.
What people build with Flights
The jobs this data is most often used for.
endpoints
credits per call
Travel apps call search_flights to show fares by route and date.
Fare monitors use price_graph to find the cheapest days to fly.
Booking flows use seat_info and airport_info to complete a trip.
What Flights data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/flights/v1/search_flights \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"origin":"London","destination":"New York","depart_date":"2026-09-27","limit":5}'import requests
r = requests.post(
"https://api.reefapi.com/flights/v1/search_flights",
headers={"x-api-key": REEF_KEY},
json={
"origin": "London",
"destination": "New York",
"depart_date": "2026-09-27",
"limit": 5
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Flights.
Get a free key →Is the flight price per passenger or for the whole trip?▾
It is the total for the whole booking. On 2026-08-27 the same LHR to JFK itinerary (Vueling VY6653, departing 2026-09-25) came back at 580.00 USD with adults=1 and 1160.00 USD with adults=2. Divide by your passenger count if you need a per-seat figure. Every itinerary also carries price_eur, a euro figure for the same total, whatever currency you asked for.
Are departure and arrival times local or UTC?▾
Both, in separate fields. departure and arrival are the local clock at each airport and carry no offset, so "2026-09-25T13:05:00" means 13:05 in London. Each segment additionally carries departure_utc and arrival_utc for the same instant, and that Gatwick departure came back as 12:05 UTC. Do arithmetic on the _utc pair and display the local pair.
What happens if I pass a city name instead of an airport code?▾
It resolves to a city and searches every airport in it. "London" resolved to City:london_gb with code LON, and one search returned itineraries departing Gatwick, Stansted and Heathrow. The resolved place comes back in data.origin with its id, name, code and type, so you can see what you actually searched. Pass a three-letter airport code instead when you want one specific airport.
Why does a return search have no segments array?▾
A return itinerary nests its flights under outbound and inbound instead, each with its own segments, stops, departure, arrival and carriers. A one-way itinerary puts segments, stops, departure and arrival at the top level. The id prefix tells you which shape you have before you parse: ItineraryOneWay: or ItineraryReturn:. meta.trip_type says the same thing.
What does seat_info return for a flight it does not recognize?▾
ok:true with found:false, seat set to null, and meta.record_count 0. Asking for BA9999 LHR to JFK produced exactly that on 2026-08-27, while BA177 on the same route returned pitch 78 CM, width 43 CM, recline 10 CM and has_power, has_wifi and has_audio_video all true. Check found before reading seat, because an unknown flight is not an error response.
How do I find the cheapest day to fly?▾
price_graph returns one row per departure date across a range, each with a price and a rating of CHEAP, AVERAGE or EXPENSIVE, plus a separate cheapest object. A London to New York window of 2026-09-25 to 2026-10-10 returned 16 rows, both endpoints included, with 2026-09-25 at 462 USD rated AVERAGE and the cheapest day, 2026-10-09, at 414 USD rated CHEAP. Add nights_min and nights_max to turn it into a return-trip graph; leave them out and return_date comes back null on every row.
What happens if I send a cabin_class the API does not know?▾
It is ignored rather than rejected, and the search runs in economy. Sending cabin_class=luxury returned ok:true with results, and meta.cabin_class read ECONOMY. The four accepted values are economy, premium_economy, business and first. The sort parameter behaves the same way, falling back to price. Read meta.cabin_class and meta.sort back if you need to be sure your filter took effect.
How do I validate an airport code or get its coordinates?▾
airport_info takes a name or a code and returns the IATA code, the ICAO code, the timezone and GPS coordinates. "Heathrow" returned id Station:airport:LHR with iata LHR, icao EGLL, timezone Europe/London and gps 51.4775 / -0.461389. A city match looks different from an airport match: cities carry country and country_code, airports carry the parent city instead. Matching is fuzzy and ranked, so check type and iata on the row before using it rather than taking the first hit blind.
What is the Flights API?▾
Flights API is a ReefAPI endpoint group for search flights with prices, routes and times. It returns live JSON through POST requests under /flights/v1.
Is the Flights API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Flights calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Flights login or account?▾
No login to Flights is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Flights data?▾
The page example is captured from a live search_flights call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Flights API use?▾
Flights actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Flights from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call flights actions with the same key, credit pool and JSON envelope used by normal REST requests.
8 Travel & Lodging APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Flights, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.