If you run a virtual airline, a dispatch page or your own planning tool, you can hand a flight straight to AnyAirline instead of asking pilots to retype it.
Be clear about what this is. It is a link you send the pilot, not a server-to-server API. There are no API keys, and nothing files a flight on somebody's behalf. The link opens AnyAirline in the pilot's own browser, signed in as them, with the flight already imported. Everything after that — languages, voices, dispatching — is their decision, in their account, on their credits.
That is deliberate: it means you never hold anyone's credentials and can never spend their credits.
The link
`` https://anyairline.app/flight-plans?raw=<url-encoded ICAO flight plan> ``
| Parameter | |
|---|---|
raw | Required. The full ICAO flight plan, normally including the surrounding (FPL-…). |
fpl | Alias for raw, if your tool already names the value that way. |
fuel_time | Optional, HHMM — block fuel or endurance time, for tools that expose it. |
URL-encode the plan. It contains spaces, slashes, plus signs and brackets, all of which break a raw query string. Use encodeURIComponent or your framework's URL encoder — and build the link from the plan itself, never by hand-editing a visible URL.
``js const raw = "(FPL-NAX112-IS-B738/M-SDE2E3FGHIRWXY/LB1-EGCC2155-N0357F230 POL P17 NUKPE/N0437F370 DCT MEJAC DCT TIPTA-ENGM0138 ENTO-PBN/A1B1C1D1S1S2 DOF/260522 REG/N806SB EET/EGPX0018 OPR/NAX PER/C RMK/TCAS SIMBRIEF)"; const link = https://anyairline.app/flight-plans?raw=${encodeURIComponent(raw)}&fuel_time=0259; ``
If the pilot is not signed in, AnyAirline asks them to sign in and then returns them to the import. After importing it opens the flight wizard and clears the URL, so a refresh does not import the same flight twice.
What gets read out of the plan
| Item | Taken from | Example |
|---|---|---|
| Callsign | first field after FPL- | NAX112 |
| Aircraft type | item 9 | B738 |
| Departure and time | item 13 | EGCC2155 |
| Route and cruise level | item 15 — a leading N0357F230 becomes 23 000 ft | |
| Destination and EET | item 16 | ENGM0138 |
| Date | DOF/YYMMDD in item 18 | DOF/260522 |
| Operator | OPR/… in item 18, used to identify the airline | OPR/NAX |
Include DOF/. Without it the airports and route still import, but the scheduled times stay blank — and the times are what the whole announcement schedule hangs off.
Include OPR/ if you want the airline recognised. It is what picks up the airline's identity, its safety video and its cabin defaults.
From the airports, AnyAirline fills in the rest itself: names, IATA codes, coordinates, and current weather at both ends.
Checking a plan before you send it
If you want to validate a plan, or show the pilot what they are about to import, there is a read-only endpoint that parses a plan and returns it as JSON without importing anything:
`` GET https://anyairline.app/api/flight-plans/raw?raw=<url-encoded ICAO flight plan> ``
It authenticates as the signed-in pilot — a browser session or their own access token — so it is for use in your page while they are looking at it, not from your backend on a schedule.
It returns the parsed flight: flight number, airline, aircraft, both airports with codes and coordinates, scheduled times, duration, cruise altitude, route, and the METAR at each end.
What there is no way to do
Being straight about the limits, so you do not build against something that is not there:
pilot dispatches it themselves.
- No API key or machine account. Every call is made as a signed-in pilot.
- No dispatching from your server. You cannot start a flight in someone's connector remotely; the
- No writing to someone else's account — no setting their languages, voices or preferences.
If your virtual airline wants to give pilots credits rather than flights, that is a separate thing and it does exist: see the virtual airline programme.