metars.eu

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

curl https://metars.eu/api/metars/EGLL/decoded

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:

METAR EGLL 031320Z 25012G22KT 220V280 9999 -RA SCT018 BKN035 17/12 Q1004 TEMPO 4000 RA
{
  "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

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.