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).
Get a key
Keys are created in the dashboard after signing in and confirming your email. Free accounts get 1 active key.
curl -H "Authorization: Bearer ow_your_key_here" \ "https://www.orbitalwiki.com/api/v1/satellites/25544"
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);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_.
Rate limits
10/sec burst · 1 active key · non-commercial evaluation
50/sec burst · commercial products and recurring jobs
150/sec burst · team and enrichment workflows
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.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/satellites | Paginated 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}/tle | Reconstructed TLE from stored OMM elements. Includes stale_warning when elements are > 3 days old. |
| GET | /api/v1/satellites/{norad_cat_id}/omm | Full CCSDS OMM JSON re-emitted from stored CelesTrak mean-elements. |
| GET | /api/v1/search | Search by name, NORAD ID, COSPAR ID, operator or country. Params: q, orbit_class, status, country, limit, offset. |
| GET | /api/v1/operators | Operators aggregated from the payload catalog, ranked by active satellite count. |
| GET | /api/v1/operators/{slug} | Single operator with paginated satellite list. |
| GET | /api/v1/sources | Data sources with license and required attribution strings. |
| GET | /api/v1/stats | Catalogue summary: object classes, statuses, and coverage. |
| GET | /api/v1/reentries | Objects marked DECAYED, newest catalogue change first. |
| GET | /api/v1/elements | Mean elements for every active object, as index-aligned parallel arrays. Public, no key. |
| GET | /api/v1/events | Recent catalogue changes: new objects, reentries, and significant orbit changes. Public, no key. |
| GET | /api/v1/launches | Launches 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
Error responses
| Status | Meaning | Details |
|---|---|---|
400 | Bad Request | A query parameter is missing or holds a value the endpoint does not accept. The body lists the allowed values. Code: invalid_parameter. |
401 | Unauthorized | No key, malformed header, or a key that has been revoked. Hint: send Authorization: Bearer ow_… |
403 | Forbidden | Account suspended. |
404 | Not Found | Object does not exist, or no orbital elements available for this NORAD ID. |
422 | Unprocessable | The record exists but its elements cannot be expressed in the format you asked for. Only on the TLE endpoint; use the OMM endpoint instead. |
429 | Rate Limited | Daily or burst limit exceeded. Check X-RateLimit-Remaining and wait Retry-After seconds. |
500 | Server Error | A 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. |
503 | Service Unavailable | API 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