TenderNed Tenders - Dutch Public Procurement Notices
Pricing
from $2.00 / 1,000 notices
TenderNed Tenders - Dutch Public Procurement Notices
Get Dutch public procurement notices (aanbestedingen) from TenderNed, the official Dutch tender platform. Filter by date, CPV code, keywords, notice type, procedure and contract type. Clean, flat JSON with English field names and TED cross-references; contact details removed (GDPR). Pay per notice.
Pricing
from $2.00 / 1,000 notices
Rating
0.0
(0)
Developer
Jishnu Harinandansingh
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Security
Limited permissionsShare
TenderNed Tenders – Dutch Public Procurement Notices
Get Dutch public procurement notices from TenderNed, the official tender platform of the Dutch government. You can filter by publication date, CPV code, keywords, notice type, procedure and contract type.
Each notice becomes one flat JSON item with stable English field names, ready for spreadsheets, CRMs or a daily tender-alert workflow. Where the meaning is the same, field names match our TED EU Tenders Actor (also on the Apify Store), so the two feeds can be merged. European notices include their TED publication number for de-duplication. Contact persons, e-mail addresses and phone numbers are removed (GDPR).
What it does
- Reads TenderNed's public JSON web service (TNS, no login). It does not scrape HTML.
- Covers every publication type on TenderNed: contract notices (open tenders), award notices, prior information notices, market consultations, corrections and contract modifications. It includes national (below EU threshold) and European procedures.
- Returns notices newest first. Each item has the notice ID and link, a PDF link, the tender ID shared by all publications of one tender, the TED notice number, title, buyer, CPV codes (main code first), publication date, deadline, procedure, notice and contract type, place of performance (NUTS), description, and the external tender platform where the documents are.
Input
| Field | Type | Default | Description |
|---|---|---|---|
lastDays | integer | 7 | Notices published in the last N days. Ignored when publishedFrom is set. |
publishedFrom | date YYYY-MM-DD | – | Start of the publication date range. |
publishedTo | date YYYY-MM-DD | – | End of the range (inclusive). Empty means up to today. |
cpvCodes | list | [] | CPV codes; sub-codes match too. For example 72000000 or 72 (IT services) also matches 72260000. The check digit (-5) is optional. |
keywords | list | [] | Free-text search, mostly in Dutch. A notice matches if it contains any keyword. A keyword with several words (data platform) is searched as an exact phrase. Max 20. |
noticeTypes | list | [] (all) | contract-notice, award-notice, prior-information, market-consultation, correction, modification. |
procedureTypes | list | [] (all) | open, restricted, neg-w-call, neg-wo-call, comp-dial, innovation, comp-tend, oth-single, oth-mult, private (national procedure below EU thresholds), open-house, market-consultation. |
contractTypes | list | [] (all) | works, supplies, services. |
maxItems | integer | 100 | Maximum number of notices returned (1–10,000). |
Example: open IT service tenders from the last 3 days:
{"lastDays": 3,"cpvCodes": ["72000000"],"keywords": [],"noticeTypes": ["contract-notice"],"contractTypes": ["services"],"maxItems": 200}
Output
One item per publication (real example from 2026-10-31):
{"noticeId": "447002","noticeUrl": "https://www.tenderned.nl/aankondigingen/overzicht/447002","pdfUrl": "https://www.tenderned.nl/papi/tenderned-rs-tns/v2/publicaties/447002/pdf","tenderId": "621831","tedNoticeId": null,"title": "Implementatiepartner Financiën, Inkoop en Projectadministratie (FIP)","buyerName": "Gemeente Den Haag","cpvCodes": ["72000000", "72200000"],"mainCpvCode": "72000000","publicationDate": "2026-10-31","deadline": "2027-02-08T10:00:00+01:00","procedureType": "open","noticeType": "contract-notice","contractType": "services","european": true,"placeOfPerformance": ["NL"],"description": "De gemeente Den Haag wil de komende jaren het huidige bedrijfsvoeringssysteem vervangen en vernieuwen voor de portefeuilles Financiën, Inkoop en Projectadministratie. ...","documentsUrl": "https://s2c.mercell.com/today/211277","tenderPlatform": "Mercell","source": "TenderNed (https://www.tenderned.nl), CC0 1.0"}
| Field | Notes |
|---|---|
noticeId | TenderNed publication ID. It is unique and stable, so use it for de-duplication. Every correction or award is a new publication with its own ID. |
tenderId | TenderNed "kenmerk", shared by all publications of the same tender (notice, corrections, award). |
tedNoticeId | TED publication number (123456-2026) when the notice was also published on TED, otherwise null. It equals noticeId in the TED Actor. It can also be empty for European notices, e.g. when TenderNed does not have the TED number yet. |
title, buyerName, description | Original language (almost always Dutch). E-mail addresses and phone numbers are redacted. |
cpvCodes, mainCpvCode | 8-digit CPV codes without check digit, main code first. |
deadline | Tender submission deadline, ISO 8601 with Dutch time offset (+01:00 or +02:00). For market consultations it is the response date (date only). null when there is none, as with most award notices. |
procedureType | Same codes as the TED Actor where the meaning is the same (open, restricted, neg-w-call, ...), plus private, open-house, market-consultation and specific-contract (call-off under a framework or DPS). Unknown TenderNed codes pass through unchanged. |
noticeType | contract-notice, award-notice, prior-information, market-consultation, correction, modification or early-termination. These are TenderNed categories, not TED eForms codes. |
contractType | works, supplies or services, as in the TED Actor. |
european | true for procedures above EU thresholds, false for national ones. |
placeOfPerformance | NUTS codes, e.g. NL366 (Groot-Rijnmond), or NL for the whole country. |
documentsUrl, tenderPlatform | External tender platform (e.g. Mercell) where the documents are, when the buyer uses one. Otherwise the documents are on the TenderNed notice page (noticeUrl). |
source | Data source and license. |
There is no estimated contract value: TenderNed's public JSON service does not provide one.
Pricing
Pay per result: $0.002 per notice (launch price). 1,000 notices cost $2. You only pay for
notices written to the dataset. Set maxItems or a maximum cost per run to cap spend.
Limits and notes
- Personal data: the TenderNed JSON service has no contact-person fields, and the Actor never
requests the full notice text, which is where contact names, e-mail addresses and phone numbers
appear. Buyers sometimes paste an e-mail address or phone number into the description; these are
replaced with
[email redacted]and[phone redacted]. Personal names typed into free text cannot be detected reliably, so they may remain. If you spot personal data in the output, report it in the Issues tab of this Actor and the redaction will be extended. - Speed and rate limits: TenderNed does not publish limits. The Actor sends at most one request per second: one per 100 search results, plus one per notice for the details (CPV codes, places, TED number). 100 notices take about 2 minutes.
- Max 10,000 results per search: TenderNed returns at most 100 pages of 100 results. For bigger backfills, run several date ranges.
- Keyword search uses TenderNed's own matching. Each keyword is a separate search and the results are merged, newest first.
- The date filter applies to the publication date, so corrections and awards for older tenders show up in recent date ranges.
- TenderNed may change its web service without notice. When the response format changes, the Actor fails with a clear error instead of returning an empty dataset.
- This is not an official TenderNed or Dutch government product.
Data source and license
Data from TenderNed, published as open data under
CC0 1.0.
No attribution is required; each item still names the source in the source field.
Development
# from the repo rootpip install -r requirements-dev.txtpytest -m "not live" # unit tests on recorded fixturespytest -m live # live smoke test against the real TenderNed servicecd actors/tenderned && PYTHONPATH=../.. apify run # local run, input in storage/key_value_stores/default/INPUT.json
The Docker build context is the repo root (dockerContextDir), so the shared helpers in shared/ are
included in the image. To re-record the fixture, run python actors/tenderned/tests/record_fixture.py
(e-mail addresses and phone numbers are scrubbed before saving).