Tender Radar
AI that reads every EU IT tender and says which ones to bid on, and at what price.
An AI pipeline on Databricks: an LLM translates and classifies every EU IT tender from 24 languages, an ML model predicts the winning price, and RAG answers questions with cited sources. Every open tender gets a score with three reasons, every morning.
- Role
- Personal project · AI, data engineering & ML
- Period
- 11/2026
Built end to end on Databricks
On Free Edition: serverless only, one SQL warehouse, one AI Search endpoint and a daily compute quota. Those limits shaped the design.
- Lakeflow Jobs
- Unity Catalog
- Auto Loader
- Delta Lake
- Databricks SQL
- ai_query
- MLflow
- AI Search
- AI/BI Dashboards
- Declarative Automation Bundles
The question
Which EU IT tenders should a mid-size IT firm bid on this week, and at what price?
Every year the EU publishes about 80,000 IT, software and consulting tenders on TED, in 24 languages. A mid-size IT firm can bid on a few a month, and every bid costs days of work.
What I asked myself first
Can we predict who wins?
No. Award notices name only the winner, never the other bidders. And 94% of winners come from the buyer's own country, so always guessing “domestic” is already 94% right, and useless.
94%of winners are domestic
What can the data predict?
The price. The award value is filled in for 77% of EU awards. So a model predicts award ÷ estimate, and similar past tenders show who won them.
77%of awards carry a price
Is bidding even worth it?
Often, yes. 40.4% of awarded IT tenders had only one bidder, 72.8% in Croatia. And winning prices land at a median 0.83× the estimate.
40.4%had only one bid
What the data can't tell
- Who else bid, and at what price
- Why the winner won
- What the contract really costs in the end
Consulting case
What this is worth to a bid team
Tender Radar is built like a client project: a real decision (bid or no bid), the firm's profile as configuration, and numbers a bid manager can check. For a mid-size IT firm in DACH it changes four things.
Focus
1,778 instead of 7,918
The score narrows the open calls to those that fit the firm's services, size and markets, each with its reasons. Today that is 77.5% fewer to read.
Price
0.83×
Winning prices land at a median 0.83× the buyer's estimate. The model gives a likely price per tender: a starting point for the bid instead of a gut feeling.
Where to compete
66% vs. 16%
Single-bid share in software maintenance vs. procurement consulting. Topics and buyers show where few firms bid, and point sales effort there.
Cost to run
≈ 10 min
Of serverless compute per day on Free Edition. At a client, the same bundle deploys from git into their own workspace.
How I would roll it out at a client
- 1Set the profileThe firm's services, home markets and size range as dbt variables. The score recalculates right away.
- 2Pilot with the bid teamFour weeks of putting the shortlist next to the team's real decisions, and tuning the weights on them.
- 3Hand overThe job, tests and dashboard run from git in the client's Databricks workspace. The team owns it, not me.
The pipeline
From 24 languages to one recommendation
Every morning at 06:00 a Lakeflow Job runs on Databricks Free Edition, deployed from git. Click a step.
What happens
The last 3 days from the TED Search API and the ECB rates land as files in a Unity Catalog volume, so a missed day catches up by itself.
Tools
- Python
- TED API
- Unity Catalog
3 yearsof history since eForms (10/2023)
The last 3 days from the TED Search API and the ECB rates land as files in a Unity Catalog volume, so a missed day catches up by itself.
- Python
- TED API
- Unity Catalog
3 yearsof history since eForms (10/2023)
One run takes about 10 minutes of serverless compute. Every step is rerunnable: the fix for a failure is to rerun.
Live dashboard
The Databricks dashboard, live
This is the AI/BI dashboard I built in Databricks, taken over 1:1: the same content, the same 7 SQL queries on the same gold tables. A GitHub Action runs them every morning after the pipeline and the page is rebuilt from the result, so the numbers match the original.
- Databricks gold tables
- 7 SQL queries
- JSON snapshot
- Static site

Tender Radar
Data as of (Berlin time)
This week's bids
Every open EU IT tender, scored 0–100 for a mid-size IT firm in the DACH region. The reasons say why. Likely winning price = estimate × the model's predicted award ÷ estimate.
- Open tenders scored
- 7,918
- Score 70 or more
- 1,778
- AITypical award ÷ estimate (model)
- 0.88×
300 matches · the top 300 of 7,918 open tenders
| Tender | ||||
|---|---|---|---|---|
| 100 | Bundesministerium für Wirtschaft und Energie · Germany | €600,000 | €586,723 | 21 Sept 2026 |
| 97 | IT-Dienstleistungszentrum Berlin (AöR) · Germany | €723,800 | €714,200 | 6 Oct 2026 |
| 97 | IT-Dienstleistungszentrum Berlin (AöR) · Germany | €415,045 | €421,140 | 2 Oct 2026 |
| 95 | Erste Abwicklungsanstalt AöR · Germany | €1,205,600 | €1,193,865 | 19 Oct 2026 |
| 95 | Erste Abwicklungsanstalt AöR · Germany | €1,205,600 | €1,195,045 | 25 Sept 2026 |
| 93 | Wiener Tourismusverband · Austria | €500,000 | €491,576 | 16 Oct 2026 |
| 90 | European Union Aviation Safety Agency · Germany | €13,000,000 | €12,545,806 | 28 Oct 2026 |
| 90 | Bundesministerium für Wirtschaft und Energie · Germany | €11,764,705 | €10,863,016 | 25 Sept 2026 |
| 90 | Bundesministerium für Wirtschaft und Energie · Germany | €11,764,705 | €10,863,016 | 16 Oct 2026 |
| 90 | Priešgaisrinės apsaugos ir gelbėjimo departamentas prie Vidaus reikalų ministerijos · Lithuania | €4,380,165 | €3,986,943 | 2 Nov 2026 |
The market: where to look, whom to target
Every IT, software and consulting notice on TED since October 2023. DACH, the home market in the bid score, is marked in green.
- Notices since 10/2023
- 243,025
- Countries with 50+ awards
- 29
- Only one bid in Croatia
- 72.8%
- Croatia72.8%
- Slovenia66.5%
- Greece58.2%
- Poland54.6%
- Cyprus52.8%
- Czechia50.3%
- Austria49.6%
- Bulgaria48.8%
- Hungary45.3%
- Latvia43.8%
- Hungary€55.7m
- Luxembourg€7m
- Austria€3.9m
- Belgium€3m
- Denmark€2.9m
- North Macedonia€1.5m
- Netherlands€1.5m
- Norway€1.3m
- Slovakia€1.3m
- Finland€1.2m
| 72 IT services | 118,721 | €770k | 43.2% | 2 |
|---|---|---|---|---|
| 48 Software | 58,789 | €554k | 46.4% | 1 |
| Other main CPV | 51,223 | €791k | 30.9% | 2 |
| 794 Consulting | 14,292 | €534k | 21.1% | 3 |
72 IT services
- Notices
- 118,721
- Median estimate
- €770k
- One bid
- 43.2%
- Median bids
- 2
48 Software
- Notices
- 58,789
- Median estimate
- €554k
- One bid
- 46.4%
- Median bids
- 1
Other main CPV
- Notices
- 51,223
- Median estimate
- €791k
- One bid
- 30.9%
- Median bids
- 2
794 Consulting
- Notices
- 14,292
- Median estimate
- €534k
- One bid
- 21.1%
- Median bids
- 3
What the market buys
15 topics from k-means clustering on the embeddings, named by the LLM. Least competition first; every column sorts.
- AITopics from k-means on embeddings
- 15
- Only one bid: Software Maintenance
- 66.3%
- Only one bid: Procurement Consulting
- 16.4%
| Software Maintenance | 2,275 | 604 | €650k | 66.3% | 1 | 0.74× |
|---|---|---|---|---|---|---|
| Digital Transformation | 523 | 156 | €881k | 59.4% | 1 | 0.85× |
| Transport Systems | 1,970 | 591 | €749k | 50.5% | 1 | 0.72× |
| Microsoft Licenses | 2,463 | 709 | €660k | 41.9% | 2 | 0.78× |
| Technical Support | 2,073 | 460 | €762k | 41.3% | 2 | 0.58× |
| Data Center | 2,147 | 574 | €624k | 39.9% | 2 | 0.88× |
| Server Equipment | 2,313 | 622 | €496k | 38.7% | 2 | 0.84× |
| Cyber Security | 1,608 | 436 | €612k | 35.8% | 2 | 0.89× |
Software Maintenance
- Notices
- 2,275
- Open (60 days)
- 604
- Median estimate
- €650k
- One bid
- 66.3%
- Median bids
- 1
- Award ÷ estimate
- 0.74×
Digital Transformation
- Notices
- 523
- Open (60 days)
- 156
- Median estimate
- €881k
- One bid
- 59.4%
- Median bids
- 1
- Award ÷ estimate
- 0.85×
Transport Systems
- Notices
- 1,970
- Open (60 days)
- 591
- Median estimate
- €749k
- One bid
- 50.5%
- Median bids
- 1
- Award ÷ estimate
- 0.72×
Microsoft Licenses
- Notices
- 2,463
- Open (60 days)
- 709
- Median estimate
- €660k
- One bid
- 41.9%
- Median bids
- 2
- Award ÷ estimate
- 0.78×
Technical Support
- Notices
- 2,073
- Open (60 days)
- 460
- Median estimate
- €762k
- One bid
- 41.3%
- Median bids
- 2
- Award ÷ estimate
- 0.58×
Data Center
- Notices
- 2,147
- Open (60 days)
- 574
- Median estimate
- €624k
- One bid
- 39.9%
- Median bids
- 2
- Award ÷ estimate
- 0.88×
Server Equipment
- Notices
- 2,313
- Open (60 days)
- 622
- Median estimate
- €496k
- One bid
- 38.7%
- Median bids
- 2
- Award ÷ estimate
- 0.84×
Cyber Security
- Notices
- 1,608
- Open (60 days)
- 436
- Median estimate
- €612k
- One bid
- 35.8%
- Median bids
- 2
- Award ÷ estimate
- 0.89×
Buyers worth bidding for
Buyers with 3+ awards and 3+ open calls, least competition first. The top 100.
- Buyers listed
- 100
- Open calls at these buyers
- 1,785
- Of them in DACH
- 11
| Województwo Warmińsko – Mazurskie – Zarząd Dróg Wojewódzkich | Poland | 89 | 16 | 100% | 1 |
|---|---|---|---|---|---|
| Helios Kliniken GmbH | Germany | 52 | 25 | 100% | 1 |
| Bundesministerium für Wirtschaft und Energie | Germany | 52 | 22 | 100% | 1 |
| "PKP Intercity" S.A. | Poland | 46 | 11 | 100% | 1 |
| Kasa Rolniczego Ubezpieczenia Społecznego | Poland | 39 | 19 | 100% | 1 |
| Aplikacje Krytyczne sp. z o.o. | Poland | 37 | 14 | 100% | 1 |
| InnoBaltica Sp. z o. o. | Poland | 35 | 10 | 100% | 1 |
| Uniwersytet Medyczny w Łodzi | Poland | 35 | 16 | 100% | 1 |
| Szpital Specjalistyczny im. Stefana Żeromskiego SPZOZ w Krakowie | Poland | 33 | 11 | 100% | 1 |
| Investitionsbank Schleswig-Holstein | Germany | 27 | 12 | 100% | 1 |
Województwo Warmińsko – Mazurskie – Zarząd Dróg Wojewódzkich
- Country
- Poland
- Open calls
- 89
- Awards
- 16
- One bid
- 100%
- Median bids
- 1
Helios Kliniken GmbH
- Country
- Germany
- Open calls
- 52
- Awards
- 25
- One bid
- 100%
- Median bids
- 1
Bundesministerium für Wirtschaft und Energie
- Country
- Germany
- Open calls
- 52
- Awards
- 22
- One bid
- 100%
- Median bids
- 1
"PKP Intercity" S.A.
- Country
- Poland
- Open calls
- 46
- Awards
- 11
- One bid
- 100%
- Median bids
- 1
Kasa Rolniczego Ubezpieczenia Społecznego
- Country
- Poland
- Open calls
- 39
- Awards
- 19
- One bid
- 100%
- Median bids
- 1
Aplikacje Krytyczne sp. z o.o.
- Country
- Poland
- Open calls
- 37
- Awards
- 14
- One bid
- 100%
- Median bids
- 1
InnoBaltica Sp. z o. o.
- Country
- Poland
- Open calls
- 35
- Awards
- 10
- One bid
- 100%
- Median bids
- 1
Uniwersytet Medyczny w Łodzi
- Country
- Poland
- Open calls
- 35
- Awards
- 16
- One bid
- 100%
- Median bids
- 1
Szpital Specjalistyczny im. Stefana Żeromskiego SPZOZ w Krakowie
- Country
- Poland
- Open calls
- 33
- Awards
- 11
- One bid
- 100%
- Median bids
- 1
Investitionsbank Schleswig-Holstein
- Country
- Germany
- Open calls
- 27
- Awards
- 12
- One bid
- 100%
- Median bids
- 1
AI, ML & RAG
Where the AI works, and how I tested it
Every AI part is tested against something simple: a hand check, a baseline, or a test set with known answers.
Translate and classify
20/20
summaries right, checked by hand
Llama 3.3 70B turns every notice in 24 languages into an English title, a summary, technologies and a service type.
ai_query right in the warehouse, a fixed JSON schema (every answer parses), each notice sent only once, open tenders first.
- Title19/20
- Summary20/20
- Technologies19/20
- Service type17/20
Predict the winning price
−19%
error (MAE) vs. the median baseline
Gradient boosting predicts award ÷ estimate. Times the estimate, that is the likely winning price in the dashboard.
Time split: trained on Oct 2023 – Sep 2026, tested on October 2026. Logged in MLflow, registered in Unity Catalog only if it beats the baseline.
- Baseline (median)0.299
- Model0.242
Answer questions with sources
80%
recall@6: the right source among the top 6
A question like “cloud migration Germany” finds matching tenders by vector search, and the LLM answers only from those sources, with a TED link for every claim.
Embeddings (gte-large-en) in dbt, an AI Search index, hybrid retrieval (top 6), answers with [n] citations and a check that every cited source exists.
- Recall@680%
- Cites the right notice80%
- Grounded answers100%
Find the topics
66%
single-bid share in software maintenance
k-means on the same embeddings groups the tenders into 15 topics that the LLM names. That shows where competition is low.
Tried k = 10 to 30; 15 had the best silhouette score. Fit once, assigned daily: stable topics and a cheap daily step.
- Software maintenance66.3%
- Procurement consulting16.4%
And why the bid score is not a model
There is no data on which tenders a firm should have bid on, so a model would only pretend to know. The score is an open formula from five signals instead, and every tender shows its top three reasons.
- Fits our services30 points
- Low competition25 points
- Right size20 points
- Home market (DACH)15 points
- Known buyer10 points
What I built
- LLM enrichment with Llama 3.3 70B via ai_query: English title, summary, technologies and service type from 24 languages, as schema-checked JSON, hand-checked on 20 tenders.
- A price model (gradient boosting, time-based split) in MLflow that predicts award ÷ estimate and beats the median baseline by 19% MAE.
- A RAG chat with sources: embeddings, a vector index of 29,373 documents, hybrid retrieval, citation checks, recall@6 of 80%. Plus 15 topics from k-means on the embeddings.
- A daily lakehouse pipeline as a Lakeflow Job: the TED API, Auto Loader into bronze, PySpark silver in EUR, dbt gold with 6 models and 18 tests, including a leak test.
- A transparent bid score from five signals with the top three reasons in words, as an AI/BI dashboard deployed from git and rebuilt here from a daily snapshot.
Results
- Every open tender scored, with three reasons in plain words and a model-predicted winning price.
- Questions about tenders in any language, answered with TED sources instead of made-up answers.
- Facts a bid manager can use: 40.4% of IT awards had only one bid.
- Runs every morning without me, deployed from git, on Databricks Free Edition.
Tech stack
AI & ML
LLM translation, the price model, topics and RAG search with sources.
- ai_query
- Llama 3.3 70B
- scikit-learn
- MLflow
- AI Search
- gte-large-en
Ingest & lakehouse
New notices every morning from bronze to silver, converted to EUR.
- Python
- Auto Loader
- Delta Lake
- PySpark
- Unity Catalog
Gold & quality
Tested gold tables for the model, search, score and dashboard.
- dbt
- SQL
- Databricks SQL
Run & serve
The daily job from git, the dashboard and this snapshot export.
- Lakeflow Jobs
- Declarative Automation Bundles
- AI/BI Dashboards
- GitHub Actions
- Next.js