EU Tenders Scraper avatar

EU Tenders Scraper

Pricing

from $0.70 / 1,000 tender scrapeds

Go to Apify Store
EU Tenders Scraper

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

Farhan Ali

Maintained by Community

Actor 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

PropertyValue
SourceTED (Tenders Electronic Daily)
Record unitOne public procurement notice
Input methodsfullTextSearch, expertQuery, buyerName, cpvCodes, buyerCountry, procedureType, publication dates, publicationNumbers, searchUrls
Main identifierspublicationNumber
DeliveryApify Dataset and API
Export formatsJSON, CSV, Excel, HTML, XML
Update modelFresh records per Actor run
PricingPay-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 a publicationDateFrom/publicationDateTo range.
  • Direct targeting — publicationNumbers (specific notice numbers), searchUrls (TED notice or search-result URLs), and ojsNumber (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 (default EN).
  • scope — ALL, ACTIVE, or LATEST notices.
  • sortBy / sortOrder — sort by publication-number, publication-date, or deadline-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

FieldTypeNullableDescriptionExample
publicationNumberstringNoUnique TED notice identifier"871151-2025"
titlestringNoNotice title"France – Agency fuel cards – ..."
noticeTypeobjectYesNotice type as code/label{"code":"can-standard","label":"Contract or concession award notice – standard regime"}
procedureTypeobjectYesProcedure type as code/label{"code":"open","label":"Open"}
contractNaturearrayYesContract nature (supplies/services/works) as code/label objects[{"code":"supplies","label":"Supplies"}]
buyerNamestringYesBuying organisation name"SDIS 85"
buyerNamesarrayYesAll buyer organisation names—
buyerCountryarrayYesBuyer country as code/label objects[{"code":"FRA","label":"France"}]
placeOfPerformancearrayYesNUTS place(s) of performance as code/label objects[{"code":"FRG05","label":"Vendée"}]
placeOfProcedurearrayYesNUTS place(s) of procedure (BT-727)—
countryOfBuyerarrayYesBuyer country as an array—
publicationDatestringYesPublication date (ISO 8601 with offset)"2025-12-31+01:00"
deadlineReceiptRequeststringYesSubmission deadline; empty string when none""
officialLanguagearrayYesOfficial language(s) of the notice—
procedureIdentifierstringYesProcedure identifier—
detailUrlstringNoFull notice link on TED"https://ted.europa.eu/en/notice/-/detail/871151-2025"
notificationSummarystringYesConcise notifier summary"TED Notice 871151-2025\nFrance – Agency fuel cards …"
languagestringYesOutput language code"EN"
searchQuerystringYesSearch query that produced the row"publication-number=871151-2025 SORT BY publication-number DESC"
appliedFiltersobjectYesEcho of the filters applied to the run—
detailTitlestringYesDetail page title (present with fetchDetails)—
pdfUrlstringYesPDF download link"https://ted.europa.eu/en/notice/871151-2025/pdf"
buyerProfileUrlsarrayYesBuyer profile URL(s)["https://sdis85.e-marchespublics.com"]
mainClassificationarrayYesCPV classification as code/label objects[{"code":"30163100","label":"Agency fuel cards"}]
translationLanguagesarrayYesAvailable translation languages—
noticeStandardVersionstringYesNotice standard/format version—
tableOfContentsarrayYesNotice section headings (present with fetchDetails)—
documentLinksobjectYesDocument download links (present with fetchDetails)—
sectionsobjectYesFull notice section content (present with fetchDetails)—
contactsobjectYesBuyer contact emails/phones (present with fetchDetails){"emails":["sajcp@sdis-vendee.fr"]}
buyerDetailsarrayYesStructured buyer details (present with fetchDetails)—
procedureDetailsarrayYesStructured procedure details (present with fetchDetails)—
summaryTextstringYesConcise 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

InputTypeRequiredDefaultAccepted valuesDescription
fullTextSearchstringNo—free textFree-text search across notices (maps to FT expert field).
businessOpportunityarrayNo["competition"]competition, result, planning, veat, dir-awa-pre, pmc, corrFilter by business opportunity type.
cpvCodesarrayNo—CPV codesCommon Procurement Vocabulary codes, e.g. 72000000.
contractNaturearrayNo—supplies, services, worksContract nature codes.
placeOfPerformancearrayNo—NUTS/country codesWhere work is performed, e.g. DEU, PL911.
placeOfProcedurearrayNo—NUTS/country codesPlace of procedure (BT-727).
procedureTypearrayNo—open, restricted, neg-wo-call, …Procedure type codes.
buyerCountryarrayNo—ISO 3166-1 alpha-3Buyer country codes, e.g. DEU, FRA, POL.
buyerNamestringNo—free textPartial match on buyer organisation name.
publicationYearstringNo—^\d{4}$Filter by publication year, e.g. 2025.
publicationDateFromstringNo—YYYY-MM-DDStart of publication date range.
publicationDateTostringNo—YYYY-MM-DDEnd of publication date range.
legalBasisarrayNo—e.g. 32014L0024Legal basis codes.
fundingarrayNo—e.g. external-aid-programFunding programme codes.
noticeTypesarrayNo—notice-type codesDirect notice-type codes; overrides businessOpportunity.
ojsNumberstringNo—supplement numberOfficial Journal supplement number.
publicationNumbersarrayNo—e.g. 871151-2025Fetch specific notices by publication number.
searchUrlsarrayNo—TED URLsTED notice detail or search-result URLs.
expertQuerystringNo—TED expert syntaxRaw TED expert query; overrides structured filters.
languagestringNoEN24 EU codes (EN, DE, FR, … BG)Language for labels and detail rendering.
scopestringNoALLALL, ACTIVE, LATESTTED search scope.
onlyLatestVersionsbooleanNofalsetrue / falseReturn only the latest version of each notice.
sortBystringNopublication-numberpublication-number, publication-date, deadline-receipt-requestSort column.
sortOrderstringNoDESCDESC, ASCSort direction.
fetchDetailsbooleanNofalsetrue / falseFetch full notice detail page (contacts, documents, sections).
maxItemsintegerNo500 = unlimitedMaximum notices to scrape.
pageSizeintegerNo501–100Results per page.
proxyConfigurationobjectNoApify RESIDENTIALproxy configProxy 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

  1. Start the Actor with a JSON input.
  2. Wait for the run to finish, or use the synchronous ?waitForFinish= endpoint when appropriate.
  3. Read items from the run's default dataset.
  4. Paginate or export the dataset.

A Python example using the Apify client:

from apify_client import ApifyClient
client = 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, and detailTitle are present only when fetchDetails is enabled. deadlineReceiptRequest is 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 publicationNumber discovered in that run; re-runs can repeat the same notice. Deduplicate across runs on publicationNumber.
  • Retries — individual notices fail soft so a single failed request does not stop the run.
  • Normalization — publicationDate is an ISO 8601 string with offset; code/label objects 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 language rendering.

Export and pipeline examples

DestinationRecommended methodTypical use
PostgreSQL / SupabaseDataset API or webhook consumerTender monitoring and award history
Google SheetsApify integrationWeekly procurement watchlists
S3 / cloud storageScheduled export or integrationDaily notice archives
CRM / lead toolScheduled run + exportFeed 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").

EventWhat countsRate (per 1,000)
dataset-item ("Tender scraped")Each tender notice saved to the dataset$1.00
apify-actor-startOne-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.

RecordsEstimated 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.

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.

  • 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.