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.
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 'https://exoplanetarchive.ipac.caltech.edu/TAP/sync?query=select+top+3+pl_name,hostname,disc_year,discoverymethod+from+ps&format=json'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);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())[
{
"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
| Parameter | Type | Required | Description |
|---|---|---|---|
query | query | Required | The ADQL statement. Use `SELECT TOP n`, not `LIMIT` — this is ADQL, not MySQL. select top 3 pl_name,hostname from ps |
format | query | Optional | `json`, `csv`, `tsv`, `votable` or `xml`. Defaults to VOTable. json |
(table) ps | table name | Optional | Planetary Systems: one row per published parameter set per planet. Filter `default_flag=1` for the preferred solution. ps |
(table) pscomppars | table name | Optional | Planetary Systems Composite Parameters: exactly one pre-assembled row per planet. pscomppars |
(endpoint) /sync vs /async | path | Optional | `/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
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
JSON to CSV Converter
Convert a JSON array of objects to CSV online. Automatic column headers from the union of all keys, delimiter choice and proper quoting — all in-browser.
SQL Formatter
Format SQL online: uppercase keywords, new lines before SELECT, FROM, WHERE and JOIN, indented AND/OR conditions. One-line minify included. Free and private.
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.