# Schiphol flight data

Schiphol's Public Flight API gives per flight the scheduled and expected times, status, gate, terminal, baggage belt, aircraft type and route, plus lists of airlines, destinations and aircraft types. Free after registration, but the terms are strict: only to help travellers, nothing stored for more than 24 hours and no statistics.

- Publisher: Royal Schiphol Group
- Area: Netherlands · Finest detail: flight
- Period: heden · Refreshed: every minute
- Access: Free key · Licence: Voorwaarden Schiphol (geen opslag langer dan 24 uur, geen statistiek)
- Join keys: vluchtnummer (flightName), IATA-luchthavencode, datum (scheduleDate)
- Status: grijs
- URL: https://developer.schiphol.nl

## What can you do with it?
- **A departure board for your own audience.** Show today's departures with gate and status, for example on a page for conference visitors. That helps travellers and so fits the terms. Commercial use needs Schiphol's explicit approval first.
- **Picking someone up.** Follow an arriving flight from scheduled through Dutch airspace (FIR) and landed (LND) to the first bag on the belt (FIB). The baggageClaim field tells you which belt.
- **Trends? Use another source.** Statistics and historical analysis are not allowed with this API. For passengers and aircraft movements per month there is CBS table 37478hvv; for flight paths, OpenSky.

## How to process it
1. **Register and create an application.** Create an account on the developer portal, create an application and subscribe it to the Public Flight API. You see the client secret only once. Some subscriptions need approval first.
   `https://developer.schiphol.nl/news-and-updates/api-consumer-getting-started-guide`
2. **Get a token.** Exchange client ID and secret for a JWT at https://api.auth.schiphol.nl/oauth/token, with audience https://api.schiphol.nl/public. The token lasts 30 minutes: keep it and don't request a new one per call, or you hit the rate limit.
3. **Request the flights.** Send the token as Authorization: Bearer. Filter with scheduleDate, flightDirection (A or D), airline, route, and order with sort. Without a token the API returns 401.
   `https://api.schiphol.nl/public/public-flights/v4/flights?scheduleDate=2026-10-15&flightDirection=D&page=0`
4. **Follow the Link header to the next page.** A response holds at most 20 flights. The next page is in the HTTP Link header (rel="next"). Pages run from 0 to 499.

## Interesting combinations
- Which flights are delayed today because of the weather? → [knmi-daggegevens](https://www.opendataindex.nl/en/bron/knmi-daggegevens.md) via datum. Put today's flight status (DEL, CNX, DIV) next to KNMI wind and visibility. Only for current traveller information; storing it for statistics is not allowed.

## Similar sources
- [opensky](https://www.opendataindex.nl/en/bron/opensky.md): Aircraft positions over the Netherlands from open ADS-B receivers, without gate or passenger information.
- [CBS Luchtvaart; maandcijfers Nederlandse luchthavens (37478hvv)](https://opendata.cbs.nl/ODataApi/OData/37478hvv): Passengers, freight and aircraft movements per month for Schiphol and the other airports of national importance. Fine for statistics.

## What to watch out for
- **Only to help travellers.** The Public API may only be used for travellers and people picking someone up. Not allowed: competitive analysis, market research, delay compensation claims, reselling or passing data to third parties, and statistical or historical analysis.
- **Keep for at most 24 hours.** Data may be cached for at most 24 hours. After that you must delete it. Building your own archive is not allowed.
- **New platform since October 2026.** The old platform with App_Id and App_Key shut down on 1 October 2026. Old examples using api.schiphol.nl/public-flights and a ResourceVersion header no longer work; the version is now in the path (/v4/).
- **Status is a code.** publicFlightState returns codes such as SCH, DEL, BRD, GTD, DEP, LND, CNX. The OpenAPI specification has no fixed list; the meaning is on the Flight Statuses page.
- **Keys are personal.** Credentials are not transferable, don't belong in browser-side code and must be rotated at least every 90 days according to the terms.

## API (REST (JSON), OAuth2)

- Base: https://api.schiphol.nl/public/public-flights/v4
- Access: Account on developer.schiphol.nl, create an application there and subscribe to the PublicFlight API. Exchange client ID and secret (OAuth2 client credentials) at https://api.auth.schiphol.nl/oauth/token, audience https://api.schiphol.nl/public, for a 30-minute JWT. Send it as Authorization: Bearer, together with Accept: application/json. Without a token: 401 Unauthorized. (tested)
- Formats: json
- Filtering: Each condition is its own query parameter; combinations act as AND. Time windows via fromDateTime/toDateTime with searchDateTimeField.; =, van/tot, sort + / −

### Endpoints
- `GET /flights`: Flights on a day (default today), with filters on direction, flight number, airline, route and time fields. 20 per page.
- `GET /flights/{id}`: One flight by its numeric id.
- `GET /flights/ids`: Only the ids of flights between fromDateTime and toDateTime (on scheduleDateTime), at most three days.
- `GET /airlines`: All airlines at Schiphol (name, IATA, ICAO, NVLS code).
- `GET /airlines/{airline}`: One airline by IATA or ICAO code.
- `GET /aircrafttypes`: Aircraft types with IATA main and sub code, short and long name; filter iataMain, iataSub.
- `GET /destinations`: Destinations with IATA code, Dutch and English name, city and country.
- `GET /destinations/{iata}`: One destination by IATA code.

### Parameters
- `scheduleDate`: Day of the flight; without: today. (from the description)
- `scheduleTime`: Flights from this scheduled time. (from the description)
- `flightDirection`: A = arrival, D = departure. (from the description)
- `flightName`: Flight number as on the ticket, e.g. KL672. (from the description)
- `airline / airlineCode`: Airline as IATA (KL) or ICAO prefix (KLM), or as NVLS code; one at a time. (from the description)
- `route`: IATA or ICAO code of an airport on the route; several separated by commas. (from the description)
- `fromDateTime / toDateTime + searchDateTimeField`: Search a time window on a time field: scheduleDateTime, estimatedLandingTime, actualLandingTime, publicEstimatedOffBlockTime, actualOffBlockTime, expectedTimeBoarding, expectedTimeGateOpen, expectedTimeGateClosing, expectedTimeOnBelt or lastUpdatedAt. (from the description)
- `fromScheduleDate / toScheduleDate`: Range of flight days. (from the description)
- `includedelays`: Also include flights from an earlier day that shift to the requested day because of delay (default false). (from the description)
- `isOperationalFlight`: Only operational (true) or non-operational (false) flights. (from the description)
- `sort`: Sort with + or −, several fields with commas, e.g. -scheduleDate,+scheduleTime (default +scheduleTime). (from the description)
- `page`: Page number (starts at 0). Better follow the URL in the Link header rel="next". (from the description)

### Fields of a flight (according to the documentation; not seen ourselves) (15)
`flightName / flightNumber / prefixIATA / prefixICAO` tekst, `flightDirection` tekst, `scheduleDate / scheduleTime` datum / tijd, `serviceType` tekst, `mainFlight / codeshares` tekst, `route.destinations` lijst, `publicFlightState.flightStates` lijst, `terminal / gate / baggageClaim.belts` tekst, `aircraftType.iataMain / iataSub` tekst, `aircraftRegistration` tekst, `estimatedLandingTime / actualLandingTime` datetime, `publicEstimatedOffBlockTime / actualOffBlockTime` datetime, `expectedTimeBoarding / expectedTimeGateOpen / expectedTimeGateClosing / expectedTimeOnBelt` datetime, `routesEu / visa` tekst / boolean, `lastUpdatedAt` datetime

### Limits and pitfalls
- 100 requests per minute per application (Public tier). Above that 429 Too Many Requests with Retry-After. (from the description)
- At most 20 results per page, pages 0 to 499. An empty page can return 204 No Content. (from the description)
- Token valid for 30 minutes: get it once and reuse it; a new token per call hits the token server's limit. (from the description)
- Terms: only to help travellers. Not allowed: competitive analysis, unauthorised commercial use, reselling or passing on to third parties, and historical or statistical analysis. Data cached for at most 24 hours, then deleted; no own archive. Rotate keys at least every 90 days. (from the description)
- The old platform (App_Id, App_Key, ResourceVersion header) stopped on 1 October 2026; the version is now in the path (/v4/). A test environment is at https://api-acc.schiphol.nl/public/public-flights/v4. (from the description)
- Parameters also exist in lower case (scheduledate, flightname, flightdirection, includeDelays); the camelCase variant takes precedence. (from the description)
- Status codes are not a fixed list in the specification; their meaning is on the Flight Statuses page. (from the description)
- For statistics an open alternative: CBS table 37478hvv (passengers, freight and aircraft movements per month, Schiphol = A043590). For positions: OpenSky. (experience)

## What you can build with it
- [What is flying over my house right now?](https://www.opendataindex.nl/en/bouwen/vliegtuigen-boven-je-huis.md): A small app that shows every few minutes which aircraft are within 25 km of your address, how high, how fast and whether they are climbing or descending, using OpenSky's live positions and without an account.


## Examples with real figures (3)

For each example the finding, the reference date and the call that fetches exactly these figures.

- **Passengers at Schiphol by origin and destination (CBS): Europe is the largest part, 71% in 2025** (2025). Table 37478hvv. [Example](https://www.opendataindex.nl/en/voorbeeld/schiphol-passagiers-bestemming)
  - `https://opendata.cbs.nl/ODataApi/OData/37478hvv/TypedDataSet?$filter=Luchthavens%20eq%20'A043590'%20and%20Perioden%20eq%20'2025JJ00'&$select=EuropaTotaal_22,Azie_36,Amerika_32,Afrika_26`
- **Passengers at Schiphol per year (CBS): 68.8 million passengers in 2025, 75% more than in 2000** (2025). Table 37478hvv. [Example](https://www.opendataindex.nl/en/voorbeeld/schiphol-passagiers-per-jaar)
  - `https://opendata.cbs.nl/ODataApi/OData/37478hvv/TypedDataSet?$filter=Luchthavens%20eq%20'A043590'%20and%20substringof('JJ'%2CPerioden)&$select=Perioden,TotaalAantalPassagiers_12`
- **Passengers at Schiphol (CBS): highest on average in August, lowest in January** (augustus 2026). Table 37478hvv. [Example](https://www.opendataindex.nl/en/voorbeeld/schiphol-passagiers-per-maand)
  - `https://opendata.cbs.nl/ODataApi/OData/37478hvv/TypedDataSet?$filter=Luchthavens%20eq%20'A043590'%20and%20substringof('MM'%2CPerioden)&$select=Perioden,TotaalAantalPassagiers_12`
