TenderNed Netherlands Tenders Scraper avatar

TenderNed Netherlands Tenders Scraper

Pricing

Pay per event

Go to Apify Store
TenderNed Netherlands Tenders Scraper

TenderNed Netherlands Tenders Scraper

Search and export normalized Dutch procurement notices, awards, buyers, procedures, descriptions, and optional CPV/NUTS details from official TenderNed data.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

14 days ago

Last modified

Categories

Share

Export structured Dutch public-procurement publications from the official, anonymous TenderNed data service.

The Actor searches tender notices, awards, market consultations, and other publication types, then writes one normalized record per publication to the default Apify dataset.

It uses direct HTTP requests to TenderNed's public JSON service. No browser, login, cookies, API key, or proxy is required.

What can TenderNed Netherlands Tenders Scraper do?

  • Search TenderNed titles, descriptions, and contracting authorities.
  • Filter by publication date, publication type, procedure, contract type, and national or European scope.
  • Keep only a specific buyer or publication status.
  • Start at a chosen source page and bound both scanned pages and saved records.
  • Export complete descriptions, references, buyer names, procedure labels, sender links, and canonical TenderNed URLs.
  • Optionally enrich every result with CPV and NUTS codes, legal framework, scope, reference number, and award status.
  • Produce JSON, CSV, Excel, XML, RSS, or another dataset export supported by Apify.

Who is it for?

Dutch and EU suppliers can discover opportunities relevant to their products and services.

Bid consultants can build repeatable buyer and sector watchlists instead of checking TenderNed manually.

Sales-intelligence teams can enrich CRM pipelines with public procurement activity and award signals.

Procurement analysts can collect reproducible notice datasets for market, buyer, procedure, and category analysis.

Data teams can schedule daily runs and send new rows to webhooks, cloud storage, spreadsheets, or databases.

Why use this Actor?

TenderNed publishes useful structured records, but production workflows still need pagination, validation, normalized field names, bounded filtering, retries, and export integrations.

This Actor handles those operational steps while preserving stable source IDs and canonical URLs.

The default mode avoids detail requests because the listing already contains the core publication record. Enable detail enrichment only when CPV, NUTS, legal, or award fields are needed.

What TenderNed data is extracted?

FieldMeaning
publicationIdStable TenderNed publication ID
referenceIdTenderNed tender/reference ID
referenceNumberBuyer reference number when details are enabled
publicationDateOfficial publication date
publicationTypePublication type code and Dutch label
publicationCodeSpecific notice-form code and label
publicationStatusStatus code and label, such as published or withdrawn
tenderTitleProcurement title
descriptionNormalized full description
buyerNameContracting authority
procedureProcedure code and label
contractTypeSupplies, services, or works code and label
senderName, senderUrlExternal sender details when provided
isEuropean, isDigitalEU and digital-submission flags
isEarlyTerminationEarly-termination flag
isEformsAmendmenteForms amendment flag
legalFrameworkLegal framework with detail enrichment
procurementNatureProcurement nature with detail enrichment
scopeNational or European scope with detail enrichment
isAwardedAward flag with detail enrichment
cpvCodesCPV classifications with main-code marker
nutsCodesGeographic NUTS codes
canonicalUrlPublic TenderNed publication URL
scrapedAtUTC extraction timestamp

Fields available only through detail enrichment are null or empty arrays when includeDetails is disabled.

How to scrape TenderNed publications

  1. Open the Actor in Apify Console.
  2. Enter a text query, buyer, or one or more source codes.
  3. Add a publication date range for recurring monitoring.
  4. Choose a practical maxItems value.
  5. Enable includeDetails only if your workflow needs enrichment fields.
  6. Click Start.
  7. Open the Dataset tab to inspect or export results.

A useful first run is:

{
"query": "duurzaamheid",
"maxItems": 25
}

Input parameters

InputTypeDefaultDescription
querystringText required in title, description, or buyer
buyerstringContracting-authority name fragment
publicationTypesstring[]allTenderNed type codes such as AAO, AGO, MAC, or VBE
publicationStatusesstring[]allStatus codes kept after retrieval, such as PUB or INT
dateFromstringInclusive publication date, YYYY-MM-DD
dateTostringInclusive publication date, YYYY-MM-DD
procedureCodesstring[]allProcedure codes such as OPE
contractTypesstring[]allL supplies, D services, or W works
scopeCodesstring[]allTenderNed national/EU scope codes, for example EU
includeDetailsbooleanfalseFetch CPV/NUTS and other enrichment fields
startPageinteger0Zero-based TenderNed page
pageSizeinteger50Source records requested per page, maximum 100
maxPagesinteger20Safety limit for source pages scanned
maxItemsinteger100Maximum matching records saved

publicationStatuses, buyer, and exact text matching are verified by the Actor after TenderNed returns candidate rows. Use maxPages to control scans for narrow client-side filters.

Output example

The following abbreviated record reflects the current output shape:

{
"publicationId": "434758",
"referenceId": "603932",
"publicationDate": "2026-07-27",
"publicationType": {
"code": "AGO",
"name": "Aankondiging gegunde opdracht"
},
"publicationStatus": {
"code": "PUB",
"name": "Gepubliceerd"
},
"tenderTitle": "Projectmanager Smart Port Waalwijk",
"buyerName": "Gemeente Waalwijk",
"procedure": {
"code": "OPE",
"name": "Openbaar"
},
"contractType": {
"code": "W",
"name": "Werken"
},
"isEuropean": true,
"isDigital": false,
"canonicalUrl": "https://www.tenderned.nl/aankondigingen/overzicht/434758"
}

The complete dataset row also contains the description, sender, publication code, flags, enrichment fields, and extraction timestamp.

How much does it cost to scrape TenderNed tenders?

The Actor uses pay-per-event pricing:

  • $0.005 once per run.
  • On the Free plan, $0.000041071 per saved publication.
  • Higher Apify plans receive automatic volume-tier discounts, down to $0.00001 per publication on the Diamond tier.

Example Free-plan prices:

Saved publicationsEstimated Actor charge
10$0.00541
100$0.00911
1,000$0.04607

Rejected, duplicate, malformed, or filtered-out source rows are not charged as items. Detail enrichment has no separate charge event; it is included in the saved-publication event.

Apify displays the applicable plan tier before a run. Storage or other platform charges may be governed by your Apify plan.

Monitoring and automation workflows

Daily opportunity watch

Set dateFrom to the latest date required by your process, filter publication types, and schedule the Actor daily. Use the stable publicationId to deduplicate downstream alerts.

Buyer activity feed

Set buyer to a contracting authority and deliver the dataset to a CRM or warehouse. Increase maxPages when collecting deep history.

Contract award intelligence

Use publicationTypes: ["AGO"], enable includeDetails, and retain CPV codes, award status, buyer, and reference fields for sales intelligence.

Sector dataset

Combine text, procedure, contract-type, and scope filters. Export the resulting dataset to CSV or query it through the Apify API.

JavaScript API example

Install the official client:

$npm install apify-client

Run the Actor and read its dataset:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/tenderned-netherlands-tenders-scraper').call({
publicationTypes: ['AGO'],
scopeCodes: ['EU'],
includeDetails: true,
maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python API example

Install the client:

$pip install apify-client

Then run and retrieve results:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/tenderned-netherlands-tenders-scraper').call(run_input={
'buyer': 'Gemeente Waalwijk',
'maxItems': 25,
})
for item in client.dataset(run['defaultDatasetId']).iterate_items():
print(item)

cURL API example

Start a synchronous run and receive dataset items:

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~tenderned-netherlands-tenders-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query":"duurzaamheid","maxItems":25}'

Keep APIFY_TOKEN in an environment variable rather than source code.

Use TenderNed data with Apify MCP

Claude Code setup

Add this Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/tenderned-netherlands-tenders-scraper"

Claude Desktop setup

Claude Desktop can use this JSON configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/tenderned-netherlands-tenders-scraper"
}
}
}

Cursor and VS Code setup

In Cursor or VS Code, add the same mcpServers.apify.url value through the editor's MCP settings. No local command process is required because the transport is HTTP.

MCP example prompts

  • “Find 25 TenderNed publications mentioning circular construction.”
  • “Collect recent contract awards from Dutch municipalities and include CPV details.”
  • “Export TenderNed notices from Gemeente Waalwijk for my supplier pipeline.”

Limits and reliability

TenderNed controls source availability, fields, code lists, and publication volume.

The Actor retries network timeouts, rate limits, and temporary server errors with bounded backoff. It does not blindly retry invalid requests or unexpected response formats.

Requests are sequential and conservative. The Actor stops at maxItems, maxPages, an empty page, or TenderNed's last page.

Some historical source descriptions contain replacement characters supplied by TenderNed. The Actor decodes HTML entities and normalizes whitespace but does not invent missing source characters.

No residential proxy or automatic browser fallback is enabled. This keeps cost and behavior predictable for the currently anonymous JSON service.

TenderNed procurement publications are public government-procurement information. You remain responsible for your collection frequency, retention, redistribution, and downstream decisions.

Respect applicable law, TenderNed terms, intellectual-property rights, privacy obligations, and reasonable request rates.

Do not use public contact or buyer data for unlawful spam, harassment, discrimination, or automated decisions that require human review.

This Actor is an independent data tool and is not affiliated with or endorsed by TenderNed or the Dutch government.

FAQ

Why did my narrow buyer or status search return fewer items than maxItems?

The Actor first receives candidates from TenderNed and then verifies buyer, text, and status filters. Increase maxPages, broaden the filter, or remove a conflicting date/type constraint.

Why are enrichment fields null or empty?

Set includeDetails to true. Core list mode intentionally skips one extra request per publication.

Why did the run fail immediately?

Check that dates use YYYY-MM-DD, dateFrom is not later than dateTo, numeric limits are within the documented bounds, and arrays contain TenderNed codes.

Does the Actor need a Netherlands proxy?

No. Current official JSON records are available anonymously and directly. The Actor does not expose an unmeasured proxy fallback.

Can I resume at another result page?

Yes. Set zero-based startPage and keep the same filters and pageSize.

Use these Actors when a supplier or analyst needs a multi-country procurement-monitoring portfolio rather than TenderNed alone.