# Sentinel-5P nitrogen dioxide (TROPOMI)

The TROPOMI instrument on the Sentinel-5P satellite measures every day how much nitrogen dioxide (NO₂) hangs over the whole earth, in cells of 3.5 by 5.5 km. TROPOMI was built in the Netherlands, by Airbus Netherlands, TNO and SRON, with KNMI leading the consortium.

- Publisher: Copernicus, European Space Agency
- Area: World · Finest detail: 3.5 × 5.5 km
- Period: 2018 – heden · Refreshed: daily
- Access: Account · Licence: Vrij gebruik (Copernicus)
- Join keys: coördinaten, opnametijd, baannummer
- Status: ok (2026-10-16) · NRTI 20261016T122254
- URL: https://dataspace.copernicus.eu

## What can you do with it?
- **A map of the pollution.** Average a month of passes over the Netherlands and Belgium. Cities, ports and motorways show up as patches.
- **Weekday versus weekend.** Compare the average of all Tuesdays with that of all Sundays. The difference says something about traffic and industry.
- **Covid spring 2020.** Put April 2020 next to April 2019 and 2021. Mind the weather, because wind and clouds change the numbers too.
- **Satellite versus monitoring station.** Compare the column value over a Luchtmeetnet station with the ground measurement. They don't measure the same thing, but the patterns should match.

## How to process it
1. **Find passes over the Netherlands.** The fast version (NRTI) comes in five-minute pieces with their own box: filtering on bbox works well.
   `https://stac.dataspace.copernicus.eu/v1/collections/sentinel-5p-l2-no2-nrti/items?bbox=3.2,50.7,7.3,53.6&sortby=-datetime&limit=3&fields=id,properties.datetime`
2. **Use the offline version for analysis.** OFFL is better processed and arrives a few days later. One file is a whole orbit (about 600 MB), so search by date: on 20 September 2026 there were fifteen.
   `https://stac.dataspace.copernicus.eu/v1/collections/sentinel-5p-l2-no2-offl/items?datetime=2026-09-20T00:00:00Z/2026-09-20T23:59:59Z&limit=20&fields=id,properties.datetime`
3. **Download with an account.** Each search result has a download link on the Copernicus Data Space. You need a free account and an access token for it.
   `https://documentation.dataspace.copernicus.eu/APIs/OData.html`
4. **Filter on quality.** Open the NetCDF with xarray (group PRODUCT) and use nitrogendioxide_tropospheric_column, in mol per m². Keep only pixels with qa_value above 0.75.

## Interesting combinations
- Does the satellite see what the station sees? → [luchtmeetnet](https://www.opendataindex.nl/en/bron/luchtmeetnet.md) via coördinaten en datum. Take the pixel over a station each day and the station measurement around the time of the pass.
- Which municipality has the most NO₂ above it? → [pdok-wijkenbuurten](https://www.opendataindex.nl/en/bron/pdok-wijkenbuurten.md) via geometrie. Average the pixels per municipal boundary. The cells are too coarse for neighbourhoods.

## Similar sources
- [luchtmeetnet](https://www.opendataindex.nl/en/bron/luchtmeetnet.md): Measurements at breathing height, hourly, but only at about a hundred places.
- [copernicus-cams](https://www.opendataindex.nl/en/bron/copernicus-cams.md): A model with a four-day forecast, also when it is cloudy.
- [TEMIS, troposferisch NO₂](https://www.temis.nl/airpollution/no2.php): Ready-made NO₂ maps and files from satellite measurements, without an account.

## What to watch out for
- **A column, not street-level air quality.** The satellite measures all NO₂ between the ground and the top of the troposphere, in mol per m². That is not the same as micrograms per m³ at breathing height.
- **Clouds and quality.** TROPOMI sees little under clouds. Use only pixels with qa_value above 0.75 and average over weeks or months.
- **Searching by place doesn't work for OFFL.** An OFFL file is a whole orbit with a box around the whole earth. Every bbox search therefore finds every orbit. Filter by date, or use NRTI.
- **Large files.** An OFFL orbit is about 600 MB, a five-minute NRTI piece about 67 MB. You always download the whole file.
- **Account needed to download.** Searching the catalogue works without an account. The download returns a 401 without a token.

## API (STAC 1.1.0)

- Base: https://stac.dataspace.copernicus.eu/v1
- Access: Searching is anonymous. The files themselves require s3 (s3) or oidc (openIdConnect) (stated in the collection). (from the description)
- Formats: GeoJSON (zoekresultaten)
- Filtering: CQL2 (text or JSON) on the queryables; id, datetime, geometry

### Endpoints
- `GET /collections/sentinel-5p-l2-no2-nrti/items`: scenes in this collection, with bbox, datetime, limit
- `GET/POST /search`: search across collections, with filter (CQL2), sortby and fields
- `GET /collections/sentinel-5p-l2-no2-nrti/queryables`: filterable fields

### Parameters
- `bbox`: lon/lat box: west,south,east,north (platform)
- `datetime`: date or period, e.g. 2026-06-01/2026-08-31 (platform)
- `limit`: per page; next via link rel=next (platform)
- `sortby`: sorting, e.g. -datetime (newest first) (from the description)
- `filter`: CQL2 filter on the queryables, e.g. eo:cloud_cover < 10 (from the description)
- `fields`: return only these fields (from the description)

### Limits and pitfalls
- Filtering is only possible on id, datetime and geometry (queryables); there is no cloud field to search on (15 Oct 2026). (tested)
- Three versions as separate collections: -nrti (within 3 hours, 5-minute pieces), -offl (a few days later, whole orbits) and -rpro (reprocessed). The sentinel-5p-l2-no2 collection mixes them. (from the description)
- Measured on 15 Oct 2026: the newest NRTI pass over Amsterdam (12:42 UTC) was in the catalogue 45 minutes later; the newest OFFL orbit was from 6 October. (tested)

### Example
```
https://stac.dataspace.copernicus.eu/v1/collections/sentinel-5p-l2-no2-nrti/items?bbox=3.2,50.7,7.3,53.6&sortby=-datetime&limit=3&fields=id,properties.datetime
```

## How to fetch it

### curl
```bash
curl "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-5p-l2-no2-nrti/items?bbox=4.7,52.2,5.1,52.5&sortby=-datetime&limit=5&fields=id,properties.datetime"
```

### python
```python
import requests

url = "https://stac.dataspace.copernicus.eu/v1/collections/sentinel-5p-l2-no2-offl/items"
r = requests.get(url, params={"datetime": "2026-09-20T00:00:00Z/2026-09-20T23:59:59Z",
                              "limit": 20}).json()
for f in r["features"]:
    print(f["properties"]["datetime"], f["assets"]["Product"]["alternate"]["https"]["href"])
```

## Who uses it
- [TROPOMI](https://www.tropomi.eu/data-products/nitrogen-dioxide): Explanation, validation and examples of the NO₂ product
- [Copernicus Browser](https://browser.dataspace.copernicus.eu): Search and view images in the browser


## Examples with real figures (1)

For each example the finding, the reference date and the call that fetches exactly these figures.

- **Nitrogen dioxide over the Netherlands on 20 March 2025: dark red from The Hague to beyond Amsterdam, measured by Sentinel-5P** (20 maart 2025). Table TROPOMI_L2_Nitrogen_Dioxide_Tropospheric_Column. [Example](https://www.opendataindex.nl/en/voorbeeld/s5p-no2-nederland-20-maart-2025)
  - `https://gibs.earthdata.nasa.gov/wms/epsg3857/best/wms.cgi?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&LAYERS=OSM_Land_Water_Map,TROPOMI_L2_Nitrogen_Dioxide_Tropospheric_Column,Coastlines_15m&STYLES=&CRS=EPSG:3857&BBOX=289431,6550841,846028,7113543&WIDTH=900&HEIGHT=910&FORMAT=image/png&TIME=2025-03-20`
