New rate limits now apply to all accounts.

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 APIRapidAPI
Base URLhttps://data.skylinkapi.com + /v3.1, /v3 or /v2https://skylink-api.p.rapidapi.com (no version segment)
Authx-api-keyX-RapidAPI-Key and X-RapidAPI-Host
Where to buyour checkoutRapidAPI listing
BillingPolar (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.

  1. Open SkyLink API checkout and pick Basic, Pro, Ultra, or Mega.
  2. 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:

HeaderValue
x-api-keyYour 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:

EndpointDescription
GET https://api.skylinkapi.com/healthUpstream health check
GET https://api.skylinkapi.com/v2/openapi.jsonv2 OpenAPI specification
GET https://api.skylinkapi.com/v3/openapi.jsonv3 OpenAPI specification
GET https://api.skylinkapi.com/v3.1/openapi.jsonv3.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

GEThttps://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.

LanguageRegistryInstall
PythonPyPI → skylink-apipip install skylink-api
TypeScriptnpm → skylink-apinpm 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