# Airport METAR & TAF Weather (`tabulary/airport-weather-metar-taf`) Actor

Live and historical aviation weather for any airport: decoded METAR observations (7 days back), TAF forecasts, pilot reports (PIREPs) and SIGMET/G-AIRMET hazard advisories by ICAO code, from NOAA's Aviation Weather Center API. Wind, visibility, turbulence and icing, as clean JSON.

- **URL**: https://apify.com/tabulary/airport-weather-metar-taf.md
- **Developed by:** [Tabulary](https://apify.com/tabulary) (community)
- **Categories:** Travel, Automation
- **Stats:** 2 total users, 1 monthly users, 90.9% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.05 / 1,000 weather reports

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Airport METAR & TAF Weather do?

It returns **live and historical aviation weather for any airport**: decoded **METAR**
observations (the latest report, or every report from up to 7 days back), the current **TAF**
forecast, nearby **PIREPs** (pilot reports of turbulence, icing and more) and active **SIGMET,
international SIGMET and G-AIRMET** hazardous-weather advisories, looked up by ICAO airport code.
The data comes from NOAA's official [Aviation Weather Center API](https://aviationweather.gov/data/api/),
and every report is turned into clean JSON with wind, visibility, clouds, flight category,
turbulence, icing and hazard areas, plus the raw report text. Pilots, flight schools, dispatchers,
drone operators, airline and logistics teams, developers and AI agents use it for dashboards,
flight planning tools and weather history. No API key needed.

### What you get

- One row per METAR, TAF, PIREP, SIGMET or G-AIRMET report, for up to 100 airports per run.
- Temperature and dewpoint (°C), wind direction, speed and gusts (knots), visibility (statute
  miles), altimeter (hPa) and cloud layers with their bases.
- Flight category (VFR, MVFR, IFR, LIFR) for METARs.
- TAF forecast periods with their own wind, visibility, weather and clouds.
- Pilot reports (PIREPs) near each airport: aircraft type, flight level and phase, and any
  reported turbulence or icing layers, with intensity and type.
- Active SIGMET (including international SIGMET) and G-AIRMET hazard advisories: hazard type,
  qualifier/severity, altitude range, movement and the affected area or line.
- The raw report text, the station name, latitude, longitude and elevation (where applicable).
- History: every METAR from the last 1 to 168 hours, newest first.
- Export as JSON, CSV or Excel, send to Google Sheets or a webhook, or call it as a tool from AI
  agents through the Apify MCP server.

### How much does it cost?

You pay per weather report saved, with no monthly fee: **$1.50 per 1,000 weather reports** on
Apify's free plan, and 10–40% less on paid Apify plans. Each run also costs $0.001 to start. Apify's free plan includes $5 of credit
every month, enough for about 3,300 weather reports. Prices as of October 2026; the price shown on
this page is the one that applies.

| Use | Weather reports | Cost on the free plan |
|---|---|---|
| Current METAR and TAF for 10 airports | 20 | about $0.03 |
| 24 hours of METAR history for 5 airports | about 120–240 | about $0.20–0.36 |
| Hourly METAR and TAF for 3 airports for a month | about 4,300 | about $7.20 with run starts |
| PIREPs and hazard advisories (SIGMET + G-AIRMET) for 2 airports | about 150–250 | about $0.23–0.38 |

Set **Maximum cost per run** to cap any run; the Actor stops cleanly at the cap and keeps
everything it saved.

### Ready-made inputs

Paste one of these into the JSON input tab, or set the same fields in the form.

**Current conditions and forecasts for three US hubs** · [open this example](https://apify.com/tabulary/airport-weather-metar-taf/examples/us-hub-airports-metar-taf)

```json
{ "stations": "KJFK,KLAX,KORD", "includeTaf": true }
```

**The last 24 hours of observations at London Heathrow and Gatwick** · [open this example](https://apify.com/tabulary/airport-weather-metar-taf/examples/heathrow-gatwick-metar-24h)

```json
{ "stations": "EGLL,EGKK", "hoursBack": 24, "includeTaf": false }
```

**A week of weather history for one airfield** (training, incident review, analysis) · [open this example](https://apify.com/tabulary/airport-weather-metar-taf/examples/boston-logan-metar-week)

```json
{ "stations": "KBOS", "hoursBack": 168, "includeTaf": false }
```

**Pilot reports and hazard advisories near two airports** (turbulence, icing, SIGMET and G-AIRMET) · [open this example](https://apify.com/tabulary/airport-weather-metar-taf/examples/jfk-ord-pireps-hazards)

```json
{ "stations": "KJFK,KORD", "includeTaf": false, "includePireps": true, "includeHazards": true }
```

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `stations` | string | required | Comma- or space-separated 4-letter ICAO codes, e.g. `KJFK, EGLL, EDDF`. Up to 100 per run. |
| `includeTaf` | boolean | `true` | Also fetch the current TAF forecast for each airport, saved as a separate row. |
| `hoursBack` | integer | `0` | `0` returns the latest METAR per airport. Up to `168` (7 days) returns every METAR in that period. |
| `includePireps` | boolean | `false` | Also fetch pilot reports (PIREPs) near each airport. Limited to the first 25 airports per run. |
| `pirepRadiusSm` | integer | `200` | Search radius around each airport for PIREPs, in statute miles. Only used when `includePireps` is on. |
| `pirepHoursBack` | integer | `3` | How many hours of PIREPs to fetch around each airport (1–24). Only used when `includePireps` is on. |
| `includeHazards` | boolean | `false` | Also fetch every currently active SIGMET (including international SIGMETs, worldwide) and G-AIRMET (contiguous United States) hazard advisory. These cover regions and flight information areas, not single airports, so this one set of advisories is the same regardless of which stations you list. |

ICAO codes are 4 letters: US airports add a `K` to the 3-letter code (`JFK` is `KJFK`), and UK
codes start with `EG`. Three-letter IATA codes are not accepted.

### Output

One dataset item per report. All report types (METAR, TAF, PIREP, SIGMET, G-AIRMET) share the
same set of fields; fields that don't apply to a given report type are `null`. A real METAR from
a test run on 13 October 2026:

```json
{
  "icaoId": "KJFK",
  "stationName": "New York/JF Kennedy Intl, NY, US",
  "reportType": "metar",
  "issuedAt": "2026-10-13T21:00:00.000Z",
  "validFrom": null,
  "validTo": null,
  "rawText": "METAR KJFK 132051Z 17013G19KT 10SM FEW016 FEW030 SCT220 19/17 A2990 RMK AO2 SLP125 T01940167 56022",
  "tempC": 19.4,
  "dewpointC": 16.7,
  "windDirDeg": 170,
  "windSpeedKt": 13,
  "windGustKt": 19,
  "visibilitySm": "10+",
  "altimeterHpa": 1012.6,
  "flightCategory": "VFR",
  "clouds": [{ "cover": "FEW", "base": 1600 }, { "cover": "FEW", "base": 3000 }, { "cover": "SCT", "base": 22000 }],
  "forecastPeriods": null,
  "latitude": 40.6392,
  "longitude": -73.7639,
  "elevationM": 3
}
```

TAF items use `reportType: "taf"`, fill `validFrom` and `validTo` (the forecast's valid period)
and `forecastPeriods` (an array of `{ from, to, windDirDeg, windSpeedKt, windGustKt, visibilitySm,
altimeterHpa, weather, clouds }`), and leave the METAR-only fields (`tempC`, `dewpointC`,
`flightCategory` and so on) as `null`.

A real PIREP from a test run on 24 October 2026, showing light chop turbulence reported by a
regional jet near New York (`icing` uses the same shape as `turbulence` when a pilot reports
icing instead):

```json
{
  "icaoId": "KWBC",
  "reportType": "pirep",
  "issuedAt": "2026-10-24T03:35:00.000Z",
  "rawText": "DEN UA /OV 20N/TM 0335/FL160/TP CRJ2/TB OCNL LGT CHOP",
  "latitude": 41.9853,
  "longitude": -73.9643,
  "aircraftType": "CRJ2",
  "flightLevelFt": 16000,
  "flightPhase": "OTHER",
  "turbulence": [{ "base": null, "top": null, "intensity": "LGT", "type": "CHOP", "frequency": "OCNL" }],
  "icing": null
}
```

(`icaoId` on a PIREP is the issuing weather office, not the airport you searched near; use
`latitude`/`longitude` for the report's actual position.)

SIGMET and G-AIRMET items use `reportType: "sigmet"` or `"gairmet"` and describe a hazard over an
area or line rather than a point: `hazardType` (e.g. `TURB`, `ICE`, `VA`, `IFR`), `qualifier`
(severity or a short description), `altitudeBaseFt`/`altitudeTopFt`, and `area` (`{ geom: "AREA"
| "LINE", coords: [{ lat, lon }, ...] }`). A real international SIGMET from the same test run
(coordinates trimmed here for length; the live Actor returns the full polygon):

```json
{
  "icaoId": "RJTD",
  "stationName": "RJJJ FUKUOKA",
  "reportType": "sigmet",
  "issuedAt": "2026-10-24T00:10:00.000Z",
  "validFrom": "2026-10-24T00:10:00.000Z",
  "validTo": "2026-10-24T06:10:00.000Z",
  "rawText": "WVJP31 RJTD 240010\nRJJJ SIGMET G01 VALID 240010/240610 RJTD-\nRJJJ FUKUOKA FIR VA ERUPTION MT SAKURAJIMA (AIRA CALDERA) PSN N3136\nE13039 VA CLD OBS AT 2355Z ABV FL050 MOV N=",
  "hazardType": "VA",
  "qualifier": "ERUPTION MT SAKURAJIMA (AIRA CALDERA)",
  "firId": "RJJJ",
  "advisoryId": "G01",
  "subType": "OBS",
  "area": { "geom": "AREA", "coords": [{ "lon": 130.65, "lat": 32.433 }, { "lon": 130.82, "lat": 32.421 }] }
}
```

### Use it from AI agents

Add the Actor to Claude, ChatGPT, Cursor or any MCP client through the Apify MCP server
(`https://mcp.apify.com?tools=tabulary/airport-weather-metar-taf`). Ask in plain language, for
example: "What are the current conditions and forecast at Denver and Salt Lake City airports?"
The agent fills in the input and gets structured reports back.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/tabulary~airport-weather-metar-taf/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"stations": "KSFO,KSEA", "hoursBack": 6}'
```

The same works with the Apify Python and JavaScript clients. See the API tab for details.

### Data source and limits

- Source: NOAA's official Aviation Weather Center data API at
  [aviationweather.gov/data/api](https://aviationweather.gov/data/api/), no API key required.
  See the [weather.gov disclaimer](https://www.weather.gov/disclaimer) for terms of use.
- Coverage is worldwide for airports that publish METAR and TAF reports; small airfields may have
  METARs but no TAF.
- PIREPs are searched by radius around each airport, not filed by airport, so coverage depends on
  how much nearby traffic has filed a report recently; many quiet periods and remote airports will
  return none. SIGMETs (including international SIGMETs) are issued per flight information region
  worldwide; G-AIRMETs cover only the contiguous United States.
- If an airport has no report (for example an unmanned or inactive station), it is skipped. No
  fake or estimated data is returned.
- The Actor sends at most about one request per second and identifies itself.
- Not for operational flight planning: always check official briefings before flight.
- No personal data: all data is public aviation weather for airport locations.

### Other Tabulary tools

Clean data from official and public sources, priced per result:

- [UK Tenders API: Contracts Finder & Find a Tender](https://apify.com/tabulary/uk-public-tenders)
- [EU Tenders API: TED Public Procurement Notices](https://apify.com/tabulary/eu-ted-tenders)
- [SAM.gov Federal Contract Opportunities](https://apify.com/tabulary/sam-gov-contract-notices)
- [Company Job Postings: Greenhouse, Lever, Ashby & Workable](https://apify.com/tabulary/multi-ats-job-postings)
- [Remote Jobs API: RemoteOK & Jobicy Postings](https://apify.com/tabulary/remote-jobs-feed)

### FAQ

**Is this data official?** Yes. It comes from NOAA's public Aviation Weather Center API, unchanged
except for field names, number formatting and ISO 8601 timestamps.

**How fresh is it?** Every run fetches live data. METARs are usually issued hourly (more often in
changing weather, as SPECI reports); TAFs usually every 6 hours.

**Why are there more than 24 METARs a day for some airports?** Stations issue extra reports when
the weather changes quickly, and some busy airports report every 30 minutes.

**What is the difference between METAR and TAF?** A METAR is an observation of what the weather
is now. A TAF is a forecast for the next 24 to 30 hours around the airport.

**What is a PIREP?** A pilot report: an observation an aircraft crew radios in, most often about
turbulence, icing or cloud tops, which ground stations relay into the official feed. Coverage
depends entirely on which aircraft happened to report nearby and recently.

**What is the difference between a SIGMET and a G-AIRMET?** Both are official hazard advisories.
A SIGMET (including international SIGMETs) warns of a specific significant hazard — severe
turbulence, icing, volcanic ash, thunderstorms — over a defined area or line, worldwide. A
G-AIRMET is a wider, routine forecast of less severe but still operationally significant hazards
(icing, turbulence, IFR conditions, mountain obscuration, etc.) issued every few hours for the
contiguous United States.

**What if I enter an invalid code?** The run fails with a clear message listing the invalid codes.

**Something broke?** Open an issue on the Issues tab. The Actor is tested daily.

### Changelog

- **2026-10-24:** Pilot reports (PIREPs, `includePireps`) near each airport, and worldwide
  SIGMET/international-SIGMET and contiguous-US G-AIRMET hazard advisories (`includeHazards`).
- **2026-10-21:** METAR history up to 7 days back (`hoursBack`), ready-made inputs.
- **2026-10-15:** the airport code field is shown as required to AI agents.
- **2026-10-13:** first version: current METAR and TAF for up to 100 airports.

### About Tabulary

This tool is part of [Tabulary](https://apify.com/tabulary): clean tables from official public
sources. Every Tabulary tool uses the source's official API or open data where one exists,
collects no personal data, and is tested on Apify every day. Questions or ideas? Open an issue on
the Issues tab.

# Actor input Schema

## `stations` (type: `string`):

Comma or space separated 4-letter ICAO airport codes (e.g. KJFK, EGLL, KLAX). Up to 100 codes per run.

## `includeTaf` (type: `boolean`):

Also fetch the latest TAF forecast for each airport, saved as a separate dataset item.

## `hoursBack` (type: `integer`):

0 returns only the latest METAR per airport. Set up to 168 (7 days) to get every METAR report from that period, one row per report, newest first. TAF is always the current forecast.

## `includePireps` (type: `boolean`):

Also fetch pilot reports (turbulence, icing, cloud tops and more) within pirepRadiusSm of each airport, from the last pirepHoursBack hours. Limited to the first 25 airports per run.

## `pirepRadiusSm` (type: `integer`):

How far from each airport to search for pilot reports, in statute miles. Only used when includePireps is on.

## `pirepHoursBack` (type: `integer`):

How many hours of pilot reports to fetch around each airport. Only used when includePireps is on.

## `includeHazards` (type: `boolean`):

Also fetch every currently active SIGMET (including international SIGMETs) worldwide and G-AIRMET hazardous-weather advisory for the contiguous United States. These cover regions and flight information areas, not single airports, so they are not filtered by the stations above.

## Actor input object example

```json
{
  "stations": "KJFK,KLAX,KORD",
  "includeTaf": true,
  "hoursBack": 0,
  "includePireps": false,
  "pirepRadiusSm": 200,
  "pirepHoursBack": 3,
  "includeHazards": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "stations": "KJFK,KLAX,KORD",
    "includeTaf": true,
    "hoursBack": 0
};

// Run the Actor and wait for it to finish
const run = await client.actor("tabulary/airport-weather-metar-taf").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "stations": "KJFK,KLAX,KORD",
    "includeTaf": True,
    "hoursBack": 0,
}

# Run the Actor and wait for it to finish
run = client.actor("tabulary/airport-weather-metar-taf").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "stations": "KJFK,KLAX,KORD",
  "includeTaf": true,
  "hoursBack": 0
}' |
apify call tabulary/airport-weather-metar-taf --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tabulary/airport-weather-metar-taf"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/7C6YkXcHMy5SGkz9v/builds/lirtghxSZe3CAX8qR/openapi.json
