New rate limits now apply to all accounts.

Aerodrome Charts

Access categorized aerodrome chart PDF links (GEN, GND, SID, STAR, APP) for airports across 91 countries. The correct national chart source is selected automatically from the ICAO prefix - no source override is needed in most integrations. Response times vary by country: some respond in under a second, others may take 5–15 seconds.

Requirements

Auth
x-api-key on every request (direct subscription). Learn more →
EndpointWhen to use
GET /charts/sourcesDiscover supported chart regions and ICAO prefixes — below
GET /charts/{icao_code}Full categorized chart index — below
GET /charts/{icao_code}/{category}Single category — by category

Choosing an endpoint. Call GET /charts/sources once at startup to validate coverage. Use Fetch charts for a full briefing index. Use Charts by category when you only need one plate type (e.g. APP for approach panels).

A category with no published charts returns an empty array rather than 404; a completely unknown airport returns 404.

Chart categories

CodeContent
GENAirport diagram and general information
GNDGround movement and taxi charts
SIDStandard instrument departures
STARStandard terminal arrivals
APPApproach procedures - ILS, RNAV, VOR, etc.

Chart sources

Returns all supported chart data sources and the ICAO prefixes each covers. Call once at startup to populate a source picker or validate coverage before fetching charts.

Request

GEThttps://data.skylinkapi.com/v3/charts/sources

No query parameters.

Response

{
  "sources": [
    {
      "source_id": "uk",
      "name": "United Kingdom",
      "icao_prefixes": ["EG"]
    }
  ],
  "total_count": 91
}
FieldTypeRequiredDescription
sourcesarrayYesSupported national chart sources
total_countintegerYesNumber of sources returned

Source item (sources[])

FieldTypeRequiredDescription
source_idstringYesSource slug passed to the optional source query override
namestringYesHuman-readable source label
icao_prefixesarrayYesICAO location prefixes handled by this source

Coverage

Charts are available for airports in 91 countries and territories. The correct chart source is selected automatically from the airport's ICAO prefix.

Full coverage list by regionExpand section
RegionCountries / territories
AfricaAlgeria, Cape Verde, Djibouti, Morocco, Somalia, South Africa, South Sudan
Africa (West & Central - ASECNA)Benin, Burkina Faso, Cameroon, Central African Republic, Chad, Comoros, Congo, Côte d'Ivoire, Gabon, Guinea, Guinea-Bissau, Madagascar, Mali, Mauritania, Niger, Senegal, Togo
Americas - NorthCanada, United States
Americas - CentralBelize, Costa Rica, El Salvador, Guatemala, Honduras, Nicaragua, Panama
Americas - CaribbeanAruba, Cayman Islands, Cuba, Dominican Republic, Haiti
Americas - SouthArgentina, Brazil, Chile, Colombia, Uruguay, Venezuela
Asia - EastChina, Hong Kong, Japan, Mongolia, South Korea, Taiwan
Asia - SouthBangladesh, Bhutan, India, Maldives, Nepal, Pakistan, Sri Lanka
Asia - SoutheastBrunei, Malaysia, Myanmar, Singapore, Thailand
Asia - CentralKazakhstan, Kyrgyzstan, Tajikistan, Turkmenistan, Uzbekistan
Middle EastBahrain, Israel, Kuwait, Oman, Qatar, Saudi Arabia, UAE
Europe - WesternAustria, Belgium, France, Germany, Iceland, Ireland, Luxembourg, Netherlands, Norway, Portugal, Spain, Sweden, United Kingdom
Europe - NorthernDenmark, Estonia, Finland, Latvia, Lithuania
Europe - EasternBelarus, Czech Republic, Hungary, Poland, Romania, Russia, Slovakia, Ukraine
Europe - SouthernCyprus, Georgia, Greece, Malta, Slovenia
Europe - BalkansAlbania, Bosnia and Herzegovina, Kosovo, North Macedonia, Serbia
OceaniaAustralia, New Zealand

For ICAO prefix to country mapping, use the icao_prefixes field on each source item.

GET
/charts/sources
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Response Body

application/json

curl -X GET "https://data.skylinkapi.com/v3/charts/sources"
{
  "sources": [
    {
      "source_id": "string",
      "name": "string",
      "icao_prefixes": [
        "string"
      ]
    }
  ],
  "total_count": 0
}

Fetch charts for an aerodrome

Fetches all categorized chart PDF links for a given ICAO code. Three-letter US codes are auto-prefixed with K (e.g. JFK → KJFK).

Request

GEThttps://data.skylinkapi.com/v3/charts/{icao_code}
ParameterTypeRequiredDefaultDescription
icao_codestringYes-ICAO airport code (3–4 characters)
sourcestringNoautoOverride auto-detected chart source (e.g. faa, france, uk)

Allow longer read timeouts (30–60 s) for countries with slower chart hosting.

Response

{
  "icao_code": "KJFK",
  "source": "faa",
  "charts": {
    "GND": [
      {
        "name": "KJFK - Airport Diagram",
        "url": "https://...",
        "category": "GND"
      }
    ],
    "SID": [
      {
        "name": "KENNEDY TWO",
        "url": "https://...",
        "category": "SID"
      }
    ]
  },
  "total_count": 42,
  "fetched_at": "2026-02-11T12:00:00Z"
}
FieldTypeRequiredNull?Description
icao_codestringYesNeverResolved ICAO code
sourcestringYesNeverChart provider used for this fetch
chartsobjectNoYesCharts keyed by category (GEN, GND, SID, STAR, APP)
total_countintegerYesNeverTotal charts across all categories
fetched_atstringNoYesISO-8601 timestamp when charts were retrieved

Chart item (charts[category][])

FieldTypeRequiredDescription
namestringYesChart title as published by the source
urlstringYesDirect URL to the chart PDF
categorystringYesOne of GEN, GND, SID, STAR, APP - see chart categories
GET
/charts/{icao_code}
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Path Parameters

icao_code*string

ICAO airport code (e.g., KJFK, EGLL, LFPG)

Length3 <= length <= 4

Query Parameters

source?string

Override auto-detected chart source (e.g., faa, france, uk)

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3/charts/KJFK"
{
  "icao_code": "KJFK",
  "source": "faa",
  "charts": {
    "GND": [
      {
        "name": "KJFK - Airport Diagram",
        "url": "https://...",
        "category": "GND"
      }
    ],
    "SID": [
      {
        "name": "KENNEDY TWO",
        "url": "https://...",
        "category": "SID"
      }
    ]
  },
  "total_count": 42,
  "fetched_at": "2026-02-11T12:00:00Z"
}
Empty
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Charts by category

Fetches charts filtered to a single category (GEN, GND, SID, STAR, or APP) for a given airport. Response envelope matches the all-charts endpoint above but charts contains only the requested category key.

Request

GEThttps://data.skylinkapi.com/v3/charts/{icao_code}/{category}
ParameterTypeRequiredDefaultDescription
icao_codestringYes-ICAO airport code (3–4 characters)
categorystringYes-Chart category: GEN, GND, SID, STAR, or APP
sourcestringNoautoOverride auto-detected chart source

Response

Same shape as the all-charts response with charts limited to the requested category. An empty category array is a normal success response. Chart items use the same chart item field table.

Important: Missing category → empty array in a 200 response. Unknown airport → 404. Allow longer read timeouts (30–60 s) for countries with slower chart hosting.

GET
/charts/{icao_code}/{category}
x-api-key<token>

Your SkyLink licence key, for keys bought direct from skylinkapi.com.

In: header

Path Parameters

icao_code*string

ICAO airport code

Length3 <= length <= 4
category*string

Chart category to filter by

Value in"GEN" | "GND" | "SID" | "STAR" | "APP"

Query Parameters

source?string

Override auto-detected chart source

Response Body

application/json

application/json

curl -X GET "https://data.skylinkapi.com/v3/charts/KJFK/approach"
{
  "icao_code": "string",
  "source": "string",
  "charts": {
    "property1": [
      {
        "name": "string",
        "url": "string",
        "category": "GEN"
      }
    ],
    "property2": [
      {
        "name": "string",
        "url": "string",
        "category": "GEN"
      }
    ]
  },
  "total_count": 0,
  "fetched_at": "2019-08-24T14:15:22Z"
}
Empty
{
  "detail": [
    {
      "loc": [
        "string"
      ],
      "msg": "string",
      "type": "string",
      "input": null,
      "ctx": {}
    }
  ]
}

Client types

"""Aerodrome chart response models for /charts/* endpoints."""from __future__ import annotationsfrom dataclasses import dataclassfrom typing import LiteralChartCategory = Literal["GEN", "GND", "SID", "STAR", "APP"]@dataclassclass Chart:    name: str    url: str    category: str@dataclassclass ChartsResponse:    icao_code: str    source: str    total_count: int    charts: dict[str, list[Chart]] | None = None    fetched_at: str | None = None@dataclassclass SourceInfo:    source_id: str    name: str    icao_prefixes: list[str]@dataclassclass SourcesResponse:    sources: list[SourceInfo]    total_count: int@dataclassclass ChartLink:    name: str    url: str    category: str

Integration

Fetch approach charts for a briefing panel and flatten them into download links.

The example below caches chart responses for 24 hours because chart publications change infrequently. Read timeouts are extended to 45 s because some countries respond slowly. The helper returns a flat ChartLink list and treats 404 as "no charts available" rather than a hard failure.

import osimport timefrom dataclasses import dataclassimport requestsHEADERS = {    "x-api-key": os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")}BASE = "https://data.skylinkapi.com/v3"CACHE: dict[str, tuple[dict, float]] = {}CHARTS_TTL = 86_400  # 24 hChartCategory = str  # GEN | GND | SID | STAR | APP@dataclassclass ChartLink:    name: str    url: str    category: ChartCategorydef fetch_charts(icao: str, *, category: str | None = None) -> dict | None:    icao = icao.upper().strip()    if len(icao) == 3:        icao = f"K{icao}"    key = f"charts:{icao}:{category or 'all'}"    cached = CACHE.get(key)    if cached and time.time() < cached[1]:        return cached[0]    path = f"{BASE}/charts/{icao}"    if category:        path = f"{path}/{category.upper()}"    try:        r = requests.get(path, headers=HEADERS, timeout=(10, 45))    except requests.Timeout as exc:        raise RuntimeError(f"SkyLink timeout fetching charts for {icao}") from exc    if r.status_code == 404:        return None    r.raise_for_status()    data = r.json()    CACHE[key] = (data, time.time() + CHARTS_TTL)    return datadef chart_links(icao: str, *, category: str | None = None) -> list[ChartLink]:    data = fetch_charts(icao, category=category)    if not data:        return []    charts_by_cat: dict = data.get("charts") or {}    if category:        items = charts_by_cat.get(category.upper(), [])    else:        items = [c for group in charts_by_cat.values() for c in group]    return [        ChartLink(name=item["name"], url=item["url"], category=item["category"])        for item in items    ]if __name__ == "__main__":    import json    links = chart_links("KJFK", category="APP")    print(json.dumps(links[:5], indent=2, default=str))

Implementation notes

US code prefixing. Pass JFK or KJFK - both resolve to KJFK for US airports.

Category filtering. Use Charts by category with APP when you only need approach plates; it avoids downloading SID/STAR metadata you will not display.

PDF delivery. Chart url values point to hosted PDF files. Open in a new tab or proxy through your server if you need consistent CORS behavior.

Empty vs 404. Missing category → empty array in a 200 response. Unknown airport → 404.

Error responses

Shared platform errors: Error Handling. Endpoint-specific:

422 - invalid category or ICAO length

{
  "detail": [
    {
      "type": "enum",
      "loc": ["path", "category"],
      "msg": "Input should be 'GEN', 'GND', 'SID', 'STAR' or 'APP'"
    }
  ]
}

404 - no charts for airport

Returned when Skylink cannot locate charts for the ICAO code in any configured source.


Related: Airports · Flight Briefing