Computational Epidemiology Est. 2011 · 28 countries
← All projects

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

MetricSourceNative resolutionCadence
PM2.5ACAG 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 tempMODIS MOD11A2.061 (Wan et al., 2021)1 kmMonthly (from 8-day composites)
Air temp (2m)ERA5-Land monthly means (Copernicus CDS)0.1°Monthly
Drought (PDSI)TerraClimate (Abatzoglou et al., 2018)~4 kmMonthly; coverage gaps in monsoon/arid climates
Drought (SPEI-12)Computed from ERA5-Land via Thornthwaite PET0.1°Monthly; global, no PDSI-style gaps
PopulationLandScan Global (ORNL)30 arc-secAnnual

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.