TED Tenders Scraper - EU Public Procurement avatar

TED Tenders Scraper - EU Public Procurement

Pricing

from $4.00 / 1,000 tender notices

Go to Apify Store
TED Tenders Scraper - EU Public Procurement

TED Tenders Scraper - EU Public Procurement

Scrape EU public tenders from TED (Tenders Electronic Daily): open notices with the days remaining to bid, buyer, CPV codes, estimated value and place of performance, or contract awards with the winner. Titles in a readable language. Filter by CPV, country, date.

Pricing

from $4.00 / 1,000 tender notices

Rating

0.0

(0)

Developer

Tom Awake

Tom Awake

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 hours ago

Last modified

Share

What does TED Tenders Scraper do?

Open EU public procurement notices with the days remaining to bid — buyer, country, CPV codes, place of performance and value.

No login. No API key. No proxies.

The countdown, and a readable title

TED publishes a submission deadline on 100 % of tender notices and never publishes how long is left. That is the only number that matters to a company deciding whether to respond.

It also returns the title in whichever language happens to be indexed first — measured 13 September 2026, a German buyer with a Hungarian title. This Actor resolves the title to English where available, falls back to the buyer country's language, and records which language it used in titleLanguage.

A real run, IT services closing soon:

TenderCountryDays left
Sweden – IT services: consulting, software developmentSWE1
France – Technical computer support servicesFRA1
Belgium – IT services: consulting, software developmentBEL1

52 of 80 results closing within a fortnight.

Why the deadline window matters

TED cannot sort. Every sort parameter returns an error, and its natural order mixes deadlines in 2027 with framework agreements running to 2038.

So "give me the 500 most urgent tenders in Europe" is not a query TED can answer — and an Actor that sorted an arbitrary sample would be quietly lying. Instead, Closing within (days) bounds the window at the source. Inside that window the result is complete, and ordering it by urgency means something.

It defaults to 60 days. Widen it to look further out, narrow it to 14 for a weekly bid review.

This also matters for cost: filtering deadlines server-side cut the notices fetched and discarded from 1,954 to 1 on the same query.

Output

FieldExample
title, titleLanguageFrance – Sewerage management services, eng
buyerName, buyerCountryStadt Essen, DEU
submissionDeadline2026-09-22T14:00:00+02:00
daysUntilDeadline1
deadlinePassedfalse
cpvMain, cpvCodes72000000
contractNatureservices / supplies / works
procedureTypeopen, restricted, negotiated
placeOfPerformanceNUTS codes
totalValueEurpresent on about 42 % of notices
winnerName, winnerCountryon award notices
publicationNumber, publicationDate599726-2026
noticeUrl, xmlUrlthe notice and its machine-readable form

Which columns fill depends on noticeType

This is not a defect, and it is worth knowing before you open the spreadsheet. A tender that is still open has no winner yet; a contract that has been awarded no longer accepts bids. Measured 17 September 2026 on 200 rows of each type:

Fieldopen-tendersawards
daysUntilDeadline, submissionDeadline100%0%
winnerName, winnerCountry0%88.5%
totalValueEur~42%93%
buyerName, title, cpvCodes100%100%

Use open-tenders to find contracts you can still bid on, and awards to find out who won what — including, on the award side, the declared contract value. The run's status message says which case you are in.

Input

{
"noticeType": "open-tenders",
"cpvCodes": ["72000000"],
"maxDaysUntilDeadline": 60,
"maxItems": 500
}
FieldDefaultNotes
noticeTypeopen-tendersTenders, awards, prior information, social
openOnlytrueDrops closed deadlines, at the source
maxDaysUntilDeadline60The window that makes results complete
cpvCodes["72000000"]45000000 construction, 33100000 medical
countriesThree-letter codes: FRA, DEU, ESP
searchTextSee the caveat below
maxItems500One row per notice
publishedAfterOnly used when the deadline filter is off

Use cases

  • Bid pipeline — every open tender in your CPV codes and countries, ordered by how soon it closes.
  • Market entry — which public buyers purchase what you sell, and where.
  • Competitor tracking — switch to award notices to see who wins.
  • Partner search — foreign buyers and suppliers active in your sector.
  • Market sizing — declared contract values by CPV and country.

Running this as a scheduled watch

Tenders close. A notice you see three days late may already be out of reach, which is why this Actor computes the days remaining rather than just printing a deadline.

Set publishedWithinDays instead of publishedAfter, then schedule the Actor. The window moves with each run.

{
"noticeType": "open-tenders",
"publishedWithinDays": 7,
"maxDaysUntilDeadline": 30,
"cpvCodes": ["72000000"],
"maxItems": 500
}

Why not a fixed publishedAfter date? A schedule replays the same input every time. With a fixed date, every run returns the same notices and charges you again for them. The rolling window returns only what appeared since the last run.


Limits, honestly

  • Free-text search is language-bound. Notices are published in the buyer's own language, so a French keyword finds French notices and misses the German ones. Prefer CPV codes, which are language-neutral.
  • totalValueEur is present on about 42 % of tender notices. Many buyers do not publish an estimate before bids.
  • Award notices carry no submission deadline, so daysUntilDeadline is empty there by design.
  • winnerName appears on roughly 90 % of award notices. Where several suppliers won different lots, all are listed together — TED does not say which lot each won, and this Actor does not guess.
  • Deadlines reaching 2035 and beyond are real: long framework agreements. They are not errors, but they will dominate an unbounded window.
  • Requests are paced out of courtesy to a free public service.
  • Not affiliated with TED or the Publications Office of the European Union.

How much does it cost?

You pay per tender notice returned: $0.006 each, that is $6.00 per 1,000. There is no start fee, and subscription plans pay less per tender notice.

The example input below asks for up to 500 tender notices, so it costs $3.00 at most.

If a run reaches the spending limit you set, the output stops at that limit and never goes past it. You are never charged for rows that were not delivered.

Use TED Tenders Scraper as an API

Call it from your own code with the Apify client, here in Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("DataIO/ted-eu-tenders-procurement").call(run_input={
'noticeType': 'open-tenders',
'cpvCodes': ['72000000'],
'maxDaysUntilDeadline': 60,
'maxItems': 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

It also works from JavaScript, Make, Zapier, n8n, and from AI agents through the Apify MCP server.

Other actors you might like

FAQ

The actor reads public data from its official source, without logging in and without bypassing any access control. What you do with the data, for example contacting people listed in it, is your responsibility under the laws that apply to you, such as GDPR in Europe.

Can I run it on a schedule?

Yes. See Running this as a scheduled watch above: use the rolling-window setting so each run returns only what is new.

Can AI agents use it?

Yes. It is available through the Apify MCP server, and every input field is described in its input schema, so an agent can call it directly.