EU Defense Tenders & Procurement Awards (TED) → Stock Tickers
Pricing
from $3.00 / 1,000 award with a named winners
EU Defense Tenders & Procurement Awards (TED) → Stock Tickers
EU defense procurement from TED: 3,800+ tender and contract award notices since 2016 (CPV 353xx–357xx), each named winner mapped to its stock ticker via LEI → listed parent → ISIN. Free public viewer + JSON feed, no signup. Callable as an MCP tool by AI agents.
Pricing
from $3.00 / 1,000 award with a named winners
Rating
0.0
(0)
Developer
Carlos Schwiening
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share
Who Won Which EU Defense Contract — Mapped to Stock Tickers
3,851 EU defense contract awards since 2016 · 1,094 with a named winner · 275 mapped to a stock ticker · 48 listed groups · Rheinmetall alone: 61 awards. Updated daily.
Turns public EU procurement records into an investable signal: EU defense contract awards published on TED, each mapped to the stock ticker of the company that won it — where a winner has been named and that winner is publicly listed. It is not a census of European defense spending; see What this does not cover for the honest limits before you rely on it.
Built on the EU's official TED (Tenders Electronic Daily) API — no scraping, no AI-generated summaries, no hallucination risk. Every field comes straight from the structured procurement notice.
Three ways to use it
1. Answer the question in your browser, free, no signup — open the public viewer →
A sortable, searchable table of all 3,851 notices: who bought, who won, what it was worth, and the winner's ticker. Click a row to expand a summary panel (procedure, description, duration, contract date, buyer contact) and a companies panel (buyer + winning contractor with ticker). This is the full unfiltered feed as a page — nothing is held back behind the paywall except the per-run filtering.


2. Take the raw JSON. These URLs always point at the latest daily run's full, unfiltered output — no run ID lookup, no API key:
- Full feed (JSON) — every notice in the dataset
- Weekly digest (JSON) — ticker-aggregated summary, last 90 days
3. Give it to an AI agent as an MCP tool. The Actor is exposed over Apify's MCP server, so Claude, Cursor or any agent framework can call it directly with typed filters (country, CPV, date range, contract value, ticker) and get back structured JSON — no HTML parsing, no prompt-engineering against a web page. "Which listed defense companies won German contracts over €10M this year?" becomes one tool call. Copy-paste config in Use as an MCP tool.
Paying runs add per-run filtering on top — see Query filters.
What you get
Each dataset item is one EU defense procurement award notice (CPV 353xx–357xx: military equipment, weapons, ammunition, aircraft, vehicles, communication systems, and related services):
| Field | Description |
|---|---|
publicationNumber, publicationDate, tedUrl | Notice identity + link to the source notice on TED |
buyer, buyerCountry | Contracting authority (e.g. a national Ministry of Defence) and its country |
contractor, contractorCountry, contractorCity | Winning company |
ticker, tickerCompany, listingStatus | Stock ticker if the winner is publicly listed (ticker), or why not (privat/JV, unmapped, no-winner) |
title, description, cpvCodes | What was procured |
titleLanguage, noticeLanguage | Language provenance: which language the stored title came from (eng), and which language the notice was legally filed in. See A note on languages |
estimatedValue/estimatedCurrency, awardedValue/awardedCurrency | Pre-tender estimate vs. actual awarded value |
procedureType, durationValue/durationUnit, contractDate, submissionsCount | Procurement process details |
buyerEmail | Contracting authority contact |
What this does not cover
TED is the EU's official procurement publication portal, but it is not a complete picture of EU defense spending — and this Actor inherits that limit. Read this before you treat the feed as exhaustive:
- TED captures only about 10% of total EU defence spending. Most of it is procured outside the TED-published route. Source: Cernat, Guinea & Preuss, Openness and Fragmentation in EU Defence Procurement, ECIPE Policy Brief No. 20/2025 (Dec 2025), which finds that "only 10 percent of total EU defence spending is captured in TED". A contract absent from this dataset is not evidence that no contract was awarded.
- Most notices have no award decision yet. 2,757 of 3,851 notices (72%) are published tenders with no named winner. Only 1,094 are resolved awards.
- Most named winners are not listed companies. Of those 1,094, 275 (25.1%) map to a stock ticker, 346 are confirmed private / state-owned / JV, and 473 are not yet researched. See Ticker coverage.
- Values are only what TED itself publishes. 864 of the 1,094 awards with a winner carry an estimated or awarded value; the remaining 230 carry no value figure at all.
- Buyer scope is TED's, not "the EU". The dataset currently spans 28 buyer countries: 25 EU member states (Croatia and Slovenia have no defense notices in it), plus the UK (160 notices, all 2016–2021), Norway (EEA, 30) and North Macedonia (2). US, NATO-agency and non-European procurement is out of scope.
- CPV-scoped. Only CPV 353xx–357xx plus a defense-buyer whitelist. Defense purchases filed under generic CPV codes by a non-whitelisted buyer are missed.
What it is: the best structured, ticker-mapped public view of the TED-published slice of EU defense procurement, with the gaps stated instead of papered over.
Query filters (Actor input)
The dataset is filterable per run — you don't have to take the full feed. Every field below shows up as a real form in the Apify Console (Actor → Input tab) when you configure a run — and as the same filter bar in the public viewer, which prints the matching Actor input JSON as you narrow the query, so you can try the filter in the browser and paste the result straight into a run:

buyerCountries— restrict to specific buyer countries (ISO 3166-1 alpha-3 codes as used by TED, e.g.DEU,FRA,POL)cpvPrefixes— restrict to CPV sub-categories, e.g.3531for ammunition,3521for military aircraft,3563for military communication equipmentpublishedWithinDays— rolling shorthand fordateFrom: only notices from the last N days. Prefilled with 90 so your first run stays small and cheap; clear it to query the full history back to 2016dateFrom/dateTo— restrict to a publication date range (an explicitdateFromoverridespublishedWithinDays)minValueEur— only notices with a known EUR value at or above this thresholdbuyerKeyword— substring match on the buyer name (e.g. "Ministry of Defence", "Bundeswehr")keyword— substring match on title + description (e.g. "drone", "ammunition")listingStatus— filter by whether the winner is listed (ticker), confirmed unlisted (privat/JV), not yet researched (unmapped) or not yet awarded (no-winner). Prefilled with["ticker", "privat/JV"]— the two statuses that represent a real, identified winneronlyWithTicker— only notices where the winning contractor maps to a public stock tickerlookbackDays— how many days back to sync fresh notices on top of the bundled history (default 5)
Leave any filter empty/unset to not restrict on it.
What you're charged for
You only pay for awards with a real winner — $0.003 per award, plus a $0.01 Actor start.
Notices that TED has published but not yet awarded
(listingStatus: "no-winner" — 2,757 of 3,851, about 72% of the full history)
are delivered in the dataset free of charge. They're a useful pipeline view
of what's coming, but they aren't the product, so they aren't billed. A run
returning 177 notices of which 157 have a winner is charged for 157.
Real costs, measured on actual runs:
| Run | Notices delivered | Billed | Cost |
|---|---|---|---|
| Prefilled input (last 90 days, identified winners) | 81 | 81 | $0.28 |
| Last 90 days, everything incl. pipeline | 177 | 157 | $0.51 |
| Full history 2016–today, no filters | 3,851 | 1,094 | $3.32 |
Why not just call the TED API yourself?
The TED API is free and public, so this is a fair question. Three things sit between it and a usable dataset, and they're what you're paying for:
- Defense buyer whitelist. TED carries public tenders from every sector — school lunches, road resurfacing, IT contracts. Isolating actual defense procurement means filtering CPV 353xx–357xx and screening the contracting authority, because plenty of defense-relevant purchases sit under generic CPV codes while plenty of 353xx notices are civilian. That whitelist is maintained here, not in TED.
- Winner → ticker mapping. TED gives you a legal entity name like
"Rheinmetall MAN Military Vehicles GmbH" or "Sellier & Bellot a.s." It does
not tell you those roll up to
RHM.DEandCZG.PR. This Actor ships a hand-verified mapping table of brand/subsidiary names to listed parents — plus an explicit "privately held / state-owned, no ticker exists" list, so an unmapped row means not yet researched, not we didn't bother. - Accumulated history since 2016. TED's search API is built for recent notices; there is no simple bulk backfill, and pulling ten years out of it is a multi-day, rate-limited, OOM-prone exercise (we know — we did it). The Actor ships that history preassembled and adds to it daily.
Everything else — schema normalisation across eForms/TED-XML generations, multilingual field flattening, per-lot deduplication, EUR value extraction — is the kind of work that's individually small and collectively a week.
Ticker coverage
Honest numbers from the current dataset, so you can judge the mapping before you buy:
| Notices | Share of notices with a winner | |
|---|---|---|
Mapped to a stock ticker (ticker) | 275 | 25.1% |
Confirmed private / JV / state-owned, no ticker exists (privat/JV) | 346 | 31.6% |
| Resolved either way | 621 | 56.8% |
Not yet researched (unmapped) | 473 | 43.2% |
No award decision published yet (no-winner) | 2,757 | — |
The unmapped remainder is a long tail, not a backlog of big names: it spans
381 distinct companies, the largest of which appears in 5 notices. EU defense
procurement below the prime-contractor level is overwhelmingly national SMEs
with no listed equity anywhere.
How the mapping is built. The table above is maintained two ways. Large
winners are researched by hand against a primary source (company IR page,
closing press release, exchange listing). Since 11.08.2026 the long tail is
additionally resolved mechanically through a GLEIF pipeline: the TED winner
name is matched to a Legal Entity Identifier, GLEIF's own parent-relationship
records are walked up to the listed parent, and that parent's ISIN is turned
into a ticker via OpenFIGI. That run added 17 mappings and, just as usefully,
proved a negative for several hundred more — companies GLEIF knows but which
report no listed parent are now labelled privat/JV ("we checked, there is no
ticker") instead of unmapped ("we haven't looked yet"). Candidates the
pipeline flagged as uncertain were re-checked against a second source before
adoption; one (NSE, a three-letter name with a high collision risk) was
rejected rather than guessed. Full provenance per mapping — LEI, ownership
chain, ISIN/FIGI, trading venues — is in GLEIF_REPORT.md.
Ticker symbols follow Yahoo Finance spelling (RHM.DE, SAAB-B.ST,
COLT.PR). That convention is not an official standard, so symbols are
verified to resolve before being shipped.
A note on languages
Titles are always taken from TED's English (eng) version, which TED provides
for every notice — you will not get a Greek or Bulgarian title where an English
one exists.
What you will occasionally see is an English title with an untranslated tail:
Cyprus – Mechanical spare parts except engines and engine parts – Προμήθεια Ανταλλακτικών Οχημάτων
TED's title format is
<country> – <standard CPV label> – <the buyer's own project title>Two fields make this explicit rather than surprising: titleLanguage (the
language the stored title came from) and noticeLanguage (TED's
official-language — the language the notice was legally filed in). When they
differ, expect an untranslated tail. noticeLanguage is populated going
forward from 2026-08-11; notices synced before that date carry null until
they are next re-fetched.
Use as an MCP tool
The Actor is callable from any MCP client (Claude, Cursor, an LLM agent framework) through Apify's MCP server:
{"mcpServers": {"apify": {"command": "npx","args": ["-y", "@apify/actors-mcp-server", "--actors", "northlab/eu-defense-contract-monitor"],"env": { "APIFY_TOKEN": "<your token>" }}}}
The input schema below is what the agent sees as the tool signature — every
filter is a typed parameter, and the response is a JSON array of notices. A
question like "which listed defense companies won German contracts over
€10M this year?" becomes one tool call with buyerCountries: ["DEU"],
minValueEur: 10000000, listingStatus: ["ticker"].
Who this is for
Investors and analysts tracking defense-sector revenue signals before they show up in quarterly earnings — a public contract award is often the first public trace of new order flow for a listed contractor. And AI agents doing the same job on their behalf.
Data source & update frequency
EU TED (Tenders Electronic Daily), the EU's official public procurement portal — freely accessible, no scraping involved. The Actor runs on a daily schedule and accumulates history over time; values are only reported where TED itself publishes them (real awarded amounts are frequently higher than what's disclosed).