Index/developers
Free API keysDashboard ready

Build on the open orbital record.

Read-only REST API for 1,000 requests/day. Records include source claims, confidence, and attribution where available; missing provenance remains explicit. Data from CelesTrak, GCAT/McDowell (CC-BY 4.0), Wikidata (CC0), and SatNOGS DB (CC BY-SA 4.0).

#01

Get a key

Keys are created in the dashboard after signing in and confirming your email. Free accounts get 1 active key.

curl
curl -H "Authorization: Bearer ow_your_key_here" \
  "https://www.orbitalwiki.com/api/v1/satellites/25544"
javascript
const res = await fetch(
  "https://www.orbitalwiki.com/api/v1/satellites/25544",
  { headers: { "Authorization": "Bearer ow_your_key_here" } }
);
const { data } = await res.json();
// data.name  → "ISS (ZARYA)"
// data.orbit_class → "LEO"
// data.operational_status → "OPERATIONAL"
console.log(data.name);
python
import requests

r = requests.get(
    "https://www.orbitalwiki.com/api/v1/satellites/25544",
    headers={"Authorization": "Bearer ow_your_key_here"},
)
r.raise_for_status()
data = r.json()["data"]
# data["name"] → "ISS (ZARYA)"
# data["orbit_class"] → "LEO"
print(data["name"])

Auth: send Authorization: Bearer ow_your_key_here or X-API-Key: ow_your_key_here on every request. Keys start with ow_.

#02

Rate limits

Free tier
1,000/day

10/sec burst · 1 active key · non-commercial evaluation

Builder tier
50,000/day

50/sec burst · commercial products and recurring jobs

Business tier
250,000/day

150/sec burst · team and enrichment workflows

Enterprise tier
Custom

Bulk access, procurement, source-rights review, and custom terms

Without a key: 50 requests/day per IP address, so you can try the API before signing up. The limit is shared across everyone on your network, and every example below still needs a key.

Rate-limit headers on metered responses

X-RateLimit-LimitYour daily quota.
X-RateLimit-RemainingRequests remaining today.
X-RateLimit-ResetUnix timestamp when the window resets.
Retry-AfterSeconds to wait (only on 429 responses).

Data freshness

Everything here is rebuilt on a fixed schedule. Requesting the same record more often than it refreshes returns identical data and spends your daily quota for nothing.

Orbital elements (TLE / OMM)
Every 6 hours, at 00, 06, 12 and 18 UTC
Catalog entries (CelesTrak SATCAT)
Daily, 06:15 UTC
Launch and operator data (GCAT)
Daily, 07:30 UTC
Wikidata and SatNOGS enrichment
Weekly, on Sundays
API responses at the edge
5 minutes to 24 hours at the edge, depending on the endpoint; keyed requests are never cached

Before you write a polling loop

Cache responses for at least six hours. Four requests a day for a given satellite is enough to see every change we publish. A once-a-minute loop returns the same bytes roughly 1,400 times and exhausts a free key in under an hour.

If you do hit the limit, the 429 carries a Retry-After header and a retry_after value. Wait for it instead of retrying immediately.

#03

Endpoints

MethodPathDescription
GET/api/v1/satellitesPaginated list. Filters: orbit_class, status, object_class, country, active, q, limit, offset.
GET/api/v1/satellites/{norad_cat_id}Full record with provenance claims and source metadata.
GET/api/v1/satellites/{norad_cat_id}/tleReconstructed TLE from stored OMM elements. Includes stale_warning when elements are > 3 days old.
GET/api/v1/satellites/{norad_cat_id}/ommFull CCSDS OMM JSON re-emitted from stored CelesTrak mean-elements.
GET/api/v1/searchSearch by name, NORAD ID, COSPAR ID, operator or country. Params: q, orbit_class, status, country, limit, offset.
GET/api/v1/operatorsOperators aggregated from the payload catalog, ranked by active satellite count.
GET/api/v1/operators/{slug}Single operator with paginated satellite list.
GET/api/v1/sourcesData sources with license and required attribution strings.
GET/api/v1/statsCatalogue summary: object classes, statuses, and coverage.
GET/api/v1/reentriesObjects marked DECAYED, newest catalogue change first.
GET/api/v1/elementsMean elements for every active object, as index-aligned parallel arrays. Public, no key.
GET/api/v1/eventsRecent catalogue changes: new objects, reentries, and significant orbit changes. Public, no key.
GET/api/v1/launchesLaunches grouped from the COSPAR designator, with object counts. Public, no key.
GET/api/v1/dataset/{slice}Bulk catalogue download in UCS column names, as CSV or JSON. Public, no key.

All paths relative to https://www.orbitalwiki.com · openapi.json

#04

Error responses

StatusMeaningDetails
400Bad RequestA query parameter is missing or holds a value the endpoint does not accept. The body lists the allowed values. Code: invalid_parameter.
401UnauthorizedNo key, malformed header, or a key that has been revoked. Hint: send Authorization: Bearer ow_…
403ForbiddenAccount suspended.
404Not FoundObject does not exist, or no orbital elements available for this NORAD ID.
422UnprocessableThe record exists but its elements cannot be expressed in the format you asked for. Only on the TLE endpoint; use the OMM endpoint instead.
429Rate LimitedDaily or burst limit exceeded. Check X-RateLimit-Remaining and wait Retry-After seconds.
500Server ErrorA database read failed, or the dataset download cannot be built because its database function is not deployed. Retry the read; the deploy fault will not clear on its own. Code: database_error.
503Service UnavailableAPI temporarily paused or auth misconfigured.

All error bodies: { "code": "...", "error": "...", "hint": "..." }

code is the stable machine-readable identifier: match on it, never on the wording of error or hint. It is sent on every 401, 429 and 503 from the shared API guard, and on the 400 and 500 from /satellites. The remaining routes still return error and hint only; adding code to them is additive and in progress. Read the stability policy