The JSON API
Everything this site decodes is available as structured JSON: live METAR and TAF reports for ~20,000 stations worldwide, parsed token by token. Free, no API key, no login. Data comes from the NOAA Aviation Weather Center feed and is cached server-side for two minutes.
Endpoints
| GET /api/metars/{icao} | Current METAR(s) for one station, fully parsed. |
| GET /api/metars/{icao}/decoded | The same, plus a plain-English decode: summary line and per-element descriptions alongside the parsed structure. |
| GET /api/metars/live | A sample of the latest METARs from the NOAA cache (20 reports), parsed. |
| GET /api/tafs/{icao} | Current TAF(s) for one station, parsed into change groups. |
| GET /api/tafs/{icao}/decoded | TAF with a plain-English decode per forecast group (FM, BECMG, TEMPO, PROB…). |
| GET /api/tafs/live | A sample of the latest TAFs from the NOAA cache (20 reports), parsed. |
Station is the 4-letter ICAO code, case-insensitive. Unknown stations and stations without a current report return 404 with {"error": "..."}.
Try it
What the parsed structure looks like
The parsed object below is generated live by the site's parser from this raw report — it is exactly what the API returns, including the tokens list showing how every piece of the raw text was classified:
{
"station" : "EGLL",
"rawText" : "METAR EGLL 031320Z 25012G22KT 220V280 9999 -RA SCT018 BKN035 17/12 Q1004 TEMPO 4000 RA",
"wind" : {
"direction" : 250,
"speed" : 12,
"gust" : 22,
"unit" : "KT"
},
"timestamp" : "031320Z",
"visibility" : {
"prefix" : "",
"distance" : 10000.0,
"unit" : "M",
"direction" : null,
"meters" : 10000
},
"minimumVisibility" : null,
"temperature" : {
"temp" : 17,
"dewPoint" : 12
},
"qnh" : 1004,
"clouds" : [ {
"type" : "SCT",
"height" : 1800,
"modifier" : ""
}, {
"type" : "BKN",
"height" : 3500,
"modifier" : ""
} ],
"weather" : [ {
"code" : "-RA",
"description" : "Light rain"
}, {
"code" : "RA",
"description" : "Rain"
} ],
"rvr" : [ ],
"verticalVisibility" : null,
"trends" : [ "TEMPO 4000 RA" ],
"recentWeather" : [ ],
"isNil" : false,
"seaCondition" : null,
"windShear" : [ ],
"runwayStates" : [ ],
"remarks" : [ ],
"tokens" : [ {
"type" : "IGNORED",
"text" : "METAR",
"startIndex" : 0,
"endIndex" : 5,
"description" : "Report Type"
}, {
"type" : "STATION",
"text" : "EGLL",
"startIndex" : 6,
"endIndex" : 10,
"description" : "Station Identifier"
}, {
"type" : "TIMESTAMP",
"text" : "031320Z",
"startIndex" : 11,
"endIndex" : 18,
"description" : "Observation Time"
}, {
"type" : "WIND",
"text" : "25012G22KT",
"startIndex" : 19,
"endIndex" : 29,
"description" : "Wind (Dir/Speed/Gusts)"
}, {
"type" : "WIND_VARIABLE",
"text" : "220V280",
"startIndex" : 30,
"endIndex" : 37,
"description" : "Wind Direction Variability"
}, {
"type" : "VISIBILITY",
"text" : "9999",
"startIndex" : 38,
"endIndex" : 42,
"description" : "Visibility (Meters)"
}, {
"type" : "WEATHER",
"text" : "-RA",
"startIndex" : 43,
"endIndex" : 46,
"description" : "Light rain"
}, {
"type" : "CLOUD",
"text" : "SCT018",
"startIndex" : 47,
"endIndex" : 53,
"description" : "Cloud Layer"
}, {
"type" : "CLOUD",
"text" : "BKN035",
"startIndex" : 54,
"endIndex" : 60,
"description" : "Cloud Layer"
}, {
"type" : "TEMPERATURE",
"text" : "17/12",
"startIndex" : 61,
"endIndex" : 66,
"description" : "Temp / Dewpoint"
}, {
"type" : "QNH",
"text" : "Q1004",
"startIndex" : 67,
"endIndex" : 72,
"description" : "Altimeter Setting"
}, {
"type" : "TREND_INDICATOR",
"text" : "TEMPO",
"startIndex" : 73,
"endIndex" : 78,
"description" : "Trend Indicator"
}, {
"type" : "TREND",
"text" : "4000",
"startIndex" : 79,
"endIndex" : 83,
"description" : "Trend Content"
}, {
"type" : "WEATHER",
"text" : "RA",
"startIndex" : 84,
"endIndex" : 86,
"description" : "Rain"
} ]
}
Terms, in plain English
- Free for reasonable use — apps, sim tooling, club sites, student projects. No key, no signup.
- CORS is open for GET requests, so you can call the API directly from browser code.
- Upstream data is fetched from NOAA once per two minutes regardless of your request rate, so polling faster than that only returns the same cache.
- Not for operational flight use. Reports can be delayed, missing or malformed; the parser flags what it cannot resolve rather than guessing.
- A link back to metars.eu is appreciated, not required. If you want a ready-made embed, there is a free widget.
Building something with it? Feedback on the response format is welcome — especially reports that decode wrong. New to METARs themselves? Start with how to read a METAR.