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
x-api-key on every request (direct subscription). Learn more →| Endpoint | When to use |
|---|---|
GET /charts/sources | Discover 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
| Code | Content |
|---|---|
GEN | Airport diagram and general information |
GND | Ground movement and taxi charts |
SID | Standard instrument departures |
STAR | Standard terminal arrivals |
APP | Approach 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
https://data.skylinkapi.com/v3/charts/sourcesNo query parameters.
Response
{
"sources": [
{
"source_id": "uk",
"name": "United Kingdom",
"icao_prefixes": ["EG"]
}
],
"total_count": 91
}| Field | Type | Required | Description |
|---|---|---|---|
sources | array | Yes | Supported national chart sources |
total_count | integer | Yes | Number of sources returned |
Source item (sources[])
| Field | Type | Required | Description |
|---|---|---|---|
source_id | string | Yes | Source slug passed to the optional source query override |
name | string | Yes | Human-readable source label |
icao_prefixes | array | Yes | ICAO 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
| Region | Countries / territories |
|---|---|
| Africa | Algeria, 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 - North | Canada, United States |
| Americas - Central | Belize, Costa Rica, El Salvador, Guatemala, Honduras, Nicaragua, Panama |
| Americas - Caribbean | Aruba, Cayman Islands, Cuba, Dominican Republic, Haiti |
| Americas - South | Argentina, Brazil, Chile, Colombia, Uruguay, Venezuela |
| Asia - East | China, Hong Kong, Japan, Mongolia, South Korea, Taiwan |
| Asia - South | Bangladesh, Bhutan, India, Maldives, Nepal, Pakistan, Sri Lanka |
| Asia - Southeast | Brunei, Malaysia, Myanmar, Singapore, Thailand |
| Asia - Central | Kazakhstan, Kyrgyzstan, Tajikistan, Turkmenistan, Uzbekistan |
| Middle East | Bahrain, Israel, Kuwait, Oman, Qatar, Saudi Arabia, UAE |
| Europe - Western | Austria, Belgium, France, Germany, Iceland, Ireland, Luxembourg, Netherlands, Norway, Portugal, Spain, Sweden, United Kingdom |
| Europe - Northern | Denmark, Estonia, Finland, Latvia, Lithuania |
| Europe - Eastern | Belarus, Czech Republic, Hungary, Poland, Romania, Russia, Slovakia, Ukraine |
| Europe - Southern | Cyprus, Georgia, Greece, Malta, Slovenia |
| Europe - Balkans | Albania, Bosnia and Herzegovina, Kosovo, North Macedonia, Serbia |
| Oceania | Australia, New Zealand |
For ICAO prefix to country mapping, use the icao_prefixes field on each source item.
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
https://data.skylinkapi.com/v3/charts/{icao_code}| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
icao_code | string | Yes | - | ICAO airport code (3–4 characters) |
source | string | No | auto | Override 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"
}| Field | Type | Required | Null? | Description |
|---|---|---|---|---|
icao_code | string | Yes | Never | Resolved ICAO code |
source | string | Yes | Never | Chart provider used for this fetch |
charts | object | No | Yes | Charts keyed by category (GEN, GND, SID, STAR, APP) |
total_count | integer | Yes | Never | Total charts across all categories |
fetched_at | string | No | Yes | ISO-8601 timestamp when charts were retrieved |
Chart item (charts[category][])
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Chart title as published by the source |
url | string | Yes | Direct URL to the chart PDF |
category | string | Yes | One of GEN, GND, SID, STAR, APP - see chart categories |
Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
ICAO airport code (e.g., KJFK, EGLL, LFPG)
3 <= length <= 4Query Parameters
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"
}{
"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
https://data.skylinkapi.com/v3/charts/{icao_code}/{category}| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
icao_code | string | Yes | - | ICAO airport code (3–4 characters) |
category | string | Yes | - | Chart category: GEN, GND, SID, STAR, or APP |
source | string | No | auto | Override 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.
Your SkyLink licence key, for keys bought direct from skylinkapi.com.
In: header
Path Parameters
ICAO airport code
3 <= length <= 4Chart category to filter by
"GEN" | "GND" | "SID" | "STAR" | "APP"Query Parameters
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"
}{
"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: strIntegration
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