Getting Started
SkyLink API is sold through two channels: direct from us (billed through our own portal) and the RapidAPI marketplace. Both serve the same data — they differ only in the base URL and the auth header. You subscribe (or apply for a trial), copy your key, and send HTTPS requests; every response is JSON.
Choose your channel
Pick the one you bought through. Every base URL, header and code sample in these docs follows this switch, and your choice is remembered across pages.
| Direct API | RapidAPI | |
|---|---|---|
| Base URL | https://data.skylinkapi.com + /v3.1, /v3 or /v2 | https://skylink-api.p.rapidapi.com (no version segment) |
| Auth | x-api-key | X-RapidAPI-Key and X-RapidAPI-Host |
| Where to buy | our checkout | RapidAPI listing |
| Billing | Polar (merchant of record) | RapidAPI |
Step 1 — Subscribe and get your credentials
FREE Trial
The FREE Trial (1,000 requests/month) is not self-serve. Apply for the SkyLink API FREE Trial — applications are reviewed weekly; most teams hear back within 3–5 business days.
Paid plans
- Open SkyLink API checkout and pick Basic, Pro, Ultra, or Mega.
- After checkout, your licence key is shown on the confirmation page and emailed to you; it is always available from your Polar customer portal.
Every authenticated request carries one header:
| Header | Value |
|---|---|
x-api-key | Your licence key |
The header is the only accepted form — the key is never read from a query parameter. A missing or unknown key returns 401.
The version lives in the path. https://data.skylinkapi.com/v3.1/... for v3.1, /v3/... and /v2/... for the older generations.
Key security
- Never embed the key in mobile apps, browser JavaScript, or public repositories — it grants full API access under your billing quota.
- Store it in an environment variable (for example
SKYLINK_API_KEY) and inject it server-side at runtime. - Rotate the key from your billing dashboard if it is ever exposed.
Public endpoints (no key required)
OpenAPI specifications and the upstream health check are served from api.skylinkapi.com — separate from both the data host and the RapidAPI proxy — and do not require a key:
| Endpoint | Description |
|---|---|
GET https://api.skylinkapi.com/health | Upstream health check |
GET https://api.skylinkapi.com/v2/openapi.json | v2 OpenAPI specification |
GET https://api.skylinkapi.com/v3/openapi.json | v3 OpenAPI specification |
GET https://api.skylinkapi.com/v3.1/openapi.json | v3.1 OpenAPI specification |
Important: Calling /health or / on a data host returns 404. Use api.skylinkapi.com for unauthenticated specs and health checks only.
Step 2 — Make your first request
https://data.skylinkapi.com/v3.1/weather/metar/{icao}Example: ?parsed=true on /weather/metar/KJFK.
Headers: Step 1.
import osimport requestsBASE_URL = "https://data.skylinkapi.com/v3.1"HEADERS = { "x-api-key": os.getenv( "SKYLINK_API_KEY", os.getenv("SKYLINK_API_KEY", os.getenv("SKYLINK_API_KEY", "YOUR_API_KEY")), )}def get_metar(icao: str, parsed: bool = True) -> dict: r = requests.get( f"{BASE_URL}/weather/metar/{icao}", headers=HEADERS, params={"parsed": str(parsed).lower()}, timeout=(10, 15), ) r.raise_for_status() return r.json()if __name__ == "__main__": import json data = get_metar("KJFK") print(json.dumps(data, indent=2, default=str))Official SDKs
Prefer a typed client over raw HTTP? Both official SDKs are published as skylink-api, wrap the same endpoints, read your key from the environment, and return typed models.
| Language | Registry | Install |
|---|---|---|
| Python | PyPI → skylink-api | pip install skylink-api |
| TypeScript | npm → skylink-api | npm install skylink-api |
from skylink_api import SkyLink
with SkyLink() as sky:
metar = sky.weather.metar("KJFK")
traffic = sky.adsb.aircraft(lat=51.47, lon=-0.46, radius=75)
status = sky.flight_status("BA117")import { SkyLink } from "skylink-api";
// Direct channel — omit `provider` to use RapidAPI, the SDK's default.
const sky = new SkyLink({ provider: "direct", apiKey: process.env.SKYLINK_API_KEY });
const metar = await sky.weather.metar("KJFK", { parsed: true });
const flight = await sky.flightStatus("BA117");Both channels expose the identical method surface — provider only decides the base URL and which auth headers are sent.
The Python client requires Python 3.10+ and depends on httpx and pydantic v2. The TypeScript client requires Node 20+ (or any runtime with a global fetch — Bun, Deno, Cloudflare Workers, Vercel Edge), ships zero runtime dependencies, and has built-in retries and quota tracking. The TypeScript client reads RAPIDAPI_KEY or SKYLINK_API_KEY from the environment when no key is passed explicitly.
What you get back
A successful METAR response with parsed=true looks like this:
{
"raw": "METAR KJFK 062251Z 24017G23KT 10SM FEW060 FEW075 SCT110 BKN180 BKN250 28/17 A2974 RMK AO2 SLP072 T02830167 $",
"icao": "KJFK",
"airport_name": "John F. Kennedy International Airport",
"timestamp": "2026-06-06T23:09:37Z",
"parsed": {
"time": "2026-06-07T00:51:00+02:00",
"wind": { "direction": 240, "speed": 17, "gust": 23, "variable": [] },
"visibility": { "value": 10, "repr": "10" },
"flight_rules": "VFR",
"temperature": 28,
"dewpoint": 17,
"altimeter": 29.74
}
}parsed.flight_rules is the flight category derived from ceiling and visibility: VFR (visual flight rules), MVFR (marginal VFR), IFR (instrument flight rules), or LIFR (low IFR). Full field tables and nullability rules: METAR reference.
When parsed=false (or omitted), the parsed key is absent — you receive raw, icao, airport_name, and timestamp only.
Next steps
- v3.1 API Reference — complete endpoint index (start here)
- Error Handling — error shapes, status codes, retry rules
- Rate Limits — plans, quota headers, Historical ADS-B path tiers
- v3 API Reference — stable version
- v2 API Reference — legacy version
- Python SDK · TypeScript SDK — typed clients