# Amsterdam tree register

Every tree managed by the City of Amsterdam, each as a point on the map: species, height class, planting year, location type and whether it is a monumental tree. On 15 October 2026 it held 326,279, including 42,008 elms.

- Publisher: Gemeente Amsterdam
- Area: Amsterdam · Finest detail: tree
- Period: actuele stand · Refreshed: daily
- Access: Open · Licence: Openbaar (geen standaardlicentie)
- Join keys: boom-id, buurt, coördinaten
- Status: ok (2026-10-15) · 326.324 bomen
- URL: https://api.data.amsterdam.nl/v1/docs/datasets/bomen.html

## What can you do with it?
- **Which trees stand in your street?.** Find all trees within 250 metres of a point, with species, height and planting year. In Vondelpark this turns up an oak from 1822.
- **The city of the elm.** Count by species. The register holds 42,008 elms, 28,493 maples and 28,370 limes. Map them per neighbourhood.
- **How old is the greenery per neighbourhood?.** Compute the median planting year per neighbourhood. Leave out trees with planting year 0 or empty, which is over 41,000.
- **Felled and replanted.** The kapenherplant table in the same dataset (36,503 rows) tracks felling and replanting per tree. Join on boomId to the main tree data.

## How to process it
1. **Search around a point.** With geometrie[within]=lat,lon,metres you get all trees in a radius. Without Accept-Crs the API tells from the values whether they are degrees or RD coordinates.
   `https://api.data.amsterdam.nl/v1/bomen/stamgegevens/?geometrie[within]=52.3580,4.8686,250&jaarVanAanleg[gt]=0&_fields=id,soortnaamTop,jaarVanAanleg,boomhoogteklasseActueel&_sort=jaarVanAanleg&_pageSize=3&_format=json`
2. **Everything as CSV.** Pick only the fields you need; then the whole register is a manageable file. There is no ZIP export for trees.
   `https://api.data.amsterdam.nl/v1/bomen/stamgegevens/?_format=csv&_fields=id,soortnaamTop,soortnaamKort,jaarVanAanleg,boomhoogteklasseActueel,stamdiameterklasse,gbdBuurtId`
3. **Monumental trees on the map.** GeoJSON comes in degrees (WGS84) by default, ready for a web map. 4,146 trees have the status 'Monumentale boom'.
   `https://api.data.amsterdam.nl/v1/bomen/stamgegevens/?beschermingsstatus=Monumentale%20boom&_format=geojson&_fields=id,soortnaamTop,jaarVanAanleg`
4. **Link neighbourhoods to CBS.** gbdBuurtId points to the gebieden dataset. There each neighbourhood has its CBS code (cbsCode), e.g. BU0363KG03.
   `https://api.data.amsterdam.nl/v1/gebieden/buurten/?_fields=identificatie,naam,cbsCode&_format=csv&_pageSize=1000`

## Interesting combinations
- Trees per resident → [cbs-kwb](https://www.opendataindex.nl/en/bron/cbs-kwb.md) via buurtcode (gebieden → cbsCode). Count trees per neighbourhood and divide by population or area from the CBS neighbourhood figures.
- How much green do you see from above? → [copernicus-sentinel2](https://www.opendataindex.nl/en/bron/copernicus-sentinel2.md) via coördinaten. Overlay the trees on a Sentinel-2 NDVI map. Neighbourhoods with many trees but little green may have young plantings.

## Similar sources
- [Bomen van andere gemeenten](https://data.overheid.nl/datasets?search=bomen): Utrecht, Rotterdam, Eindhoven, Groningen, Nijmegen and Breda also publish a tree file, each with its own fields.
- [esa-worldcover](https://www.opendataindex.nl/en/bron/esa-worldcover.md): Tree cover from satellite images, everywhere on earth, but no individual trees or species.
- [copernicus-sentinel2](https://www.opendataindex.nl/en/bron/copernicus-sentinel2.md): Shows how green a place is, including gardens and parks not in the register.

## What to watch out for
- **Only city-managed trees.** According to the city, Amsterdam has about a million trees, of which it manages around 300,000. Trees in private gardens are missing.
- **Planting year sometimes unknown.** 20,829 trees have planting year 0 and 20,758 have none. Filter with jaarVanAanleg[gt]=0.
- **Trunk diameter often empty.** For 231,865 trees the trunk diameter class is empty. The height class is filled more often (empty for 45,769).
- **Street name and condition are restricted.** Fields such as street name, condition score and pruning frequency are for staff only. Filtering on street name gives a 403; search by coordinates or neighbourhood instead.
- **API key will become mandatory.** Amsterdam will make an API key mandatory. On 15 October 2026 it was still optional; request a free one if you use the API often.

## API (OpenAPI 3.0.3)

- Base: https://api.data.amsterdam.nl/v1/bomen
- Access: The description lists oauth2 (oauth2), but this endpoint works without logging in (tested). (tested)
- Formats: JSON, CSV, GeoJSON
- Size: 326324 records (tested)
- Filtering: per field as query parameter: field=value or field[operator]=value; eq, in, isempty, isnull, like, not, intersects, within, gt, gte, lt, lte

### Endpoints
- `GET /gebrekregistratie`: bevat de actuele gebrekregistratie van de bomen in beheer van gemeente Amsterdam.
- `GET /gebrekregistratie/{id}`: 
- `GET /groeiplaatsboom`: Tabel met gegevens over groeiplaatsen voor bomen in de openbare ruimte, inclusief beheerstatus, locatiegegevens en boomsoorten.
- `GET /groeiplaatsboom/{id}`: 
- `GET /groeiplaatsmedebeheer`: 
- `GET /groeiplaatsmedebeheer/{id}`: 
- `GET /hoofdbomenstructuurbuffer`: deze tabel bevat de buffer van de hoofdboomstructuur (HBS). Voor bomen in de HBS geldt bij aanplant en vervanging een groeiplaatsverbetering van 25-40m3 …
- `GET /hoofdbomenstructuurbuffer/{id}`: 
- `GET /hoofdbomenstructuurlijnen`: deze tabel bevat de lijnen van de hoofdboomstructuur (HBS). Voor bomen in de HBS geldt bij aanplant en vervanging een groeiplaatsverbetering van 25-40m3 …
- `GET /hoofdbomenstructuurlijnen/{id}`: 
- `GET /kapenherplant`: Tabel met gegevens over het kappen en herplanten van bomen in de openbare ruimte, conform Handboek Bomen 2022 en IMBOR. Omvat het volledige proces van …
- `GET /kapenherplant/{id}`: 
- `GET /maatregelregistratie`: bevat de actuele maatregelregistratie van de bomen in beheer van gemeente Amsterdam.
- `GET /maatregelregistratie/{id}`: 
- `GET /ntometing`: Bij een Nader Technisch Onderzoek (NTO meting) wordt aan de hand van metingen bepaald of er sprake is van een verzwakking die gevolgen heeft voor de …
- `GET /ntometing/{id}`: 
- `GET /stamgegevens`: bevat de actuele stamgegevens van de bomen in beheer van gemeente Amsterdam. In Amsterdam staan ongeveer 1 miljoen bomen. Deze staan in tuinen, (sport)parken, …
- `GET /stamgegevens/{id}`: 
- `GET /stormmeldingen`: Tijdens een storm kan schade ontstaan aan (of door) bomen. Deze tabel bevat storm meldingen met betrekking tot de bomen in beheer van gemeente Amsterdam. …
- `GET /stormmeldingen/{id}`: 
- `GET /veiligheidsinspecties`: bevat de veiligheidsinspecties van de bomen in beheer van gemeente Amsterdam. Elke rij in de dataset is 1 inspectie van 1 boom.
- `GET /veiligheidsinspecties/{id}`: 
- `GET /vergunningsplichtigesnoei`: deze tabel bevat data over vergunningsplichtige snoei.Voor het kappen, rooien, verplanten of vormsnoei van een vergunningplichtige boom of andersoortige …
- `GET /vergunningsplichtigesnoei/{id}`: 

### Parameters
- `_count`: Include a count of the total result set and the number of pages.Only works for responses that return a page. (from the description)
- `_csv_header`: Specify type of header for csv file (id, title, none) (from the description)
- `_csv_separator`: Specify type of separator for csv file (,, ;) (from the description)
- `_expand`: Allow to expand relations. (from the description)
- `_expandScope`: Comma separated list of named relations to expand. (from the description)
- `_fields`: Comma-separated list of fields to display (from the description)
- `_format`: Select the export format (json, csv, geojson) (from the description)
- `_pageSize`: Number of results to return per page. (from the description)
- `_sort`: Which field to use when ordering the results. (from the description)

### Fields (43)
`id` integer/int64, `gbdBuurtId` string, `geometrie` , `actueleOpkroonhoogte` string, `typeBeheerder` string, `typeBeheerderPlus` string, `beheergebied` string, `beoogdeOpkroonhoogte` string, `boombeeld` string, `boomhoogteklasseActueel` string, `conditiescore` string, `controlefrequentie` string, `conversieid` string, `typeEigenaar` string, `typeEigenaarPlus` string, `bgttype` string, `gemeente` string, `guid` string, `idOudebeheerindeling` string, `idGeovisia` string, `jaarVanAanleg` integer/int64, `jaarVolgendeInspectie` integer/int64, `omgevingsrisicoklasse` string, `openbareRuimte` string, `snoeifase` string, `snoeifrequentie` string, `soortnaam` string, `stamdiameterklasse` string, `standplaats` string, `standplaatsGedetailleerd` string, `takvrijeStam` string, `typeObject` string, `typeSoortnaam` string, `vrijeDoorrijhoogte` string, `vrijeDoorrijhoogtePrimair` string, `vrijeDoorrijhoogteSecundair` string, `groeiplaatsBoomId` integer/int64, `beschermingsstatusGedetailleerd` string, `beschermingsstatus` string, `geldigVanaf` string, `mutatieDatum` string/date-time, `soortnaamKort` string, `soortnaamTop` string

### Limits and pitfalls
- _pageSize=5000 worked (1.3 MB with two fields, 0.7 s). The OpenAPI description of the whole dataset is 1.5 MB (12 tables). (tested)
- geometrie[within]=lat,lon,radius in metres. Without Accept-Crs the API guesses from the values whether they are degrees or RD. (from the description)
- The groeiplaatsboom table returns 403 anonymously; the other tables (kapenherplant, veiligheidsinspecties, gebrekregistratie …) are open (15 Oct 2026). (tested)

### Example
```
https://api.data.amsterdam.nl/v1/bomen/stamgegevens/?geometrie[within]=52.3580,4.8686,250&jaarVanAanleg[gt]=0&_fields=id,soortnaamTop,jaarVanAanleg,boomhoogteklasseActueel&_sort=jaarVanAanleg&_pageSize=3&_format=json
```

## How to fetch it

### curl
```bash
curl "https://api.data.amsterdam.nl/v1/bomen/stamgegevens/?geometrie%5Bwithin%5D=52.3580,4.8686,250&_fields=id,soortnaamTop,jaarVanAanleg,boomhoogteklasseActueel&_pageSize=20&_format=json"
```

### python
```python
import requests

url = "https://api.data.amsterdam.nl/v1/bomen/stamgegevens/"
for soort in ["Iep (Ulmus)", "Linde (Tilia)", "Esdoorn (Acer)"]:
    r = requests.get(url, params={"soortnaamTop": soort, "_count": "true",
                                  "_pageSize": 1, "_format": "json"})
    print(soort, r.headers["X-Total-Count"])
```

## Who uses it
- [Data en informatie Amsterdam](https://data.amsterdam.nl): The city's own data portal


## Examples with real figures (1)

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

- **Amsterdam municipal trees by species: most Iep (Ulmus) (42,020 trees), then Esdoorn (Acer) and Linde (Tilia)** (oktober 2026). Table bomen/stamgegevens. [Example](https://www.opendataindex.nl/en/voorbeeld/ams-bomen-soorten)
  - `https://api.data.amsterdam.nl/v1/bomen/stamgegevens/?soortnaamTop=Eik%20(Quercus)&_pageSize=1&_count=true&_format=json`
