Table · satellite-catalog
Satellite catalog
Every artificial object GCAT catalogs, one record per object since Sputnik in 1957: payloads, rocket stages, components and debris, including those that reentered, left for deep space or failed to reach orbit. Each record has the GCAT id, the US catalog number (six digits and up since the 2026 rollover), the international designator, owner, state, launch and decay dates, mass, status and the latest orbit with its class.
- Updates
- Daily
- Coverage
- —
- Current version
- —
- Last published
- —
- Validation
- —
- License
- CC BY 4.0
- Commercial use
- Allowed
Preview
Use the API
The examples follow the rows picked above. See the docs for versions, caching and errors.
curl
# All rows (.json or .csv)
curl -s "https://api.satellitedata.dev/v1/satellite-catalog/table/all.json"
# The whole table in one file
curl -sO "https://api.satellitedata.dev/v1/satellite-catalog/download/satellite-catalog.csv" Python (polars)
import polars as pl
# All rows
df = pl.read_csv("https://api.satellitedata.dev/v1/satellite-catalog/table/all.csv")
# The whole table
everything = pl.read_parquet("https://api.satellitedata.dev/v1/satellite-catalog/download/satellite-catalog.parquet") JavaScript
const res = await fetch("https://api.satellitedata.dev/v1/satellite-catalog/table/all.json");
if (!res.ok) throw new Error((await res.json()).detail); // errors are problem+json
const { meta, rows } = await res.json();
console.log(meta.rows, rows[0]); Downloads
The whole dataset in one file. Parquet keeps the column types and is much smaller.
- satellite-catalog.csv CSV
- satellite-catalog.parquet Parquet
Schema
Rows are identified by jcat.
The rows are also split into one file per value of status_group.
Tables up to 50,000 rows also have a single table/all file.
| Column | Type | Unit | Can be empty | Description |
|---|---|---|---|---|
| jcat key | text | — | no | GCAT's object id: catalog letter (S, A, T, F) and sequence number, e.g. S25544 |
| norad_cat_id | integer | — | yes | US Space Force (NORAD) catalog number. Not unique: objects that stayed attached share their parent's number, and the S-catalog row (jcat S plus the number) is the one the US catalog lists. Null when GCAT does not tie the object to a number (see satcat_note), including S entries it cannot match to a specific satellite of the launch |
| satcat_note | text | — | yes | GCAT's reason for a missing catalog number: NNA (not assigned or not identified), NNA A/C/E/I/P/R/S/T/X (attached, component, spacesuit, internal, partial orbit, ...), NSO (suborbital) |
| piece | text | — | yes | International (COSPAR) designator as GCAT records it, e.g. 1998-067A. Launches before 1963 keep their original Harvard designations (1957 ALP 2), which Space-Track shows renumbered (1957-001B) |
| launch_tag | text | — | yes | Launch the object belongs to; joins launches.launch_tag |
| catalog | text | — | no | GCAT catalog holding the object: satcat, satcat100k, satcat270k, auxcat, tmpcat or ftocat |
| name | text | — | no | GCAT's recommended current name (after any renaming) |
| original_name | text | — | no | Name in the object's first phase |
| object_type | text | — | no | payload, rocket-stage, component, debris, suborbital-payload or spurious (GCAT SatType byte 1) |
| gcat_type | text | — | no | GCAT's 12-byte SatType string (byte 1 coarse type, byte 2 modifier, byte 3 attachment, byte 4 subtype, ...) |
| identity_uncertain | true / false | — | no | SatType byte 9 is '?': GCAT knows the objects of the launch but not which catalog number is which |
| status_group partition | text | — | no | in-orbit, lost (in orbit but untracked), reentered (decayed, deorbited or landed), suborbital, deep-space, failed-to-orbit, broken-up (exploded or destroyed in a collision) or spurious (no real object) |
| status_code | text | — | no | GCAT phase status code of the latest phase: O in orbit, AO attached in orbit, OX lost, R reentered, D deorbited, L landed, AR reentered attached, DSO deep space, E exploded, ERR not a real object, ... A trailing ? marks it unconfirmed |
| status | text | — | yes | GCAT's plain-language current status (currentcat ExpandedStatus), e.g. 'Attached to S25544 Zarya'. Null for objects currentcat does not cover (ftocat and a few others) |
| active | true / false | — | yes | GCAT counts the object as an active satellite (currentcat Ac = A). Null where currentcat does not cover it |
| owner | text | — | yes | GCAT org code of the owner/operator in the latest phase (e.g. SPXS, JSC). A trailing ? marks an uncertain attribution; joint owners are slash-separated |
| owner_name | text | — | yes | Owner's name from GCAT's organizations table |
| state | text | — | yes | GCAT code of the country or intergovernmental body responsible (US, CN, SU, F for France, I-ESA, ...); not ISO codes |
| state_name | text | — | yes | — |
| launch_date | date (YYYY-MM-DD) | — | yes | UTC launch date; null when GCAT gives it only roughly, or gives a day after its own file date (a typo); see launch_date_text |
| launch_date_text | text | — | yes | Launch date exactly as GCAT writes it, in its Vague Date format ('1957 Oct 4', '1971?') |
| decay_date | date (YYYY-MM-DD) | — | yes | UTC date the object reentered, landed, crashed or impacted another body; null while in orbit or flying, and when GCAT gives the date only roughly |
| decay_date_text | text | — | yes | That date exactly as GCAT writes it ('1958 Jan 4?', '1960 Apr 26 1730?') |
| mass_kg | number | kg | yes | Mass at orbital insertion, not counting attached objects. Null when GCAT gives none (0 or '-'), as for most debris |
| mass_estimated | true / false | — | yes | GCAT flags the mass as an estimate (good to about 20%) |
| orbit_source | text | — | yes | latest: currentcat's most recent orbit (objects still in space); canonical: the representative early-operations orbit GCAT lists for the latest phase |
| orbit_epoch | date (YYYY-MM-DD) | — | yes | Epoch of that orbit when GCAT pins it to a day |
| orbit_epoch_text | text | — | yes | — |
| period_min | number | min | yes | Orbital period (latest orbits only) |
| perigee_km | number | km | yes | Perigee height above the central body's equatorial radius. Negative for trajectories that intersect the Earth or are hyperbolic |
| apogee_km | number | km | yes | Apogee height. Negative for hyperbolic (escape) trajectories; null where GCAT writes Inf |
| inclination_deg | number | deg | yes | Inclination to the equator of date (Earth orbits) |
| orbit_estimated | true / false | — | yes | GCAT flags a perigee/apogee/inclination value as a guess |
| orbit_category | text | — | yes | GCAT OpOrbit category: LLEO/I, LEO/S, MEO, HEO/M, GTO, GEO/S, GEO/ID, VHEO, CLO, EEO, ... |
| orbit_class | text | — | yes | LEO (below 2000 km), MEO, GEO (geosynchronous, incl. inclined and drifting), HEO (highly elliptical incl. Molniya and GTO), VHEO, cislunar, escape or suborbital, mapped from orbit_category |
Source and license
- Source
- General Catalog of Artificial Space Objects (GCAT), object catalogs and currentcat
- Publisher
- Jonathan C. McDowell
- License
- Creative Commons Attribution 4.0 (
CC-BY-4.0) - Commercial use
- Allowed
Credit the source with this exact text:
data from GCAT (J. McDowell, planet4589.org/space/gcat)
Checked every 1 day. If the source hasn't changed in 14 days, the status page flags it as stale.
Endpoints
Every URL for this dataset. To pin the current version, put it after the id:
/v1/satellite-catalog@<version>.
The API reference describes each response.
| What | URL |
|---|---|
| Metadata: version, coverage, downloads, validation | /v1/satellite-catalog |
| Versions and monthly snapshots | /v1/satellite-catalog/versions |
| Partitions | /v1/satellite-catalog/locations |
| Rows for one status_group (JSON) | /v1/satellite-catalog/table/{status_group}.json |
| Rows for one status_group (CSV) | /v1/satellite-catalog/table/{status_group}.csv |
| All rows in one file (tables up to 50,000 rows) | /v1/satellite-catalog/table/all.json |
| Whole dataset (CSV) | /v1/satellite-catalog/download/satellite-catalog.csv |
| Whole dataset (Parquet) | /v1/satellite-catalog/download/satellite-catalog.parquet |