metar-http

Aviation weather products — METAR observations, TAF forecasts, Graphical Area Forecasts, Grid Point Wind & Temperature charts and radar/rainfall imagery — from the Australian Bureau of Meteorology, with NOAA fallback for non-Australian aerodromes.

METAR observations

Fetch the current METAR/SPECI observation for an aerodrome by ICAO code. Australian aerodromes (codes beginning with Y) come from BOM; others fall back to NOAA.

GET /metar/<icao>
Raw METAR (may span multiple lines).
GET /metar/<icao>/*
METAR collapsed onto one line.
GET /metar/<icao>/*/<maxchars>
One line, truncated to <maxchars> characters.
GET /metar/<icao>/*/<maxchars>/<append>
One line, truncated to <maxchars>; if truncation occurred, <append> is appended.
GET /metar/<icao>/<maxlines>
First <maxlines> lines.
GET /metar/<icao>/<maxlines>/<maxchars>
First <maxlines> lines, each truncated to <maxchars>.
GET /metar/<icao>/<maxlines>/<maxchars>/<append>
First <maxlines> lines, truncated with <append> suffix on truncation.

Examples

curl https://metar.online/metar/YSSY
curl https://metar.online/metar/YBAF/*
curl https://metar.online/metar/KJFK/1/80/...

TAF forecasts

Fetch the current TAF (Terminal Aerodrome Forecast) for an aerodrome by ICAO code. Australian aerodromes (codes beginning with Y) come from BOM; others fall back to NOAA. TAFs typically span several lines — the same truncation/one-line options as /metar apply.

GET /taf/<icao>
Raw TAF (multi-line).
GET /taf/<icao>/*
TAF collapsed onto one line.
GET /taf/<icao>/*/<maxchars>
One line, truncated to <maxchars> characters.
GET /taf/<icao>/*/<maxchars>/<append>
One line, truncated to <maxchars>; if truncation occurred, <append> is appended.
GET /taf/<icao>/<maxlines>
First <maxlines> lines.
GET /taf/<icao>/<maxlines>/<maxchars>
First <maxlines> lines, each truncated to <maxchars>.
GET /taf/<icao>/<maxlines>/<maxchars>/<append>
First <maxlines> lines, truncated with <append> suffix on truncation.

Examples

curl https://metar.online/taf/YSSY
curl https://metar.online/taf/YBBN/*
curl https://metar.online/taf/KJFK/3

Graphical Area Forecasts (GAF)

The current or next PNG chart for one of BOM's ten forecast areas. Which of the four rotating products counts as "current" or "next" is derived from the current UTC hour (rotations at 05, 11, 17 and 23Z).

GET /gaf/<area>/current
Current GAF PNG for <area>.
GET /gaf/<area>/next
Next GAF PNG for <area>.

Valid areas:

WA-N WA-S NT QLD-N QLD-S SA NSW-W NSW-E VIC TAS

Examples

curl -o wan-current.png https://metar.online/gaf/WA-N/current
curl -o qlds-next.png    https://metar.online/gaf/QLD-S/next

Grid Point Wind & Temperature (GPWT)

PNG chart for a given flight-level band, forecast area and 3-hourly UTC time slot. The valid (level, area, time) triples are discovered by scraping BOM's grid-point-forecasts page; requesting a triple that doesn't exist returns 404 with the valid list.

GET /gpwt/<level>/<area>/<time>
GPWT PNG for the requested triple.

Level and area (each row shows all areas available at that level):

lowAUS NSW NT QLD-N QLD-S SA TIMS VIC/TAS WA-N WA-S
midAUS NE SE TASMAN-SEA WEST
highAUS TASMAN-SEA

Codes are matched case-insensitively with punctuation ignored — VIC/TAS, vic-tas and VICTAS all resolve to the same product.

Time: 00Z, 03Z, 06Z, 09Z, 12Z, 15Z, 18Z, 21Z.

Examples

curl -o qldn-09z.png     https://metar.online/gpwt/low/QLD-N/09Z
curl -o aus-mid-12z.png  https://metar.online/gpwt/mid/AUS/12Z
curl -o tims-18z.png     https://metar.online/gpwt/low/TIMS/18Z
curl -o tasman-00z.png   https://metar.online/gpwt/high/TASMAN-SEA/00Z

Radar and rainfall imagery

Single-frame or animated radar and rainfall images for any of the ~67 BOM radar sites. image returns BOM's own single-frame .gif verbatim; loop downloads every frame referenced by the site's loop page, composites each on top of the site background, range rings (or river catchments for rainfall) and locations, and returns the result as one animated GIF.

GET /radar/<period>/<kind>/<site>/<image>
Per-site radar or rainfall image.
GET /radar/<period>/radar/national
National radar composite (loop-only; the single-image variant is not published).

Period: image (single frame), loop (animated GIF).

Kind: radar, rainfall.

Site: matched case-insensitively as either the BOM base radar id (IDR02), the 128 km product id (IDR023), or the slugified site name (melbourne, brisbane-mt-stapylton, sydney-terrey-hills).

Image (radar):

64km 128km 256km 512km-composite doppler-wind national

Image (rainfall):

5m 1h since-9am 24h

Examples

curl -o melb-128km.gif   https://metar.online/radar/image/radar/melbourne/128km
curl -o syd-loop.gif     https://metar.online/radar/loop/radar/IDR71/128km
curl -o bris-rain.gif    https://metar.online/radar/loop/rainfall/brisbane-mt-stapylton/1h
curl -o national.gif     https://metar.online/radar/loop/radar/national

Radar frame listing and per-frame download

The /radar/loop/… endpoint above composites and encodes the frames of an animated radar loop into a single GIF. The endpoints below expose the same frames as individual raw BOM PNGs — useful for building your own animation, sampling a specific timestamp, or serving as tiles to a client-side loop.

GET /radar/frames/<kind>/<site>/<image>
JSON listing of every frame currently in the loop for the given (kind, site, image) triple. Each entry gives its zero-based index n, its 12-digit UTC timestamp, the raw BOM url, and two convenience self-links back to this server (see JSON shape below).
GET /radar/frames/<kind>/national
Frame listing for the national radar composite (site-less variant, same JSON shape).
GET /radar/frame/<kind>/<site>/<image>/<id>
Fetch a single frame as image/png. <id> is either a 12-digit UTC timestamp (YYYYMMDDHHMM) or a zero-based integer index into the current loop (0 is the oldest frame, higher = more recent).
GET /radar/frame/<kind>/national/<id>
Single frame of the national composite by timestamp or index.

The listing and per-frame endpoints share the same <kind>, <site> and <image> parameters as /radar/loop/… above.

JSON shape

The listing response looks like this (formatted for readability):

{
  "site": {
    "base_id": "IDR02",
    "name": "Melbourne",
    "slug": "melbourne"
  },
  "kind": "radar",
  "product": "128km",
  "product_code": "IDR023",
  "count": 7,
  "frames": [
    {
      "n": 0,
      "timestamp": "202608240034",
      "url": "https://reg.bom.gov.au/radar/IDR023.T.202608240034.png",
      "self_index": "https://metar.online/radar/frame/radar/IDR02/128km/0",
      "self_timestamp": "https://metar.online/radar/frame/radar/IDR02/128km/202608240034"
    },
    …
  ]
}

For the national composite, "site" is null and the site path segment in each self-link is the literal national instead of a base id.

Examples

List the current frames for the Melbourne 128 km radar:

curl https://metar.online/radar/frames/radar/melbourne/128km

Extract just the frame URLs (JSON → line-per-URL) with jq:

curl -s https://metar.online/radar/frames/radar/melbourne/128km \
  | jq -r '.frames[].url'

Download every frame straight from this server (by index):

curl -s https://metar.online/radar/frames/radar/melbourne/128km \
  | jq -r '.frames[].self_index' \
  | xargs -I{} curl -s -O {}

Fetch a specific frame by timestamp:

curl -o melb-0034.png https://metar.online/radar/frame/radar/melbourne/128km/202608240034

Fetch the oldest frame in the loop by index (indices start at 0; the newest frame is count - 1):

curl -o melb-oldest.png https://metar.online/radar/frame/radar/melbourne/128km/0

Fetch a rainfall frame:

curl -o bris-rain-2.png https://metar.online/radar/frame/rainfall/brisbane-mt-stapylton/1h/2

Fetch a frame of the national composite:

curl -o national-0.png https://metar.online/radar/frame/radar/national/0