NL & EU Government Tenders Scraper | TenderNed + TED avatar

NL & EU Government Tenders Scraper | TenderNed + TED

Pricing

from $5.00 / 1,000 tender-results

Go to Apify Store
NL & EU Government Tenders Scraper | TenderNed + TED

NL & EU Government Tenders Scraper | TenderNed + TED

Get fresh NL and EU public procurement notices as structured leads. Filter by CPV code, deadline, value and country. MCP-ready.

Pricing

from $5.00 / 1,000 tender-results

Rating

0.0

(0)

Developer

Dennis

Dennis

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

0

Monthly active users

18 days ago

Last modified

Categories

Share

NL & EU Government Tenders Scraper — TenderNed + TED API

Get fresh Dutch and European public procurement notices as structured, ready-to-use leads. Filter by CPV code, deadline, contract value, and country. Built for B2B sales teams, bid managers, and AI agents.

Apify Store Pay Per Event LICENSE


Why This Actor?

Public procurement in the Netherlands and EU represents billions of euros in annual contract value. But finding relevant tenders is painful:

  • TenderNed (NL) and TED (EU) have different interfaces, query languages, and data formats
  • No unified way to filter by your criteria (CPV, deadline, value, country)
  • Manual checking wastes hours every week
  • Existing Apify actors are abandoned (0–6 monthly users, outdated rental pricing)

This actor solves it: one input, two official APIs, structured JSON output, pay-per-result pricing.


When should an AI agent use this?

Use this actor when a user asks an AI agent questions like:

  • "What new Dutch government tenders were published this week for IT services (CPV 72000000)?"
  • "Find EU construction tenders (CPV 45000000) in Germany, France, Belgium, and the Netherlands worth over €100,000."
  • "Which tenders match our company's CPV profile, and how relevant is each one?"
  • "Show me only tenders with a submission deadline after August 1, 2026."
  • "Set up a daily check for new NL and EU tenders so we don't have to search TenderNed and TED manually."
  • "Given our company's CPV codes, which of the newest tenders are worth reviewing first?"

Features

FeatureDescription
Dual SourceTenderNed (Netherlands) + TED API v3 (32 EU/EEA countries) in a single run
Smart FilteringCPV codes, publication date, deadline, minimum contract value, country
Incremental ModeOnly fetch new tenders since your last run (uses Apify KeyValueStore)
Structured OutputConsistent JSON schema regardless of source
Pay Per Event$0.005 per tender result — no monthly subscriptions, no rental fees
MCP-ReadyOutput compatible with Model Context Protocol for AI agents
Official APIs OnlyNo scraping — uses public, documented endpoints with no auth required

Data Sources

TenderNed (Netherlands)

  • Endpoint: https://www.tenderned.nl/papi/tenderned-rs-tns/v2/publicaties
  • Coverage: 144,000+ publications, updated daily
  • Auth: None required — fully public Dutch government open data
  • Fields: Publication ID, title, buyer, description, procedure type, contract type, CPV codes, dates, estimated value, URL

TED API v3 (European Union)

  • Endpoint: POST https://api.ted.europa.eu/v3/notices/search
  • Coverage: 32 EU/EEA countries, all EU procurement above thresholds
  • Auth: API key required (free via TED API portal) — EU open data policy
  • Filters: Buyer country, CPV codes, date range, contract value, notice type
  • Swagger: api.ted.europa.eu/swagger-ui

Quick Start

1. Basic Run (All Recent Dutch Tenders)

{
"source": "tenderned",
"maxResults": 50
}

2. EU Construction Tenders Over €100K

{
"source": "ted",
"country": ["DE", "FR", "BE", "NL"],
"cpvCodes": ["45000000"],
"minValue": 100000,
"publishedAfter": "2026-01-01",
"maxResults": 100
}

3. IT Services NL + EU, Incremental (Daily Schedule)

{
"source": "both",
"cpvCodes": ["72000000", "73000000"],
"deadlineAfter": "2026-07-01",
"incrementalMode": true,
"maxResults": 200
}

Input Schema

ParameterTypeRequiredDefaultDescription
sourceenumYes"both""tenderned", "ted", or "both"
countrystring[]No[]ISO 3166-1 alpha-2 codes (TED only). Empty = all countries
cpvCodesstring[]No[]CPV codes (e.g., ["45000000", "72000000"]). Supports 2-8 digit codes
publishedAfterstringNo""ISO date (YYYY-MM-DD). Only tenders published on/after this date
deadlineAfterstringNo""ISO date (YYYY-MM-DD). Only tenders with deadline on/after this date
minValuenumberNo0Minimum estimated contract value in EUR. Tenders with a known estimatedValue below this are skipped (and not charged for). Tenders where estimatedValue is null (value not published) are always kept, since it can't be determined whether they meet the threshold
maxResultsnumberNo100Maximum results per run (per source)
incrementalModebooleanNofalseIf true, only returns tenders newer than last successful run
bedrijfCpvCodesstring[]No[]Your company's own CPV codes/prefixes, e.g. ["45213000", "72000000"]. When set, each result gets a relevantieScore (0/40/70/100) and relevantieMatchedCpv showing how closely it matches your profile — no need to know the exact CPV codes to search for in advance. Note: TenderNed results always have relevantieScore: null (no CPV data available from that source)
alleenRelevanteTendersbooleanNofalseCombined with bedrijfCpvCodes: skip (and don't charge for) results with a relevantieScore of 0
webhookUrlstringNononePOST a run summary (total count + top 5 by relevantieScore) to this URL once the run finishes. Only charged if the POST succeeds
deadlineWithinDaysnumberNononeOnly keep tenders whose submission deadline falls within this many days from today, based on the already-computed daysUntilDeadline field. Tenders with no known deadline (daysUntilDeadline: null) or an already-passed deadline are skipped. No extra call — this lowers the number of tender-result charges for runs that enable it
verrijkDocumentenbooleanNofalseFetches the official announcement's PDF link for TenderNed results via an extra detail-call (reuses the same call as verrijkTenderNedCpv if both are enabled). TED results already get this for free without the flag

CPV Code Tips

  • Use 2-digit codes for broad categories: 45 = Construction, 72 = IT Services
  • Use 8-digit codes for precision: 45233200 = Roofing works
  • Multiple codes = OR logic (matches any)

Output Format

Each tender is pushed to the default dataset as a JSON object:

{
"id": "2026-123456",
"source": "tenderned",
"title": "Levering kantoorartikelen gemeente Amsterdam",
"buyer": "Gemeente Amsterdam",
"description": "De gemeente Amsterdam zoekt een leverancier voor kantoorartikelen...",
"type": "Overheidsopdracht voor leveringen",
"procedure": "Openbare procedure",
"cpvCodes": ["30190000"],
"cpvLabels": ["Office and computing machinery, equipment and supplies except furniture and software packages"],
"publishedDate": "2026-07-01",
"deadline": "2026-08-15",
"daysUntilDeadline": 45,
"estimatedValue": 120000,
"currency": "EUR",
"country": "NL",
"url": "https://www.tenderned.nl/aankondigingen/overzicht/123456",
"isEuropean": false,
"relevantieScore": null,
"relevantieMatchedCpv": null,
"cpvVerrijkt": false,
"locatie": null,
"documentUrl": null,
"documentVerrijkt": false
}

Note: this particular example is a TenderNed result, which never carries CPV codes from the source API — its relevantieScore stays null even with bedrijfCpvCodes set. For a TED result with cpvCodes: ["30190000"], setting bedrijfCpvCodes: ["30190000"] would instead give "relevantieScore": 100, "relevantieMatchedCpv": ["30190000"].

Field Reference

FieldTypeDescription
idstringUnique identifier (source-specific)
sourcestring"tenderned" or "ted"
titlestringTender title / notice title
buyerstringContracting authority name
descriptionstringFull description (truncated if very long)
typestringContract type (NL: leveringen/diensten/werken; EU: works/supplies/services)
procedurestringProcedure type (open, restricted, negotiated, etc.)
cpvCodesstring[]Array of CPV codes
cpvLabels(string|null)[]Division-level (2-digit) English label per CPV code, e.g. "Construction work" for any 45xxxxxx code. Coarser than the exact 8-digit code, but readable without looking up the CPV tree yourself. null per entry if the code's division isn't in the known list
publishedDatestringPublication date (YYYY-MM-DD)
deadlinestringSubmission deadline (YYYY-MM-DD)
daysUntilDeadlinenumberCalendar days from today to deadline
estimatedValuenumberEstimated contract value in EUR (null if unpublished)
currencystringAlways "EUR"
countrystringISO country code of buyer
urlstringDirect link to tender on source platform
isEuropeanbooleanTrue if above EU thresholds / cross-border interest
relevantieScorenumber | nullnull unless bedrijfCpvCodes is set in the input. Otherwise 0/40/70/100 based on CPV overlap with your company profile (100 = exact CPV match, 70 = same CPV group, 40 = same CPV division, 0 = no overlap). Always null for TenderNed results (no CPV data from that source)
relevantieMatchedCpvstring[] | nullThe tender's CPV codes that matched your bedrijfCpvCodes, if any. null when relevantieScore is null
cpvVerrijktbooleantrue when cpvCodes was filled via the optional TenderNed detail-call (verrijkTenderNedCpv)
locatieobject | null{ gemeente, provincie, lat, lon } for NL tenders (country === "NL", regardless of source — TenderNed or TED), only with verrijkMetLocatie enabled and a real PDOK match
documentUrlstring | nullDirect PDF link to the official announcement. Always filled for TED results (free, from the same search response). For TenderNed, only filled with verrijkDocumenten enabled and a successful detail-call
documentVerrijktbooleantrue only when documentUrl was filled via the paid TenderNed detail-call (verrijkDocumenten) — the signal for the document-enrichment charge. Stays false for TED even though documentUrl is filled there (no extra call, no charge)

Optional enrichments (separately charged)

verrijkTenderNedCpv — TenderNed's list API never returns CPV codes (see relevantieScore note above). With this flag, each TenderNed result gets an extra detail-call (GET /publicaties/{id}), which does include CPV codes. Only charged (tender-cpv-enrichment) when the call succeeds and returns at least one code — a failed detail-call is logged and skipped, never crashes the run.

verrijkMetLocatie — geocodes the buyer name of NL tenders to a municipality/province via the public PDOK Locatieserver, restricted to type:gemeente matches. This applies to any tender whose country is "NL", regardless of which source it came from — that includes NL buyers found via the TED source, not just TenderNed results. This only works reliably when the buyer name literally contains a municipality name (e.g. "Gemeente Amsterdam") — provinces, waterschappen and private buyers won't match, which is an accepted limitation rather than a bug (fuzzy-matching arbitrary organization names would give unreliable region assignments). Only charged (location-enrichment) on a real PDOK match.

verrijkDocumenten — fetches the PDF link of the official announcement for TenderNed results, via the same detail-call as verrijkTenderNedCpv (one call covers both if both flags are on). TED results already carry their PDF link (documentUrl) for free — it's part of the same search response that also fills url, so no flag or extra charge applies there. Only charged (document-enrichment) for TenderNed results, when the detail-call succeeds and actually returns a PDF link.

{
"id": "ted-123",
"verrijkTenderNedCpv": true,
"buyer": "Gemeente Utrecht",
"cpvVerrijkt": true,
"cpvCodes": ["45000000"],
"locatie": { "gemeente": "Utrecht", "provincie": "Utrecht", "lat": 52.09, "lon": 5.12 }
}

Pricing — Pay Per Event

This actor uses Pay Per Event (PPE) — no monthly rental, no subscription.

EventPriceWhen Charged
apify-actor-start$0.00005Once per run (Apify default, first 5s compute free)
tender-result$0.005Per tender returned in the dataset
notification-sent$0.0015Once per run, only if webhookUrl is set and the POST succeeds — never per tender
tender-cpv-enrichment$0.0025Per TenderNed result, only with verrijkTenderNedCpv enabled and a successful detail-call returning at least 1 CPV code
location-enrichment$0.003Per NL tender, only with verrijkMetLocatie enabled and a real PDOK match
document-enrichment$0.0025Per TenderNed result, only with verrijkDocumenten enabled and a successful detail-call returning a PDF link (TED results get this for free, no charge)

Cost Examples

ScenarioTenders ReturnedEst. Cost
Daily NL IT tenders15$0.075/run → ~$2.25/month
Weekly EU construction80$0.40/run → ~$1.60/month
One-time market scan500$2.50 total

Why $0.005? Comparable actors charge $0.003–$0.005/result. This price covers platform fees, leaves margin, and is far cheaper than building your own integration.


Incremental Mode (Scheduled Runs)

Enable incrementalMode: true to only fetch new tenders since your last successful run.

  • Uses Apify KeyValueStore to persist lastRunDate per source
  • First run with incremental mode returns all matching tenders (up to maxResults)
  • Subsequent runs return only tenders with publishedDate > lastRunDate
  • Ideal for daily/weekly schedules via Apify Scheduler

MCP Integration (AI Agents)

Output is compatible with Model Context Protocol. Use the dataset directly as context for:

  • Lead qualification agents
  • Proposal drafting assistants
  • Market analysis workflows

Example MCP server config:

{
"mcpServers": {
"tenders": {
"command": "npx",
"args": ["-y", "@apify/mcp-server"],
"env": {
"APIFY_TOKEN": "your-token",
"ACTOR_ID": "nl-eu-tenders-scraper",
"DATASET_ID": "auto"
}
}
}
}

AspectStatus
Data SourceOfficial public APIs (TenderNed, TED) — no scraping
Terms of ServiceBoth APIs explicitly allow reuse (open data policies)
Personal DataMinimal — buyers are legal entities, not individuals
GDPR RiskLow — no personal data processing
LicenseApache 2.0 (actor code); data governed by source terms

TenderNed: Publieke overheidsdienst, data expliciet bedoeld voor hergebruik (data.overheid.nl).
TED: EU-instelling, data onder EU open data directive (hergebruik toegestaan).


Roadmap / Upcoming

  • Historical backfill option
  • Buyer organization enrichment (KvK, VAT, size)

FAQ

How fresh is the data? TenderNed publications update daily. TED notices are fetched live via the official TED API v3 search endpoint at run time, so results reflect whatever is currently published on each source — there is no caching layer beyond the optional incrementalMode bookkeeping.

Which countries/sources are covered? Two sources: TenderNed for the Netherlands (144,000+ publications), and TED API v3 for 32 EU/EEA countries. Set source to "tenderned", "ted", or "both" to control which are queried.

What does bedrijfCpvCodes do? It lets you supply your own company's CPV codes/prefixes so each result gets a relevantieScore (0/40/70/100) and relevantieMatchedCpv showing how closely the tender's CPV codes match your profile, without you needing to know the exact CPV codes to filter on upfront. Note that TenderNed results always have relevantieScore: null because that source doesn't expose CPV data.

Can I skip irrelevant results to save cost? Yes — combine bedrijfCpvCodes with alleenRelevanteTenders: true to skip (and avoid being charged for) results with a relevantieScore of 0.

How is this priced? Pay Per Event: $0.00005 once per run for apify-actor-start, plus $0.005 per tender returned (tender-result). There's no monthly subscription or rental fee.

Are there rate limits or authentication requirements? TenderNed's endpoint requires no authentication and is fully public. TED API v3 requires a free API key from the TED API portal under the EU open data policy. Neither API is scraped — both are official, documented endpoints.


Also by this developer — Dutch/EU public-data actors that pair well with this one:


Support & Feedback

  • Issues: Apify Actor page
  • Response Time: Within 14 days (urgent: 3 business days)
  • Feature Requests: Welcome — open an issue with the enhancement label

Zoekwoorden: aanbestedingen nederland, tenderned scraper, overheidsopdrachten, europese aanbesteding, cpv-code zoeken, aanbesteding monitor nederland.

Keywords

tenderned, ted, procurement, aanbesteding, tender, lead-generation, government, public-procurement, mcp


Changelog

  • 2026-07-16: Added verrijkDocumenten — fetches the official announcement's PDF link for TenderNed results (documentUrl) via the same detail-call as verrijkTenderNedCpv. New document-enrichment event ($0.0025), only charged for TenderNed on a successful detail-call. TED results now also expose documentUrl for free (already present in the existing search response, no new call, no charge). Must be re-pushed (
    apify push
    ) — this actor is already live, and the new PPE event must be created in Apify Console > Monetization first.
  • 2026-07-16: Added deadlineWithinDays — optional filter on the already-computed daysUntilDeadline field, so runs can keep only tenders with a submission deadline within N days. Tenders with no known deadline or an already-passed deadline are skipped. No pricing change — filters on existing data, no extra call, and lowers the number of tender-result charges for runs that enable it.
  • 2026-07-16: Documentation clarification — verrijkMetLocatie was already applying to NL buyers found via the TED source (the check is on country, not source); the README and input schema now say so explicitly. No behavior change.
  • 2026-07-15: BugfixincrementalMode never saw the previous run's lastRunDate: the actor was reading/writing to Apify's per-Run default key-value store, which is not shared between separate runs. Now uses a named, persistent key-value store. Must be re-pushed (apify push) — this actor is already live.
  • 2026-07-14: Added verrijkTenderNedCpv (extra detail-call for TenderNed CPV codes, new tender-cpv-enrichment event, $0.0025) and verrijkMetLocatie (PDOK gemeente/provincie geocoding for NL buyers, new location-enrichment event, $0.003). Both confirmed by the user, see docs/actor-verbeteringen/PRIJSBESLISSINGEN.md. Must be re-pushed (apify push) — this actor is already live, and the 2 new PPE events must be created in Apify Console > Monetization first.
  • 2026-07-14: Added webhookUrl — optional POST of a run summary (total count + top 5 by relevantieScore) after the run finishes. New notification-sent event ($0.0015, once per run), only charged when the POST succeeds. A failing webhook never fails the run itself.
  • 2026-07-14: Added cpvLabels — a division-level (2-digit) English label per CPV code, so results are readable without looking up the CPV tree yourself. TenderNed results (which never carry CPV codes from the source API) get an empty array, same as cpvCodes. No pricing change — enrichment of the existing tender-result output.
  • 2026-07-13: Documentation update — added a Dutch-language "Zoekwoorden" line for search coverage on NL-specific terms.
  • 2026-07-12: Added company-profile CPV matching — new optional bedrijfCpvCodes and alleenRelevanteTenders input fields, new relevantieScore/relevantieMatchedCpv output fields. Fully backward compatible: existing behavior is unchanged when these fields are left empty.
  • 2026-07-12: Documentation update — fixed a rendering bug where JSON code examples showed literal escaped quotes (\") instead of "; added a "Related Actors" section cross-linking other actors by this developer.
  • Initial release
  • TenderNed + TED API v3 integration
  • Incremental mode with KeyValueStore
  • Pay Per Event pricing
  • Full input validation (Zod)
  • Comprehensive test suite (21 tests)

Developer

Built by an independent developer. No enterprise affiliation with TenderNed, TED, or the European Commission.

Apify Store: NL & EU Government Tenders Scraper
Pricing Model: Pay Per Event ($0.005/tender)