DEV Community

Bence Kadi
Bence Kadi

Posted on AI-assisted

See who won an EU public contract before you bid on it (free TED data)

When a public buyer in the EU re-tenders a service, the most useful question for a bidder is rarely "what do they want?". It's "who has the contract now, and what did they get paid?"

That tells you who you're up against, whether the incumbent is a giant or a three-person shop, and what price the buyer accepted last time. The answer is public: every above-threshold contract award in the EU is published on TED (Tenders Electronic Daily). It's just scattered across thousands of separate notices.

This guide shows how to get the previous winner next to every open tender, in one table, without code.

Disclosure: I built the tool used in this guide, the EU Public Tenders Scraper (TED) on Apify.

A real example

The Estonian Transport Administration (Transpordiamet) is tendering maintenance of its traffic counting devices for 2027-2029, estimated at EUR 210,000, closing 23 November 2026.

The previous contract, for 2025-2027, was published on TED on 3 February 2025: it went to AS Signaal TM for EUR 188,880.

So before writing a single page of the bid you know the incumbent, the price the buyer accepted two years ago, and that the new budget is about 11% higher. Finding that by hand takes a few TED searches per tender. With a weekly list of 50 tenders, it doesn't happen.

Step 1: Run the search with "who won before" switched on

Open EU Public Tenders Scraper (TED) and click Try for free (a free Apify account is enough). Use this input, or set the same fields in the form:

{
  "countries": ["EE"],
  "cpvCodes": ["72000000"],
  "noticeTypes": ["contract_notice"],
  "publishedWithinDays": 14,
  "includePreviousAward": true,
  "maxResults": 50
}
Enter fullscreen mode Exit fullscreen mode
  • countries: ISO codes, e.g. DE, FR, IT, or leave empty for all of Europe.
  • cpvCodes: the EU categories of what is bought. 72000000 is IT services, 48000000 software, 45000000 construction, 79000000 business services. Sub-categories are included automatically.
  • includePreviousAward: the new part. For every open tender, the Actor searches the same buyer's contract awards of the last 5 years in the same CPV division and adds the most similar one.

Step 2: Read the previousAward column

Each open tender gets a previousAward object:

{
  "publicationNumber": "72778-2025",
  "publicationDate": "2025-02-03",
  "title": "Liiklusloendusseadmete hooldus 2025-2027",
  "winners": ["AS Signaal TM"],
  "awardedValue": 188880,
  "awardedCurrency": "EUR",
  "url": "https://ted.europa.eu/en/notice/-/detail/72778-2025",
  "matchScore": 1.1
}
Enter fullscreen mode Exit fullscreen mode

matchScore says how close the titles are: around 1 means the same system or service (often literally the previous edition of the same contract), 0.45 to 0.7 a related contract. Always open the url before you quote a number to anyone.

Not every tender gets a match, and that's on purpose. Buyers reuse words like "framework agreement" or "open procedure" in every title, and a wrong "previous winner" is worse than none. The matching ignores the buyer's own name and those procedural words, and weights rare words (a system name, a product) much higher than common ones ("development", "maintenance"). In a test on Estonian IT tenders, about half got a previous award, and the matches were the previous edition of the same contract or the same system.

Step 3: Make it a weekly routine

  1. Save the input as a Task and add a Schedule (e.g. every Monday 07:00).
  2. Turn on Only new notices so each run returns only tenders you haven't seen.
  3. Connect the dataset to Google Sheets, Slack or e-mail with Apify's integrations.

You now get every Monday: new tenders in your sector, with deadlines, estimated values and the incumbent with their price.

What it's good for

  • Bid / no-bid decisions: an incumbent that has held the contract for years is a different fight from a first-time purchase.
  • Pricing: the awarded value of the previous edition is the best anchor you will get.
  • Partner search: small incumbents are sometimes better partners than competitors.
  • Consultancies: one list for all your clients, filtered per client by CPV and country.

Limits

  • TED covers tenders above the EU thresholds. Smaller tenders are only on national portals.
  • Some award notices name no winner (e.g. natural persons, which the Actor leaves out for GDPR reasons) or publish a placeholder value like EUR 1; those values are dropped.
  • Framework agreements split between several winners show all of them; the value is the framework maximum, not what each winner earned.

Pricing is per notice ($1.50 per 1,000), and the previous-award lookup is included.

If you try it on your sector, I'd like to hear which matches were useful and which were wrong.

Top comments (0)