ExposureAPI
Submit a GeoJSON polygon, get back satellite-derived environmental exposure for the area inside it: PM2.5, greenspace (NDVI), land surface temperature, air temperature, and drought (SPEI-12 or PDSI), with a citable methods paragraph and DOI attached. Built for environmental-epi researchers who need exposure estimates without managing raster pipelines themselves.
Access
This is a real, live API — there's no self-serve signup yet, so access is by request. Email me with your use case (study area, polygon count, date range, which metrics you need) and I'll set you up with a username and key. I'm prioritizing academic researchers right now, since that's where I can be most useful fastest — but if you're evaluating this for a commercial use case, say so and I'll tell you honestly whether it's ready for that yet.
Data sources
| Metric | Source | Native resolution | Cadence |
|---|---|---|---|
| PM2.5 | ACAG SatPM2.5 V6.GL.02.04 (van Donkelaar et al., 2021) | 0.01° | Annual, 1998–2023 |
| NDVI (greenness) | MODIS MOD13C3.061 (Didan, 2015) | 0.05° | Monthly |
| Land surface temp | MODIS MOD11A2.061 (Wan et al., 2021) | 1 km | Monthly (from 8-day composites) |
| Air temp (2m) | ERA5-Land monthly means (Copernicus CDS) | 0.1° | Monthly |
| Drought (PDSI) | TerraClimate (Abatzoglou et al., 2018) | ~4 km | Monthly; coverage gaps in monsoon/arid climates |
| Drought (SPEI-12) | Computed from ERA5-Land via Thornthwaite PET | 0.1° | Monthly; global, no PDSI-style gaps |
| Population | LandScan Global (ORNL) | 30 arc-sec | Annual |
Every response includes a provenance block naming the exact source per
metric and a methods field with a ready-to-cite paragraph, so you don't
need this table in your own methods section — you can quote the response directly.
Quickstart
One endpoint, POST /v1/evaluate, dispatched by an action field
in the request body. ping is unauthenticated; everything else needs a username and key issued when you request access.
New projects go through two steps: create, then poll until ready.
1. Create a project — submit your polygon(s) as a GeoJSON FeatureCollection:
{
"username": "your-username",
"key": "your-key",
"action": "evaluate-exposure",
"payload": {
"project_id": "my-study-area",
"json_obj": {
"type": "FeatureCollection",
"features": [
"…your polygons…"
]
},
"year_start": 2015,
"year_end": 2022,
"skus": [
"pm25",
"ndvi",
"lst",
"t2m",
"spei"
]
}
} Returns 202 immediately with a status message and an estimated wait time while the data populates in the background.
2. Poll for readiness:
{
"username": "your-username",
"key": "your-key",
"action": "get-project-status",
"payload": {
"project_id": "my-study-area"
}
} Returns status: "initializing" until initialized_at is set, then status: "ready".
3. Retrieve results — call evaluate-exposure again with the same project_id:
{
"project_id": "my-study-area",
"year_start": 2015,
"year_end": 2022,
"skus": [
"pm25",
"ndvi",
"lst",
"t2m",
"spei"
],
"metrics": [
{
"name": "my-study-area",
"year": 2022,
"pm25_mean": 18.4,
"pm25_pop_mean": 19.1,
"population": 708316
}
],
"metrics_monthly": [
{
"name": "my-study-area",
"year": 2022,
"month": 4,
"ndvi_mean": 0.42,
"lst_mean": 24.6,
"t2m_mean": 15.2,
"spei": -1.1
}
],
"provenance": {
"pm25_source": "ACAG SatPM2.5 V6.GL.02.04",
"ndvi_source": "MODIS MOD13C3.061 (NASA LP DAAC)"
},
"methods": "Annual mean PM2.5 concentrations (µg/m³) were extracted from the ACAG SatPM2.5 V6.GL.02.04 dataset…",
"citations": [
"van Donkelaar, A. et al. (2021)…",
"Kishore, N. (2026). ExposureAPI v2.0.0…"
]
}What's not there yet
Being direct about this rather than finding out the hard way: there's no uncertainty or confidence interval returned alongside each estimate yet, only the point value and its source citation. There's no self-serve signup — access is provisioned by hand, by email. And this runs on infrastructure I manage myself, not a monitored production SLA — fine for research use today, not yet what I'd hand a paying commercial client without a conversation first about what that would take.