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
# 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
- 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. - 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
- "planning / mijlpalen / sluitingsdatum" ->
- Standaard komt het resultaat inline; met
--md <bestand>naar markdown. Presenteer gedownloade documenten en het md-bestand metpresent_files. - 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/jsonen een browser-User-Agentmee. - 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 heeftdocumentNaam,typeDocument,publicatieCategorie(ANK/NVI/DOC),grootteenlinks.download.href. - Document downloaden: de
download.hrefis een pad; zet erhttps://www.tenderned.nlvoor. 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.