TAF (ICAO)

Required roles: AIS PIB API — Roles
Base endpoint: https://ais-pib-api.ibosoft.net.tr:2087/opmet-decoder-taf-icao
Reference documents: ICAO Doc 10157 PANS-MET, Ed. 1 (27/11/25) · ICAO Doc 8400 PANS-ABC, Ed. 9, Amend. 33 (8/11/18)
Attribution: show ibonav.aero or "Decoded by Ibosoft" wherever decoded output is displayed
Data sources: none — decodes the message supplied in the request.
Last updated: 17 OCT 2026

About the reference documents: Related Documents and Resources

Decodes an aerodrome forecast (TAF) into readable fields, one box per forecast group, following the PANS-MET template. Also returns the position of every decoded token in the message (positions).

The format is that of PANS-MET Appendix 4 (template Table A4-1, change and time indicators Table A4-2). To get forecasts to decode, see TAF. For U.S. format forecasts use TAF (FAA).


Endpoints

POST /opmet-decoder-taf-icao/decode
Content-Type: application/json

{ "raw": "<TAF text>" }

Parameters

Parameter In Description
raw body Forecast text, at least 10 characters. Line breaks, extra spaces, lower case and a final = are accepted.

How the template is processed

  • Field names and wording come from the template and the related PANS-MET paragraphs: output keys are the template element names; group headers use the meanings of Table A4-2 and the notes on the change indicators. Abbreviations are expanded as defined in PANS-MET and PANS-ABC (Doc 8400).
  • Header elements (type, location indicator, time of issue, period of validity) are at the top level.
  • Forecast groups: the base forecast and every change group (BECMG, TEMPO, FM, PROB30, PROB40, PROB30 TEMPO, PROB40 TEMPO) become one box each in forecast_groups, with a header (label) and the elements of that group.
  • M (mandatory) elements of the base forecast are always present (null or [] when missing). Change groups contain only the elements they give.
  • Special cases: NIL (missing forecast) and CNL (cancelled forecast) are returned as their own fields with no forecast groups; CAVOK replaces visibility and cloud in its group; NSC is "No significant clouds"; wind 00000 is Calm; visibility 9999 is 10 km or more; temperature groups (TX…, TN…) appear in the base forecast as a Temperature list.
  • Strict template: a value that does not follow the template is not guessed; it is listed under Undecodable elements (neighbouring groups form one entry).

For the full list of elements and their templates, see PANS-MET Table A4-1.

Response

Example — PANS-MET Example A4-1:

TAF YUDO 151800Z 1600/1618 13005MPS 9000 BKN020 BECMG 1606/1608 SCT015CB BKN020 TEMPO 1608/1612 17006G12MPS 1000 TSRA SCT010CB BKN020 FM161230 15004MPS 9999 BKN020
{
  "Type of forecast": "TAF",
  "Location indicator": "YUDO",
  "Time of issue of forecast": "Day 15, 18:00 UTC",
  "Days and period of validity of forecast": "Day 16, 00:00 UTC to Day 16, 18:00 UTC",
  "forecast_groups": [
    {"label": "Base forecast (Day 16, 00:00 UTC to Day 16, 18:00 UTC)", "label_start": 17, "label_end": 26,
     "Surface wind": "05 m/s from 130°T", "Visibility": "9000 m", "Cloud": ["Broken [5/8, 7/8] at 2000 ft AGL"]},
    {"label": "Becoming - Day 16, 06:00 UTC to Day 16, 08:00 UTC - (The change is forecast to commence at Day 16, 06:00 UTC and be completed by Day 16, 08:00 UTC) (Note: …)", "label_start": 48, "label_end": 63,
     "Cloud": ["Scattered [3/8, 4/8] at 1500 ft AGL cumulonimbus", "Broken [5/8, 7/8] at 2000 ft AGL"]},
    {"label": "Temporary - Day 16, 08:00 UTC to Day 16, 12:00 UTC - (…) (Note: …)", "label_start": 80, "label_end": 95,
     "Surface wind": "06 m/s gusting 12 m/s from 170°T", "Visibility": "1000 m", "Weather": ["Thunderstorm with rain"],
     "Cloud": ["Scattered [3/8, 4/8] at 1000 ft AGL cumulonimbus", "Broken [5/8, 7/8] at 2000 ft AGL"]},
    {"label": "From - Day 16, 12:30 UTC - (Significant change in most weather elements occurring at Day 16, 12:30 UTC)", "label_start": 134, "label_end": 142,
     "Surface wind": "04 m/s from 150°T", "Visibility": "10 km or more", "Cloud": ["Broken [5/8, 7/8] at 2000 ft AGL"]}
  ],
  "marker_positions": [{"start": 48, "end": 63}, {"start": 80, "end": 95}, {"start": 134, "end": 142}],
  "positions": [{"start": 0, "end": 3}, "…"],
  "raw": "TAF YUDO 151800Z …"
}
Key Description
header keys Type of forecast, location indicator, time of issue, period of validity
forecast_groups One box per forecast group: label, label_start/label_end (header span in the message) and the group's elements
marker_positions Header spans of the change groups
Undecodable elements Groups that do not follow the template (only when there are any)
positions Character spans {start, end} in the normalized message (single spaces, upper case, no final =), one per decoded value in output order (header fields, then the groups in order)
raw The message as received

Errors

Code Meaning
400 The message could not be parsed at all; detail explains why
422 raw is missing or shorter than 10 characters