# Tenderned Tender

> Haalt publieke aanbestedingsdata op van TenderNed (www.tenderned.nl), zoals pagina's op tenderned.nl/aankondigingen/overzicht/{id}. Gebruik deze skill altijd wanneer de gebruiker vraagt om de planning, mijlpalen, sluitingsdatum of het tijdschema van een TenderNed-aanbesteding, om de aanbestedingsgegevens, om het aanbestedingsdossier of de aanbestedingsstukken (leidraad, bijlagen, Nota van Inlichtingen, aankondiging), of om documenten van een TenderNed-aankondiging te downloaden, ook als de gebruiker alleen een tenderned.nl-link plakt. De pagina is een single-page app zonder data in de HTML; de data is publiek (geen login) en wordt via de publieke TenderNed-API opgehaald.

- Skill: `martinwolve/tenderned-tender` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add martinwolve/tenderned-tender`
- Raw SKILL.md: https://api.skillmd.com/api/skills/martinwolve/tenderned-tender/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: martinwolve (https://skillmd.com/u/martinwolve)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/martinwolve/tenderned-tender

---


# TenderNed aanbesteding ophalen

## Wanneer en waarom

De TenderNed-aankondigingspagina (`/aankondigingen/overzicht/{id}`) is een single-page app: de HTML bevat geen inhoud, dus `web_fetch` levert alleen een lege huls. De data is publiek (geen login) en beschikbaar via de publieke API (`papi`). Deze skill praat rechtstreeks met die API met het meegeleverde script.

Gebruik `scripts/tenderned.py`. Het lost het publicatie-id op uit een aankondigings-URL of een kaal nummer, en levert gegevens, planning en het volledige documentendossier.

## Snelstart

```bash
# planning/mijlpalen (standaard: API-kerndata + volledige planning uit de leidraad)
python3 scripts/tenderned.py 434640 --what planning

# alleen de snelle API-kerndata, zonder de leidraad te downloaden en parsen
python3 scripts/tenderned.py 434640 --what planning --geen-leidraad

# hele dossier: gegevens + planning + documentenlijst, naar md
python3 scripts/tenderned.py https://www.tenderned.nl/aankondigingen/overzicht/434640 --what dossier --md dossier.md

# alle aanbestedingsstukken downloaden
python3 scripts/tenderned.py 434640 --download ./stukken

# alleen bepaalde categorieën downloaden (DOC = documenten, NVI = nota van inlichtingen, ANK = aankondiging)
python3 scripts/tenderned.py 434640 --download ./stukken --categorie DOC NVI
```

Het script gebruikt `pdfplumber` om de planningstabel uit de leidraad te lezen (in deze omgeving aanwezig; anders `pip install pdfplumber`). Zonder pdfplumber werkt alles behalve het parsen van de leidraad-planning; die stap meldt dat netjes.

## Werkwijze

1. Bepaal het publicatie-id. Een gebruiker plakt vaak `https://www.tenderned.nl/aankondigingen/overzicht/434640`; het id is het laatste getal. Een kaal getal mag ook.
2. Kies wat er gevraagd wordt:
   - "planning / mijlpalen / sluitingsdatum" -> `--what planning`
   - "aanbestedingsgegevens / opdrachtgever / procedure / CPV" -> `--what details`
   - "hele dossier / aanbestedingsstukken / leidraad + documenten" -> `--what dossier`
   - "download de stukken / geef me de documenten" -> voeg `--download <map>` toe, eventueel met `--categorie`
3. Standaard komt het resultaat inline; met `--md <bestand>` naar markdown. Presenteer gedownloade documenten en het md-bestand met `present_files`.
4. Respecteer de bestandsnaamvoorkeur van de gebruiker voor md-bestanden die je zelf aanmaakt (compact-onderwerp gevolgd door `vYYYYMMDD`).

## Planning: API-kerndata + leidraad

TenderNed publiceert via de API alleen de **publicatiedatum** en de **sluitingsdatum** (aanmelden of inschrijven). De volledige planning met vragenronde, nota van inlichtingen, presentaties en gunning staat in de leidraad.

Daarom haalt `--what planning` (en `--what dossier`) standaard óók de leidraad op en parset de planningstabel eruit. Zo krijg je zowel de harde API-datums als het volledige tijdschema. Wil je alleen de snelle API-kerndata (bijvoorbeeld om een grote leidraad-download te vermijden), gebruik dan `--geen-leidraad`. Heb je de leidraad al lokaal, wijs die aan met `--leidraad-bestand PAD`.

Hoe het werkt: het script kiest uit de documentenlijst het meest recente PDF-document in categorie DOC waarvan de naam op een leidraad wijst (leidraad, beschrijvend document, offerteaanvraag, uitvraag). Vervolgens kiest het de planningspagina met de meeste datumregels en leest het de planning met pdfplumber. Het werkt zowel voor gerasterde tabellen als voor tekstlijsten, en voor beide volgordes (datum vóór of ná de activiteit). Een planning die doorloopt op de volgende pagina (een tabel bovenaan de pagina, of losse datumregels na de koptekst) wordt meegenomen, net als volledige planningspagina's direct ervoor. Fasekopjes worden herkend uit tabelkopregels en tussenkopjes ("Onderdeel selectiefase", "Inschrijvingsfase", "Fase 1: Selectie") en als vetgedrukte regel in de tabel gezet. Mijlpalen met alleen een weeknummer ("Week 38/39 Interviews") tellen ook mee.

Getest op selectieleidraden van gemeenten (planning in twee tabellen, selectie- en gunningsfase, over twee pagina's) en op een Prolander-offerteaanvraag onder een raamovereenkomst. Als je een nieuwe leidraad tegenkomt waar de parser iets mist, test dan `parse_pdf_planning(pad)` rechtstreeks op de lokale PDF en pas het script aan.

Let op bij het presenteren van de leidraad-planning:
- Die planning is vaak **indicatief of concept**; de aanbestedende dienst behoudt zich meestal het recht voor de planning te wijzigen. Neem die nuance mee.
- Bij een tweefasige (niet-openbare) procedure staan er twee fasen (selectie en inschrijving/gunning), en soms staan er per mijlpaal **meerdere conceptdatums** naast elkaar. Het script toont die zoals ze in de leidraad staan; interpreteer ze niet als harde data.
- Bij een niet-openbare procedure is de API-sluitingsdatum de sluiting van de **aanmeldingstermijn**; de inschrijvingsfase volgt daarna en staat in de leidraad.
- Let op rectificaties: het script meldt het meest recente publicatie-id als er een rectificatie is.

Controleer bij twijfel altijd de leidraad zelf; download hem met `--download`.

## Wat het dossier bevat

De documentenlijst bevat alle gepubliceerde stukken, ingedeeld in categorieën:
- **ANK** (Aankondiging): de TED/TenderNed-aankondiging(en), inclusief eerdere versies.
- **NVI** (Nota Van Inlichtingen): gepubliceerde vragen en antwoorden.
- **DOC** (Aanbestedingsdocumenten): leidraad, UEA, bijlagen, tekeningen enzovoort.

Let op: sommige bijlagen (tekeningen, verkenningen) kunnen zeer groot zijn (honderden MB). Filter met `--categorie` als je niet alles nodig hebt.

## Publieke API (voor handmatig werk of debuggen)

- Basis: `https://www.tenderned.nl/papi/tenderned-rs-tns/v2`
- Stuur `Accept: application/json` en een browser-`User-Agent` mee.
- Publicatie (gegevens + datums): `GET /publicaties/{id}`, velden o.a. `aanbestedingNaam`, `opdrachtgeverNaam`, `opdrachtBeschrijving`, `publicatieDatum`, `sluitingsDatum`, `procedureCode`, `typeOpdrachtCode`, `nationaalOfEuropeesCode`, `cpvCodes`, `nutsCodes`, `referentieNummer`, `pbNummerTed`, `kenmerk`, `publicatieIDLaatsteRectificatie`, `publicatiePdfId`.
- Documenten: `GET /publicaties/{id}/documenten`, elk item heeft `documentNaam`, `typeDocument`, `publicatieCategorie` (ANK/NVI/DOC), `grootte` en `links.download.href`.
- Document downloaden: de `download.href` is een pad; zet er `https://www.tenderned.nl` voor. Vorm: `/papi/tenderned-rs-tns/v2/publicaties/{id}/documenten/{fileId}/content`.
- Aankondiging-PDF los: `GET /publicaties/{id}/pdf`.
- Datums zijn ISO zonder tijdzone en al in Nederlandse tijd; presenteer als `dd-mm-jjjj [uu:mm]`.

Verwant: dit is de tegenhanger van de `mercell-tender`-skill voor Mercell S2C. De API's verschillen (TenderNed is REST met vaste paden, Mercell is RPC-achtig), maar de skills werken op dezelfde manier.

## Wijzigingshistorie

- 1.1 (2026-09-09): planning die doorloopt op de volgende pagina wordt meegenomen; fasekoppen uit tabelkopregels herkend; weeknummers gelden als mijlpaal; losse sluithaakjes in datumcellen opgeschoond. Getest op selectieleidraden Huizen en Bergen op Zoom en de Prolander-uitvraag Locatie Steen.
- 1.0: eerste versie met API-kerndata, leidraad-planning, dossier en downloads.

