NL & EU Government Tenders Scraper | TenderNed + TED
Pricing
from $5.00 / 1,000 results
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 results
Rating
0.0
(0)
Developer
Dennis
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 hours 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.
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
| Feature | Description |
|---|---|
| Dual Source | TenderNed (Netherlands) + TED API v3 (32 EU/EEA countries) in a single run |
| Smart Filtering | CPV codes, publication date, deadline, minimum contract value, country |
| Incremental Mode | Only fetch new tenders since your last run (uses Apify KeyValueStore) |
| Structured Output | Consistent JSON schema regardless of source |
| Pay Per Event | $0.005 per tender result — no monthly subscriptions, no rental fees |
| MCP-Ready | Output compatible with Model Context Protocol for AI agents |
| Official APIs Only | No 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
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
source | enum | Yes | "both" | "tenderned", "ted", or "both" |
country | string[] | No | [] | ISO 3166-1 alpha-2 codes (TED only). Empty = all countries |
cpvCodes | string[] | No | [] | CPV codes (e.g., ["45000000", "72000000"]). Supports 2-8 digit codes |
publishedAfter | string | No | "" | ISO date (YYYY-MM-DD). Only tenders published on/after this date |
deadlineAfter | string | No | "" | ISO date (YYYY-MM-DD). Only tenders with deadline on/after this date |
minValue | number | No | 0 | Minimum 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 |
maxResults | number | No | 100 | Maximum results per run (per source) |
incrementalMode | boolean | No | false | If true, only returns tenders newer than last successful run |
bedrijfCpvCodes | string[] | 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) |
alleenRelevanteTenders | boolean | No | false | Combined with bedrijfCpvCodes: skip (and don't charge for) results with a relevantieScore of 0 |
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"],"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,"documents": [],"relevantieScore": null,"relevantieMatchedCpv": null}
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
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier (source-specific) |
source | string | "tenderned" or "ted" |
title | string | Tender title / notice title |
buyer | string | Contracting authority name |
description | string | Full description (truncated if very long) |
type | string | Contract type (NL: leveringen/diensten/werken; EU: works/supplies/services) |
procedure | string | Procedure type (open, restricted, negotiated, etc.) |
cpvCodes | string[] | Array of CPV codes |
publishedDate | string | Publication date (YYYY-MM-DD) |
deadline | string | Submission deadline (YYYY-MM-DD) |
daysUntilDeadline | number | Calendar days from today to deadline |
estimatedValue | number | Estimated contract value in EUR (null if unpublished) |
currency | string | Always "EUR" |
country | string | ISO country code of buyer |
url | string | Direct link to tender on source platform |
isEuropean | boolean | True if above EU thresholds / cross-border interest |
documents | array | Placeholder for future document-link enrichment |
relevantieScore | number | null | null 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) |
relevantieMatchedCpv | string[] | null | The tender's CPV codes that matched your bedrijfCpvCodes, if any. null when relevantieScore is null |
Pricing — Pay Per Event
This actor uses Pay Per Event (PPE) — no monthly rental, no subscription.
| Event | Price | When Charged |
|---|---|---|
apify-actor-start | $0.00005 | Once per run (Apify default, first 5s compute free) |
tender-result | $0.005 | Per tender returned in the dataset |
Cost Examples
| Scenario | Tenders Returned | Est. Cost |
|---|---|---|
| Daily NL IT tenders | 15 | $0.075/run → ~$2.25/month |
| Weekly EU construction | 80 | $0.40/run → ~$1.60/month |
| One-time market scan | 500 | $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
lastRunDateper 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"}}}}
Legal & Compliance
| Aspect | Status |
|---|---|
| Data Source | Official public APIs (TenderNed, TED) — no scraping |
| Terms of Service | Both APIs explicitly allow reuse (open data policies) |
| Personal Data | Minimal — buyers are legal entities, not individuals |
| GDPR Risk | Low — no personal data processing |
| License | Apache 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
- Document/link enrichment (fetch PDF attachments)
- CPV code lookup / human-readable labels
- Email/Slack/webhook notifications on new matches
- 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.
Related Actors
Also by this developer — Dutch/EU public-data actors that pair well with this one:
- NL Vergunningen & Bekendmakingen Leadfeed — the same lead-generation-from-government-publications approach, for Dutch building/environmental permits instead of tenders.
- NL CAO Wijzigingen Database — the same official Dutch publication family (Staatscourant / officielebekendmakingen.nl), for collective labour agreement changes.
- PDOK Adres Geocoding & Buurtdata — geocode buyer addresses or project locations extracted from tender descriptions.
Support & Feedback
- Issues: Apify Actor page
- Response Time: Within 14 days (urgent: 3 business days)
- Feature Requests: Welcome — open an issue with the
enhancementlabel
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-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
bedrijfCpvCodesandalleenRelevanteTendersinput fields, newrelevantieScore/relevantieMatchedCpvoutput 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)