Bulk export

The whole catalogue as five CSV files, frozen against a release and published with a checksum each. This is what the API means when it stops paging: a hundred thousand rows in, you are no longer asking questions of a catalogue, you are copying one, and copying it once is kinder to both ends than a hundred thousand requests.

Everything below the files is the part a CSV cannot carry: what every column holds, in what unit, and which of them can be empty. There is no registration, no key and no rate limit on the download.

[

THE FILES

] DR1 · 2026-08-21

Everything at once, or a file at a time. The archive holds all five CSVs plus the licence, the release notes, a checksum list and a machine-readable manifest of every count in the release.

spacecatalog-dr1.tar.gz30 MB · EVERYTHING ↓
  • One row per object. The file the other four hang off, and the one to open first.

    630ba7ae703659f0c4fe67480d11dd1f2c7eafd89bb2443361d68d9e91321398
  • Every catalogue identifier that resolves to an object — the table to join on if you arrive with a list of names rather than positions.

    1ea90d8d329d8b5b03f84fa15846a9ca2ecada5825dfd984fd0bc156b17114e6
  • Object-to-object links the catalogue is confident enough to publish. Every pair appears twice, once from each end, so a join on slug finds all of an object's relations without a second join the other way — and a count of these rows is twice the number of pairs.

    b2e41ea6a22427a53abb7e7b09cb4bd875892ac5302e2e233e4dfd2a0e6382ff
  • The upstream catalogues this release was built from. Not gzipped: it is two kilobytes and it is the file that says what you may do with the rest.

    8f9c4d6441d1ed5c3ba38c35164ae275726167b3609df8e7eb2a1732dcb57ea4
  • Where two upstreams describe one object differently by more than the tolerance for that quantity, and which value this release kept. Recorded rather than resolved: catalogues disagreeing is the normal condition of astronomy, and which one is right is not a question a merge can answer.

    af601cb342ef877bde356bcc2ffff35dda5d0197f8167188482b3f6fd9e4b71b
[

CHECK IT

] TWO COMMANDS

The bundle is built reproducibly — the clock gzip writes into its header and the timestamps tar writes per entry are both zeroed — so the same catalogue packed twice gives the same digest, and the digest is a claim you can check rather than one you have to take.

curl -LO https://github.com/space-catalog/data-releases/releases/download/dr1/spacecatalog-dr1.tar.gz
curl -LO https://github.com/space-catalog/data-releases/releases/download/dr1/spacecatalog-dr1.tar.gz.sha256
shasum -a 256 -c spacecatalog-dr1.tar.gz.sha256

The digests printed beside the files above are the ones to compare against if you take a single file rather than the archive: they are served from this database, on a different host to the downloads, which is the point of having them in two places.

[

LOAD IT

] PANDAS · ASTROPY · DUCKDB · TOPCAT

Gzipped UTF-8 CSV with a header row, quoted where a field needs it. Nothing here has to be decompressed first — every tool below reads the gzip directly.

import pandas as pd

# low_memory=False so the sparse text columns are typed from the whole
# file rather than chunk by chunk, which is what raises DtypeWarning.
objects = pd.read_csv("spacecatalog-dr1-objects.csv.gz", low_memory=False)
names = pd.read_csv("spacecatalog-dr1-designations.csv.gz")

# Every galaxy with a spectroscopic redshift distance, nearest first.
galaxies = objects[objects.category.eq("galaxy")].dropna(subset=["distance_ly"])
galaxies.nsmallest(20, "distance_ly")[["name", "distance_ly", "distance_method"]]

# The properties column is JSON, one object per row.
import json
props = objects.properties.map(json.loads)

For a table that already knows the sky, read it into astropy and give the two position columns their units:

from astropy.table import Table
import astropy.units as u

t = Table.read("spacecatalog-dr1-objects.csv.gz", format="ascii.csv")
t["ra_deg"].unit = u.deg
t["dec_deg"].unit = u.deg

For SQL over the whole file without loading it into memory, DuckDB reads the gzip and the JSON column in one statement:

SELECT name, distance_ly, properties->>'spectral_type' AS spectral_type
FROM read_csv_auto('spacecatalog-dr1-objects.csv.gz')
WHERE category = 'star' AND distance_ly < 30
ORDER BY distance_ly;

TOPCAT and Aladin open the CSV directly, but they will not know which column is a coordinate until you say so. If you would rather they were told, ask the API for format=votable instead — the same columns arrive carrying their units and their UCDs, and land on the sky without being configured. The trade is the row limit: a VOTable is a slice, this is the catalogue.

[

THE COLUMNS

] 47 IN FIVE FILES

In the order each file writes them. A column marked sometimes empty is empty on at least one row of this release, and one not marked is filled on every row — which is a claim about the data rather than about this page, and a test holds it to the files.

objects.csv.gz

One row per object. The file the other four hang off, and the one to open first.

slug
Permanent identifier, unique in the release and never reused. spacecatalog.org/object/<slug> is the page for it, and every other file here joins on it.
name
The name the object is normally called by — a proper name where it has one, its principal catalogue designation otherwise. Every other identifier is in designations.csv.gz.
category
One of eleven: star, galaxy, exoplanet, asteroid, comet, moon, planet, cluster, nebula, black_hole, other. The coarse split, on which most of the other columns' meaning depends.
object_typeSOMETIMES EMPTY
The finer classification in the words of the upstream that made it — a spectral type and colour for a star, a morphology for a galaxy, an orbit class for a minor planet.
ra_degdegreesSOMETIMES EMPTY
Right ascension, ICRS at epoch J2000.0. Empty for solar-system bodies, whose position is a function of time rather than a property of the row; their orbital elements are in the properties column instead.
dec_degdegreesSOMETIMES EMPTY
Declination, ICRS at epoch J2000.0. Empty wherever ra_deg is.
magmagnitudesSOMETIMES EMPTY
Apparent magnitude in the band named by mag_band. Deep-sky objects and stars carry one; minor planets do not, because theirs changes with the geometry of the night — for those, see abs_mag.
mag_bandSOMETIMES EMPTY
The photometric band mag is measured in: V or B. Never empty where mag is filled — a magnitude without its band is not a measurement.
abs_magmagnitudesSOMETIMES EMPTY
Absolute magnitude, in the band named by abs_mag_band.
abs_mag_bandSOMETIMES EMPTY
V or B for stars and galaxies. H on a minor planet is not the near-infrared band: it is the IAU absolute-magnitude parameter H, the brightness the body would have at one au from both Sun and observer at zero phase angle. Read the band before comparing two rows.
distance_lylight-yearsSOMETIMES EMPTY
Distance from the Sun. Empty where no method in this catalogue could produce one — including the galaxies whose redshift is too small for a Hubble-flow distance to mean anything, which carry none here rather than one that is right by accident.
distance_methodSOMETIMES EMPTY
Which rung of the distance ladder produced distance_ly, named in full, with the paper's ADS bibcode verbatim where the value came from one. Never a bare number: a distance whose provenance is unknown is not usable in a fit.
orbitsSOMETIMES EMPTY
The slug of the body this one orbits, where the catalogue models the pair — a moon's planet, a planet's star. Empty for everything that orbits the galaxy at large.
semi_major_axis_kmkilometresSOMETIMES EMPTY
Semi-major axis of the orbit about the body named in orbits.
periapsis_kmkilometresSOMETIMES EMPTY
Closest approach of that same orbit.
mass_kgkilogramsSOMETIMES EMPTY
Mass, in kilograms rather than in solar or Jupiter masses, so that two rows of different categories can be compared without a conversion factor going missing. The conventional units are also in properties where the upstream published them.
radius_kmkilometresSOMETIMES EMPTY
Radius, of the kind named by radius_kind.
radius_kindSOMETIMES EMPTY
Which radius radius_km is: effective for a photometric fit, mean for a body measured in three dimensions. Empty where the upstream did not say — true of every exoplanet radius here, which are published as a single number without a convention attached.
constellationSOMETIMES EMPTY
The IAU constellation the position falls in, spelled out in full ('Ursa Major'). Empty for the bodies with no fixed position.
discoveredSOMETIMES EMPTY
When it was found, as published — usually a year, sometimes 'Antiquity'. Free text, because that is what the upstreams carry and parsing it into a date would invent precision.
descriptionSOMETIMES EMPTY
A written description, present only on the small set of objects this catalogue writes about itself. Everything else is left to the upstream's own words in object_type.
is_featured
true or false: whether the site gives this object the long editorial treatment. An editorial flag, not a fact about the sky — safe to ignore.
properties
A JSON object with everything that does not fit a column, keyed by category. Always present, sometimes empty. Its keys are documented below.
data_qualitySOMETIMES EMPTY
Non-empty when this catalogue believes a figure on the row cannot be right, saying which and why. Quote it if you quote the number it is about.
source
The upstream this row was built from. Joins to the id column of sources.csv, which gives its licence and the date it was retrieved — the terms of that upstream govern this row.
search_text
The names and types the site's own search matches against, concatenated. Included so a downstream index can reproduce it; it is derived from the other columns and holds nothing new.

designations.csv.gz

Every catalogue identifier that resolves to an object — the table to join on if you arrive with a list of names rather than positions. Joins on slug.

slug
The object in objects.csv.gz this identifier names.
catalog
Which catalogue the designation belongs to: HIP, HD, NGC, IC, PGC, 2MASX, Gliese, Bayer/Flamsteed and some eighty others, plus 'Common name' for the names people actually use.
designation
The identifier itself, spelled the way that catalogue spells it. One object usually carries several rows here.

relations.csv.gz

Object-to-object links the catalogue is confident enough to publish. Every pair appears twice, once from each end, so a join on slug finds all of an object's relations without a second join the other way — and a count of these rows is twice the number of pairs. Joins on slug.

slug
The object this row is written from the point of view of. Its mirror row, with the two slugs swapped, is in the file as well.
related_slug
The object at the other end of the relation.
kind
What the link is. This release publishes double-star pairs; what orbits what is in the orbits column of objects.csv.gz instead, because that one is a property of a single row.
detail
The identifier the relation is recorded under upstream — for a double star, its WDS designation.

sources.csv

The upstream catalogues this release was built from. Not gzipped: it is two kilobytes and it is the file that says what you may do with the rest. Joins on id.

id
What the source column of objects.csv.gz contains.
name
The catalogue's name as its authors publish it.
url
Where that catalogue is published — the page to read before relying on a row it produced.
license
The terms that catalogue publishes under, and therefore the terms of every row naming it. The release mixes several, and some are share-alike.
retrieved_at
When this catalogue was last downloaded for this release — the date of the retrieval, not the date the release was assembled, so the dates here legitimately differ from each other.

source_disagreements.csv

Where two upstreams describe one object differently by more than the tolerance for that quantity, and which value this release kept. Recorded rather than resolved: catalogues disagreeing is the normal condition of astronomy, and which one is right is not a question a merge can answer.

slugs
The two rows that were found to be the same object, separated by a slash. The first is the one that survived into objects.csv.gz.
match
How the two were recognised as one object: by a shared catalogue identifier, or by their names.
matched_on
The identifier or name that matched them, as it was written.
field
Which quantity the two upstreams disagree about — a position, a magnitude, a distance, a radius or an orbital element.
kept_source
The upstream whose value was kept, and which therefore appears in objects.csv.gz.
kept_value
The value that was kept, in the unit that quantity uses in objects.csv.gz.
other_source
The upstream whose value was not kept.
other_value
What that upstream said instead — published here rather than discarded, so the disagreement stays visible.
relative_difference
The size of the disagreement as a fraction of the kept value. Sort by it to find the ones worth a second look; most of these are rounding, a few are not.
[

THE PROPERTIES COLUMN

] 94 KEYS

A column per quantity would be a table of a hundred columns of which any one row fills a dozen — a minor planet has no spectral type and a star has no perihelion. So everything that does not belong to every object is one JSON object per row, and which keys are present is decided by what the object is and by what its upstream published.

The unit is in the name — _km, _deg, _days, _solar — and stated below as well. A key missing from an object was not published for it; it is not a zero.

Motion

How the object is moving, where a survey measured it.

proper_motion_ra_mas_yrmilliarcseconds/year
Proper motion in right ascension, already multiplied by cos(dec) — an angular rate on the sky, not a coordinate rate.
proper_motion_dec_mas_yrmilliarcseconds/year
Proper motion in declination.
radial_velocity_km_skm/s
Line-of-sight velocity, positive away from us.

Stellar parameters

What is known about a star itself. Where these came from a model rather than a measurement, stellar_parameters_method says so, and says what was done to earn the right to publish them.

spectral_type
MK spectral type as classified.
spectral_type_source
Which catalogue classified it, with the paper's bibcode and the quality grade that catalogue attached.
stellar_parameters_method
How the modelled parameters below were derived, and the cut they had to pass to appear at all — plus a warning where the model is being used in a regime it is known to handle poorly.
color_index_bvmagnitudes
B−V colour index.
surface_temperature_kkelvin
Effective temperature.
surface_gravity_log_glog10(cm/s²)
Surface gravity, as the logarithm the literature quotes.
radius_solarsolar radii
Radius.
mass_solarsolar masses
Mass. Also carried by black holes.
luminosity_solarsolar luminosities
Luminosity as published by the source catalogue.
bolometric_luminosity_solarsolar luminosities
Luminosity integrated over all wavelengths, where the model produced one.
age_yearsyears
Estimated age.
rotation_period_daysdays
Rotation period.

Photometry

Magnitudes in bands other than the one in the mag column, kept under their band names rather than folded into one number.

v_magmagnitudes
Johnson V.
b_magmagnitudes
Johnson B.
j_magmagnitudes
2MASS J, 1.25 μm.
h_magmagnitudes
2MASS H, 1.65 μm.
k_magmagnitudes
2MASS Ks, 2.16 μm.

Variability

Stars whose brightness changes, from the General Catalogue of Variable Stars. Period and epoch together are an ephemeris.

variable_designation
The star's GCVS designation.
variability_type
The GCVS type code.
variability_class
That code written out in words.
variable_mag_maxmagnitudes
Brightest magnitude, as sampled by Hipparcos and converted to the visual scale. Approximate, and for a star that spends most of its cycle out of eclipse the satellite may never have caught the bottom of the dip.
variable_mag_minmagnitudes
Faintest magnitude, from the same sampling.
variable_period_daysdays
Period of the variation.
variable_epoch_hjdheliocentric Julian date
The zero point the period counts from: the epoch of minimum light for eclipsing and ellipsoidal variables and for the RV Tauri and RS Canum Venaticorum types, and of maximum light for every other class.

Double and multiple stars

From the Washington Double Star catalogue.

wds_id
The pair's WDS identifier.
companions
A JSON array, one entry per recorded companion: its components, separation in arcseconds, position angle in degrees, magnitude, the year of the measurement, and the discoverer code.

Galaxies and deep-sky objects

Extragalactic quantities, and the angular geometry an imager needs. Two redshifts are carried where both are known, because which frame a redshift is in decides what distance comes out of it.

redshift
Redshift as the upstream published it, heliocentric.
redshift_cmb
The same redshift corrected to the CMB rest frame. This is the one every distance in the release is computed from.
hubble_type
Morphological type on the Hubble sequence.
morphology_source
Which catalogue classified the morphology, with its bibcode and quality grade.
stellar_mass_solarsolar masses
Total stellar mass of the galaxy.
major_axis_arcminarcminutes
Apparent major axis.
minor_axis_arcminarcminutes
Apparent minor axis.
position_angle_degdegrees
Position angle of the major axis, east of north.
surface_brightnessmagnitudes/arcsec²
Mean surface brightness — what decides whether it is visible in a given sky, more than the integrated magnitude does.
ngc_type_code
OpenNGC's own type code for the object.
distance_reference
The identifier this object is listed under in the distance-scale catalogue that distance_method names — what to look it up as when checking the number.

Orbits of solar-system bodies

Osculating elements as published, valid at element_epoch_jd. Positions for these bodies are computed from these rather than stored, which is why ra_deg and dec_deg are empty on their rows.

orbital_period_daysdays
Orbital period.
eccentricity
Orbital eccentricity.
inclination_degdegrees
Inclination to the reference plane.
longitude_ascending_node_degdegrees
Longitude of the ascending node.
argument_of_perihelion_degdegrees
Argument of perihelion.
mean_anomaly_degdegrees
Mean anomaly at the element epoch.
element_epoch_jdJulian date
The epoch these elements are valid at. Propagate from here, not from today.
perihelion_epoch_jdJulian date
Time of perihelion passage.
longitude_perihelion_degdegrees
Longitude of perihelion, for the planets, whose elements are carried in that form.
mean_longitude_degdegrees
Mean longitude at the element epoch.
element_rates
For the planets, the linear rate of change of each element per Julian century — what makes the elements usable over centuries rather than months.
earth_moid_auau
Minimum orbit intersection distance with Earth's orbit.
orbit_class
The dynamical class JPL assigns the orbit: MBA, TNO, Apollo and so on.
rotation_period_hourshours
Rotation period of the body.
albedo
Geometric albedo, as a fraction.
spectral_type_smassii
Taxonomic class in the SMASS II scheme.
first_observed
Date of the earliest observation in the orbit solution.
discovery_date
Date of discovery.
discovery_site
Where it was discovered.

Exoplanets and their hosts

From the NASA Exoplanet Archive. The host_ keys describe the star, repeated on the planet's row so a single row is self-contained; the star has a row of its own too.

host_star
The name of the star this planet orbits.
discovery_method
How it was found: transit, radial velocity, microlensing, imaging.
discovery_facility
Which instrument or survey found it.
host_mass_solarsolar masses
Mass of the host star.
host_radius_solarsolar radii
Radius of the host star.
host_temperature_kkelvin
Effective temperature of the host star.
host_v_magmagnitudes
V magnitude of the host star.
host_spectral_type
Spectral type of the host star.
equilibrium_temperature_kkelvin
Equilibrium temperature of the planet, on the archive's own albedo assumption.
transit_midpoint_bjdbarycentric Julian date
Mid-transit epoch. Published in TDB; the site treats it as UTC, which costs under nine minutes.
periastron_epoch_bjdbarycentric Julian date
Time of periastron passage.
argument_of_periastron_degdegrees
Argument of periastron.
eccentricity_upper_limit
Where only a limit was published rather than a value, this is the limit — not an eccentricity.
eccentricity_lower_limit
The same, from below.
stars_in_system
How many stars the system holds.
planets_in_system
How many planets are known in it.

Planets, moons and black holes

The small set of bodies the catalogue models in three dimensions.

parent_planet
The planet a moon belongs to, by name.
satellite_code
The NAIF identifier the JPL ephemerides use for the body.
ephemeris
Which JPL ephemeris the position is computed from.
name_authority
Who names the body, where two authorities spell it differently.
mean_density_g_cm3g/cm³
Mean density.
mean_temperature_c°C
Mean surface temperature.
moons
Number of known moons.
axial_tilt_degdegrees
Obliquity of the spin axis to the orbital plane.
pole_ra_degdegrees
Right ascension of the IAU north pole of rotation.
pole_dec_degdegrees
Declination of the same pole.
rings
Ring geometry: a tint, and a band list with inner and outer radii in kilometres and an optical depth.
accretion
For a black hole, the accretion regime it is observed in.
disc_inclination_degdegrees
Inclination of its accretion disc to the line of sight.

Cross-identifications and provenance

Where else the object can be looked up, and who found it.

wikidata_id
Wikidata Q-number.
wikipedia_article
English Wikipedia article title.
also_known_as
Other names, as an array — the ones too informal for designations.csv.gz.
discovered_by
The discoverer's name, as published.

Published uncertainties

One key, holding all of them. Doubt is carried in the numbers rather than in prose, and a quantity missing from the object simply has no published uncertainty — which is not the same as having none.

uncertainties
A JSON object keyed by the quantity it is about, each value a [minus, plus] pair in that quantity's own unit. Asymmetric bars are kept asymmetric: averaging them into one number is a decision this catalogue does not make for you. The quantities that appear are listed below.

The quantities that carry one in this release: distance_ly, mass_kg, radius_km, semi_major_axis_km, periapsis_km, orbital_period_days, eccentricity, inclination_deg, longitude_ascending_node_deg, argument_of_perihelion_deg, argument_of_periastron_deg, stellar_mass_solar, host_mass_solar, host_radius_solar, host_temperature_k, mean_density_g_cm3.

Rendering

Not measurements. Present so the site's own pictures can be reproduced.

display_colors
The colours the site draws this object in.
[

WHAT IS NOT IN IT

] AND WHERE IT IS
  • The two survey tiers under the sky map

    Tens of millions of Gaia sources and GLADE+ galaxies are drawn on the map and answered by cone search, but they are not merged, named or cross-identified — they are those surveys, and their own archives publish them in full, in the form their authors intended. What this bundle holds is the tier this catalogue actually built: the objects with names, distances and provenance.

  • Images

    The photographs on object pages belong to the observatories and photographers credited beside them, under their own terms. They are not this catalogue’s to redistribute.

  • Search vectors

    The embeddings behind the search box are a property of one version of one model rather than of the sky, and they are reproducible from the text in these files.

For a slice rather than the whole thing — one constellation, one category, everything inside a cone — the API answers in JSON, CSV and VOTable, and three cone-search services stand beside it.

[

TERMS

] MIXED LICENCES

The data is not under one licence. Every row names its upstream in the source column, that upstream’s terms govern the row, and some of them are share-alike — which reaches anything you derive from the rows they cover. The full list, catalogue by catalogue, is on the releases page, and it travels inside the bundle as well.

Cite the release rather than the site: the site is corrected continuously and a release is not. How to cite it, in plain text and BibTeX. Citing the release does not discharge the upstream attribution — any row you quote names the catalogue behind it.