Python wrapper for NASA APIs
Project description
nasa-apis-wrapper
Disclaimer: This is an unofficial, community-maintained Python wrapper. It is not affiliated with, endorsed by, or in any way connected to NASA.
A typed Python wrapper for NASA's public APIs, built on Pydantic v2 and requests. Every response is a validated model with IDE autocompletion — no raw dicts.
Installation
pip install nasa-apis-wrapper
Requires Python 3.12+.
API Key
Most NASA APIs accept a free API key from api.nasa.gov. Without one you can use the demo key DEMO_KEY, which has stricter rate limits (30 requests/hour, 50/day).
Pass the key when constructing any service that requires it:
from nasa_apis_wrapper import APODService
apod = APODService(api_key="YOUR_KEY_HERE")
Services that don't require a key (EONET, EPIC, Exoplanet, GIBS, Image Library, CNEOS, SSC, OSDR, Trek) are instantiated without arguments.
API Coverage
| Service | Class | API Key | Status |
|---|---|---|---|
| Astronomy Picture of the Day | APODService |
Required | ✓ |
| Asteroids — NeoWs | NeoWsService |
Required | ✓ |
| DONKI (space weather) | DonkiService |
Required | ✓ |
| Earth imagery | EarthService |
Required | ✗ Backend down |
| EONET (natural events) | EONETService |
No | ✓ |
| EPIC (Earth polychromatic imaging) | EPICService |
No | ✓ |
| Exoplanet Archive | ExoplanetService |
No | ✓ |
| GIBS (satellite imagery tiles) | GIBSService |
No | ✓ |
| NASA Image & Video Library | ImageLibraryService |
No | ✓ |
| InSight Mars weather | InsightService |
Required | ✓ (data frozen Dec 2022) |
| Mars Rover Photos | MarsRoverService |
Required | ✗ Backend down |
| OSDR (space biology data) | OSDRService + RadLabService + BioDataService |
No | ✓ |
| SSD/CNEOS (small bodies) | CNEOSService |
No | ✓ |
| Satellite Situation Center | SSCService |
No | ✓ |
| TechPort (NASA projects) | TechportService |
No | ✗ 403 Forbidden |
| TechTransfer | TechTransferService |
Required | ✗ 404 Endpoint removed |
| TLE (orbital elements) | TLEService |
No | ✗ Service down |
| Vesta/Moon/Mars Trek WMTS | TrekService |
No | ✓ (tile endpoints only) |
Usage
APOD — Astronomy Picture of the Day
from nasa_apis_wrapper import APODService, APODRequest
apod = APODService(api_key="YOUR_KEY")
# Today's picture
pic = apod.get_astronomy_picture_of_day()
print(pic.title, pic.url)
# Specific date
pic = apod.get_astronomy_picture_of_day(APODRequest(date="2024-01-01"))
# Random batch
pics = apod.get_astronomy_pictures(APODRequest(count=5))
# Date range
pics = apod.get_astronomy_pictures(APODRequest(start_date="2024-01-01", end_date="2024-01-07"))
NeoWs — Near Earth Objects
from nasa_apis_wrapper import NeoWsService, NeoFeedRequest
neows = NeoWsService(api_key="YOUR_KEY")
feed = neows.feed(NeoFeedRequest(start_date="2024-01-01", end_date="2024-01-07"))
print(feed.element_count, "NEOs this week")
neo = neows.lookup(2000433) # 433 Eros by SPK-ID
print(neo.name, neo.is_potentially_hazardous_asteroid)
page = neows.browse() # paginated full catalogue
DONKI — Space Weather
from nasa_apis_wrapper import DonkiService, GenericDonkiRequest, DonkiIPSRequest
donki = DonkiService(api_key="YOUR_KEY")
req = GenericDonkiRequest(startDate="2024-01-01", endDate="2024-01-31")
cmes = donki.cme(req) # Coronal Mass Ejections
flares = donki.flr(req) # Solar Flares
storms = donki.gst(req) # Geomagnetic Storms
particles = donki.sep(req) # Solar Energetic Particles
streams = donki.hss(req) # High Speed Streams
shocks = donki.ips(DonkiIPSRequest(startDate="2024-01-01", endDate="2024-01-31"))
simulations = donki.wsa_enlil_simulation(req)
EONET — Natural Events
from nasa_apis_wrapper import EONETService, EONETEventsRequest
eonet = EONETService()
events = eonet.events(EONETEventsRequest(category="wildfires", days=30))
for e in events.events:
print(e.id, e.title)
categories = eonet.categories()
layers = eonet.layers("wildfires")
EPIC — Earth Polychromatic Imaging Camera
from nasa_apis_wrapper import EPICService
epic = EPICService()
images = epic.images() # latest natural colour
images = epic.images("enhanced") # latest enhanced
images = epic.images("natural", date="2024-01-15")
for img in images:
url = epic.image_url(img, "natural", "png")
print(img.date, url)
dates = epic.available_dates()
Exoplanet Archive
from nasa_apis_wrapper import ExoplanetService
exo = ExoplanetService()
planets = exo.confirmed_planets(limit=10)
transits = exo.planets_by_method("Transit", limit=5)
trappist = exo.planet("TRAPPIST-1 b")
print(trappist.pl_name, trappist.hostname, trappist.pl_orbper)
# Raw ADQL query
rows = exo.query("SELECT TOP 5 pl_name, hostname, disc_year FROM pscomppars")
GIBS — Global Imagery Browse Services
Serves NASA satellite imagery tiles (WMTS/WMS).
from nasa_apis_wrapper import GIBSService
gibs = GIBSService()
# Build tile/WMS URLs
url = gibs.tile_url("MODIS_Terra_CorrectedReflectance_TrueColor", "250m", 3, 2, 5, date="2024-01-15")
wms = gibs.wms_url("MODIS_Terra_CorrectedReflectance_TrueColor", "-180,-90,180,90", 512, 256, date="2024-01-15")
# Download tile bytes
tile_bytes = gibs.get_tile("MODIS_Terra_CorrectedReflectance_TrueColor", "250m", 0, 0, 0, date="2024-01-15")
domains = gibs.describe_domains("MODIS_Terra_CorrectedReflectance_TrueColor", "250m")
print(domains.start_date, domains.end_date)
NASA Image & Video Library
from nasa_apis_wrapper import ImageLibraryService, ImageLibrarySearchRequest
lib = ImageLibraryService()
results = lib.search(ImageLibrarySearchRequest(q="Apollo 11", media_type="image", page_size=10))
print(results.collection.metadata.total_hits, "results")
for item in results.collection.items:
print(item.metadata.nasa_id, item.metadata.title)
print(item.thumbnail) # preview URL
asset = lib.asset("as11-40-5931")
print(asset.urls) # all rendition URLs
album = lib.album("Apollo-at-50")
SSD/CNEOS — Small Body Database
from nasa_apis_wrapper import CNEOSService, FireballRequest, CADRequest
cneos = CNEOSService()
fireballs = cneos.fireballs(FireballRequest(date_min="2024-01-01"))
for fb in fireballs.records:
print(fb.date, fb.energy)
cad = cneos.close_approaches(CADRequest(date_min="2024-01-01", dist_max="0.05"))
for c in cad.records:
print(c.des, c.cd, c.dist)
body = cneos.object(sstr="ceres") # by name
body = cneos.object(des="433") # by designation
sentry = cneos.sentry_summary() # impact risk objects
nhats = cneos.nhats_summary() # human-accessible NEOs
cal = cneos.jd_to_date(2451545.0)
print(cal.cd) # "2000-01-01 12:00:00"
SSC — Satellite Situation Center
from nasa_apis_wrapper import SSCService
ssc = SSCService()
observatories = ssc.observatories()
iss = ssc.observatories(id="iss")[0]
print(iss.Id, iss.Name)
stations = ssc.ground_stations()
OSDR — Open Science Data Repository
Three sub-services under the OSDR umbrella:
from nasa_apis_wrapper import OSDRService, OSDRSearchRequest, RadLabService, RadLabRequest, BioDataService
# Search space biology studies
osdr = OSDRService()
results = osdr.search(OSDRSearchRequest(term="microgravity"))
print(results.hits.total, "studies")
for hit in results.hits.hits:
print(hit.source.accession, hit.source.study_title)
files = osdr.study_files("OSD-48")
# Radiation measurements
radlab = RadLabService()
measurements = radlab.measurements(RadLabRequest(instrument="TEPC"))
for m in measurements:
print(m.timestamp, m.instrument_id)
# Biological data
bio = BioDataService()
datasets = bio.datasets() # {accession: url}
assays = bio.assays("OSD-48")
samples = bio.samples("OSD-48", assays[0])
Trek WMTS — Vesta / Moon / Mars
from nasa_apis_wrapper import TrekService
trek = TrekService()
# Build tile/WMS URLs (body = "mars", "moon", or "vesta")
tile_url = trek.tile_url("mars", "Mars_Viking_MDIM21_ClrMosaic_global_232m", 0, 0, 0)
wms_url = trek.wms_url("moon", "LRO_WAC_Mosaic_Global_303m", "-180,-90,180,90", 512, 256)
# Download tile bytes
tile = trek.get_tile("mars", "Mars_Viking_MDIM21_ClrMosaic_global_232m", 0, 0, 0)
InSight — Mars Weather
Data from the InSight lander. The mission ended in December 2022 — the last 7 sols (675–681) are always returned.
from nasa_apis_wrapper import InsightService
insight = InsightService(api_key="YOUR_KEY")
weather = insight.weather()
for sol in weather.sol_keys:
data = getattr(weather, sol)
print(f"Sol {sol}: {data}")
Error Handling
All network errors, HTTP errors, and malformed responses raise NasaAPIException:
from nasa_apis_wrapper import APODService, NasaAPIException
try:
apod = APODService(api_key="INVALID_KEY")
pic = apod.get_astronomy_picture_of_day()
except NasaAPIException as e:
print(e)
Development
uv run pytest
uv run pytest --cov --cov-report term-missing
uv run black nasa_apis_wrapper tests
License
MIT — see LICENSE.
Official documentation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nasa_apis_wrapper-0.2.0.tar.gz.
File metadata
- Download URL: nasa_apis_wrapper-0.2.0.tar.gz
- Upload date:
- Size: 133.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
14d42945bcebaf7b6f1ccac0da6cf9734cbd807c8aeaf1e3406411d846819762
|
|
| MD5 |
2f35503e60b1e886c468f7bee05d8769
|
|
| BLAKE2b-256 |
a20ea5581a7deb0734a80a27a6777e0a60d6acaa6c4991edca45c8048c7a6dfe
|
File details
Details for the file nasa_apis_wrapper-0.2.0-py3-none-any.whl.
File metadata
- Download URL: nasa_apis_wrapper-0.2.0-py3-none-any.whl
- Upload date:
- Size: 91.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7078d17db482271602749396be5f971981c017dcea9061bb1275efea2289f67a
|
|
| MD5 |
1e01fbd0fd85b110228b212f12a3ed11
|
|
| BLAKE2b-256 |
92f2c884d8928319803e700141991057ea60843e9708e7fb740717190f044e91
|