OrbTop

TED EU Procurement Scraper - Tenders & Award Notices

BUSINESSLEAD GENERATION

TED EU Procurement Scraper - Tenders & Award Notices

Scrape EU public procurement notices from TED (Tenders Electronic Daily), the official OJEU portal. Returns tender opportunities, award notices, prior-information notices, and corrigenda with buyer, CPV codes, estimated and awarded value, winner, subcontractors, NUTS region, and SME flag — roughly 1M+ notices published per year across 27 EU member states plus EEA.

No API key. No proxy. No browser. Pure JSON over the TED Public Expert Search API v3.


TED EU Procurement Scraper Features

  • Extracts 30+ fields per notice — buyer, CPV, estimated value, awarded value, winner, SME flag, NUTS region, deadlines, subcontractors, document URLs
  • Filters by country, CPV code, NUTS region, publication-date range, minimum estimated value, and SME-winner-only
  • Covers four notice kinds in one actor — tender opportunities, award notices, prior information, and modifications
  • Normalises multi-language free-text fields to a preferred language (default English) with graceful fallback
  • Streams through the full TED Expert Search API with 1-based pagination and total-count termination
  • Runs in 512MB memory with no proxy requirement
  • Two-view output: one view for bidders (open tenders), one for competitor intelligence (award notices)

What Can You Do With TED EU Procurement Data?

  • B2G sales teams — Track new tender opportunities in your CPV codes and countries, and feed them into a CRM
  • Competitive intelligence — Pull award notices with winner name and awarded value to map who is winning which contracts
  • Lobbying and policy research — Aggregate public spending patterns across ministries, agencies, and NUTS regions
  • SME market entry — Filter to SME-winner-only results and see which small firms are landing government contracts
  • Due diligence — Cross-reference vendors and subcontractors against their EU public-sector revenue

How TED EU Procurement Scraper Works

  1. Pick your filters — notice types, countries, CPV codes, NUTS regions, date range, minimum value, SME-only
  2. The scraper composes a TED Expert Search query and paginates the API 100 records per page
  3. Each notice is flattened into a row-per-notice record with consistent field names across all four notice kinds
  4. Results stream into the Apify dataset — you can export to JSON, CSV, or Excel, or feed directly into another actor

Input

{
  "noticeTypes": ["award"],
  "countries": ["DEU", "FRA"],
  "cpvCodes": ["71220000"],
  "publishedAfter": "2024-01-01",
  "publishedBefore": "2024-12-31",
  "minEstimatedValueEur": 100000,
  "onlySmeWinners": false,
  "preferredLanguage": "eng",
  "maxItems": 500
}
Field Type Default Description
noticeTypes array [] (all) Notice kinds: prior_info, contract, award, modification
countries array [] (all) Buyer countries as ISO 3-letter codes (e.g. POL, DEU, FRA)
cpvCodes array [] EU Common Procurement Vocabulary codes, 8 digits
nutsCodes array [] EU NUTS region codes (e.g. PL418, DE268)
minEstimatedValueEur integer 0 Lower bound on estimated-value-glo, in the notice's currency unit
publishedAfter string 30 days ago Earliest publication date (YYYY-MM-DD)
publishedBefore string today Latest publication date (YYYY-MM-DD)
onlySmeWinners boolean false On award notices, keep only winners flagged as SMEs
preferredLanguage string eng Preferred language for titles, buyer names, descriptions
maxItems integer 100 Maximum notices to return across the whole run
proxyConfiguration object {} Optional — TED is a public API and does not need proxies

Example: German contracts over €100K from the last year

{
  "noticeTypes": ["contract"],
  "countries": ["DEU"],
  "minEstimatedValueEur": 100000,
  "publishedAfter": "2024-01-01",
  "maxItems": 1000
}

Example: Award notices to SME winners in architectural services

{
  "noticeTypes": ["award"],
  "cpvCodes": ["71220000", "71200000"],
  "onlySmeWinners": true,
  "preferredLanguage": "eng",
  "maxItems": 500
}

TED EU Procurement Scraper Output Fields

Every record is flat, CSV-friendly, and uses the same schema across all four notice kinds. Empty fields are returned as "" or null, not omitted.

{
  "noticeId": "192938-2026",
  "noticeType": "contract",
  "noticeSubtype": "cn-standard",
  "publicationDate": "2026-03-20",
  "deadlineDate": "2026-04-24",
  "awardDate": "",
  "country": "DEU",
  "nutsCode": "DE268",
  "title": "Germany – Telephone and data transmission services – Auswahlverfahren Großlangheim - Gigabit-RL 2.0",
  "titleLanguage": "eng",
  "description": "Der Netzbetreiber, dem nach Abschluss dieses Auswahlverfahrens der Zuschlag erteilt wird, erhält eine Dienstleistungskonzession zum Aufbau und Betrieb eines gigabitfähigen Netzes für das Erschließungsgebiet...",
  "buyerName": "Markt Großlangheim",
  "buyerCity": "Großlangheim",
  "buyerCountryCode": "DEU",
  "buyerLegalType": "la",
  "procedureType": "",
  "cpvMain": "64210000",
  "cpvCodes": ["64210000", "32412000", "32561000", "32562000", "32562100", "32562300", "64215000"],
  "estimatedValueEur": null,
  "estimatedValueCurrency": "",
  "awardedValueEur": 550000,
  "awardedValueCurrency": "EUR",
  "placeOfPerformance": "DE268, DEU",
  "frameworkAgreement": false,
  "winnerName": "",
  "winnerCountry": "",
  "winnerIsSme": false,
  "subcontractors": "",
  "documentUrls": [
    "https://ted.europa.eu/en/notice/-/detail/192938-2026",
    "https://ted.europa.eu/en/notice/192938-2026/xml",
    "https://ted.europa.eu/en/notice/192938-2026/pdf"
  ],
  "url": "https://ted.europa.eu/en/notice/-/detail/192938-2026"
}
Field Type Description
noticeId string Publication number, e.g. 192938-2026
noticeType string Category: prior_info, contract, award, or modification
noticeSubtype string Raw TED notice-type code (e.g. cn-standard, can-standard, pin-only, corr)
publicationDate string ISO 8601 publication date
deadlineDate string Submission deadline (ISO 8601), when present
awardDate string Winner-decision date on award notices (ISO 8601), when present
country string Buyer country ISO 3-letter code
nutsCode string Primary NUTS region code for place of performance
title string Notice title in the preferred language
titleLanguage string Actual language returned for the title
description string Notice description in the preferred language, truncated at 2000 characters
buyerName string Buyer organisation name
buyerCity string Buyer city
buyerCountryCode string Buyer country ISO code
buyerLegalType string Buyer legal-type code (la = local authority, cga = central government, 8 = regional, etc.)
procedureType string Procedure-type code (open, restricted, neg-wo-call, comp-dial, etc.)
cpvMain string Primary CPV code
cpvCodes array All CPV codes on the notice
estimatedValueEur number Estimated total contract value (see currency field for unit)
estimatedValueCurrency string Currency code for estimated value
awardedValueEur number Final awarded value on result notices
awardedValueCurrency string Currency code for awarded value
placeOfPerformance string NUTS codes joined comma-separated
frameworkAgreement boolean Whether this notice is part of a framework agreement
winnerName string Awarded winner organisation name
winnerCountry string Winner country ISO code
winnerIsSme boolean Whether the winner is flagged as an SME
subcontractors string Subcontractor names, comma-separated
documentUrls array Deep-link URLs — HTML detail, XML, PDF
url string Canonical TED detail page URL

FAQ

How do I scrape TED EU procurement data?

TED EU Procurement Scraper uses the public TED Expert Search API v3 — no API key, no account, no proxy. Pick your filters, set maxItems, and run. The actor paginates the API 100 records per page until it hits your cap or exhausts the query.

How much does TED EU Procurement Scraper cost to run?

Pricing is pay-per-event: a small fee per actor start plus a fraction of a cent per record saved. A full year of German contracts (≈50K records) runs roughly a few dollars. Pulling 100 records costs basically nothing.

Can I filter by CPV code or NUTS region?

Yes. Pass cpvCodes as an array of 8-digit codes and nutsCodes as an array of NUTS identifiers. The filters are applied server-side as OR groups, so cpvCodes: ["71220000", "71200000"] returns any notice matching either code.

Does this return award notices with the winner?

Yes — that's the point of the actor. Set noticeTypes: ["award"] and the output includes winnerName, winnerCountry, winnerIsSme, awardedValueEur, awardedValueCurrency, and subcontractors on every record where TED has that data. Coverage varies by publishing authority; large EU central buyers are most consistent.

What languages are the titles and descriptions in?

TED publishes notices in the buyer's language and also provides a translation in each of the 24 EU languages for machine-readable fields. Set preferredLanguage to your desired code (eng, fra, deu, ita, spa, pol, nld, por, ces, swe). The scraper returns the requested language if available and falls back to English or any other available language. The chosen language is reported in titleLanguage.

Does TED EU Procurement Scraper need a proxy?

No. TED is a public EU portal with a rate-friendly API. The actor makes one request every 200ms and handles pagination cleanly up to the API's total-count limit.


Need More Features?

Need row-per-lot output, XML schema parsing, or a different set of fields? File an issue or get in touch.

Why Use TED EU Procurement Scraper?

  • Full coverage — All four TED notice kinds in one schema: tenders, awards, prior info, modifications
  • Award-notice parsing — Winner name, awarded value, SME flag, and subcontractor list on every award record — the fields most actors stop before reaching
  • Clean flat output — One row per notice with consistent field names, ready for CSV, BI tools, or a CRM, instead of the nested XML most TED consumers end up writing their own parser for