# TED, Europese aanbestedingen

TED (Tenders Electronic Daily) is het aanbestedingsblad van de EU. Elke overheid die boven de Europese drempels inkoopt, moet het hier melden: vooraankondiging, aankondiging, gunning en wijziging, met CPV-code, aanbestedende dienst en vaak de winnaar en het bedrag. De zoek-API werkt zonder sleutel. In 2025 verschenen er 22.755 aankondigingen van Nederlandse aanbesteders, sinds oktober 2016 ruim 183.000.

- Uitgever: Publicatiebureau van de Europese Unie
- Gebied: Europa · Laagste detail: aankondiging (per aanbesteding en perceel)
- Periode: zoekbaar sinds oktober 2016 · Ververst: dagelijks
- Toegang: Open · Licentie: Aankondigingen vrij herbruikbaar, ook commercieel (Besluit 2011/833/EU); redactionele inhoud CC BY 4.0
- Koppelsleutels: publicatienummer (bv. 599786-2026), CPV-code, landcode (NLD), naam aanbestedende dienst
- Status: ok (2026-10-16) · 183.548 Nederlandse aankondigingen, nieuwste 715510-2026
- URL: https://ted.europa.eu/

## Wat kun je ermee?
- **Wat koopt jouw gemeente in?.** Zoek op de naam van de aanbestedende dienst. Op 16 oktober 2026 stond er bijvoorbeeld een gunning van de gemeente Hengelo voor kantoormeubilair.
- **Meer aanbestedingen per jaar.** Tel per jaar met buyer-country=NLD en een datumbereik. Van 13.531 in 2017 naar 22.755 in 2025. Let wel op de overstap naar eForms in 2023.
- **Wie wint het vaakst?.** Haal de gunningen (form-type=result) van één jaar op en tel per winnaar. Koppel de namen aan GLEIF of KvK om concerns samen te nemen.
- **Diensten, leveringen of werken.** In 2025 ging het bij 14.214 Nederlandse aankondigingen om diensten, 6.836 om leveringen en 2.510 om werken. Een aankondiging met meer percelen kan in meer groepen vallen.

## Zo verwerk je het
1. **Zoeken met een expert-query.** POST naar /v3/notices/search met query, fields en limit. Zonder sleutel. Maximaal 250 per pagina en 15.000 per zoekvraag (pagina × limit).
   `curl -X POST -H "Content-Type: application/json" -d '{"query":"buyer-country=NLD SORT BY publication-date DESC","fields":["publication-number","publication-date","notice-title","buyer-name","notice-type"],"limit":10,"paginationMode":"PAGE_NUMBER"}' https://api.ted.europa.eu/v3/notices/search`
2. **Tellen zonder alles op te halen.** Met limit 1 staat het aantal in totalNoticeCount. Zo tel je per jaar, per soort bericht (form-type) of per soort opdracht (contract-nature).
   `curl -X POST -H "Content-Type: application/json" -d '{"query":"buyer-country=NLD AND publication-date>=20250101 AND publication-date<=20251231 AND form-type=result","fields":["publication-number"],"limit":1,"paginationMode":"PAGE_NUMBER"}' https://api.ted.europa.eu/v3/notices/search`
3. **Meer dan 15.000 resultaten.** Gebruik paginationMode ITERATION. Elk antwoord geeft een iterationNextToken voor de volgende reeks.
   `curl -X POST -H "Content-Type: application/json" -d '{"query":"buyer-country=NLD AND publication-date>=20261001","fields":["publication-number"],"limit":250,"paginationMode":"ITERATION"}' https://api.ted.europa.eu/v3/notices/search`
4. **De volledige aankondiging.** Elk resultaat heeft links naar de aankondiging als XML (eForms) en als PDF in alle EU-talen.
   `https://ted.europa.eu/en/notice/599786-2026/xml`

## Interessante koppelingen
- Bij welk concern horen de winnaars? → [gleif-lei](https://www.opendataindex.nl/bron/gleif-lei.md) via naam van de winnaar. Zoek de winnende bedrijven op in GLEIF en tel de gunningen per uiteindelijke moedermaatschappij.
- Hoeveel van de begroting gaat via Europese aanbestedingen? → [iv3-gemeentefinancien](https://www.opendataindex.nl/bron/iv3-gemeentefinancien.md) via gemeentenaam. Tel per gemeente de gegunde bedragen in TED en zet die naast de lasten uit de Iv3-cijfers. Niet alle gunningen noemen een bedrag.

## Vergelijkbare bronnen
- [tenderned](https://www.opendataindex.nl/bron/tenderned.md): TenderNed is het Nederlandse aanbestedingsplatform, ook voor opdrachten onder de Europese drempels. TED heeft alleen de Europese aanbestedingen, maar wel van alle EU-landen.
- [data-europa](https://www.opendataindex.nl/bron/data-europa.md): Het Europese dataportaal heeft TED als dataset (ted-1) en een CSV-deel (ted-csv), handig voor bulk, maar geen zoekvraag op losse aankondigingen.

## Waar je op moet letten
- **Alleen boven de Europese drempels.** Kleinere opdrachten staan niet in TED. Voor een volledig beeld van Nederlandse inkoop kijk je ook in TenderNed.
- **Een aankondiging is geen aanbesteding.** Eén aanbesteding levert vaak meer berichten op (vooraankondiging, aankondiging, gunning, wijziging). Tel per soort bericht als je aanbestedingen wilt tellen.
- **Zoekindex begint in oktober 2016.** Zoekvragen op eerdere publicatiedatums gaven op 16 oktober 2026 nul resultaten. Zoek oudere aankondigingen in de TED-datasets op data.europa.eu.
- **Overstap naar eForms.** Sinds eind 2023 gebruiken aanbesteders eForms, met andere formulieren en velden. Vergelijk jaren voor en na de overstap voorzichtig.
- **Velden zijn soms lijsten of meertalig.** contract-nature en buyer-name komen terug als lijst of als object per taal (bv. buyer-name.nld). Een aankondiging met percelen kan dus dubbel tellen.

## API (REST (POST, JSON), OpenAPI 3)

- Basis: https://api.ted.europa.eu/v3
- Toegang: Geen sleutel voor zoeken. De andere v3-endpoints (submit, validate, render) zijn voor aanbesteders en eSenders en vragen een API-sleutel. (getest)
- Formaten: json, xml, pdf, html
- Omvang: 183548 aankondigingen met een Nederlandse aanbesteder (buyer-country=NLD, scope ALL, 16 okt 2026); 17.776 actief (getest)
- Filteren: TED expert-query: veld operator waarde, gecombineerd met AND/OR/NOT en haakjes, lijsten met IN (A B), tekst bevat met ~ "woord", FT~ voor de volledige tekst, sorteren met SORT BY veld ASC|DESC aan het eind.; =, !=, >, >=, <, <=, IN ( ), ~, FT~, AND, OR, NOT, SORT BY

### Endpoints
- `POST /notices/search`: Zoeken met een expert-query; body JSON met query (verplicht), fields (verplicht), limit, page, scope, paginationMode. Antwoord: notices, totalNoticeCount, iterationNextToken.
- `GET https://ted.europa.eu/{taal}/notice/{publicatienummer}/xml`: De volledige aankondiging als XML (eForms of het oude TED-schema). Elk zoekresultaat geeft deze links.
- `GET https://ted.europa.eu/{taal}/notice/{publicatienummer}/pdf`: De aankondiging als PDF in elke EU-taal (ook /html).

### Parameters
- `query`: Expert-query, bv. buyer-country=NLD AND publication-date>=20250101 SORT BY publication-date DESC. Datums als JJJJMMDD. (getest)
- `fields`: Welke velden terugkomen (verplicht), bv. publication-number, publication-date, notice-title, buyer-name, notice-type, form-type, classification-cpv, winner-name. (uit de beschrijving)
- `limit`: Aantal per pagina, standaard 10, hoogstens 250 (251 geeft SEARCH_EXCEEDS_MAX_LIMIT). Daarnaast hoogstens 10.000 velden per pagina (limit × aantal fields). (getest)
- `page`: Paginanummer, begint bij 1 (alleen PAGE_NUMBER). (uit de beschrijving)
- `paginationMode`: PAGE_NUMBER (standaard, hoogstens 15.000 resultaten) of ITERATION (onbeperkt, met iterationNextToken; geldig tot 24 uur na de volgende OJ S-uitgave). (uit de beschrijving)
- `iterationNextToken`: Token uit het vorige antwoord, voor de volgende pagina in ITERATION. (uit de beschrijving)
- `scope`: ALL (standaard), ACTIVE (alleen lopende aankondigingen) of LATEST (alleen de laatste OJ S-uitgave). (getest)
- `onlyLatestVersions`: Alleen de nieuwste versie van een aankondiging. (uit de beschrijving)
- `checkQuerySyntax`: Alleen de syntaxis controleren, niet zoeken. (uit de beschrijving)

### Velden die je in fields kunt vragen (selectie van 1.830) (14)
`publication-number` string, `publication-date` date, `notice-title` object, `buyer-name` object, `buyer-country` string, `notice-type` string, `form-type` string, `contract-nature` lijst, `classification-cpv` lijst, `procedure-type` string, `place-of-performance` lijst, `winner-name` object, `deadline-receipt-tender-date-lot` lijst, `links` object

### Limieten en valkuilen
- PAGE_NUMBER: hoogstens 250 per pagina en 15.000 per zoekvraag (page × limit; daarboven SEARCH_WINDOW_TOO_WIDE). ITERATION: geen maximum aan resultaten. (uit de beschrijving)
- Geen rate-limit-koppen gezien. Eén zoekvraag met SORT BY duurde ongeveer 7 s; een telling met limit 1 is sneller. (getest)
- Fouten komen als JSON met error.type: QUERY_UNKNOWN_FIELD (met fieldName en positie), QUERY_SYNTAX_ERROR, SEARCH_EXCEEDS_MAX_LIMIT … (getest)
- Tellen: limit 1 en totalNoticeCount lezen. NL 2025: 22.755 aankondigingen; met buyer-country IN (NLD BEL) 349.226 sinds 2016. (getest)
- De zoekindex begint in oktober 2016; eerdere publicatiedatums geven 0. buyer-country=NLD is voor de eerste jaren onvolledig (2016: 2.912, 2018: 15.491). (ervaring)
- Velden die er niet zijn komen niet terug (total-value ontbrak bij gunningen). buyer-name en notice-title zijn objecten per taal; contract-nature en classification-cpv lijsten per perceel, dus tel aankondigingen, geen lijstwaarden. (getest)
- Op api.ted.europa.eu is geen robots.txt (404). Op ted.europa.eu zijn alleen portaal- en zoekpagina's verboden; /…/notice/<nr>/xml mag. (ervaring)

### Voorbeeld
```
https://api.ted.europa.eu/v3/notices/search
```

## Zo haal je het op

### curl
```bash
curl -X POST -H "Content-Type: application/json" -d '{"query":"buyer-country=NLD SORT BY publication-date DESC","fields":["publication-number","publication-date","buyer-name","notice-type"],"limit":5,"paginationMode":"PAGE_NUMBER"}' https://api.ted.europa.eu/v3/notices/search
```

### python
```python
import requests

url = "https://api.ted.europa.eu/v3/notices/search"
for jaar in range(2017, 2026):
    q = f"buyer-country=NLD AND publication-date>={jaar}0101 AND publication-date<={jaar}1231"
    r = requests.post(url, json={"query": q, "fields": ["publication-number"], "limit": 1,
                                 "paginationMode": "PAGE_NUMBER"})
    print(jaar, r.json()["totalNoticeCount"])
```

## Wat je ermee kunt bouwen
- [Aanbestedingsradar: wie krijgt de overheidsopdrachten?](https://www.opendataindex.nl/bouwen/aanbestedingsradar.md): Zie per kwartaal welke bedrijven Nederlandse overheidsopdrachten winnen, in welke sector en voor welk bedrag, met hun KvK-nummer, LEI en moedermaatschappij.


## Voorbeelden met echte cijfers (1)

Per voorbeeld de bevinding, de peildatum en de aanroep die precies deze cijfers ophaalt.

- **Aankondigingen op TED van Nederlandse aanbesteders: 22.755 aankondigingen in 2025, 68% meer dan in 2017** (2025). Tabel notices/search. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/ted-aankondigingen-nl)
  - `curl -X POST -H "Content-Type: application/json" -d '{"query":"buyer-country=NLD AND publication-date>=20250101 AND publication-date<=20251231","fields":["publication-number"],"limit":1,"paginationMode":"PAGE_NUMBER"}' https://api.ted.europa.eu/v3/notices/search`
