BYTETOOLS

NASA Exoplanet Archive API

Free NASA Exoplanet Archive TAP API with no key: query 5,000+ confirmed exoplanets and their host stars with SQL-like ADQL, returning JSON, CSV or VOTable.

No API key requiredHTTPSFree tier

Endpoint tested and returned HTTP 200 on 2026-08-21

What is the NASA Exoplanet Archive API?

The NASA Exoplanet Archive TAP service is a free, key-free endpoint that runs SQL-like ADQL queries against the archive's tables of confirmed exoplanets, planetary systems, stellar hosts and transit observations, returning JSON, CSV, VOTable or XML.

The Exoplanet Archive is the authoritative catalogue of confirmed exoplanets, curated at Caltech under a NASA contract, and its TAP interface is a genuine relational query surface rather than a set of fixed endpoints. You write ADQL — a constrained SQL dialect standardised by the International Virtual Observatory Alliance — and select exactly the columns and rows you need. That means no paging logic, no over-fetching, and aggregate queries like counting planets by discovery method in a single request.

The table you almost always want is `ps`, the Planetary Systems table, where each row is one published parameter set for one planet — so a well-studied planet appears several times, once per paper. Filter on `default_flag=1` to get the archive's preferred solution per planet, or use `pscomppars`, which holds exactly one pre-assembled row per planet. Getting that distinction wrong is the classic beginner error and inflates planet counts substantially. Note also that ADQL uses `SELECT TOP n`, not `LIMIT n`.

Quick facts

Base URL
https://exoplanetarchive.ipac.caltech.edu/TAP
Authentication
No API key or account. NASA Exoplanet Archive data is publicly available; the archive requests an acknowledgement in publications.
Rate limit
No published limit for synchronous queries, but the `/sync` endpoint has a server-side timeout. Long or heavy queries should use the `/async` endpoint, which returns a job you poll.
Pricing
Free, with no registration.
CORS
Not enabled — call it from your server
Official docs
Read the docs

How to use the NASA Exoplanet Archive API

Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.

1. Select three exoplanets with host star and discovery method

GET https://exoplanetarchive.ipac.caltech.edu/TAP/sync?query=select+top+3+pl_name,hostname,disc_year,discoverymethod+from+ps&format=json

curl
curl 'https://exoplanetarchive.ipac.caltech.edu/TAP/sync?query=select+top+3+pl_name,hostname,disc_year,discoverymethod+from+ps&format=json'
JavaScript (fetch)
const res = await fetch("https://exoplanetarchive.ipac.caltech.edu/TAP/sync?query=select+top+3+pl_name,hostname,disc_year,discoverymethod+from+ps&format=json");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);
Python (requests)
import requests

res = requests.get("https://exoplanetarchive.ipac.caltech.edu/TAP/sync?query=select+top+3+pl_name,hostname,disc_year,discoverymethod+from+ps&format=json", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200
[
  {
    "pl_name": "Kepler-317 c",
    "hostname": "Kepler-317",
    "disc_year": 2014,
    "discoverymethod": "Transit"
  },
  {
    "pl_name": "Kepler-1513 b",
    "hostname": "Kepler-1513",
    "disc_year": 2016,
    "discoverymethod": "Transit"
  },
  {
    "pl_name": "HAT-P-45 b",
    "hostname": "HAT-P-45",
    "disc_year": 2014,
    "discoverymethod": "Transit"
  }
]

Parameters

ParameterTypeRequiredDescription
queryqueryRequiredThe ADQL statement. Use `SELECT TOP n`, not `LIMIT` — this is ADQL, not MySQL. select top 3 pl_name,hostname from ps
formatqueryOptional`json`, `csv`, `tsv`, `votable` or `xml`. Defaults to VOTable. json
(table) pstable nameOptionalPlanetary Systems: one row per published parameter set per planet. Filter `default_flag=1` for the preferred solution. ps
(table) pscompparstable nameOptionalPlanetary Systems Composite Parameters: exactly one pre-assembled row per planet. pscomppars
(endpoint) /sync vs /asyncpathOptional`/sync` returns results inline; `/async` submits a job for long queries and returns a pollable URL. /sync

Response fields

pl_namestring
Planet name in the archive's canonical form, such as `Kepler-317 c`.
hostnamestring
Host star name. Join on this to group planets into systems.
disc_yearinteger
Year the discovery was published.
discoverymethodstring
Detection technique — `Transit`, `Radial Velocity`, `Microlensing`, `Imaging` and others. Strongly biases which planets exist in the catalogue.
default_flaginteger
In the `ps` table, 1 marks the archive's preferred parameter set for that planet. Essential when counting.
(any column)varies
The response is a plain JSON array of objects whose keys are exactly the columns you selected.

What you can build with the NASA Exoplanet Archive API

  • Count confirmed exoplanets by discovery method or year
  • Fetch orbital and physical parameters for a named planet
  • Build a filterable exoplanet catalogue for a website
  • Find planets in the habitable zone by querying insolation columns
  • Cross-match exoplanet hosts against a stellar catalogue

Common errors and how to fix them

Syntax error mentioning LIMIT

ADQL does not support `LIMIT`.

Fix: Use `SELECT TOP n column FROM table`. This trips up almost everyone arriving from SQL.

Duplicated planets in results

The `ps` table holds one row per published parameter set.

Fix: Add `WHERE default_flag=1`, or query `pscomppars`, which is already one row per planet.

Empty result for a planet you know exists

Name formatting differs from the archive's canonical form.

Fix: Match with `LIKE` or query on `hostname` — the archive uses specific spacing and letter conventions for planet names.

Timeout on /sync

The query was too heavy for the synchronous endpoint.

Fix: Resubmit against `/async`, which queues the job and gives you a URL to poll for the completed result.

NASA Exoplanet Archive API — frequently asked questions

Is the NASA Exoplanet Archive API free?

Yes, free and key-free. The archive asks that publications acknowledge it, which is a courtesy rather than a licence condition.

What is the difference between the ps and pscomppars tables?

`ps` contains one row per published parameter set, so a planet studied five times has five rows. `pscomppars` contains exactly one composite row per planet, assembled by the archive from the best available measurements. Use `pscomppars` for counting and `ps` when you care about provenance.

What query language does the archive use?

ADQL, the Astronomical Data Query Language, which is SQL-like but standardised by the IVOA. The main practical differences are `SELECT TOP n` instead of `LIMIT`, plus astronomy-specific geometry functions for cone searches.

How do I run a query too big for a single response?

Submit it to the `/async` endpoint instead of `/sync`. That creates a job, returns a URL, and you poll until the result is ready — the standard TAP pattern for long-running queries.

Tools that pair with this API

NASA Exoplanet Archive is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.