EU Defense Tenders & Procurement Awards (TED) → Stock Tickers avatar

EU Defense Tenders & Procurement Awards (TED) → Stock Tickers

Pricing

from $3.00 / 1,000 award with a named winners

Go to Apify Store
EU Defense Tenders & Procurement Awards (TED) → Stock Tickers

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

Carlos Schwiening

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

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.

Overview

Notice detail with summary + companies panel

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:

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):

FieldDescription
publicationNumber, publicationDate, tedUrlNotice identity + link to the source notice on TED
buyer, buyerCountryContracting authority (e.g. a national Ministry of Defence) and its country
contractor, contractorCountry, contractorCityWinning company
ticker, tickerCompany, listingStatusStock ticker if the winner is publicly listed (ticker), or why not (privat/JV, unmapped, no-winner)
title, description, cpvCodesWhat was procured
titleLanguage, noticeLanguageLanguage 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/awardedCurrencyPre-tender estimate vs. actual awarded value
procedureType, durationValue/durationUnit, contractDate, submissionsCountProcurement process details
buyerEmailContracting 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:

Viewer filter bar with buyer countries, CPV prefix and listing status set, showing the matching Actor input JSON

  • 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. 3531 for ammunition, 3521 for military aircraft, 3563 for military communication equipment
  • publishedWithinDays — rolling shorthand for dateFrom: 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 2016
  • dateFrom / dateTo — restrict to a publication date range (an explicit dateFrom overrides publishedWithinDays)
  • minValueEur — only notices with a known EUR value at or above this threshold
  • buyerKeyword — 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 winner
  • onlyWithTicker — only notices where the winning contractor maps to a public stock ticker
  • lookbackDays — 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:

RunNotices deliveredBilledCost
Prefilled input (last 90 days, identified winners)8181$0.28
Last 90 days, everything incl. pipeline177157$0.51
Full history 2016–today, no filters3,8511,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:

  1. 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.
  2. 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.DE and CZG.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.
  3. 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:

NoticesShare of notices with a winner
Mapped to a stock ticker (ticker)27525.1%
Confirmed private / JV / state-owned, no ticker exists (privat/JV)34631.6%
Resolved either way62156.8%
Not yet researched (unmapped)47343.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>
. The first two parts are translated into all 24 official languages; the buyer's own project title is source text and is published untranslated in every language version, including the English one. There is no English variant of it anywhere in TED to fall back to. Currently 23 of 3,851 notices (0.6%) carry such a tail.

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