EU TED Procurement Notices Scraper
Pricing
from $1.20 / 1,000 procurement notices
EU TED Procurement Notices Scraper
Search official EU TED procurement notices and export buyers, CPV codes, values, locations, deadlines, award winners, and source links.
Pricing
from $1.20 / 1,000 procurement notices
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Share
Search and export official EU TED procurement notices for tender monitoring, bid research, and public-spending analysis.
The Actor queries the European Union's public TED Search API and produces one clean dataset row per notice. It covers publication identity, buyers, CPV classifications, performance locations, deadlines, estimated values, award values, winners, and official source links when those fields are present in TED.
Use it for one-time research or schedule the same filtered run to identify newly published opportunities and awards. No TED account, API key, browser, or proxy is required.
What can you do with this Actor?
- Find public procurement opportunities by keyword, country, CPV code, buyer, publication date, or deadline.
- Export notices to JSON, CSV, Excel, XML, RSS, or another Apify dataset integration.
- Track a category such as software, renewable energy, construction, or medical equipment.
- Monitor contracting authorities and recurring buyers.
- Separate tender opportunities from award/result notices.
- Capture named winners and awarded values when TED publishes them.
- Keep official HTML, PDF, and XML links beside every record.
- Use a native TED expert query for advanced source-specific searches.
The Actor does not scrape search-result HTML.
It uses POST https://api.ted.europa.eu/v3/notices/search, TED's official anonymous data-reuse endpoint.
Who is it for?
Government sales teams can discover suitable tenders and feed qualified notices into a CRM.
Bid managers can schedule country, CPV, buyer, and deadline searches instead of repeating them manually.
Procurement analysts can compare buyers, categories, estimated values, awarded values, and named winners.
Market-intelligence teams can monitor contract awards and supplier activity in selected countries.
Data engineers can obtain a stable normalized row while optionally retaining the selected raw TED fields.
Researchers and journalists can trace each row back to official TED HTML, PDF, and XML documents.
Why use the official Search API route?
The structured route is faster and cheaper than browser automation. It also avoids brittle selectors and exposes multilingual notice fields directly.
This Actor adds practical automation around that source:
- safe query generation for common filters;
- bounded pagination and deduplication by publication number;
- localized text selection with English fallback;
- normalized tender and award fields;
- client-side value and result-type filters;
- transient retry handling;
- Apify datasets, schedules, webhooks, API clients, and integrations.
What data does it extract?
| Field | Meaning |
|---|---|
publicationNumber | Official TED publication identifier. |
noticeTitle | Preferred localized notice title, or English/source fallback. |
publicationDate | TED publication date and source timezone. |
noticeType | TED notice-type code when present. |
formType | TED form category, useful for result/award analysis. |
noticeCategory | Competition, result, planning, change, completion, consultation, direct-award-preannouncement, business-registration, or unknown. |
sourceTotalValue | First numeric TED total-value, preserved for any notice category; not necessarily an award. |
sourceTotalValueCurrency | Currency accompanying the source total. |
procedureType | Procurement procedure type when present. |
contractNature | Main contract nature, such as works, services, or supplies. |
buyerName | First normalized contracting authority name. |
buyerNames | All buyer names returned for the notice. |
buyerCountryCodes | Buyer-country codes. |
cpvCodes | Common Procurement Vocabulary classifications. |
countryCodes | Place-of-performance country codes. |
cities | Place-of-performance cities when published. |
deadlineDate | First published submission deadline. |
deadlineDates | All returned lot deadlines. |
estimatedValues | Numeric estimated lot values. |
estimatedValueCurrencies | Currencies associated with estimates. |
maximumEstimatedValue | Largest numeric estimate in the notice. |
awardTotalValue | First numeric TED total value on a result notice only; otherwise null. This is not proof of a value awarded to a particular winner. |
awardCurrency | Award-value currency. |
winnerNames | Named successful tenderers or winners. |
winnerCountryCodes | Winner-country codes. |
isAwardNotice | Normalized award/result indicator. |
tedUrl | Official TED HTML notice. |
pdfUrl | Official PDF document when available. |
xmlUrl | Official XML document when available. |
sourceApiUrl | Official TED Search API endpoint. |
scrapedAt | UTC extraction timestamp. |
rawNotice | Optional selected raw TED response fields. |
TED notices vary by form and procedure.
Missing source fields are represented by null or an empty array; they are not guessed.
How to run EU TED procurement searches
- Open the Actor input page.
- Enter at least one keyword, country, CPV code, buyer, publication date, deadline, or expert query.
- Choose
all,tenders, orawardsunder Result type. - Set
maxItemsto the maximum unique notices you need. - For selective value or award filters, increase
maxNoticesScannedif necessary. - Click Start.
- Open the default dataset and export or integrate the resulting rows.
A useful first run is:
{"keywords": ["renewable energy"],"countries": ["DEU"],"sortBy": "publication-date-desc","maxItems": 20}
Input reference
Search filters
keywords— full-text phrases combined with OR.countries— three-letter TED/ISO country codes such asDEU,FRA,ESP, orPRT.cpvCodes— exact eight-digit CPV codes such as48000000.buyerName— contracting authority name text.publicationDateFromandpublicationDateTo— inclusive publication window inYYYY-MM-DDformat.deadlineDateFromanddeadlineDateTo— inclusive deadline window inYYYY-MM-DDformat.
Value and award filters
minimumValue— inclusive lower bound on an estimate or source total.maximumValue— inclusive upper bound. When both bounds are set, the same value must fall inside the interval. Notices without numeric values do not match a value filter.resultType—allkeeps every category;tenderskeeps competition notices;awardskeeps result notices, including results without published winners.
Official TED form categories take precedence over notice codes and winner evidence. Competition notices do not become awards because they have a value. Planning, change, completion, consultation and direct-award preannouncements are not active tenders or result notices; use all to retain them. Missing/unrecognized forms fall back to recognized notice codes (including legacy contract-notice/contract-award-notice codes), then winner names as result evidence; without either, the category is unknown. A numeric value alone never establishes an award. tenders does not check whether deadlines have expired.
Compatibility keys isAwardNotice, awardTotalValue and awardCurrency remain, but award totals/currencies are now null outside result notices. Use the additive sourceTotalValue and sourceTotalValueCurrency to retain non-award source totals.
Value filters do not convert currencies.
For example, 1000000 EUR and 1000000 CZK are both numeric values of 1,000,000 in their source currency.
Filter or convert by the accompanying currency fields downstream when comparing totals.
Advanced and limit options
expertQuery— a raw TED expert query that replaces generated search clauses.sortBy— relevance, newest/oldest publication, or earliest deadline.language— preferred three-letter TED language code; defaulteng.maxItems— 1 to 5,000 saved notices.pageSize— 1 to 100 records requested per source page.maxNoticesScanned— client-side scan ceiling, up to TED's 15,000 page-number result limit.includeRawNotice— include selected source fields inrawNotice.
Even with expertQuery, resultType, minimumValue, and maximumValue remain active post-filters. Generated keyword/country/CPV/buyer/date clauses are ignored, including their validation. Without an expert query, dates must be real calendar dates and each from/to window must be ordered. Invalid sortBy values are rejected; an existing expert SORT BY is preserved.
Real output example
This abbreviated record came from a current run against the official API:
{"publicationNumber": "610518-2026","noticeTitle": "Portugal – Construction work – Contrato de empreitada de construção do novo edifício administrativo da EDA...","publicationDate": "2026-09-04+02:00","buyerName": "EDA - Electricidade dos Açores, S. A.","buyerCountryCodes": ["PRT"],"cpvCodes": ["45000000"],"countryCodes": ["PRT"],"awardTotalValue": 4821485.33,"awardCurrency": "EUR","winnerNames": ["CEATANO & MEDEIROS, SOCIEDADE DE CONSTRUÇÃO E IMOBILIÁRIA LDA.,"],"isAwardNotice": true,"tedUrl": "https://ted.europa.eu/en/notice/610518-2026/html","pdfUrl": "https://ted.europa.eu/en/notice/610518-2026/pdf"}
The complete dataset row includes all fields listed above.
Monitor tenders and awards on a schedule
Create an Apify Schedule for daily or weekly monitoring. Keep the search scope stable and use a rolling publication window or a TED expert query appropriate to your workflow.
For change detection:
- use
publicationNumberas the stable notice identity; - save the prior run in your database or spreadsheet;
- compare new publication numbers and changed business fields;
- route new opportunities to the responsible owner;
- route result notices to supplier and spending analysis.
The Actor returns snapshots; it does not maintain a hidden cross-run history or send alerts by itself. Apify Schedules, webhooks, Zapier, Make, Slack, email, or your own pipeline can provide those actions.
Export and integration patterns
Spreadsheet review: export the default dataset as CSV or Excel and filter by buyer, CPV, deadline, or country.
CRM enrichment: send new tender rows through a webhook and map publicationNumber as an external ID.
Bid pipeline: select opportunity notices, reject expired deadlines downstream, and attach tedUrl for source review.
Award intelligence: run with resultType: "awards" and analyze winnerNames, awardTotalValue, and awardCurrency.
Data warehouse: ingest JSON rows, preserve arrays, and partition on publicationDate.
Document workflow: use pdfUrl or xmlUrl as inputs to a separate document extraction process when notice-level fields are insufficient.
How much does it cost to export EU TED procurement notices?
Pricing uses one start event plus one item event for each unique notice saved.
There is no separate charge for award fields, source links, pagination, or an included raw notice.
The current source configuration declares a $0.005 start fee and tiered item pricing. At the BRONZE rate of $0.002 per notice, a run saving 10 notices costs $0.025, 100 notices costs $0.205, and 1,000 notices costs $2.005. The item rates are FREE $0.0023, BRONZE $0.002, SILVER $0.00156, and GOLD/PLATINUM/DIAMOND $0.0012 per saved notice.
Only accepted notices generate item events, and only the billing-accepted prefix is saved. The Actor checks the remaining charge allowance before billing so it does not intentionally exceed your total-charge ceiling. Charge rejection/failure stops the run rather than silently returning unpaid rows. Local runs bypass hosted billing. Dataset writes and charge calls are separate platform operations: if storage fails after billing, the run fails visibly; do not blindly rerun without inspecting that run's charges and output.
Only saved, accepted notices generate item events in a completed successful run. Rows rejected by value/result-type filters, duplicates, failed requests, and scanned-but-unsaved notices do not generate item charges. Always check the live pricing tab before a large run because the applicable platform tier is authoritative.
Use the Actor through the Apify API
Replace APIFY_TOKEN with your token.
The Actor ID is automation-lab/eu-ted-procurement-notices.
cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~eu-ted-procurement-notices/runs?token=APIFY_TOKEN&waitForFinish=300" \-H "Content-Type: application/json" \-d '{"cpvCodes":["48000000"],"publicationDateFrom":"2026-01-01","resultType":"tenders","maxItems":25}'
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/eu-ted-procurement-notices').call({countries: ['PRT'],publicationDateFrom: '2026-01-01',resultType: 'awards',maxItems: 25,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
from apify_client import ApifyClientimport osclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('automation-lab/eu-ted-procurement-notices').call(run_input={'keywords': ['medical equipment'],'countries': ['FRA'],'maxItems': 50,})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
Use with MCP and AI agents
Add the Apify MCP endpoint to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/eu-ted-procurement-notices"
Claude Desktop, Cursor, and VS Code
Claude Desktop, Cursor, and VS Code can use this equivalent HTTP MCP configuration:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/eu-ted-procurement-notices"}}}
Example prompts:
- “Find the 20 newest TED renewable-energy notices for Germany and summarize buyers and deadlines.”
- “Export recent software tenders under CPV 48000000 to a dataset.”
- “Collect Portuguese award notices and group winners by awarded value.”
An agent should still follow the official links before making a bid or compliance decision.
Reliability, retries, and limits
The Actor retries network errors, HTTP 429, and temporary 5xx responses up to three times with bounded backoff. Stable invalid-query and other 4xx responses fail immediately so input mistakes are visible.
maxItems limits accepted saved rows.
maxNoticesScanned limits source rows examined for client-side value and award filtering, including duplicates and rejected rows. Requests keep a fixed page size to avoid moving the TED offset backwards; a final page can fetch an unexamined tail. A selective filter can return fewer than maxItems even when the broader query has more records. No hidden cross-run state is kept.
Run summary and partial results
Open Run summary and completeness in the Output tab (RUN-SUMMARY in the default key-value store). It contains saved, scanned (actually examined rows), fetched (all received rows), duplicates, rejections (unique rows rejected by post-filters), pages, requests (including retries), retries, sourceTotal, stopReason, and completenessWarning. Counters are bounded numbers, not copied notices or private queries.
Stop reasons are source_exhausted, max_items, scan_limit, source_timeout, charge_limit, or error. Only source exhaustion has no completeness warning; it means exhaustion of the returned search response, not a guarantee of all historical procurement data. A source timedOut response may contain useful rows: these are processed within the configured limits, the run stops with source_timeout, and the summary warns that rows/total may be incomplete. Narrow the query before retrying; the Actor does not silently treat a timeout as an empty complete search. Failed runs retain a best-effort partial summary. If limits or billing stop a run, additional matches may exist.
TED page-number search exposes at most 15,000 matches for a query. Narrow broad searches with publication dates, countries, CPV codes, or expert-query clauses. When a page size does not divide 15,000, the Actor stops before a page would cross that source window; the scan count can be slightly below the requested ceiling. Page-number results can shift as TED updates; deduplication avoids duplicate output but cannot create a transactional source snapshot.
The Actor does not download or parse every linked PDF/XML attachment. Fields absent from TED's search response remain empty rather than being inferred from document prose.
Troubleshooting
The run says no search filter was provided.
Add a keyword, country, CPV code, buyer, publication/deadline date, or expertQuery.
TED returns HTTP 400. Check the expert-query syntax, three-letter country codes, eight-digit CPV codes, and date format. The error log includes the HTTP status without copying source response bodies or echoed queries.
An award run returns fewer rows than expected.
Increase maxNoticesScanned, broaden the publication window, or remove another restrictive filter.
Award status follows official form/notice classification, with winner-only fallback for unrecognized legacy types. Totals alone are not award evidence. Check the run summary for scan limits or a source timeout.
A value looks incomparable.
Read estimatedValueCurrencies or awardCurrency.
The Actor preserves source currencies and does not perform foreign-exchange conversion.
A title is not in the requested language. TED may not publish that field in the selected language. The Actor falls back to English and then another available source value.
Diagnostics and privacy
No AI model is used. Searches are sent to the official TED API; output and logs are stored in your Apify run storage under your account's retention settings. The Actor creates no persistent named dataset, external business-data copy or hidden cache. Delete run storage through Apify when no longer needed. For help, open an issue in the Actor's Apify Store Issues tab and include a run link and a non-secret input example.
This is an independent Automation Lab Actor, not affiliated with or endorsed by TED or the European Union.
Failed operations send sanitized diagnostic input, exceptions and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed; reports are retained for 30 days. Bounded operational counters help diagnose incomplete searches. Telemetry credentials are not public inputs.
Legality and responsible use
TED is the official EU publication surface for public procurement notices. This Actor accesses the public anonymous Search API and keeps official source links in each row.
Follow TED reuse conditions, Apify terms, applicable database rights, and local law.
Do not treat a normalized row as legal advice or as a substitute for the complete official notice and procurement documents.
Verify deadlines, eligibility, amendments, values, currencies, and award decisions at tedUrl before acting.
Buyer and winner names may identify sole traders or other individuals in some notices. Process personal data only with an appropriate lawful purpose, minimize retention, and honor applicable rights.
FAQ
Does it require a TED account or API key?
No. The official TED Search API route used here is public and unauthenticated.
Does it cover all EU countries?
It searches the source's published scope. Use TED three-letter country codes, and remember that a buyer country can differ from the contract's place of performance.
Can it return both tenders and awards?
Yes. Choose all, tenders, or awards.
Award fields are populated only when TED publishes them.
Can it search by contract value?
Yes. minimumValue and maximumValue filter returned estimated and awarded numeric values without currency conversion.
Can I use a native TED expert query?
Yes. expertQuery replaces generated search clauses and preserves an existing SORT BY expression.
Does it monitor changes automatically?
It produces a current run snapshot.
Use an Apify Schedule and compare publicationNumber plus relevant fields between runs.
Why are some fields null or empty?
Different TED forms publish different data. The Actor does not invent missing deadlines, values, locations, or winners.
Related Automation Lab Actors
For procurement research outside this source, consider:
- Brazil PNCP Procurement Notices Scraper for Brazil's official PNCP notices.
- EBRD ECEPP Procurement Notices Scraper for EBRD electronic procurement opportunities.
- Spain Public Tenders Scraper for Spain-specific public tender workflows.
Use this Actor when TED is the authoritative source and you need one normalized notice row with official EU links.