Skip to content
Public Universe

For developers

Catalogue API

A free, read-only HTTP catalogue of solar-system and exoplanet data, plus a streamable HTTP MCP server. No API key and no account.

Overview

A queryable catalogue of known solar-system objects — planets, moons, dwarf planets, asteroids, comets, TNOs, centaurs, and rings. Sourced from NASA/JPL and the IAU Minor Planet Center. Separate exoplanet and host catalogues use the NASA Exoplanet Archive. For astronomy, science education, sci-fi worldbuilding, and model-building — not astrology.

This reference lists the public GET operations from the live OpenAPI document and caches that document on the server. Calls you run from the forms below are read-only GETs made by this site. Example URLs start with the catalogue base URL.

Base URL
https://api.publicuniverse.net/api/v1
Specification
solar-system-db REST API 0.1.0
MCP
solar-mcp · https://api.publicuniverse.net/mcp

Catalogue base URL

https://api.publicuniverse.net/api/v1

A worked example

Fuzzy text search across names/designations/discoverers

Endpoint reference

Paths come from the cached OpenAPI document. Example snippets use a limit of at most 3 when the operation has a limit parameter. Interactive calls use the same cap so a response fits on the page; a direct request can use the maximum printed on the operation.

catalog

GET Filter solar-system objects https://api.publicuniverse.net/api/v1/objects?limit=3

Filter the catalogue. For walks over all 1.4 M bodies use `after` (keyset pagination) rather than `offset`; `next_after` is null on the last page.

Parameters

type query · string
object_type filter (planet/moon/asteroid/comet/...)
parent query · string
parent body name/id (e.g. 'Jupiter')
min_radius_km query · number
max_radius_km query · number
max_eccentricity query · number
min_semi_major_axis_au query · number
max_semi_major_axis_au query · number
neo query · boolean
pha query · boolean
named_only query · boolean
orbit_class query · string
SBDB orbit class code, e.g. MBA, APO, TNO, JFc
max_moid_au query · number
Earth MOID at most this many AU
minimum 0
min_diameter_km query · number
minimum 0
max_condition_code query · integer
orbit uncertainty code 0 (best) … 9
minimum 0, maximum 9
discovered_after query · string
ISO date
after query · string
keyset pagination: last id of the previous page
limit query · integer
default 50, minimum 1, maximum 1000
offset query · integer
ignored when `after` is given
default 0, minimum 0

Request

curl example for Filter solar-system objects

curl -sS 'https://api.publicuniverse.net/api/v1/objects?limit=3'

JavaScript example for Filter solar-system objects

const response = await fetch("https://api.publicuniverse.net/api/v1/objects?limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Filter solar-system objects

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/objects?limit=3") as response:
    data = json.load(response)
print(data)

Example response

Example response for Filter solar-system objects

{
    "results": [
        {
            "id": "comet-c-2005-j2-catalina",
            "name": "Catalina",
            "designation": "C/2005 J2 (Catalina)",
            "object_type": "comet",
            "parent_id": "sun",
            "discoverer": null,
            "discovery_date": null,
            "wikipedia_url": null,
            "radius_km": null,
            "mass_kg": null,
            "semi_major_axis_au": -433338614767.9136,
            "eccentricity": 1.000000000009894,
            "inclination_deg": 150.803020510002,
            "orbital_period_days": null,
            "perihelion_au": 4.287489327002505,
            "aphelion_au": null,
            "orbit_class_code": "HYP",
            "moid_au": 3.30202,
            "condition_code": null,
            "geometric_albedo": null,
            "absolute_magnitude_h": 9
        },
        {
            "id": "comet-c-1988-c1-maury-phinney",
            "name": "Maury-Phinney",
            "designation": "C/1988 C1 (Maury-Phinney)",
            "object_type": "comet",
            "parent_id": "sun",
            "discoverer": null,
            "discovery_date": null,
            "wikipedia_url": null,
            "radius_km": null,
            "mass_kg": null,
            "semi_major_axis_au": -3647207.47036457,
            "eccentricity": 1.00000052935711,
            "inclination_deg": 93.15868283813296,
            "orbital_period_days": null,
            "perihelion_au": 1.930675205805696,
            "aphelion_au": null,
            "orbit_class_code": "HYP",
            "moid_au": 0.959834,
            "condition_code": null,
            "geometric_albedo": null,
            "absolute_magnitude_h": null
        },
        {
            "id": "comet-c-2000-o1-koehn",
            "name": "Koehn",
            "designation": "C/2000 O1 (Koehn)",
            "object_type": "comet",
            "parent_id": "sun",
            "discoverer": null,
            "discovery_date": null,
            "wikipedia_url": null,
            "radius_km": null,
            "mass_kg": null,
            "semi_major_axis_au": -2729545.221721413,
            "eccentricity": 1.000002169511477,
            "inclination_deg": 148.104188645481,
            "orbital_period_days": null,
            "perihelion_au": 5.921779685276794,
            "aphelion_au": null,
            "orbit_class_code": "HYP",
            "moid_au": 5.04238,
            "condition_code": null,
            "geometric_albedo": null,
            "absolute_magnitude_h": 5.1
        }
    ],
    "limit": 3,
    "offset": 0,
    "next_after": null
}

Try it

object_type filter (planet/moon/asteroid/comet/...)

parent body name/id (e.g. 'Jupiter')

SBDB orbit class code, e.g. MBA, APO, TNO, JFc

Earth MOID at most this many AU

orbit uncertainty code 0 (best) … 9

ISO date

keyset pagination: last id of the previous page

ignored when `after` is given

Calls from this form send at most 3 for limit. A direct request can use up to 1000.

GET IAU meteor showers https://api.publicuniverse.net/api/v1/meteor-showers?limit=3

Parameters

established_only query · boolean
Keep only MDC status codes 1 (single established shower, group) or 6 (member of the established group)
default false
active_on query · string
ISO date (YYYY-MM-DD); filters to showers active on this date
limit query · integer
default 500, minimum 1, maximum 1000

Request

curl example for IAU meteor showers

curl -sS 'https://api.publicuniverse.net/api/v1/meteor-showers?limit=3'

JavaScript example for IAU meteor showers

const response = await fetch("https://api.publicuniverse.net/api/v1/meteor-showers?limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for IAU meteor showers

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/meteor-showers?limit=3") as response:
    data = json.load(response)
print(data)

Example response

Example response for IAU meteor showers

{
    "items": [
        {
            "iau_no": 1,
            "ad_no": 0,
            "code": "CAP",
            "name": "alpha Capricornids",
            "status_code": 1,
            "status_label": "single established shower, group",
            "activity": "annual",
            "solar_longitude_deg": 128.9,
            "ra_deg": 306.6,
            "dec_deg": -8.2,
            "dra_deg_per_day": 0.54,
            "ddec_deg_per_day": 0.26,
            "vg_km_s": 22.2,
            "a_au": 2.618,
            "q_au": 0.602,
            "e": null,
            "peri_deg": 266.67,
            "node_deg": 128.9,
            "incl_deg": 7.68,
            "n_members": 36,
            "shower_group": "00000",
            "parent_body": "169P/NEAT (= 2002 EX12)",
            "parent_object_id": "comet-169p-neat",
            "technique": null,
            "reference": "1) <A href='http://adsabs.harvard.edu/abs/2006mspc.book.....J' target=_blank>Jenniskens, 2006</A>",
            "submitted_on": "SD",
            "source": "IAU Meteor Data Center (Jenniskens et al. 2020; Hajdukova & Rudawska)"
        },
        {
            "iau_no": 1,
            "ad_no": 1,
            "code": "CAP",
            "name": "alpha Capricornids",
            "status_code": 1,
            "status_label": "single established shower, group",
            "activity": "annual",
            "solar_longitude_deg": 122.3,
            "ra_deg": 306.7,
            "dec_deg": -9.3,
            "dra_deg_per_day": 0.91,
            "ddec_deg_per_day": 0.25,
            "vg_km_s": 23.4,
            "a_au": null,
            "q_au": 0.55,
            "e": 0.768,
            "peri_deg": 273.3,
            "node_deg": 122.3,
            "incl_deg": 7.7,
            "n_members": 269,
            "shower_group": "00000",
            "parent_body": "169P/NEAT (= 2002 EX12)",
            "parent_object_id": "comet-169p-neat",
            "technique": "R",
            "reference": "2) <A href='http://adsabs.harvard.edu/abs/2002dsso.conf...48G' target=_blank>Galligan and Baggaley, 2002</A>",
            "submitted_on": "SD",
            "source": "IAU Meteor Data Center (Jenniskens et al. 2020; Hajdukova & Rudawska)"
        },
        {
            "iau_no": 1,
            "ad_no": 2,
            "code": "CAP",
            "name": "alpha Capricornids",
            "status_code": 1,
            "status_label": "single established shower, group",
            "activity": "annual",
            "solar_longitude_deg": 123.8,
            "ra_deg": 303.4,
            "dec_deg": -10.6,
            "dra_deg_per_day": 0.75,
            "ddec_deg_per_day": 0.28,
            "vg_km_s": 22.2,
            "a_au": 2.54,
            "q_au": 0.594,
            "e": null,
            "peri_deg": 267.6,
            "node_deg": 123.8,
            "incl_deg": 7.2,
            "n_members": null,
            "shower_group": "00000",
            "parent_body": "169P/NEAT (= 2002 EX12)",
            "parent_object_id": "comet-169p-neat",
            "technique": "P",
            "reference": "3) <A href='http://adsabs.harvard.edu/abs/2001ESASP.495...55H' target=_blank>Hasegawa, 2001</A>",
            "submitted_on": "SD",
            "source": "IAU Meteor Data Center (Jenniskens et al. 2020; Hajdukova & Rudawska)"
        }
    ],
    "count": 3
}

Try it

Keep only MDC status codes 1 (single established shower, group) or 6 (member of the established group)

ISO date (YYYY-MM-DD); filters to showers active on this date

Calls from this form send at most 3 for limit. A direct request can use up to 1000.

GET Get full record for one object https://api.publicuniverse.net/api/v1/objects/planet-saturn

Parameters

name_or_designation path · string · required

Request

curl example for Get full record for one object

curl -sS 'https://api.publicuniverse.net/api/v1/objects/planet-saturn'

JavaScript example for Get full record for one object

const response = await fetch("https://api.publicuniverse.net/api/v1/objects/planet-saturn");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Get full record for one object

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/objects/planet-saturn") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for Get full record for one object

{
    "id": "planet-saturn",
    "name": "Saturn",
    "designation": null,
    "object_type": "planet",
    "parent_id": "sun",
    "discoverer": null,
    "discovery_date": null,
    "wikipedia_url": "https://en.wikipedia.org/wiki/Saturn",
    "notes": null,
    "created_at": "2026-10-24T03:03:46Z",
    "updated_at": "2026-10-24T03:03:46Z",
    "orbital": {
        "object_id": "planet-saturn",
        "epoch": "J2000",
        "epoch_jd": 2451545,
        "frame": "J2000",
        "centre": "sun",
        "semi_major_axis_au": 9.53667594,
        "eccentricity": 0.05386179,
        "inclination_deg": 2.48599187,
        "longitude_ascending_node_deg": 113.66242448,
        "argument_periapsis_deg": 339.392,
        "mean_anomaly_deg": 317.02,
        "orbital_period_days": 10759.22,
        "perihelion_au": 9.04108,
        "aphelion_au": 10.1238,
        "mean_motion_deg_per_day": null,
        "perihelion_time_jd": null,
        "moid_au": null,
        "moid_jupiter_au": null,
        "tisserand_jupiter": null,
        "condition_code": null,
        "data_arc_days": null,
        "first_obs": null,
        "last_obs": null,
        "n_obs_used": null,
        "n_delay_obs_used": null,
        "n_doppler_obs_used": null,
        "rms_arcsec": null,
        "solution_date": null,
        "orbit_id": null,
        "producer": null,
        "orbit_source": null,
        "equinox": null,
        "two_body": null,
        "pe_used": null,
        "sb_used": null,
        "orbit_class_code": null,
        "orbit_class_name": null,
        "sigma_e": null,
        "sigma_a": null,
        "sigma_q": null,
        "sigma_i": null,
        "sigma_om": null,
        "sigma_w": null,
        "sigma_ma": null,
        "sigma_tp": null,
        "sigma_per": null,
        "sigma_n": null,
        "sigma_ad": null,
        "updated_at": "2026-10-24T03:03:46Z"
    },
    "physical": {
        "object_id": "planet-saturn",
        "radius_km": 58232,
        "equatorial_radius_km": 60268,
        "polar_radius_km": 54364,
        "mass_kg": 5.6832000000000005e+26,
        "density_g_cm3": 0.687,
        "rotation_period_hours": 10.656,
        "axial_tilt_deg": 26.73,
        "surface_gravity_m_s2": 11.19,
        "escape_velocity_km_s": 35.5,
        "gm_km3_s2": 37931000,
        "slope_g": null,
        "extent_km": null,
        "pole_ra_dec": null,
        "diameter_sigma_km": null,
        "volume_km3": 827130000000000,
        "ellipticity": 0.09796,
        "moment_of_inertia": 0.21,
        "j2": null,
        "magnetic_field": null,
        "length_of_day_hours": 10.656,
        "synodic_period_days": 378.09,
        "mean_orbital_velocity_km_s": 9.67,
        "min_orbital_velocity_km_s": 9.14,
        "max_orbital_velocity_km_s": 10.14,
        "tropical_period_days": 10746.94,
        "mean_temperature_k": null,
        "black_body_temperature_k": 81,
        "solar_irradiance_w_m2": 14.82,
        "updated_at": "2026-10-24T03:03:46Z"
    },
    "visual": {
        "object_id": "planet-saturn",
        "geometric_albedo": 0.499,
        "bond_albedo": 0.342,
        "absolute_magnitude_h": null,
        "colour_b_v": null,
        "spectral_type": null,
        "dominant_colour_hex": "#EAD6A0",
        "colour_u_b": null,
        "colour_i_r": null,
        "spectral_type_tholen": null,
        "magnitude_v10": -8.91,
        "comet_m1": null,
        "comet_k1": null,
        "comet_m2": null,
        "comet_k2": null,
        "nongra

Try it

GET List moons of a planet or dwarf planet https://api.publicuniverse.net/api/v1/planets/Saturn/moons

Parameters

name path · string · required

Request

curl example for List moons of a planet or dwarf planet

curl -sS 'https://api.publicuniverse.net/api/v1/planets/Saturn/moons'

JavaScript example for List moons of a planet or dwarf planet

const response = await fetch("https://api.publicuniverse.net/api/v1/planets/Saturn/moons");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for List moons of a planet or dwarf planet

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/planets/Saturn/moons") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for List moons of a planet or dwarf planet

{
    "results": [
        {
            "id": "moon-s-2009-s-2",
            "name": "S/2009 S 2",
            "designation": "S/2009 S 2",
            "discoverer": null,
            "discovery_date": null,
            "radius_km": null,
            "mass_kg": null,
            "density_g_cm3": null,
            "geometric_albedo": null,
            "semi_major_axis_au": 0.0007825044531198666,
            "orbital_period_days": 0.473026,
            "eccentricity": 0,
            "inclination_deg": 0
        },
        {
            "id": "moon-pan",
            "name": "Pan",
            "designation": null,
            "discoverer": "Mark R. Showalter",
            "discovery_date": "1990",
            "radius_km": 14,
            "mass_kg": 4195196500007491,
            "density_g_cm3": 0.365,
            "geometric_albedo": null,
            "semi_major_axis_au": 0.0008930608395350644,
            "orbital_period_days": 0.575051,
            "eccentricity": 0,
            "inclination_deg": 0
        },
        {
            "id": "moon-daphnis",
            "name": "Daphnis",
            "designation": null,
            "discoverer": "Cassini Imaging Team",
            "discovery_date": "2005",
            "radius_km": null,
            "mass_kg": null,
            "density_g_cm3": null,
            "geometric_albedo": null,
            "semi_major_axis_au": 0.0009124461421896429,
            "orbital_period_days": 0.59408,
            "eccentricity": 0,
            "inclination_deg": 0
        },
        {
            "id": "moon-atlas",
            "name": "Atlas",
            "designation": null,
            "discoverer": "Richard Terrile",
            "discovery_date": "1980",
            "radius_km": 15.1,
            "mass_kg": 5543652517867042,
            "density_g_cm3": 0.385,
            "geometric_albedo": null,
            "semi_major_axis_au": 0.000920467646736365,
            "orbital_period_days": 0.604602,
            "eccentricity": 0.001,
            "inclination_deg": 0
        },
        {
            "id": "moon-prometheus",
            "name": "Prometheus",
            "designation": null,
            "discoverer": "Voyager Imaging Team",
            "discovery_date": "1980",
            "radius_km": 43.1,
            "mass_kg": 1.6046626612528656e+17,
            "density_g_cm3": 0.4784,
            "geometric_albedo": null,
            "semi_major_axis_au": 0.0009318314448442214,
            "orbital_period_days": 0.615878,
            "eccentricity": 0.002,
            "inclination_deg": 0
        },
        {
            "id": "moon-pandora",
            "name": "Pandora",
            "designation": null,
            "discoverer": "Voyager Imaging Team",
            "discovery_date": "1980",
            "radius_km": 40.6,
            "mass_kg": 1.3874114139310488e+17,
            "density_g_cm3": 0.4948,
            "geometric_albedo": null,
            "semi_major_axis_au": 0.0009472059952254389,
            "orbital_period_days": 0.631369,
            "eccentricity": 0.004,
            "inclination_deg": 0
        },
        {
            "id": "moon-epimetheus",
            "name": "Epimetheus",
            "designation": null,
            "discoverer": "Richard Walker",
            "discovery_date": "1980",
            "radius_km": 58.2,
            "mass_kg": 5.2649716075094016e+17,
            "density_g_cm3": 0.6375,
            "geometric_albedo": null,
            "semi_major_axis_au": 0.001012

Try it

GET List rings of a planet or dwarf planet https://api.publicuniverse.net/api/v1/planets/Saturn/rings

Parameters

name path · string · required

Request

curl example for List rings of a planet or dwarf planet

curl -sS 'https://api.publicuniverse.net/api/v1/planets/Saturn/rings'

JavaScript example for List rings of a planet or dwarf planet

const response = await fetch("https://api.publicuniverse.net/api/v1/planets/Saturn/rings");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for List rings of a planet or dwarf planet

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/planets/Saturn/rings") as response:
    data = json.load(response)
print(data)

Example response

Example response for List rings of a planet or dwarf planet

{
    "results": [
        {
            "id": 5,
            "name": "D Ring",
            "inner_radius_km": 66900,
            "outer_radius_km": 74510,
            "width_km": null,
            "thickness_km": null,
            "notes": null
        },
        {
            "id": 6,
            "name": "C Ring",
            "inner_radius_km": 74658,
            "outer_radius_km": 92000,
            "width_km": null,
            "thickness_km": null,
            "notes": null
        },
        {
            "id": 7,
            "name": "B Ring",
            "inner_radius_km": 92000,
            "outer_radius_km": 117580,
            "width_km": null,
            "thickness_km": null,
            "notes": null
        },
        {
            "id": 8,
            "name": "Cassini Division",
            "inner_radius_km": 117580,
            "outer_radius_km": 122170,
            "width_km": null,
            "thickness_km": null,
            "notes": null
        },
        {
            "id": 9,
            "name": "A Ring",
            "inner_radius_km": 122170,
            "outer_radius_km": 136775,
            "width_km": null,
            "thickness_km": null,
            "notes": null
        },
        {
            "id": 10,
            "name": "F Ring",
            "inner_radius_km": 140224,
            "outer_radius_km": 140324,
            "width_km": null,
            "thickness_km": null,
            "notes": null
        },
        {
            "id": 11,
            "name": "G Ring",
            "inner_radius_km": 166000,
            "outer_radius_km": 175000,
            "width_km": null,
            "thickness_km": null,
            "notes": null
        },
        {
            "id": 12,
            "name": "E Ring",
            "inner_radius_km": 180000,
            "outer_radius_km": 480000,
            "width_km": null,
            "thickness_km": null,
            "notes": null
        },
        {
            "id": 13,
            "name": "Phoebe Ring",
            "inner_radius_km": 7600000,
            "outer_radius_km": 16000000,
            "width_km": null,
            "thickness_km": null,
            "notes": null
        }
    ]
}

Try it

GET IAU dwarf planets (+ candidates if requested) https://api.publicuniverse.net/api/v1/dwarf-planets

Parameters

include_candidates query · boolean
default false

Request

curl example for IAU dwarf planets (+ candidates if requested)

curl -sS 'https://api.publicuniverse.net/api/v1/dwarf-planets'

JavaScript example for IAU dwarf planets (+ candidates if requested)

const response = await fetch("https://api.publicuniverse.net/api/v1/dwarf-planets");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for IAU dwarf planets (+ candidates if requested)

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/dwarf-planets") as response:
    data = json.load(response)
print(data)

Example response

Example response for IAU dwarf planets (+ candidates if requested)

{
    "results": [
        {
            "id": "dwarf-ceres",
            "name": "Ceres",
            "designation": "(1) Ceres",
            "object_type": "dwarf_planet",
            "radius_km": 469.73,
            "mass_kg": 9.3835e+20,
            "semi_major_axis_au": 2.765552595034094,
            "eccentricity": 0.07969229514816586,
            "orbital_period_days": 1679.853119758983
        },
        {
            "id": "dwarf-pluto",
            "name": "Pluto",
            "designation": "(134340) Pluto",
            "object_type": "dwarf_planet",
            "radius_km": 1188,
            "mass_kg": 1.303e+22,
            "semi_major_axis_au": 39.58862938517124,
            "eccentricity": 0.2518378778576892,
            "orbital_period_days": 90981.71647718345
        },
        {
            "id": "dwarf-haumea",
            "name": "Haumea",
            "designation": "(136108) Haumea",
            "object_type": "dwarf_planet",
            "radius_km": 780,
            "mass_kg": 4.006e+21,
            "semi_major_axis_au": 43.06029023650952,
            "eccentricity": 0.1944430148898797,
            "orbital_period_days": 103208.1173403618
        },
        {
            "id": "dwarf-makemake",
            "name": "Makemake",
            "designation": "(136472) Makemake",
            "object_type": "dwarf_planet",
            "radius_km": 715,
            "mass_kg": 3.1e+21,
            "semi_major_axis_au": 45.57093317300052,
            "eccentricity": 0.1588889953992523,
            "orbital_period_days": 112364.8068762869
        },
        {
            "id": "dwarf-eris",
            "name": "Eris",
            "designation": "(136199) Eris",
            "object_type": "dwarf_planet",
            "radius_km": 1163,
            "mass_kg": 1.6466e+22,
            "semi_major_axis_au": 67.93394687853566,
            "eccentricity": 0.4382385347971672,
            "orbital_period_days": 204516.6629430732
        }
    ]
}

Try it

GET Near-Earth Objects https://api.publicuniverse.net/api/v1/neos?limit=3

Parameters

min_diameter_km query · number
max_diameter_km query · number
limit query · integer
default 200, minimum 1, maximum 1000

Request

curl example for Near-Earth Objects

curl -sS 'https://api.publicuniverse.net/api/v1/neos?limit=3'

JavaScript example for Near-Earth Objects

const response = await fetch("https://api.publicuniverse.net/api/v1/neos?limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Near-Earth Objects

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/neos?limit=3") as response:
    data = json.load(response)
print(data)

Example response

Example response for Near-Earth Objects

{
    "results": [
        {
            "id": "ast-54661108",
            "name": "2010 AL153",
            "designation": "(2010 AL153)",
            "semi_major_axis_au": 1.0336143,
            "perihelion_au": 1.0054947,
            "eccentricity": 0.0272051,
            "inclination_deg": 13.52858,
            "radius_km": null,
            "absolute_magnitude_h": null,
            "is_pha": 0
        },
        {
            "id": "ast-54659689",
            "name": "2010 BH74",
            "designation": "(2010 BH74)",
            "semi_major_axis_au": 0.9454358,
            "perihelion_au": 0.7814739,
            "eccentricity": 0.1734247,
            "inclination_deg": 5.35498,
            "radius_km": null,
            "absolute_magnitude_h": null,
            "is_pha": 0
        },
        {
            "id": "ast-54661437",
            "name": "2010 CS262",
            "designation": "(2010 CS262)",
            "semi_major_axis_au": 0.8498681,
            "perihelion_au": 0.6837273,
            "eccentricity": 0.1954901,
            "inclination_deg": 7.88854,
            "radius_km": null,
            "absolute_magnitude_h": null,
            "is_pha": 0
        }
    ]
}

Try it

Calls from this form send at most 3 for limit. A direct request can use up to 1000.

GET Numbered periodic comets https://api.publicuniverse.net/api/v1/comets/periodic?limit=3

Parameters

limit query · integer
default 500, minimum 1, maximum 2000

Request

curl example for Numbered periodic comets

curl -sS 'https://api.publicuniverse.net/api/v1/comets/periodic?limit=3'

JavaScript example for Numbered periodic comets

const response = await fetch("https://api.publicuniverse.net/api/v1/comets/periodic?limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Numbered periodic comets

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/comets/periodic?limit=3") as response:
    data = json.load(response)
print(data)

Example response

Example response for Numbered periodic comets

{
    "results": [
        {
            "id": "comet-c-2020-p4-b",
            "name": "C/2020 P4-B",
            "designation": "C/2020 P4-B",
            "discoverer": null,
            "discovery_date": null,
            "semi_major_axis_au": 1.020070950980331,
            "eccentricity": 0.9092091821956565,
            "inclination_deg": 28.1473125338304,
            "orbital_period_days": 376.3084730293948,
            "perihelion_au": 0.09261307585795861,
            "aphelion_au": 1.947528826102702
        },
        {
            "id": "comet-c-2020-p4-c",
            "name": "C/2020 P4-C",
            "designation": "C/2020 P4-C",
            "discoverer": null,
            "discovery_date": null,
            "semi_major_axis_au": 1.39054041749636,
            "eccentricity": 0.9394205210769577,
            "inclination_deg": 37.5593616220339,
            "orbital_period_days": 598.9269448141177,
            "perihelion_au": 0.08423821391335916,
            "aphelion_au": 2.696842621079361
        },
        {
            "id": "comet-311p-panstarrs",
            "name": "PANSTARRS",
            "designation": "311P/PANSTARRS",
            "discoverer": null,
            "discovery_date": null,
            "semi_major_axis_au": 2.188584204499729,
            "eccentricity": 0.1153701977575953,
            "inclination_deg": 4.96993346244621,
            "orbital_period_days": 1182.614821458139,
            "perihelion_au": 1.936086812017446,
            "aphelion_au": 2.441081596982012
        }
    ]
}

Try it

Calls from this form send at most 3 for limit. A direct request can use up to 2000.

GET Trans-Neptunian objects + centaurs https://api.publicuniverse.net/api/v1/tnos?limit=3

Parameters

limit query · integer
default 500, minimum 1, maximum 2000

Request

curl example for Trans-Neptunian objects + centaurs

curl -sS 'https://api.publicuniverse.net/api/v1/tnos?limit=3'

JavaScript example for Trans-Neptunian objects + centaurs

const response = await fetch("https://api.publicuniverse.net/api/v1/tnos?limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Trans-Neptunian objects + centaurs

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/tnos?limit=3") as response:
    data = json.load(response)
print(data)

Example response

Example response for Trans-Neptunian objects + centaurs

{
    "results": [
        {
            "id": "ast-50713537",
            "name": "2015 BX306",
            "designation": "(2015 BX306)",
            "object_type": "centaur",
            "semi_major_axis_au": 5.501079307643905,
            "eccentricity": 0.5141655101489397,
            "inclination_deg": 11.33318697750316,
            "orbital_period_days": 4712.705334679225,
            "absolute_magnitude_h": 17
        },
        {
            "id": "ast-54508193",
            "name": "2015 HQ409",
            "designation": "(2015 HQ409)",
            "object_type": "centaur",
            "semi_major_axis_au": 5.503186767696715,
            "eccentricity": 0.1158115870019567,
            "inclination_deg": 5.995076234057173,
            "orbital_period_days": 4715.413745748458,
            "absolute_magnitude_h": 16.48
        },
        {
            "id": "ast-54534192",
            "name": "2015 HK471",
            "designation": "(2015 HK471)",
            "object_type": "centaur",
            "semi_major_axis_au": 5.505493476375868,
            "eccentricity": 0.1319800399609929,
            "inclination_deg": 6.718810797817242,
            "orbital_period_days": 4718.378816533536,
            "absolute_magnitude_h": 16.96
        }
    ]
}

Try it

Calls from this form send at most 3 for limit. A direct request can use up to 2000.

GET Fuzzy text search across names/designations/discoverers https://api.publicuniverse.net/api/v1/search?q=Halley&limit=3

Parameters

q query · string · required
Search query
limit query · integer
default 20, minimum 1, maximum 100

Request

curl example for Fuzzy text search across names/designations/discoverers

curl -sS 'https://api.publicuniverse.net/api/v1/search?q=Halley&limit=3'

JavaScript example for Fuzzy text search across names/designations/discoverers

const response = await fetch("https://api.publicuniverse.net/api/v1/search?q=Halley&limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Fuzzy text search across names/designations/discoverers

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/search?q=Halley&limit=3") as response:
    data = json.load(response)
print(data)

Example response

Example response for Fuzzy text search across names/designations/discoverers

{
    "query": "Halley",
    "results": [
        {
            "id": "comet-1p-halley",
            "name": "Halley",
            "designation": "1P/Halley",
            "object_type": "comet",
            "parent_id": "sun",
            "discoverer": null,
            "score": -7.134338082894388
        },
        {
            "id": "ast-20002688-halley",
            "name": "Halley",
            "designation": "2688 Halley (1982 HG1)",
            "object_type": "asteroid",
            "parent_id": "sun",
            "discoverer": "Bowell, E.",
            "score": -18.890210400634864
        }
    ]
}

Try it

Search query

Calls from this form send at most 3 for limit. A direct request can use up to 100.

detail

GET Close approaches of one body to the planets / Moon https://api.publicuniverse.net/api/v1/objects/planet-saturn/close-approaches?limit=3

Parameters

name_or_designation path · string · required
from query · string
to query · string
body query · string
limit query · integer
default 100, minimum 1, maximum 1000

Request

curl example for Close approaches of one body to the planets / Moon

curl -sS 'https://api.publicuniverse.net/api/v1/objects/planet-saturn/close-approaches?limit=3'

JavaScript example for Close approaches of one body to the planets / Moon

const response = await fetch("https://api.publicuniverse.net/api/v1/objects/planet-saturn/close-approaches?limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Close approaches of one body to the planets / Moon

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/objects/planet-saturn/close-approaches?limit=3") as response:
    data = json.load(response)
print(data)

Try it

Calls from this form send at most 3 for limit. A direct request can use up to 1000.

GET Discovery circumstances https://api.publicuniverse.net/api/v1/objects/planet-saturn/discovery

Parameters

name_or_designation path · string · required

Request

curl example for Discovery circumstances

curl -sS 'https://api.publicuniverse.net/api/v1/objects/planet-saturn/discovery'

JavaScript example for Discovery circumstances

const response = await fetch("https://api.publicuniverse.net/api/v1/objects/planet-saturn/discovery");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Discovery circumstances

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/objects/planet-saturn/discovery") as response:
    data = json.load(response)
print(data)

Example response

Example response for Discovery circumstances

[]

Try it

GET Every number, name, provisional and alternate designation https://api.publicuniverse.net/api/v1/objects/planet-saturn/designations

Parameters

name_or_designation path · string · required

Request

curl example for Every number, name, provisional and alternate designation

curl -sS 'https://api.publicuniverse.net/api/v1/objects/planet-saturn/designations'

JavaScript example for Every number, name, provisional and alternate designation

const response = await fetch("https://api.publicuniverse.net/api/v1/objects/planet-saturn/designations");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Every number, name, provisional and alternate designation

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/objects/planet-saturn/designations") as response:
    data = json.load(response)
print(data)

Example response

Example response for Every number, name, provisional and alternate designation

{
    "results": []
}

Try it

GET Atmosphere (NASA fact sheet) https://api.publicuniverse.net/api/v1/planets/Saturn/atmosphere

Parameters

name path · string · required

Request

curl example for Atmosphere (NASA fact sheet)

curl -sS 'https://api.publicuniverse.net/api/v1/planets/Saturn/atmosphere'

JavaScript example for Atmosphere (NASA fact sheet)

const response = await fetch("https://api.publicuniverse.net/api/v1/planets/Saturn/atmosphere");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Atmosphere (NASA fact sheet)

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/planets/Saturn/atmosphere") as response:
    data = json.load(response)
print(data)

Example response

Example response for Atmosphere (NASA fact sheet)

{
    "object_id": "planet-saturn",
    "surface_pressure_bar": 1000,
    "pressure_note": ">>1000 bars",
    "temperature_k": 134,
    "temperature_note": "134 K (-139 C)",
    "density_kg_m3": 0.19,
    "scale_height_km": 59.5,
    "mean_molecular_weight": 2.07,
    "wind_note": "Up to 400 m/s (<30 degrees latitude) Up to 150 m/s (>30 degrees latitude)",
    "source": "NASA Planetary Fact Sheet",
    "composition": [
        {
            "species": "Molecular hydrogen (H2)",
            "fraction": 96.3,
            "unit": "%",
            "uncertainty": "2.4%"
        },
        {
            "species": "Helium (He)",
            "fraction": 3.25,
            "unit": "%",
            "uncertainty": "2.4%"
        },
        {
            "species": "Methane (CH4)",
            "fraction": 4500,
            "unit": "ppm",
            "uncertainty": "2000"
        },
        {
            "species": "Ammonia (NH3)",
            "fraction": 125,
            "unit": "ppm",
            "uncertainty": "75"
        },
        {
            "species": "Hydrogen Deuteride (HD)",
            "fraction": 110,
            "unit": "ppm",
            "uncertainty": "58"
        },
        {
            "species": "Ethane (C2H6)",
            "fraction": 7,
            "unit": "ppm",
            "uncertainty": "1.5"
        }
    ]
}

Try it

GET All close approaches to a body in a date window, nearest first https://api.publicuniverse.net/api/v1/close-approaches?from=2026-10-01&to=2026-10-31&limit=3

Parameters

from query · string · required
ISO date
to query · string · required
ISO date
body query · string
default Earth
max_dist_au query · number
default 0.05, maximum 1
limit query · integer
default 200, minimum 1, maximum 1000

Request

curl example for All close approaches to a body in a date window, nearest first

curl -sS 'https://api.publicuniverse.net/api/v1/close-approaches?from=2026-10-01&to=2026-10-31&limit=3'

JavaScript example for All close approaches to a body in a date window, nearest first

const response = await fetch("https://api.publicuniverse.net/api/v1/close-approaches?from=2026-10-01&to=2026-10-31&limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for All close approaches to a body in a date window, nearest first

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/close-approaches?from=2026-10-01&to=2026-10-31&limit=3") as response:
    data = json.load(response)
print(data)

Try it

ISO date

ISO date

Calls from this form send at most 3 for limit. A direct request can use up to 1000.

GET One IAU meteor shower by code or name https://api.publicuniverse.net/api/v1/meteor-showers/GEM

Parameters

code path · string · required

Request

curl example for One IAU meteor shower by code or name

curl -sS 'https://api.publicuniverse.net/api/v1/meteor-showers/GEM'

JavaScript example for One IAU meteor shower by code or name

const response = await fetch("https://api.publicuniverse.net/api/v1/meteor-showers/GEM");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for One IAU meteor shower by code or name

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/meteor-showers/GEM") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for One IAU meteor shower by code or name

{
    "iau_no": 4,
    "code": "GEM",
    "name": "Geminids",
    "status_label": "single established shower, group",
    "parameter_sets": [
        {
            "iau_no": 4,
            "ad_no": 0,
            "code": "GEM",
            "name": "Geminids",
            "status_code": 1,
            "status_label": "single established shower, group",
            "activity": "annual",
            "solar_longitude_deg": 262.1,
            "ra_deg": 113.2,
            "dec_deg": 32.5,
            "dra_deg_per_day": 1.02,
            "ddec_deg_per_day": -0.15,
            "vg_km_s": 34.58,
            "a_au": 1.372,
            "q_au": 0.141,
            "e": null,
            "peri_deg": 324.42,
            "node_deg": 261.49,
            "incl_deg": 24.02,
            "n_members": 221,
            "shower_group": "00000",
            "parent_body": "3200 Phaethon (=1983 TB)",
            "parent_object_id": "ast-20003200-phaethon",
            "technique": "P",
            "reference": "1) Dutch Meteor Society 2001",
            "submitted_on": "SD",
            "source": "IAU Meteor Data Center (Jenniskens et al. 2020; Hajdukova & Rudawska)"
        },
        {
            "iau_no": 4,
            "ad_no": 1,
            "code": "GEM",
            "name": "Geminids",
            "status_code": 1,
            "status_label": "single established shower, group",
            "activity": "annual",
            "solar_longitude_deg": 261.6,
            "ra_deg": 112.9,
            "dec_deg": 32.3,
            "dra_deg_per_day": null,
            "ddec_deg_per_day": null,
            "vg_km_s": 34.6,
            "a_au": null,
            "q_au": 0.141,
            "e": 0.898,
            "peri_deg": 324.2,
            "node_deg": 261.6,
            "incl_deg": 23.5,
            "n_members": 51,
            "shower_group": "00000",
            "parent_body": "3200 Phaethon (=1983 TB)",
            "parent_object_id": "ast-20003200-phaethon",
            "technique": "P",
            "reference": "2) <A href='http://adsabs.harvard.edu/abs/2003MNRAS.344..665J' target=_blank>Jopek et al., 2003</A>",
            "submitted_on": "SD",
            "source": "IAU Meteor Data Center (Jenniskens et al. 2020; Hajdukova & Rudawska)"
        },
        {
            "iau_no": 4,
            "ad_no": 2,
            "code": "GEM",
            "name": "Geminids",
            "status_code": 1,
            "status_label": "single established shower, group",
            "activity": "2002/06",
            "solar_longitude_deg": 261.5,
            "ra_deg": 112.8,
            "dec_deg": 32.1,
            "dra_deg_per_day": 1.1,
            "ddec_deg_per_day": -0.17,
            "vg_km_s": 35,
            "a_au": 1.416,
            "q_au": 0.136,
            "e": 0.904,
            "peri_deg": 324.6,
            "node_deg": 261.3,
            "incl_deg": 24,
            "n_members": 4384,
            "shower_group": "00000",
            "parent_body": "3200 Phaethon (=1983 TB)",
            "parent_object_id": "ast-20003200-phaethon",
            "technique": "R",
            "reference": "3) <A href='http://adsabs.harvard.edu/abs/2008Icar..195..317B' target=_blank>Brown et al., 2008</A>",
            "submitted_on": "SD",
            "source": "IAU Meteor Data Center (Jenniskens et al. 2020; Hajdukova & Rudawska)"
        },
        {
            "iau_no": 4,
            "ad_no": 3,
            "code": "GEM",
            "name": "Geminids",
            "status_cod

Try it

observing catalogues

GET List Starter Targets https://api.publicuniverse.net/api/v1/starter-targets?limit=3

Parameters

family query · string
q query · string
limit query · integer
default 50, minimum 1, maximum 200
offset query · integer
default 0, minimum 0, maximum 1000

Request

curl example for List Starter Targets

curl -sS 'https://api.publicuniverse.net/api/v1/starter-targets?limit=3'

JavaScript example for List Starter Targets

const response = await fetch("https://api.publicuniverse.net/api/v1/starter-targets?limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for List Starter Targets

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/starter-targets?limit=3") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for List Starter Targets

{
    "available": true,
    "results": [
        {
            "id": "bsc5p:hr1017",
            "name": "HR 1017",
            "aliases": [
                "33Alp Per"
            ],
            "families": [
                "bright_star"
            ],
            "object_type": "star",
            "ra_deg": 51.0808,
            "dec_deg": 49.8611,
            "coordinate_equinox": "J2000.0",
            "coordinate_epoch": "J2000.0 reference epoch; individual observation epoch not reported",
            "magnitude": 1.79,
            "magnitude_band": "V (BSC5P; retain code/uncertainty flags)",
            "magnitude_flag": null,
            "magnitude_code": null,
            "major_axis_arcmin": null,
            "minor_axis_arcmin": null,
            "components": null,
            "separation_arcsec": null,
            "separation_epoch": null,
            "position_angle_deg": null,
            "source": "bsc5p",
            "source_data": {
                "ads": "",
                "ads_comp": "",
                "alt_name": "33Alp Per",
                "bii": "-5.8624",
                "bv_color": "0.48",
                "bv_uncert": "",
                "cdec": "+495140",
                "cdec_1950": "+494105",
                "class": "2451",
                "cra": "032419.4",
                "cra_1950": "032044.6",
                "dec": "49.8611",
                "dec_1900": "49.50000000053",
                "dec_1950": "49.6846",
                "dm_cat": "BD",
                "dm_num": "+49  917",
                "fk5": "120",
                "glat": "-5.86",
                "glon": "146.57",
                "hd": "20902",
                "hr": "1017",
                "ir_flag": "I",
                "lii": "146.569",
                "m_cnt": "",
                "m_id": "",
                "m_mdiff": "10",
                "m_sep": "167",
                "multiple": "W",
                "name": "HR 1017",
                "note": "*",
                "par_code": "",
                "parallax": "0.016",
                "pmdec": "-0.025",
                "pmra": "0.024",
                "ra": "51.0808",
                "ra_1900": "49.29500000079",
                "ra_1950": "50.1858",
                "radvel": "-2",
                "radvel_comm": "V",
                "ri_code": "",
                "ri_color": "0.33",
                "rotvel": "18",
                "rotvel_comm": "",
                "rotvel_uncert": "",
                "sao": "38787",
                "spect_code": "",
                "spect_type": "F5Ib",
                "ub_color": "0.37",
                "ub_uncert": "",
                "var_id": "1125",
                "vmag": "1.79",
                "vmag_code": "",
                "vmag_uncert": ""
            },
            "astrometry": {
                "status": "verified",
                "frame": "FK5",
                "equinox": "J2000.0",
                "reference_epoch_jyear": 2000,
                "observation_epoch_jyear": null,
                "pm_ra_cosdec_arcsec_per_year": 0.024,
                "pm_dec_arcsec_per_year": -0.025,
                "motion_model": "linear_angular_proper_motion",
                "coordinates_propagated": false,
                "evidence_source": "bsc5p",
                "matched_identifier": "1017",
                "unsupported_reason": null
            }
        },
        {
            "id": "bsc5p:hr1457",
            "name": "HR 1457",
            "aliases"

Try it

Calls from this form send at most 3 for limit. A direct request can use up to 200.

GET Get Starter Target https://api.publicuniverse.net/api/v1/starter-targets/bsc5p%3Ahr1017

Parameters

target_id path · string · required

Request

curl example for Get Starter Target

curl -sS 'https://api.publicuniverse.net/api/v1/starter-targets/bsc5p%3Ahr1017'

JavaScript example for Get Starter Target

const response = await fetch("https://api.publicuniverse.net/api/v1/starter-targets/bsc5p%3Ahr1017");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Get Starter Target

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/starter-targets/bsc5p%3Ahr1017") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for Get Starter Target

{
    "id": "bsc5p:hr1017",
    "name": "HR 1017",
    "aliases": [
        "33Alp Per"
    ],
    "families": [
        "bright_star"
    ],
    "object_type": "star",
    "ra_deg": 51.0808,
    "dec_deg": 49.8611,
    "coordinate_equinox": "J2000.0",
    "coordinate_epoch": "J2000.0 reference epoch; individual observation epoch not reported",
    "magnitude": 1.79,
    "magnitude_band": "V (BSC5P; retain code/uncertainty flags)",
    "magnitude_flag": null,
    "magnitude_code": null,
    "major_axis_arcmin": null,
    "minor_axis_arcmin": null,
    "components": null,
    "separation_arcsec": null,
    "separation_epoch": null,
    "position_angle_deg": null,
    "source": "bsc5p",
    "source_data": {
        "ads": "",
        "ads_comp": "",
        "alt_name": "33Alp Per",
        "bii": "-5.8624",
        "bv_color": "0.48",
        "bv_uncert": "",
        "cdec": "+495140",
        "cdec_1950": "+494105",
        "class": "2451",
        "cra": "032419.4",
        "cra_1950": "032044.6",
        "dec": "49.8611",
        "dec_1900": "49.50000000053",
        "dec_1950": "49.6846",
        "dm_cat": "BD",
        "dm_num": "+49  917",
        "fk5": "120",
        "glat": "-5.86",
        "glon": "146.57",
        "hd": "20902",
        "hr": "1017",
        "ir_flag": "I",
        "lii": "146.569",
        "m_cnt": "",
        "m_id": "",
        "m_mdiff": "10",
        "m_sep": "167",
        "multiple": "W",
        "name": "HR 1017",
        "note": "*",
        "par_code": "",
        "parallax": "0.016",
        "pmdec": "-0.025",
        "pmra": "0.024",
        "ra": "51.0808",
        "ra_1900": "49.29500000079",
        "ra_1950": "50.1858",
        "radvel": "-2",
        "radvel_comm": "V",
        "ri_code": "",
        "ri_color": "0.33",
        "rotvel": "18",
        "rotvel_comm": "",
        "rotvel_uncert": "",
        "sao": "38787",
        "spect_code": "",
        "spect_type": "F5Ib",
        "ub_color": "0.37",
        "ub_uncert": "",
        "var_id": "1125",
        "vmag": "1.79",
        "vmag_code": "",
        "vmag_uncert": ""
    },
    "astrometry": {
        "status": "verified",
        "frame": "FK5",
        "equinox": "J2000.0",
        "reference_epoch_jyear": 2000,
        "observation_epoch_jyear": null,
        "pm_ra_cosdec_arcsec_per_year": 0.024,
        "pm_dec_arcsec_per_year": -0.025,
        "motion_model": "linear_angular_proper_motion",
        "coordinates_propagated": false,
        "evidence_source": "bsc5p",
        "matched_identifier": "1017",
        "unsupported_reason": null
    },
    "provenance": {
        "schema_version": 1,
        "source": "bsc5p",
        "source_url": "https://heasarc.gsfc.nasa.gov/FTP/heasarc/dbase/tdat_files/heasarc_bsc5p.tdat.gz",
        "retrieved_at": "2026-10-01T21:40:09.869946+00:00",
        "license": "NASA government-works; HEASARC free-use policy",
        "selection": "Vmag <= 2.0, excluding 14 documented nonstellar HR identifiers",
        "upstream_sha256": {
            "bsc5p.tdat": "e2b2f8e9d615426f9478f88061235976143d49d8b25c6c15df3f3661c7095b53"
        },
        "attribution": "Hoffleit and Warren (1991), Bright Star Catalog, 5th revised preliminary edition; NASA/GSFC HEASARC",
        "license_url": "https://heasarc.gsfc.nasa.gov/docs/heasarc/data_policy.html",
        "snapshot_sha256": "7fe926d80b535f9422ca81f8f3fee1d6422de29adaecfbd2f14b1a93fe5134b9",
        "astrometry_evidence": {
            "file": "vizier-v

Try it

exoplanets

GET List Exoplanets https://api.publicuniverse.net/api/v1/exoplanets?limit=3

Parameters

q query · string
discovery_method query · string
max_distance_pc query · number
limit query · integer
default 50, minimum 1, maximum 1000
offset query · integer
default 0, minimum 0, maximum 100000

Request

curl example for List Exoplanets

curl -sS 'https://api.publicuniverse.net/api/v1/exoplanets?limit=3'

JavaScript example for List Exoplanets

const response = await fetch("https://api.publicuniverse.net/api/v1/exoplanets?limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for List Exoplanets

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/exoplanets?limit=3") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for List Exoplanets

{
    "available": true,
    "results": [
        {
            "id": "exo-7935f726449d233aec89",
            "name": "11 Com b",
            "host_id": "host-22fe7521aec0bdbd6317",
            "discovery_method": "Radial Velocity",
            "discovery_year": 2007,
            "radius_earth": 12.2,
            "mass_earth": 4914.89848585,
            "mass_provenance": "Msini",
            "period_days": 323.21,
            "semi_major_axis_au": 1.178,
            "equilibrium_temperature_k": 803.26,
            "controversial": 0,
            "source": "NASA Exoplanet Archive / PSCompPars (doi:10.26133/NEA13)",
            "source_url": "https://exoplanetarchive.ipac.caltech.edu/overview/11%20Com%20b",
            "retrieved_at": "2026-10-24T04:15:14.282228+00:00",
            "source_data": {
                "pl_name": "11 Com b",
                "hostname": "11 Com",
                "discoverymethod": "Radial Velocity",
                "disc_year": 2007,
                "disc_refname": "<a refstr=LIU_ET_AL__2008 href=https://ui.adsabs.harvard.edu/abs/2008ApJ...672..553L/abstract target=ref> Liu et al. 2008 </a>",
                "pl_controv_flag": 0,
                "pl_bmassprov": "Msini",
                "sy_snum": 2,
                "sy_pnum": 1,
                "cb_flag": 0,
                "gaia_dr3_id": "Gaia DR3 3946945413106333696",
                "ra": 185.1787793,
                "dec": 17.7932516,
                "ra_reflink": "<a refstr=STASSUN_ET_AL__2019 href=https://ui.adsabs.harvard.edu/abs/2019AJ....158..138S/abstract target=ref>TICv8</a>",
                "dec_reflink": "<a refstr=STASSUN_ET_AL__2019 href=https://ui.adsabs.harvard.edu/abs/2019AJ....158..138S/abstract target=ref>TICv8</a>",
                "sy_dist": 93.1846,
                "sy_disterr1": 1.9238,
                "sy_disterr2": -1.9238,
                "sy_distlim": 0,
                "sy_dist_reflink": "<a refstr=STASSUN_ET_AL__2019 href=https://ui.adsabs.harvard.edu/abs/2019AJ....158..138S/abstract target=ref>TICv8</a>",
                "pl_rade": 12.2,
                "pl_radeerr1": null,
                "pl_radeerr2": null,
                "pl_radelim": 0,
                "pl_rade_reflink": "<a refstr=CALCULATED_VALUE href=/docs/pscp_calc.html target=_blank>Calculated Value</a>",
                "pl_bmasse": 4914.89848585,
                "pl_bmasseerr1": 39.09289406,
                "pl_bmasseerr2": -39.72855088,
                "pl_bmasselim": 0,
                "pl_bmasse_reflink": "<a refstr=TENG_ET_AL_2023 href=https://ui.adsabs.harvard.edu/abs/2023PASJ...75.1030T/abstract target=ref>Teng et al. 2023</a>",
                "pl_orbper": 323.21,
                "pl_orbpererr1": 0.06,
                "pl_orbpererr2": -0.05,
                "pl_orbperlim": 0,
                "pl_orbper_reflink": "<a refstr=TENG_ET_AL_2023 href=https://ui.adsabs.harvard.edu/abs/2023PASJ...75.1030T/abstract target=ref>Teng et al. 2023</a>",
                "pl_orbsmax": 1.178,
                "pl_orbsmaxerr1": 0,
                "pl_orbsmaxerr2": 0,
                "pl_orbsmaxlim": 0,
                "pl_orbsmax_reflink": "<a refstr=TENG_ET_AL_2023 href=https://ui.adsabs.harvard.edu/abs/2023PASJ...75.1030T/abstract target=ref>Teng et al. 2023</a>",
                "pl_eqt": 803.26,
                "pl_eqterr1": null,
                "pl_eqterr2": null,
                "pl_eqtlim": 0,
                "pl_eqt_reflink": "<a refstr=CALCULATED_VALUE href=/docs/pscp_

Try it

Calls from this form send at most 3 for limit. A direct request can use up to 1000.

GET Get Exoplanet https://api.publicuniverse.net/api/v1/exoplanets/Proxima%20Cen%20b

Parameters

name path · string · required

Request

curl example for Get Exoplanet

curl -sS 'https://api.publicuniverse.net/api/v1/exoplanets/Proxima%20Cen%20b'

JavaScript example for Get Exoplanet

const response = await fetch("https://api.publicuniverse.net/api/v1/exoplanets/Proxima%20Cen%20b");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Get Exoplanet

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/exoplanets/Proxima%20Cen%20b") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for Get Exoplanet

{
    "id": "exo-32080c26d1599e72fccf",
    "name": "Proxima Cen b",
    "host_id": "host-1a11a204739d95cb0e20",
    "discovery_method": "Radial Velocity",
    "discovery_year": 2016,
    "radius_earth": 1.02,
    "mass_earth": 1.055,
    "mass_provenance": "Msini",
    "period_days": 11.18465,
    "semi_major_axis_au": 0.04848,
    "equilibrium_temperature_k": 218,
    "controversial": 0,
    "source": "NASA Exoplanet Archive / PSCompPars (doi:10.26133/NEA13)",
    "source_url": "https://exoplanetarchive.ipac.caltech.edu/overview/Proxima%20Cen%20b",
    "retrieved_at": "2026-10-24T04:15:14.282228+00:00",
    "source_data": {
        "pl_name": "Proxima Cen b",
        "hostname": "Proxima Cen",
        "discoverymethod": "Radial Velocity",
        "disc_year": 2016,
        "disc_refname": "<a refstr=ANGLADA_ESCUD_EACUTE__ET_AL__2016 href=https://ui.adsabs.harvard.edu/abs/2016Natur.536..437A/abstract target=ref>Anglada-Escud&eacute; et al. 2016</a>",
        "pl_controv_flag": 0,
        "pl_bmassprov": "Msini",
        "sy_snum": 3,
        "sy_pnum": 2,
        "cb_flag": 0,
        "gaia_dr3_id": "Gaia DR3 5853498713190525696",
        "ra": 217.3934657,
        "dec": -62.6761821,
        "ra_reflink": "<a refstr=STASSUN_ET_AL__2019 href=https://ui.adsabs.harvard.edu/abs/2019AJ....158..138S/abstract target=ref>TICv8</a>",
        "dec_reflink": "<a refstr=STASSUN_ET_AL__2019 href=https://ui.adsabs.harvard.edu/abs/2019AJ....158..138S/abstract target=ref>TICv8</a>",
        "sy_dist": 1.30119,
        "sy_disterr1": 0.00034,
        "sy_disterr2": -0.00035,
        "sy_distlim": 0,
        "sy_dist_reflink": "<a refstr=STASSUN_ET_AL__2019 href=https://ui.adsabs.harvard.edu/abs/2019AJ....158..138S/abstract target=ref>TICv8</a>",
        "pl_rade": 1.02,
        "pl_radeerr1": null,
        "pl_radeerr2": null,
        "pl_radelim": 0,
        "pl_rade_reflink": "<a refstr=CALCULATED_VALUE href=/docs/pscp_calc.html target=_blank>Calculated Value</a>",
        "pl_bmasse": 1.055,
        "pl_bmasseerr1": 0.055,
        "pl_bmasseerr2": -0.055,
        "pl_bmasselim": 0,
        "pl_bmasse_reflink": "<a refstr=SU_AMP_AACUTE_REZ_MASCARE_AMP_NTILDE_O_ET_AL__2025 href=https://ui.adsabs.harvard.edu/abs/2025A&A...700A..11M/abstract target=ref>Su&aacute;rez Mascare&ntilde;o et al. 2025</a>",
        "pl_orbper": 11.18465,
        "pl_orbpererr1": 0.00053,
        "pl_orbpererr2": -0.00053,
        "pl_orbperlim": 0,
        "pl_orbper_reflink": "<a refstr=SU_AMP_AACUTE_REZ_MASCARE_AMP_NTILDE_O_ET_AL__2025 href=https://ui.adsabs.harvard.edu/abs/2025A&A...700A..11M/abstract target=ref>Su&aacute;rez Mascare&ntilde;o et al. 2025</a>",
        "pl_orbsmax": 0.04848,
        "pl_orbsmaxerr1": 0.00029,
        "pl_orbsmaxerr2": -0.00029,
        "pl_orbsmaxlim": 0,
        "pl_orbsmax_reflink": "<a refstr=SU_AMP_AACUTE_REZ_MASCARE_AMP_NTILDE_O_ET_AL__2025 href=https://ui.adsabs.harvard.edu/abs/2025A&A...700A..11M/abstract target=ref>Su&aacute;rez Mascare&ntilde;o et al. 2025</a>",
        "pl_eqt": 218,
        "pl_eqterr1": 18,
        "pl_eqterr2": -18,
        "pl_eqtlim": 0,
        "pl_eqt_reflink": "<a refstr=SU_AMP_AACUTE_REZ_MASCARE_AMP_NTILDE_O_ET_AL__2025 href=https://ui.adsabs.harvard.edu/abs/2025A&A...700A..11M/abstract target=ref>Su&aacute;rez Mascare&ntilde;o et al. 2025</a>",
        "st_teff": 2900,
        "st_tefferr1": 100,
        "st_tefferr2": -100,
        "st_tefflim": 0,
        "st_teff_reflink": "<a refstr=SU_AMP_AACUTE_REZ

Try it

GET Get Exoplanet Host https://api.publicuniverse.net/api/v1/exoplanet-hosts/Proxima%20Cen

Parameters

name path · string · required

Request

curl example for Get Exoplanet Host

curl -sS 'https://api.publicuniverse.net/api/v1/exoplanet-hosts/Proxima%20Cen'

JavaScript example for Get Exoplanet Host

const response = await fetch("https://api.publicuniverse.net/api/v1/exoplanet-hosts/Proxima%20Cen");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Get Exoplanet Host

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/exoplanet-hosts/Proxima%20Cen") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for Get Exoplanet Host

{
    "id": "host-1a11a204739d95cb0e20",
    "name": "Proxima Cen",
    "ra_deg": 217.3934657,
    "dec_deg": -62.6761821,
    "distance_pc": 1.30119,
    "distance_error_plus_pc": 0.00034,
    "distance_error_minus_pc": -0.00035,
    "x_pc": 0.9021663308151595,
    "y_pc": -0.936640084236698,
    "z_pc": -0.04355089258078132,
    "galactocentric_x_pc": -8121.071315090504,
    "galactocentric_y_pc": -0.9366408594667782,
    "galactocentric_z_pc": 20.75413876894171,
    "coordinate_source_planet": "Proxima Cen b",
    "coordinate_metadata": {
        "input": "ICRS; archive catalogue coordinates, no proper-motion propagation",
        "heliocentric": "Galactic Cartesian: x toward Galactic centre, y toward l=90 deg, z north",
        "unit": "pc",
        "galactocentric": {
            "galcen_distance_pc": 8122,
            "z_sun_pc": 20.8,
            "roll_deg": 0,
            "galcen_ra_deg": 266.4051,
            "galcen_dec_deg": -28.936175
        },
        "astropy_version": "8.0.2"
    },
    "source": "NASA Exoplanet Archive / PSCompPars (doi:10.26133/NEA13)",
    "retrieved_at": "2026-10-24T04:15:14.282228+00:00",
    "planets": [
        {
            "id": "exo-32080c26d1599e72fccf",
            "name": "Proxima Cen b",
            "host_id": "host-1a11a204739d95cb0e20",
            "discovery_method": "Radial Velocity",
            "discovery_year": 2016,
            "radius_earth": 1.02,
            "mass_earth": 1.055,
            "mass_provenance": "Msini",
            "period_days": 11.18465,
            "semi_major_axis_au": 0.04848,
            "equilibrium_temperature_k": 218,
            "controversial": 0,
            "source": "NASA Exoplanet Archive / PSCompPars (doi:10.26133/NEA13)",
            "source_url": "https://exoplanetarchive.ipac.caltech.edu/overview/Proxima%20Cen%20b",
            "retrieved_at": "2026-10-24T04:15:14.282228+00:00",
            "source_data": {
                "pl_name": "Proxima Cen b",
                "hostname": "Proxima Cen",
                "discoverymethod": "Radial Velocity",
                "disc_year": 2016,
                "disc_refname": "<a refstr=ANGLADA_ESCUD_EACUTE__ET_AL__2016 href=https://ui.adsabs.harvard.edu/abs/2016Natur.536..437A/abstract target=ref>Anglada-Escud&eacute; et al. 2016</a>",
                "pl_controv_flag": 0,
                "pl_bmassprov": "Msini",
                "sy_snum": 3,
                "sy_pnum": 2,
                "cb_flag": 0,
                "gaia_dr3_id": "Gaia DR3 5853498713190525696",
                "ra": 217.3934657,
                "dec": -62.6761821,
                "ra_reflink": "<a refstr=STASSUN_ET_AL__2019 href=https://ui.adsabs.harvard.edu/abs/2019AJ....158..138S/abstract target=ref>TICv8</a>",
                "dec_reflink": "<a refstr=STASSUN_ET_AL__2019 href=https://ui.adsabs.harvard.edu/abs/2019AJ....158..138S/abstract target=ref>TICv8</a>",
                "sy_dist": 1.30119,
                "sy_disterr1": 0.00034,
                "sy_disterr2": -0.00035,
                "sy_distlim": 0,
                "sy_dist_reflink": "<a refstr=STASSUN_ET_AL__2019 href=https://ui.adsabs.harvard.edu/abs/2019AJ....158..138S/abstract target=ref>TICv8</a>",
                "pl_rade": 1.02,
                "pl_radeerr1": null,
                "pl_radeerr2": null,
                "pl_radelim": 0,
                "pl_rade_reflink": "<a refstr=CALCULATED_VALUE href=/docs/pscp_calc.html target=_blank>Calculated Value</a>",

Try it

GET Measured exoplanet host positions in parsecs https://api.publicuniverse.net/api/v1/galaxy?limit=3

Parameters

max_distance_pc query · number
limit query · integer
default 10000, minimum 1, maximum 10000

Request

curl example for Measured exoplanet host positions in parsecs

curl -sS 'https://api.publicuniverse.net/api/v1/galaxy?limit=3'

JavaScript example for Measured exoplanet host positions in parsecs

const response = await fetch("https://api.publicuniverse.net/api/v1/galaxy?limit=3");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Measured exoplanet host positions in parsecs

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/galaxy?limit=3") as response:
    data = json.load(response)
print(data)

Example response

Example response for Measured exoplanet host positions in parsecs

{
    "available": true,
    "results": [
        {
            "id": "host-1a11a204739d95cb0e20",
            "name": "Proxima Cen",
            "distance_pc": 1.30119,
            "distance_error_plus_pc": 0.00034,
            "distance_error_minus_pc": -0.00035,
            "x_pc": 0.9021663308151595,
            "y_pc": -0.936640084236698,
            "z_pc": -0.04355089258078132,
            "galactocentric_x_pc": -8121.071315090504,
            "galactocentric_y_pc": -0.9366408594667782,
            "galactocentric_z_pc": 20.75413876894171,
            "planet_count": 2
        },
        {
            "id": "host-934a924fc168f6d7760f",
            "name": "Barnard's star",
            "distance_pc": 1.82655,
            "distance_error_plus_pc": 0.000975,
            "distance_error_minus_pc": -0.000975,
            "x_pc": 1.517815555232836,
            "y_pc": 0.9137325537463832,
            "z_pc": 0.444537583357522,
            "galactocentric_x_pc": -8120.454416885091,
            "galactocentric_y_pc": 0.9137304889067035,
            "galactocentric_z_pc": 21.2406525966418,
            "planet_count": 4
        },
        {
            "id": "host-89f58465a7285aa15823",
            "name": "eps Eri",
            "distance_pc": 3.2026,
            "distance_error_plus_pc": 0.00483,
            "distance_error_minus_pc": -0.00483,
            "x_pc": -2.0593770534223523,
            "y_pc": -0.5843504258598228,
            "z_pc": -2.382046912139831,
            "galactocentric_x_pc": -8124.038833858898,
            "galactocentric_y_pc": -0.5843450113573769,
            "galactocentric_z_pc": 18.42323103841166,
            "planet_count": 1
        }
    ],
    "frame": {
        "input": "ICRS; archive catalogue coordinates, no proper-motion propagation",
        "heliocentric": "Galactic Cartesian: x toward Galactic centre, y toward l=90 deg, z north",
        "unit": "pc",
        "galactocentric": {
            "galcen_distance_pc": 8122,
            "z_sun_pc": 20.8,
            "roll_deg": 0,
            "galcen_ra_deg": 266.4051,
            "galcen_dec_deg": -28.936175
        }
    },
    "total_hosts": 4847,
    "mapped_hosts": 4819,
    "unmapped_hosts": 28,
    "matching_hosts": 4819,
    "truncated": true
}

Try it

Calls from this form send at most 3 for limit. A direct request can use up to 10000.

reference

GET Where to get the whole database as one file https://api.publicuniverse.net/api/v1/download

This operation takes no parameters.

Request

curl example for Where to get the whole database as one file

curl -sS 'https://api.publicuniverse.net/api/v1/download'

JavaScript example for Where to get the whole database as one file

const response = await fetch("https://api.publicuniverse.net/api/v1/download");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Where to get the whole database as one file

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/download") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for Where to get the whole database as one file

{
    "artefact": "solar_system-20261024.sqlite.zst",
    "url": "https://download.sol.wickedsick.com/solar_system-20261024.sqlite.zst",
    "size_bytes": 1100300527,
    "sha256": "b4ca2a77f386186496940ce1115e957f4f7b979c38062c4ae0d21c96adedaeb5",
    "sqlite_sha256": "7d2a34b20a63129bd1e9a5457ccb6d4847fd1c60438a13d821c51e93ec4be246",
    "catalogue_identity": {
        "build": {
            "finished_at": "2026-10-24T04:28:47Z",
            "mode": "full",
            "started_at": "2026-10-24T03:03:46Z"
        },
        "build_identifier": "sha256:863575869c85ed9c873ace94bba4fc90a5e0cb1ded81ee21e248bf274c518b35",
        "built_at": "2026-10-24T04:28:47Z",
        "catalogue_id": "sha256:2c7d4001a13d6a3f3bb20d28b09d1b2d91f3a9dfa33a5e5f258ad6d9852e2170",
        "hash_policy": "catalogue-logical-v1",
        "reason": null,
        "row_counts": {
            "atmospheres": 9,
            "classifications": 1652464,
            "close_approaches": 4045369,
            "designations": 4583059,
            "discoveries": 896109,
            "exoplanet_hosts": 4847,
            "exoplanets": 6451,
            "impact_monitoring": 1580021,
            "meteor_showers": 1497,
            "objects": 1581076,
            "orbital_elements": 1581074,
            "physical_properties": 1581076,
            "radar_observations": 4714,
            "rings": 32,
            "sources": 3480285,
            "starter_sources": 2,
            "starter_targets": 158,
            "visual_properties": 1581069
        },
        "schema_sha256": "3657985bc6aa87fcdb684848bbbeaf39da6f4cb3be95352be09f31c7a203d951",
        "schema_version": 1,
        "source_manifest": {
            "builder": {
                "enrichment_store_requested": true,
                "options": {
                    "cad_years": 200,
                    "offline": false,
                    "skip_cad": false,
                    "skip_exoplanets": false,
                    "skip_mpc": false,
                    "skip_showers": false
                },
                "revision": null,
                "source_files": [
                    {
                        "name": "schema/schema.sql",
                        "sha256": "7d932e8d137840da14ce48fd4e2ac345669f576703291f3c4b976d9b076dfa8e"
                    },
                    {
                        "name": "scripts/__init__.py",
                        "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
                    },
                    {
                        "name": "scripts/benchmark_catalogue_finalization.py",
                        "sha256": "3018d21db9d74b6e5588c14edaa2f7d786d28fd9fce3344d86932488e8573295"
                    },
                    {
                        "name": "scripts/build_full.py",
                        "sha256": "bddb05f94d6a8ec283bb09554f900ea09401302bef5272e023204bde163c7468"
                    },
                    {
                        "name": "scripts/catalogue_provenance.py",
                        "sha256": "09eeab48c085b6e30f6cc8f7fc9d6e2643d08b2d1e8f0e0f0b8144bfaca67b22"
                    },
                    {
                        "name": "scripts/common.py",
                        "sha256": "8fe5812e2c8c0665be58cdda5d0ff779f3ea138c582c836825149764f74129cc"
                    },
                    {
                        "name": "scripts/enrich_crawler.py",
                        "sha256": "07a48d3c4916adc2f430b743b

Try it

GET Finalized catalogue identity and recorded source provenance https://api.publicuniverse.net/api/v1/catalogue

This operation takes no parameters.

Request

curl example for Finalized catalogue identity and recorded source provenance

curl -sS 'https://api.publicuniverse.net/api/v1/catalogue'

JavaScript example for Finalized catalogue identity and recorded source provenance

const response = await fetch("https://api.publicuniverse.net/api/v1/catalogue");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Finalized catalogue identity and recorded source provenance

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/catalogue") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for Finalized catalogue identity and recorded source provenance

{
    "build": {
        "finished_at": "2026-10-24T04:28:47Z",
        "mode": "full",
        "started_at": "2026-10-24T03:03:46Z"
    },
    "build_identifier": "sha256:863575869c85ed9c873ace94bba4fc90a5e0cb1ded81ee21e248bf274c518b35",
    "built_at": "2026-10-24T04:28:47Z",
    "catalogue_id": "sha256:2c7d4001a13d6a3f3bb20d28b09d1b2d91f3a9dfa33a5e5f258ad6d9852e2170",
    "hash_policy": "catalogue-logical-v1",
    "reason": null,
    "row_counts": {
        "atmospheres": 9,
        "classifications": 1652464,
        "close_approaches": 4045369,
        "designations": 4583059,
        "discoveries": 896109,
        "exoplanet_hosts": 4847,
        "exoplanets": 6451,
        "impact_monitoring": 1580021,
        "meteor_showers": 1497,
        "objects": 1581076,
        "orbital_elements": 1581074,
        "physical_properties": 1581076,
        "radar_observations": 4714,
        "rings": 32,
        "sources": 3480285,
        "starter_sources": 2,
        "starter_targets": 158,
        "visual_properties": 1581069
    },
    "schema_sha256": "3657985bc6aa87fcdb684848bbbeaf39da6f4cb3be95352be09f31c7a203d951",
    "schema_version": 1,
    "source_manifest": {
        "builder": {
            "enrichment_store_requested": true,
            "options": {
                "cad_years": 200,
                "offline": false,
                "skip_cad": false,
                "skip_exoplanets": false,
                "skip_mpc": false,
                "skip_showers": false
            },
            "revision": null,
            "source_files": [
                {
                    "name": "schema/schema.sql",
                    "sha256": "7d932e8d137840da14ce48fd4e2ac345669f576703291f3c4b976d9b076dfa8e"
                },
                {
                    "name": "scripts/__init__.py",
                    "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
                },
                {
                    "name": "scripts/benchmark_catalogue_finalization.py",
                    "sha256": "3018d21db9d74b6e5588c14edaa2f7d786d28fd9fce3344d86932488e8573295"
                },
                {
                    "name": "scripts/build_full.py",
                    "sha256": "bddb05f94d6a8ec283bb09554f900ea09401302bef5272e023204bde163c7468"
                },
                {
                    "name": "scripts/catalogue_provenance.py",
                    "sha256": "09eeab48c085b6e30f6cc8f7fc9d6e2643d08b2d1e8f0e0f0b8144bfaca67b22"
                },
                {
                    "name": "scripts/common.py",
                    "sha256": "8fe5812e2c8c0665be58cdda5d0ff779f3ea138c582c836825149764f74129cc"
                },
                {
                    "name": "scripts/enrich_crawler.py",
                    "sha256": "07a48d3c4916adc2f430b743b9fbdd6bb461928105e58cb34604cb8310911118"
                },
                {
                    "name": "scripts/ingest_cad.py",
                    "sha256": "13168d9e67f0b6e317d06dc170c1c03d9d96d463fe906113852ee8eb4c75b6fc"
                },
                {
                    "name": "scripts/ingest_enrichment.py",
                    "sha256": "40178e4f48bd29e463d55aebebf8226bdebec7d523c1247fa58ac040360b869e"
                },
                {
                    "name": "scripts/ingest_exoplanets.py",
                    "sha256": "85c5be04c073d339c18b6a228e209167977df31e08ff7ea84539a24e0ad57167"
                },
                {

Try it

GET Object types present in the catalogue and their counts https://api.publicuniverse.net/api/v1/object-types

This operation takes no parameters.

Request

curl example for Object types present in the catalogue and their counts

curl -sS 'https://api.publicuniverse.net/api/v1/object-types'

JavaScript example for Object types present in the catalogue and their counts

const response = await fetch("https://api.publicuniverse.net/api/v1/object-types");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Object types present in the catalogue and their counts

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/object-types") as response:
    data = json.load(response)
print(data)

Example response

Example response for Object types present in the catalogue and their counts

{
    "results": [
        {
            "object_type": "asteroid",
            "n": 1567751
        },
        {
            "object_type": "tno",
            "n": 7660
        },
        {
            "object_type": "comet",
            "n": 4082
        },
        {
            "object_type": "centaur",
            "n": 1071
        },
        {
            "object_type": "moon",
            "n": 493
        },
        {
            "object_type": "planet",
            "n": 8
        },
        {
            "object_type": "dwarf_planet",
            "n": 5
        },
        {
            "object_type": "dwarf_planet_candidate",
            "n": 5
        },
        {
            "object_type": "star",
            "n": 1
        }
    ]
}

Try it

GET Upstream data sources + last-retrieved timestamps https://api.publicuniverse.net/api/v1/sources

This operation takes no parameters.

Request

curl example for Upstream data sources + last-retrieved timestamps

curl -sS 'https://api.publicuniverse.net/api/v1/sources'

JavaScript example for Upstream data sources + last-retrieved timestamps

const response = await fetch("https://api.publicuniverse.net/api/v1/sources");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Upstream data sources + last-retrieved timestamps

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/sources") as response:
    data = json.load(response)
print(data)

Example response

Example response for Upstream data sources + last-retrieved timestamps

{
    "results": [
        {
            "source_name": "JPL SBDB (lookup)",
            "n": 1898735,
            "first_seen": "2026-10-24T04:16:12Z",
            "last_seen": "2026-10-24T04:28:13Z"
        },
        {
            "source_name": "JPL SBDB",
            "n": 1580573,
            "first_seen": "2026-10-24T03:03:53Z",
            "last_seen": "2026-10-24T03:23:44Z"
        },
        {
            "source_name": "JPL Solar System Dynamics — planetary satellites",
            "n": 506,
            "first_seen": "2026-10-24T03:03:48Z",
            "last_seen": "2026-10-24T03:03:48Z"
        },
        {
            "source_name": "JPL CAD",
            "n": 305,
            "first_seen": "2026-10-24T03:25:08Z",
            "last_seen": "2026-10-24T04:15:03Z"
        },
        {
            "source_name": "NASA Planetary Fact Sheet",
            "n": 120,
            "first_seen": "2026-10-24T03:03:46Z",
            "last_seen": "2026-10-24T03:03:46Z"
        },
        {
            "source_name": "NASA Planetary Fact Sheet / JPL keplerian elements",
            "n": 43,
            "first_seen": "2026-10-24T03:03:46Z",
            "last_seen": "2026-10-24T03:03:46Z"
        },
        {
            "source_name": "IAU Meteor Data Center (Jenniskens et al. 2020; Hajdukova & Rudawska)",
            "n": 1,
            "first_seen": "2026-10-24T04:15:09Z",
            "last_seen": "2026-10-24T04:15:09Z"
        },
        {
            "source_name": "IAU Minor Planet Center",
            "n": 1,
            "first_seen": "2026-10-24T03:24:50Z",
            "last_seen": "2026-10-24T03:24:50Z"
        },
        {
            "source_name": "NASA Exoplanet Archive / PSCompPars (doi:10.26133/NEA13)",
            "n": 1,
            "first_seen": "2026-10-24T04:16:02Z",
            "last_seen": "2026-10-24T04:16:02Z"
        }
    ]
}

Try it

GET SQLite schema DDL (read-only) https://api.publicuniverse.net/api/v1/schema

This operation takes no parameters.

Request

curl example for SQLite schema DDL (read-only)

curl -sS 'https://api.publicuniverse.net/api/v1/schema'

JavaScript example for SQLite schema DDL (read-only)

const response = await fetch("https://api.publicuniverse.net/api/v1/schema");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.text();
console.log(data);

Python example for SQLite schema DDL (read-only)

from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/schema") as response:
    text = response.read().decode()
print(text)

Example response

Showing the start of the response.

Example response for SQLite schema DDL (read-only)

CREATE TABLE atmospheres (
    object_id               TEXT PRIMARY KEY REFERENCES objects(id) ON DELETE CASCADE,
    surface_pressure_bar    REAL,
    pressure_note           TEXT,
    temperature_k           REAL,
    temperature_note        TEXT,
    density_kg_m3           REAL,
    scale_height_km         REAL,
    mean_molecular_weight   REAL,
    wind_note               TEXT,
    composition_json        TEXT,                  -- [{"species":"N2","fraction":0.78,"unit":"%"},…]
    source                  TEXT NOT NULL DEFAULT 'NASA Planetary Fact Sheet'
);

CREATE TABLE build_meta (
    id              INTEGER PRIMARY KEY AUTOINCREMENT,
    started_at      TEXT NOT NULL,
    finished_at     TEXT,
    mode            TEXT NOT NULL,              -- 'full','nightly'
    row_count       INTEGER,
    notes           TEXT
);

CREATE TABLE catalogue_identity (
    singleton INTEGER PRIMARY KEY CHECK(singleton=1),
    payload TEXT NOT NULL
);

CREATE TABLE classifications (
    object_id   TEXT NOT NULL REFERENCES objects(id) ON DELETE CASCADE,
    label       TEXT NOT NULL,           -- 'NEO','PHA','Trojan','Hilda','MBA','Centaur','KBO','SDO','Inner','Outer'
    PRIMARY KEY (object_id, label)
);

CREATE TABLE close_approaches (
    id              INTEGER PRIMARY KEY AUTOINCREMENT,
    object_id       TEXT NOT NULL REFERENCES objects(id) ON DELETE CASCADE,
    body            TEXT NOT NULL,                 -- 'Earth', 'Moon', 'Venus', …
    cd_jd           REAL NOT NULL,
    cd_iso          TEXT NOT NULL,
    dist_au         REAL,
    dist_min_au     REAL,
    dist_max_au     REAL,
    v_rel_km_s      REAL,
    v_inf_km_s      REAL,
    t_sigma         TEXT,                          -- formatted uncertainty, e.g. '04:08'
    orbit_ref       TEXT,
    source          TEXT NOT NULL DEFAULT 'JPL CAD',
    UNIQUE (object_id, body, cd_iso)                -- minute resolution: CAD and SBDB-lookup rows dedupe
);

CREATE TABLE designations (
    object_id       TEXT NOT NULL REFERENCES objects(id) ON DELETE CASCADE,
    designation     TEXT NOT NULL,                 -- '1', 'A801 AA', '2004 MN4', '1P'
    kind            TEXT NOT NULL CHECK (kind IN ('number','provisional','alternate','name')),
    source          TEXT,
    PRIMARY KEY (object_id, designation)
);

CREATE TABLE discoveries (
    object_id       TEXT PRIMARY KEY REFERENCES objects(id) ON DELETE CASCADE,
    discovered_on   TEXT,                          -- ISO date
    discoverer      TEXT,
    site            TEXT,
    location        TEXT,
    citation        TEXT,
    reference       TEXT,
    source          TEXT NOT NULL,                 -- 'MPC', 'JPL SBDB', 'seed'
    updated_at      TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ','now'))
);

CREATE TABLE enrichment_state (
    object_id       TEXT PRIMARY KEY REFERENCES objects(id) ON DELETE CASCADE,
    tier            INTEGER NOT NULL DEFAULT 2,    -- 1 = shown on the site, 2 = everything else
    lookup_at       TEXT,
    lookup_status   TEXT                           -- 'ok', 'not_found', 'error'
);

CREATE TABLE exoplanet_hosts (
    id TEXT PRIMARY KEY,
    name TEXT NOT NULL UNIQUE,
    ra_deg REAL, dec_deg REAL,
    distance_pc REAL CHECK (distance_pc > 0),
    distance_error_plus_pc REAL, distance_error_minus_pc REAL,
    x_pc REAL, y_pc REAL, z_pc REAL,
    galactocentric_x_pc REAL, galactocentric_y_pc REAL, galactocentric_z_pc REAL,
    coordinate_source_planet TEXT NOT NULL,
    coordinate_metadata TEX

Try it

GET Catalogue stats + last refresh timestamp https://api.publicuniverse.net/api/v1/stats

This operation takes no parameters.

Request

curl example for Catalogue stats + last refresh timestamp

curl -sS 'https://api.publicuniverse.net/api/v1/stats'

JavaScript example for Catalogue stats + last refresh timestamp

const response = await fetch("https://api.publicuniverse.net/api/v1/stats");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Catalogue stats + last refresh timestamp

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/stats") as response:
    data = json.load(response)
print(data)

Example response

Showing the start of the response.

Example response for Catalogue stats + last refresh timestamp

{
    "total_objects": 1581076,
    "by_object_type": {
        "asteroid": 1567751,
        "tno": 7660,
        "comet": 4082,
        "centaur": 1071,
        "moon": 493,
        "planet": 8,
        "dwarf_planet": 5,
        "dwarf_planet_candidate": 5,
        "star": 1
    },
    "last_build": {
        "id": 1,
        "started_at": "2026-10-24T03:03:46Z",
        "finished_at": "2026-10-24T04:28:47Z",
        "mode": "full",
        "row_count": 1581076,
        "notes": "{\"seed\": {\"star\": 1, \"planet\": 8, \"dwarf_planet\": 5, \"dwarf_planet_candidate\": 5, \"moon\": 273, \"rings\": 32, \"tno_notable\": 10}, \"factsheets\": {\"factsheet_bodies\": 10, \"atmospheres\": 9}, \"satellites\": {\"moons_created\": 220, \"moons_updated\": 240}, \"sbdb\": {\"asteroid\": 1567752, \"centaur\": 1071, \"tno\": 7668, \"comet\": 4082}, \"mpc\": {\"discoveries\": 895910, \"unmatched\": 0}, \"cad\": {\"close_approaches\": 883993, \"unmatched\": 0}, \"showers\": {\"showers\": 1497, \"parents_resolved\": 123, \"parents_unresolved\": 287, \"skipped_rows\": 0}, \"starter_catalogues\": {\"bright_star\": 50, \"double_star\": 23, \"deep_sky\": 108}, \"exoplanets\": {\"exoplanets\": 6451, \"hosts\": 4847, \"mapped_hosts\": 4819, \"unmapped_hosts\": 28}, \"tiers\": {\"tier1\": 75857, \"tier2\": 1505219}, \"enrichment\": {\"applied\": 1580021, \"skipped\": 86, \"close_approaches\": 4012786, \"radar\": 4714}, \"fts_rows\": 1581076}"
    },
    "catalogue_identity": {
        "build": {
            "finished_at": "2026-10-24T04:28:47Z",
            "mode": "full",
            "started_at": "2026-10-24T03:03:46Z"
        },
        "build_identifier": "sha256:863575869c85ed9c873ace94bba4fc90a5e0cb1ded81ee21e248bf274c518b35",
        "built_at": "2026-10-24T04:28:47Z",
        "catalogue_id": "sha256:2c7d4001a13d6a3f3bb20d28b09d1b2d91f3a9dfa33a5e5f258ad6d9852e2170",
        "hash_policy": "catalogue-logical-v1",
        "reason": null,
        "row_counts": {
            "atmospheres": 9,
            "classifications": 1652464,
            "close_approaches": 4045369,
            "designations": 4583059,
            "discoveries": 896109,
            "exoplanet_hosts": 4847,
            "exoplanets": 6451,
            "impact_monitoring": 1580021,
            "meteor_showers": 1497,
            "objects": 1581076,
            "orbital_elements": 1581074,
            "physical_properties": 1581076,
            "radar_observations": 4714,
            "rings": 32,
            "sources": 3480285,
            "starter_sources": 2,
            "starter_targets": 158,
            "visual_properties": 1581069
        },
        "schema_sha256": "3657985bc6aa87fcdb684848bbbeaf39da6f4cb3be95352be09f31c7a203d951",
        "schema_version": 1,
        "source_manifest": {
            "builder": {
                "enrichment_store_requested": true,
                "options": {
                    "cad_years": 200,
                    "offline": false,
                    "skip_cad": false,
                    "skip_exoplanets": false,
                    "skip_mpc": false,
                    "skip_showers": false
                },
                "revision": null,
                "source_files": [
                    {
                        "name": "schema/schema.sql",
                        "sha256": "7d932e8d137840da14ce48fd4e2ac345669f576703291f3c4b976d9b076dfa8e"
                    },
                    {
                        "name": "scripts/__init__.

Try it

positions

GET One local night of labelled geometric Moon and planet planning https://api.publicuniverse.net/api/v1/observing/night?date=2026-10-10&timezone=UTC&lat=51.5&lon=-0.1

Configured offline ephemerides; no weather or guaranteed visibility. Local noon to the next noon, including timezone transitions. Returns explicit model and Earth-orientation coverage; unavailable coverage is HTTP 503.

Parameters

date query · string · required
timezone query · string · required
lat query · string · required
lon query · string · required
targets query · string
default moon,jupiter,saturn
min_altitude_deg query · string
default 20
sun_altitude_deg query · string
default -12
min_moon_separation_deg query · string
default 0

Request

curl example for One local night of labelled geometric Moon and planet planning

curl -sS 'https://api.publicuniverse.net/api/v1/observing/night?date=2026-10-10&timezone=UTC&lat=51.5&lon=-0.1'

JavaScript example for One local night of labelled geometric Moon and planet planning

const response = await fetch("https://api.publicuniverse.net/api/v1/observing/night?date=2026-10-10&timezone=UTC&lat=51.5&lon=-0.1");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for One local night of labelled geometric Moon and planet planning

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/observing/night?date=2026-10-10&timezone=UTC&lat=51.5&lon=-0.1") as response:
    data = json.load(response)
print(data)

Try it

GET Heliocentric position by two-body Kepler propagation https://api.publicuniverse.net/api/v1/positions/planet-saturn?date=2026-10-10

Parameters

name_or_designation path · string · required
date query · string · required
ISO date or datetime

Request

curl example for Heliocentric position by two-body Kepler propagation

curl -sS 'https://api.publicuniverse.net/api/v1/positions/planet-saturn?date=2026-10-10'

JavaScript example for Heliocentric position by two-body Kepler propagation

const response = await fetch("https://api.publicuniverse.net/api/v1/positions/planet-saturn?date=2026-10-10");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Heliocentric position by two-body Kepler propagation

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/positions/planet-saturn?date=2026-10-10") as response:
    data = json.load(response)
print(data)

Example response

Example response for Heliocentric position by two-body Kepler propagation

{
    "name": "Saturn",
    "designation": null,
    "input_date": "2026-10-10",
    "x_au": 9.249829973128437,
    "y_au": 1.8274985299269007,
    "z_au": -0.39967116970920724,
    "distance_from_sun_au": 9.437099260501974,
    "true_anomaly_deg": 278.13301263585254,
    "eccentric_anomaly_deg": 281.177917300386,
    "mean_anomaly_deg": 284.20542793994366,
    "jd": 2461323.5,
    "frame": "ecliptic J2000, heliocentric, two-body propagation",
    "accuracy_note": "Two-body Kepler propagation — accurate to ~0.1% for major planets over decades, less so for highly-perturbed bodies. Use JPL Horizons for high precision."
}

Try it

ISO date or datetime

GET Where an object appears in Earth's sky (RA/Dec, constellation, optional observer view) https://api.publicuniverse.net/api/v1/sky/planet-saturn

Geocentric RA/Dec (J2000), constellation, hemisphere, distance from Earth and elongation from the Sun. Supply `lat` and `lon` together to add altitude/azimuth, whether it is up after dark, and rise/transit/set for that UT day. Other moons report an explicit parent-body proxy; Earth's Moon is unavailable here. Two-body accuracy (~1°).

Parameters

name_or_designation path · string · required
date query · string
ISO date or datetime (UTC); default now
lat query · number
Observer latitude, degrees north
minimum -90, maximum 90
lon query · number
Observer longitude, degrees east
minimum -180, maximum 180

Request

curl example for Where an object appears in Earth's sky (RA/Dec, constellation, optional observer view)

curl -sS 'https://api.publicuniverse.net/api/v1/sky/planet-saturn'

JavaScript example for Where an object appears in Earth's sky (RA/Dec, constellation, optional observer view)

const response = await fetch("https://api.publicuniverse.net/api/v1/sky/planet-saturn");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Where an object appears in Earth's sky (RA/Dec, constellation, optional observer view)

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/sky/planet-saturn") as response:
    data = json.load(response)
print(data)

Example response

Example response for Where an object appears in Earth's sky (RA/Dec, constellation, optional observer view)

{
    "name": "Saturn",
    "designation": null,
    "input_datetime": "2026-10-24T16:16:43Z",
    "resolved_from": null,
    "ra_deg": 9.649148822192725,
    "ra_hours": 0.6432765881461816,
    "ra_hms": "00h 38m 36s",
    "dec_deg": 1.2251239448064795,
    "dec_dms": "+01° 13′ 30″",
    "distance_from_earth_au": 8.508323086751851,
    "distance_from_sun_au": 9.432736958479431,
    "elongation_deg": 157.18973619409897,
    "constellation": {
        "abbr": "Cet",
        "name": "Cetus"
    },
    "hemisphere": "equatorial",
    "visible_from": "Visible from both hemispheres.",
    "jd": 2461338.178275463,
    "observer": null,
    "frame": "equatorial J2000, geocentric; alt/az topocentric; two-body propagation",
    "accuracy_note": "Two-body approximation, good to about a degree for the planets — enough to find the constellation and know whether it is up."
}

Try it

ISO date or datetime (UTC); default now

Observer latitude, degrees north

Observer longitude, degrees east

GET Next perihelion JD https://api.publicuniverse.net/api/v1/perihelion/planet-saturn

Parameters

name_or_designation path · string · required

Request

curl example for Next perihelion JD

curl -sS 'https://api.publicuniverse.net/api/v1/perihelion/planet-saturn'

JavaScript example for Next perihelion JD

const response = await fetch("https://api.publicuniverse.net/api/v1/perihelion/planet-saturn");
if (!response.ok) {
  throw new Error("Catalogue request failed (" + response.status + ")");
}
const data = await response.json();
console.log(data);

Python example for Next perihelion JD

import json
from urllib.request import urlopen

with urlopen("https://api.publicuniverse.net/api/v1/perihelion/planet-saturn") as response:
    data = json.load(response)
print(data)

Example response

Example response for Next perihelion JD

{
    "name": "Saturn",
    "designation": null,
    "next_perihelion_jd": 2463588.7513211113,
    "orbital_period_days": 10759.22
}

Try it

Limits and attribution

Rate limits

  • Catalogue routes are limited to 60 requests per minute per IP. A route-specific limit replaces the application default of 60 per minute and 1,000 per day.
  • Night planning, GET /api/v1/observing/night, is limited to 10 requests per minute per IP.
  • The public MCP endpoint allows 60 requests per minute and request bodies up to 64 kB.
  • The MCP tool plan_observing_night is limited to 10 requests per minute.
  • The MCP tool discover_observing_targets is limited to 5 requests per minute.

Attribution

The API software is MIT. https://opensource.org/licenses/MIT solar-system-db

Keep the source cited on each record when you reuse a measurement. Dataset terms are separate from the API software licence.

MCP server

solar-mcp is the public streamable HTTP server at the URL below. It identifies itself to clients as solar-system-db. Connect it with that URL and no API key, no headers and no OAuth client.

Reported version 1.30.0

Queryable catalogue of known solar-system objects for astronomy and science-education use. Bodies: planets, moons, dwarf planets, asteroids, comets, TNOs, centaurs, rings. Data sourced from NASA/JPL and the IAU Minor Planet Center. Use the `search` and `find_objects` tools for discovery; `get_object` for full detail; `compute_position` for two-body orbital propagation. This is an astronomy tool — not astrology. Use list_exoplanets, get_exoplanet, get_exoplanet_host and galaxy_map for NASA Exoplanet Archive data beyond the solar system.

MCP server URL

https://api.publicuniverse.net/mcp

Cursor

  1. Open Cursor Settings → MCP, or create .cursor/mcp.json in a project or ~/.cursor/mcp.json for every project.
  2. Add the server with the URL form Cursor documents for remote streamable HTTP. Leave out headers and auth.
  3. Reload Cursor and confirm the server is connected before asking it to call a tool.

Cursor MCP configuration

{
    "mcpServers": {
        "solar-system-db": {
            "url": "https://api.publicuniverse.net/mcp"
        }
    }
}

Cursor MCP documentation

Grok

Grok reads remote MCP servers from ~/.grok/config.toml. The same URL works with the grok mcp command. Grok can also load a Cursor mcp.json file.

Grok MCP configuration

[mcp_servers.solar-system-db]
url = "https://api.publicuniverse.net/mcp"

Grok MCP command

grok mcp add --transport http solar-system-db https://api.publicuniverse.net/mcp

Grok MCP documentation

Example prompts

  • Search the catalogue for Halley and cite each matching record.
  • Get the full catalogue record for Saturn and name the source of the physical measurements.
  • List Saturn's moons in orbital-distance order.
  • Describe the Geminids from the meteor-shower catalogue, including the parent body.
  • Where does Saturn appear in the sky from latitude 51.5 and longitude -0.1?
  • How many objects are in the catalogue, and when was it last built?

Tools

Names, descriptions and parameters are the read-only tools the server reported. Each one advertises a read-only annotation.

list_starter_targets Bounded bright_star, double_star or deep_sky samples with source licences.

Bounded bright_star, double_star or deep_sky samples with source licences. Static catalogue coordinates, not ephemerides or visibility predictions. Double-star separations have unknown measurement dates; no current companion positions.

  • family
  • q
  • limit
  • offset
get_starter_target Exact source-namespaced starter target identity with original row and provenance.
  • target_id required
list_exoplanets Search NASA confirmed exoplanets by planet/host name, discovery method and distance in parsecs.

Search NASA confirmed exoplanets by planet/host name, discovery method and distance in parsecs. Separate from solar-system find_objects. Composite measurements may mix references; source_data preserves errors, limits, references and mass provenance. catalogue_snapshot associates this page and its count with identity metadata from one SQLite read transaction; it does not pin subsequent pages.

  • q
  • discovery_method
  • max_distance_pc
  • limit
  • offset
get_exoplanet Get an exoplanet by name or stable id, with original archive measurements and references.
  • name required
get_exoplanet_host Get host astrometry, coordinate-frame metadata and its confirmed planets.
  • name required
galaxy_map Measured host-system positions, in parsecs; missing distances are omitted, never guessed.

Measured host-system positions, in parsecs; missing distances are omitted, never guessed. Returns Sun-centred Galactic and Galactocentric coordinates with frame metadata, coverage and truncation counts. Not stellar motion or individual planet ephemerides.

  • max_distance_pc
  • limit
find_objects Filter solar-system objects by type, parent body, size, orbit, and classification.

Filter solar-system objects by type, parent body, size, orbit, and classification. Args: object_type: planet / moon / dwarf_planet / dwarf_planet_candidate / asteroid / comet / tno / centaur. Omit to search all. parent: parent body name or id (e.g. "Jupiter" returns Jupiter's moons). min_radius_km, max_radius_km: physical radius bounds in kilometres. max_eccentricity: orbital eccentricity upper bound. min/max_semi_major_axis_au: orbital semi-major axis bounds in AU. neo: True returns only Near-Earth Objects. pha: True returns only Potentially Hazardous Asteroids. named_only: True excludes provisional-designation-only objects. orbit_class: SBDB orbit class code, e.g. MBA, APO, TNO, or JFc. max_moid_au: maximum Earth minimum-orbit-intersection distance in AU. min_diameter_km: estimated diameter lower bound in kilometres. max_condition_code: maximum orbit uncertainty code, from 0 (best) to 9. discovered_after: earliest discovery date, as an ISO date. after: last object id from the previous page for keyset pagination. limit: 1–1000, default 50. Returns: list of object summaries with key orbital + physical fields.

  • object_type
  • parent
  • min_radius_km
  • max_radius_km
  • max_eccentricity
  • min_semi_major_axis_au
  • max_semi_major_axis_au
  • neo
  • pha
  • named_only
  • orbit_class
  • max_moid_au
  • min_diameter_km
  • max_condition_code
  • discovered_after
  • after
  • limit
get_object Return the full record for one object — orbital + physical + visual

Return the full record for one object — orbital + physical + visual properties, classifications, and provenance. Resolves by exact id, exact name, exact designation, or partial match (e.g. "Halley", "1P/Halley", "Ceres", "(1) Ceres", "Pluto").

  • name_or_designation required
list_moons List all moons of a given planet (or dwarf planet), ordered by orbital

List all moons of a given planet (or dwarf planet), ordered by orbital distance. Example: list_moons("Saturn") returns ~146 moons.

  • planet_name required
list_dwarf_planets List the IAU-recognised dwarf planets (Ceres, Pluto, Eris, Makemake,

List the IAU-recognised dwarf planets (Ceres, Pluto, Eris, Makemake, Haumea). Set include_candidates=True to also include leading candidates (Orcus, Quaoar, Sedna, Gonggong, Salacia).

  • include_candidates
list_neos List Near-Earth Objects, ordered by absolute magnitude H (brightest first).

List Near-Earth Objects, ordered by absolute magnitude H (brightest first). `min_diameter_km` / `max_diameter_km` filter on the estimated diameter.

  • min_diameter_km
  • max_diameter_km
list_periodic_comets List numbered / periodic comets (orbital period < 200 years), ordered by

List numbered / periodic comets (orbital period < 200 years), ordered by period. Includes 1P/Halley, 67P/Churyumov-Gerasimenko, 109P/Swift-Tuttle, etc. `limit` is 1–2000, default 500.

  • limit
list_tnos List trans-Neptunian objects and centaurs, ordered by semi-major axis.

List trans-Neptunian objects and centaurs, ordered by semi-major axis. Includes Pluto's KBO cousins, Sedna, Eris, Quaoar, Chiron, Chariklo, etc. `limit` is 1–2000, default 500.

  • limit
get_rings List the rings of a given planet or dwarf planet, ordered by inner

List the rings of a given planet or dwarf planet, ordered by inner radius. Example: get_rings("Saturn") returns all known Saturn ring components (D, C, B, Cassini Division, A, F, G, E, Phoebe ring).

  • planet_name required
search Free-text search across object names, designations, and discoverers.

Free-text search across object names, designations, and discoverers. Use this when you don't know the exact name — e.g. search("Halley") returns both comet 1P/Halley and asteroid (2688) Halley.

  • query required
  • limit
get_close_approaches Close approaches of one body to the planets or the Moon (JPL CAD + SBDB).

Close approaches of one body to the planets or the Moon (JPL CAD + SBDB). Dates are ISO; `body` filters to e.g. "Earth". Nearest-in-time first.

  • name_or_designation required
  • date_min
  • date_max
  • body
  • limit
find_close_approaches Every catalogued close approach to `body` between two ISO dates, nearest

Every catalogued close approach to `body` between two ISO dates, nearest first. 1 lunar distance ≈ 0.00257 AU. Example: what passes Earth this year?

  • date_min required
  • date_max required
  • body
  • max_dist_au
  • limit
get_discovery Discovery circumstances: date, discoverer(s), site, and the naming

Discovery circumstances: date, discoverer(s), site, and the naming citation where one exists (MPC numbered list + SBDB).

  • name_or_designation required
get_designations Every identifier a body has carried: permanent number, name, provisional

Every identifier a body has carried: permanent number, name, provisional and alternate designations, legacy ids.

  • name_or_designation required
list_meteor_showers List IAU Meteor Data Center showers — one entry per parameter set (a

List IAU Meteor Data Center showers — one entry per parameter set (a shower may have several, from different observation campaigns). `established_only` keeps only showers whose MDC status code is 1 (single established shower, group) or 6 (member of the established group). `active_on` (ISO date, YYYY-MM-DD) keeps only showers whose activity peak (solar longitude) falls within 15 degrees of the Sun's position on that date.

  • established_only
  • active_on
  • limit
get_meteor_shower One IAU Meteor Data Center shower by 3-letter code (e.g. "GEM") or name

One IAU Meteor Data Center shower by 3-letter code (e.g. "GEM") or name (e.g. "Geminids"), case-insensitively — all its parameter sets, plus its parent comet/asteroid when the MDC has linked one.

  • code_or_name required
get_atmosphere Atmosphere of a planet, Pluto or Titan-class body from the NASA fact

Atmosphere of a planet, Pluto or Titan-class body from the NASA fact sheets: surface pressure, temperature, density, scale height, winds and composition by volume.

  • planet required
get_download_info How to download the entire catalogue as one SQLite file: URL, size,

How to download the entire catalogue as one SQLite file: URL, size, SHA-256, build date, row counts, enrichment coverage and licence.

compute_position Compute the heliocentric ecliptic position (J2000) of an object at a

Compute the heliocentric ecliptic position (J2000) of an object at a given date by Keplerian two-body propagation. Args: name_or_designation: any object that has stored orbital elements. date: ISO 8601 date or datetime (e.g. "2027-04-15" or "2027-04-15T12:00:00Z"). Returns x/y/z in AU plus radius, true anomaly, and an accuracy note. For arcsecond precision use the JPL Horizons API directly — this is intended for general astronomy, planetarium-style visualisations, and educational use.

  • name_or_designation required
  • date required
plan_observing_night Geometric body/catalogue windows for one local noon-to-noon night.

Geometric body/catalogue windows for one local noon-to-noon night. Uses the configured labelled offline provider (builtin or pinned local JPL). UTC event times, timezone/DST boundaries, model and IERS coverage are explicit. Optional user-entered horizon is circularly interpolated; it is not surveyed terrain. Optional paired exact UTC window times must lie inside the local night. Weather is not included. Targets are comma-separated supported planets, moon or exact pinned bsc5p:/openngc: IDs (eight combined). Catalogue directions have no distance/parallax; verified BSC angular proper motion or static OpenNGC ICRS is labelled per target. Sun/Earth excluded. No visibility guarantee.

  • date required
  • timezone required
  • lat required
  • lon required
  • targets
  • min_altitude_deg
  • sun_altitude_deg
  • min_moon_separation_deg
  • window_start_utc
  • window_end_utc
  • horizon_mask
discover_observing_targets Explicit bounded target discovery, not all-sky or guaranteed visibility.

Explicit bounded target discovery, not all-sky or guaranteed visibility. Chooses from the reviewed packaged starter sample plus Moon/seven planets. Equipment naked_eye/binocular/telescope changes explained editorial family preferences; no aperture/detection limit is inferred. Optional catalogue V cut excludes unknown/non-V values explicitly. Twenty-minute screening can miss short windows; only up to eight selections receive refined planning. No weather or storage writes. Exact source/provider identities are retained.

  • date required
  • timezone required
  • lat required
  • lon required
  • equipment_mode required
  • preference
  • true_field_deg
  • max_catalogue_v_magnitude
  • shortlist_limit
  • min_altitude_deg
  • sun_altitude_deg
  • min_moon_separation_deg
  • window_start_utc
  • window_end_utc
  • horizon_mask
get_sky_position Where an object appears in Earth's sky: RA/Dec (J2000), constellation,

Where an object appears in Earth's sky: RA/Dec (J2000), constellation, hemisphere, distance from Earth and elongation from the Sun. Args: name_or_designation: any planet, dwarf planet, asteroid, comet or moon (other moons report a parent-body proxy; Earth's Moon is unavailable in this legacy endpoint), or "sun". date: ISO 8601 date or datetime, UTC. Defaults to now. lat, lon: observer's latitude (north-positive) and longitude (east-positive) in degrees. Give both to add altitude/azimuth, whether it is above the horizon after dark, and rise/transit/set for that day. Two-body accuracy (about a degree for the planets) — enough to name the constellation and say whether it is up; use JPL Horizons for precision.

  • name_or_designation required
  • date
  • lat
  • lon
next_perihelion Return the next perihelion passage (closest approach to the Sun) of an

Return the next perihelion passage (closest approach to the Sun) of an object as a Julian Date. Two-body Kepler estimate — fine for periodic comets and minor planets over short look-aheads. Long-period comets and bodies in mean-motion resonance may drift; use JPL Horizons for mission-planning precision.

  • name_or_designation required
get_catalogue_identity Return finalized logical/build identifiers and recorded source provenance.

Return finalized logical/build identifiers and recorded source provenance. Unknown for older, partially built or modified files. An ID does not promise that historical snapshots remain hosted; keep a verified exported file.

list_object_types List the object_type values present in the catalogue and how many rows

List the object_type values present in the catalogue and how many rows each has. Useful as a sanity-check on coverage.

get_sources Return the upstream data sources used to populate the catalogue,

Return the upstream data sources used to populate the catalogue, summarised by source name and last-retrieved timestamp. Sources are NASA Planetary Fact Sheets, JPL Solar System Dynamics, JPL Small-Body Database, and the IAU Minor Planet Center (via SBDB).

get_schema Return the SQLite schema (DDL) for the catalogue, including views.

Return the SQLite schema (DDL) for the catalogue, including views. Useful if you want to write your own queries against a local copy of data/solar_system.sqlite.

get_stats Catalogue statistics: total objects, counts by object_type, and the

Catalogue statistics: total objects, counts by object_type, and the timestamp of the most recent build.

Resources

  • solar-system://schema

    The SQLite schema, exposed as a resource.

  • solar-system://catalog-stats

    Catalogue statistics, exposed as a resource (JSON).

MCP server README · Plugin setup guide