EU Tenders Scraper
Pricing
from $0.70 / 1,000 tender scrapeds
EU Tenders Scraper
Delivers a structured dataset of EU public procurement notices from TED (Tenders Electronic Daily). Filter tenders by business opportunity, CPV code, buyer country, procedure type, publication date, or keyword, with optional notice details and buyer contacts.
Pricing
from $0.70 / 1,000 tender scrapeds
Rating
0.0
(0)
Developer
Farhan Ali
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
EU Tenders Scraper creates a structured dataset of EU public procurement notices collected from TED (Tenders Electronic Daily). Each dataset item represents one tender notice and includes its publication number, title, notice type, buyer, buyer country, CPV classification, procedure type, contract nature, place of performance, publication date, submission deadline, and detail URLs; when fetchDetails is enabled, it also attaches buyer contacts, document links, and section-level details. Query the source with fullTextSearch, expertQuery, buyerName, CPV codes, buyer country, procedure type, publication dates, or specific publicationNumbers and searchUrls, cap the result with maxItems, and retrieve records through the Apify Dataset API or export them as JSON, CSV, Excel, or XML.
Dataset at a glance
| Property | Value |
|---|---|
| Source | TED (Tenders Electronic Daily) |
| Record unit | One public procurement notice |
| Input methods | fullTextSearch, expertQuery, buyerName, cpvCodes, buyerCountry, procedureType, publication dates, publicationNumbers, searchUrls |
| Main identifiers | publicationNumber |
| Delivery | Apify Dataset and API |
| Export formats | JSON, CSV, Excel, HTML, XML |
| Update model | Fresh records per Actor run |
| Pricing | Pay-per-event: $1.00 / 1,000 tenders (standard tier) |
Coverage and available records
The Actor accepts two complementary query styles in the same run:
- Structured filters —
businessOpportunity,cpvCodes,contractNature,placeOfPerformance,placeOfProcedure,procedureType,buyerCountry,buyerName,legalBasis,funding,noticeTypes,publicationYear, and apublicationDateFrom/publicationDateTorange. - Direct targeting —
publicationNumbers(specific notice numbers),searchUrls(TED notice or search-result URLs), andojsNumber(Official Journal supplement number).
Search behavior is further controlled by:
expertQuery— a raw TED expert-syntax query that overrides the structured filters.fullTextSearch— free-text search across notices.language— one of 24 EU languages for rendering labels and detail views (defaultEN).scope—ALL,ACTIVE, orLATESTnotices.sortBy/sortOrder— sort bypublication-number,publication-date, ordeadline-receipt-request, ascending or descending.onlyLatestVersions— return only the most recent version of each notice.
Conditional enrichment is controlled by fetchDetails (default false). When enabled, each notice is enriched with buyer contacts, document links, table of contents, section text, buyer details, and procedure details. maxItems caps the total number of notices returned (0 = unlimited); pageSize (max 100) controls how many results are read per page. Notice detail is not collected when fetchDetails is off.
Data dictionary
| Field | Type | Nullable | Description | Example |
|---|---|---|---|---|
publicationNumber | string | No | Unique TED notice identifier | "871151-2025" |
title | string | No | Notice title | "France – Agency fuel cards – ..." |
noticeType | object | Yes | Notice type as code/label | {"code":"can-standard","label":"Contract or concession award notice – standard regime"} |
procedureType | object | Yes | Procedure type as code/label | {"code":"open","label":"Open"} |
contractNature | array | Yes | Contract nature (supplies/services/works) as code/label objects | [{"code":"supplies","label":"Supplies"}] |
buyerName | string | Yes | Buying organisation name | "SDIS 85" |
buyerNames | array | Yes | All buyer organisation names | — |
buyerCountry | array | Yes | Buyer country as code/label objects | [{"code":"FRA","label":"France"}] |
placeOfPerformance | array | Yes | NUTS place(s) of performance as code/label objects | [{"code":"FRG05","label":"Vendée"}] |
placeOfProcedure | array | Yes | NUTS place(s) of procedure (BT-727) | — |
countryOfBuyer | array | Yes | Buyer country as an array | — |
publicationDate | string | Yes | Publication date (ISO 8601 with offset) | "2025-12-31+01:00" |
deadlineReceiptRequest | string | Yes | Submission deadline; empty string when none | "" |
officialLanguage | array | Yes | Official language(s) of the notice | — |
procedureIdentifier | string | Yes | Procedure identifier | — |
detailUrl | string | No | Full notice link on TED | "https://ted.europa.eu/en/notice/-/detail/871151-2025" |
notificationSummary | string | Yes | Concise notifier summary | "TED Notice 871151-2025\nFrance – Agency fuel cards …" |
language | string | Yes | Output language code | "EN" |
searchQuery | string | Yes | Search query that produced the row | "publication-number=871151-2025 SORT BY publication-number DESC" |
appliedFilters | object | Yes | Echo of the filters applied to the run | — |
detailTitle | string | Yes | Detail page title (present with fetchDetails) | — |
pdfUrl | string | Yes | PDF download link | "https://ted.europa.eu/en/notice/871151-2025/pdf" |
buyerProfileUrls | array | Yes | Buyer profile URL(s) | ["https://sdis85.e-marchespublics.com"] |
mainClassification | array | Yes | CPV classification as code/label objects | [{"code":"30163100","label":"Agency fuel cards"}] |
translationLanguages | array | Yes | Available translation languages | — |
noticeStandardVersion | string | Yes | Notice standard/format version | — |
tableOfContents | array | Yes | Notice section headings (present with fetchDetails) | — |
documentLinks | object | Yes | Document download links (present with fetchDetails) | — |
sections | object | Yes | Full notice section content (present with fetchDetails) | — |
contacts | object | Yes | Buyer contact emails/phones (present with fetchDetails) | {"emails":["sajcp@sdis-vendee.fr"]} |
buyerDetails | array | Yes | Structured buyer details (present with fetchDetails) | — |
procedureDetails | array | Yes | Structured procedure details (present with fetchDetails) | — |
summaryText | string | Yes | Concise human-readable notice summary | — |
publicationNumber is the best stable field for deduplication, with detailUrl as a fallback. The code/label objects and contacts object follow TED's structure; fields marked — do not have a verified example in the schema.
Example dataset record
The following representative record was produced by a run with publicationNumbers: ["871151-2025"] and fetchDetails enabled.
{"publicationNumber": "871151-2025","title": "France – Agency fuel cards – Fourniture de cartes carburant et de carburant en vrac pour le SDIS de la Vendée","noticeType": {"code": "can-standard","label": "Contract or concession award notice – standard regime"},"procedureType": { "code": "open", "label": "Open" },"contractNature": [{ "code": "supplies", "label": "Supplies" }],"buyerName": "SDIS 85","buyerCountry": [{ "code": "FRA", "label": "France" }],"placeOfPerformance": [{ "code": "FRG05", "label": "Vendée" }],"publicationDate": "2025-12-31+01:00","deadlineReceiptRequest": "","detailUrl": "https://ted.europa.eu/en/notice/-/detail/871151-2025","pdfUrl": "https://ted.europa.eu/en/notice/871151-2025/pdf","mainClassification": [{ "code": "30163100", "label": "Agency fuel cards" }],"buyerProfileUrls": ["https://sdis85.e-marchespublics.com"],"contacts": { "emails": ["sajcp@sdis-vendee.fr"] },"notificationSummary": "TED Notice 871151-2025\nFrance – Agency fuel cards …","searchQuery": "publication-number=871151-2025 SORT BY publication-number DESC"}
Query and input reference
| Input | Type | Required | Default | Accepted values | Description |
|---|---|---|---|---|---|
fullTextSearch | string | No | — | free text | Free-text search across notices (maps to FT expert field). |
businessOpportunity | array | No | ["competition"] | competition, result, planning, veat, dir-awa-pre, pmc, corr | Filter by business opportunity type. |
cpvCodes | array | No | — | CPV codes | Common Procurement Vocabulary codes, e.g. 72000000. |
contractNature | array | No | — | supplies, services, works | Contract nature codes. |
placeOfPerformance | array | No | — | NUTS/country codes | Where work is performed, e.g. DEU, PL911. |
placeOfProcedure | array | No | — | NUTS/country codes | Place of procedure (BT-727). |
procedureType | array | No | — | open, restricted, neg-wo-call, … | Procedure type codes. |
buyerCountry | array | No | — | ISO 3166-1 alpha-3 | Buyer country codes, e.g. DEU, FRA, POL. |
buyerName | string | No | — | free text | Partial match on buyer organisation name. |
publicationYear | string | No | — | ^\d{4}$ | Filter by publication year, e.g. 2025. |
publicationDateFrom | string | No | — | YYYY-MM-DD | Start of publication date range. |
publicationDateTo | string | No | — | YYYY-MM-DD | End of publication date range. |
legalBasis | array | No | — | e.g. 32014L0024 | Legal basis codes. |
funding | array | No | — | e.g. external-aid-program | Funding programme codes. |
noticeTypes | array | No | — | notice-type codes | Direct notice-type codes; overrides businessOpportunity. |
ojsNumber | string | No | — | supplement number | Official Journal supplement number. |
publicationNumbers | array | No | — | e.g. 871151-2025 | Fetch specific notices by publication number. |
searchUrls | array | No | — | TED URLs | TED notice detail or search-result URLs. |
expertQuery | string | No | — | TED expert syntax | Raw TED expert query; overrides structured filters. |
language | string | No | EN | 24 EU codes (EN, DE, FR, … BG) | Language for labels and detail rendering. |
scope | string | No | ALL | ALL, ACTIVE, LATEST | TED search scope. |
onlyLatestVersions | boolean | No | false | true / false | Return only the latest version of each notice. |
sortBy | string | No | publication-number | publication-number, publication-date, deadline-receipt-request | Sort column. |
sortOrder | string | No | DESC | DESC, ASC | Sort direction. |
fetchDetails | boolean | No | false | true / false | Fetch full notice detail page (contacts, documents, sections). |
maxItems | integer | No | 50 | 0 = unlimited | Maximum notices to scrape. |
pageSize | integer | No | 50 | 1–100 | Results per page. |
proxyConfiguration | object | No | Apify RESIDENTIAL | proxy config | Proxy settings. |
A minimal request and an advanced request:
{ "publicationNumbers": ["871151-2025"], "maxItems": 1 }
{"businessOpportunity": ["competition"],"buyerCountry": ["POL"],"publicationYear": "2025","cpvCodes": ["72000000"],"language": "EN","fetchDetails": true,"maxItems": 20,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Retrieve the data through the API
- Start the Actor with a JSON input.
- Wait for the run to finish, or use the synchronous
?waitForFinish=endpoint when appropriate. - Read items from the run's default dataset.
- Paginate or export the dataset.
A Python example using the Apify client:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("datascrapers/eu-tenders-scraper").call(run_input={"buyerCountry": ["POL"], "publicationYear": "2025", "maxItems": 20})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["publicationNumber"], item["title"])
For other languages, use the generated API tab on the Actor page. Never place a real token in a URL or example.
Data quality and record handling
- Conditional fields —
contacts,documentLinks,sections,tableOfContents,buyerDetails,procedureDetails, anddetailTitleare present only whenfetchDetailsis enabled.deadlineReceiptRequestis an empty string when no deadline applies. - Completeness — overview-only runs omit the detail fields above;
buyerNames,placeOfProcedure,countryOfBuyer,officialLanguage, and other secondary fields may be absent for some notices. - Deduplication — each run outputs one row per
publicationNumberdiscovered in that run; re-runs can repeat the same notice. Deduplicate across runs onpublicationNumber. - Retries — individual notices fail soft so a single failed request does not stop the run.
- Normalization —
publicationDateis an ISO 8601 string with offset;code/labelobjects carry both the source code and a rendered label. Field names are preserved in camelCase. - Raw versus derived — all fields are source values; the Actor does not translate or derive content beyond the selected
languagerendering.
Export and pipeline examples
| Destination | Recommended method | Typical use |
|---|---|---|
| PostgreSQL / Supabase | Dataset API or webhook consumer | Tender monitoring and award history |
| Google Sheets | Apify integration | Weekly procurement watchlists |
| S3 / cloud storage | Scheduled export or integration | Daily notice archives |
| CRM / lead tool | Scheduled run + export | Feed new opportunities to sales |
Pricing and cost examples
Billing is pay-per-event. Each tender notice written to the dataset triggers the dataset-item event ("Tender scraped").
| Event | What counts | Rate (per 1,000) |
|---|---|---|
dataset-item ("Tender scraped") | Each tender notice saved to the dataset | $1.00 |
apify-actor-start | One-time per run | $0.00005 |
Higher Apify plan tiers apply a discount (per 1,000): Bronze $0.90 / Silver $0.80 / Gold (and Platinum/Diamond) $0.70. For this Actor's pay-per-event model, platform usage is not billed separately to the end user beyond the event rates above.
| Records | Estimated base cost |
|---|---|
| 1,000 tenders | $1.00 |
| 10,000 tenders | $10.00 |
| 100,000 tenders | $100.00 |
Estimates assume the standard tier and no detail-enrichment surcharge; fetchDetails does not add a separate event but increases run time.
Limitations and responsible data use
- The Actor collects publicly accessible TED (Tenders Electronic Daily) procurement notices only.
- Notice data reflects TED at crawl time and can change or be superseded by later versions.
- Some fields are conditional or empty (see Data quality).
- No historical snapshots are guaranteed unless you store the exported datasets yourself.
- You are responsible for complying with applicable privacy, contractual, and legal requirements when using the data.
Dataset questions
What does one dataset item represent?
One EU public procurement notice from TED, optionally enriched with buyer contacts, document links, and section-level details when fetchDetails is enabled.
Which field should I use as a unique identifier?
Use publicationNumber; fall back to detailUrl when it is absent.
Are fields nullable or conditional?
Yes. Detail fields such as contacts, documentLinks, sections, buyerDetails, and procedureDetails appear only when fetchDetails is on, and deadlineReceiptRequest is an empty string when no deadline applies.
Can I combine structured filters with a direct search?
Yes, but expertQuery overrides the structured filters, and noticeTypes overrides businessOpportunity when both are set.
What counts as a billable result?
Each tender notice written to the dataset is one dataset-item charge, plus a one-time apify-actor-start event per run.
Does the Actor return historical data?
Notices are read fresh from TED on each run. Historical snapshots are not stored by the Actor, so archive the exported datasets yourself if you need history.
Related datasets from Data Scrapers
- FindLaw Scraper — law firm and attorney records for entity research around legal-service procurement.
- LinkedIn Company Scraper — company profiles for buyer and vendor research.
- Trustpilot Scraper — vendor reputation reviews for supplier due diligence.
- Glassdoor Jobs Scraper — job listings for labour-market analysis.
- ZipRecruiter Scraper — job listings for recruitment and talent research.
Data Scrapers support
Need an additional field, record type, or export workflow? Contact Data Scrapers at stardustspotlight@gmail.com. Include a sample source URL, the required fields, the expected record volume, and your preferred delivery format.