Procurement · Measured · Published 2026-08-15
Finding CCTV tenders in the EU: 443,879 notices, 2.2% worth reading
About 1,573 new public contract notices appear across the EU every working day. Roughly one in fifty involves cameras, intrusion alarm or access control. We spent a month measuring how to find that one, register by register, and almost everything we assumed at the start turned out to be wrong. Here are the numbers.
1. The denominator nobody quotes
Every tender alert service tells you how many notices it found. None of them tell you how many there were. We pulled the denominator straight from TED, which answers a query on publication date alone: 443,879 contract notices across the EU in the 12 months to 14 August 2026. That is about 1,573 a day.
Of those, 9,620 matched the CCTV and electronic security CPV codes or our keyword dictionary. That is 2.2 percent of the stream, and it is the honest shape of the problem: if you scan a national register by hand, you are reading roughly fifty notices to find one that concerns you, and you are doing it every day, because below the EU thresholds a submission deadline of 7 to 14 days is normal.
One caveat on that figure, stated because it matters: TED carries contracts above the EU publication thresholds. Most CCTV work in most member states sits below them and is published nationally instead. The 443,879 is the ceiling of the visible EU-wide layer, not the whole market.
2. Buyers do not write "CCTV"
This is the finding that reorganised the whole project. A tender register is a literal string matcher, and the string a public buyer types is whatever the job is called in their own administrative habit. We measured the same idea several ways against each register. The results were not close.
| Register | Search term | Notices |
|---|---|---|
| BZP (PL) | monitoring wizyjny | 2 |
| BZP (PL) | monitoring | 119 |
| BZP (PL) | telewizja przemysłowa | 0 |
| BZP (PL) | kamer | 42 |
| Diavgeia (EL) | σύστημα συναγερμού | 0 |
| Diavgeia (EL) | συναγερμ | 9 |
| BOAMP (FR) | vidéoprotection | baseline |
| BOAMP (FR) | vidéo protection | +18 |
Polish and Greek measured over the 90 days to 14 August 2026; French over the same window, counted as notices no other term in our list found.
Two mechanisms are at work. In inflected languages a phrase search dies on the first case ending: "monitoring wizyjny" is the dictionary form, and a Polish buyer writes "Rozbudowa systemu monitoringu wizyjnego miasta". The phrase never appears in that sentence. The stem does. Greek repeats the pattern in a third alphabet: the full phrase for "alarm system" returned nothing, the stem returned nine.
The second mechanism is plain spelling. French procurement writes the same word both ways, and we had only one of them. "Vidéo protection" with a space brought in 18 notices that were among the purest camera tenders in the register, including several worded exactly as "Fourniture et installation d'un système de vidéo protection". One missing space, one year of misses.
3. The same three words mean opposite things in two countries
Widening a keyword list is easy. Knowing which of the wide terms are lying to you is the actual work, and no dictionary will tell you. We read the titles, term by term, register by register.
German "Sicherheitstechnik" looks like the perfect broad term: security technology. It returned 19 notices on service.bund.de, 18 of which no other term in our list had found, and reading all 18 gave exactly one plausible camera job. The rest were occupational safety officers, workplace health contracts, guard services and logistics vehicles. In German procurement the word means workplace safety far more often than it means electronic security, and one usable hit in eighteen would have tripled our classification bill.
French "système de sécurité" would have added 97 notices on BOAMP and they are largely "sécurité incendie", fire safety systems. Rejected as well. Then the Romanian register added 86 notices for "sistem de securitate", the literal translation of the French term we had just thrown out, and they are ours: integrated electronic security, video monitoring systems, security systems for military units. Same three words, opposite verdicts, and only reading the titles separates them.
The small traps are just as expensive. In Romanian, "camere de aer" is a tyre inner tube, so a plain search for "camere" adds 58 mostly irrelevant notices. In German, "Kamera" returns an electron microscope, a high-speed camera and lecture hall media equipment. In Polish, "monitoring" drags in dormouse population surveys and climate strategy work, which we accepted anyway, because the same token also returns the city video surveillance expansions that every phrase-based term missed.
4. A fifth of the work carries no CCTV code at all
The standard advice is to subscribe to the CCTV CPV codes and wait. Measured on the Polish national register over the 90 days to 12 August 2026: the CPV sweep returned 176 notices, and six free-text terms added 48 more that carried no CCTV code whatsoever. The free text put 27 percent on top of what the codes found, and 48 of the 224 notices, better than one in five, would never have appeared in a code subscription.
The reason is structural rather than sloppy. Cameras bought inside a school refurbishment keep the building works code. A camera lot inside an electrical installation contract keeps 45311200. The buyer is not hiding the work; they are classifying the contract, and the contract is a building.
The same split shows up on TED over the 12 months to 12 August 2026: CPV codes alone found 2,574 notices, free text alone found 1,846, and the union was 3,630. Free text adds 41 percent on top of a pure code subscription, on the register that is supposed to be the best classified in Europe.
One more category is worth naming, because it was completely invisible to us for a year: intrusion alarm. Adding the Polish abbreviation SSWiN found 8 notices in 90 days that no camera term saw, with titles like "Modernizacja SSP, SSWiN, CCTV" and "Montaż systemu alarmowego SSWiN, CCTV w Budynku Warsztatów". The alarm is tendered in the same lot as the cameras, by the same integrator, and the title happens to lead with the alarm. French behaves the same way: "contrôle d'accès" added 78 notices, about half of them ours, in the classic multi-lot French job that puts fire, smoke extraction, access control and video in one contract.
5. A keyword rule only ever works forwards
This is the part that costs money quietly. Adding SSWiN caught 8 notices, and it caught them going forward only. Everything that passed through the register in the preceding year is gone, not because it was filtered out, but because it was never fetched. There is nothing to re-search.
That has a practical consequence for anyone building a watchlist, in a spreadsheet or otherwise: the moment you learn a new term is the moment you have already lost a year of it. It is an argument for keeping your own archive of what the registers publish, and for making the net wide at the start rather than tuning it later.
6. Search where the text is, not where the download is
We were confident about the next step: stop letting a foreign server decide relevance, download the entire daily stream, filter it ourselves. The measurement killed it. On 13 August 2026, one full EU day: the server-side query returned 30 notices. Downloading everything and filtering locally returned 16. Three notices were found only locally and all three were false positives, electrical works, endoprostheses and fuel. Seventeen were found only by the server.
The reason is that TED indexes more text than it returns. The full-text pseudo-field searches the whole notice, while the API hands back the title and the lot description, a fraction of it. Filtering locally on that fraction is structurally weaker than asking the register to search what it actually holds. A corpus approach is still the right end state, but only with the full notice packages, and that is a much bigger job than it looks. The cheap win was elsewhere.
7. The cheap win was the dictionary
Same register, same CPV codes, same 12-month window, only the word list changed. The old list of 15 phrases returned 3,874 notices. A dictionary of 146 phrases, built from the per-register measurements above, returned 9,620. That is 5,746 additional notices, an increase of 148 percent, with no new data source, no crawler and no scraping.
Which is the summary of the whole month of work: the constraint on finding public tenders is not access to data. The data is free, published by law and available through documented APIs. The constraint is knowing what the work is called in 24 languages, in the specific inflected form the register will match, and being willing to read a few hundred titles to find out which of your promising terms are actually about fire safety.
8. If you are doing this by hand
Everything above is reproducible with a free account on your national register. In priority order:
- Search in the buyer's language, not in English. "CCTV" does appear in every register we measured, but it is a minority spelling everywhere outside consultant-written specifications.
- Use stems, not phrases, wherever the language inflects: Polish, Czech, Slovak, Slovenian, Croatian, Romanian, Greek, Lithuanian, Latvian. "kamerov" catches kamerový, kamerové and kamerovým in one term.
- Add the spelling variants. Written together and written apart, with and without diacritics: vidéoprotection and vidéo protection, videonadzor and video nadzor.
- Do not subscribe to CPV codes alone. Better than one notice in five is classified as something else, and the something else is usually construction or electrical installation.
- Include intrusion alarm and access control terms. They are tendered in the same lot as the cameras, and the title often leads with them.
- Check daily, not weekly. Below the EU thresholds a 7 to 14 day submission window is normal, and a weekly scan spends half of the lead time before you have read the notice.
- Keep what you fetch. Every rule you add works only on what comes next.
A word on the numbers in this article: each one is a single measurement against a live register on a stated date, not a permanent property of the market. Registers change their matching behaviour, and a term that returns 119 notices this quarter may behave differently next year. We publish the dates so the figures can be checked and so it is obvious when they have aged.
9. What we built with it
The dictionary is not a document, it is the ingest. One list serves every register we query in that language, so a term added for the Polish market improves the Slovak and Czech sweeps that share the stem. Notices land in a single database with a deduplication key that survives registers reissuing their own identifiers, a location that degrades honestly from street address through city and region down to a country label when the notice gives no place at all, and a relevance classification that reads the title and description rather than trusting the code.
On top of that sits the part that made us build it in the first place: a tender opens into the designer, the requirements from the specification become a checklist, and every line in that checklist is answered pass, fail, or no data, from the manufacturer datasheet. Never a guess. The offer package comes out as a PDF with the compliance matrix, the bill of materials and the camera-by-camera evidence.
It is an add-on to CCTVplanner rather than a separate product, available in EU countries, and the design tool underneath it stays free to use.
See what is open in your country right now
The tender list is public: country, title and deadline, no account needed. The analysis, the map, the alert zones and the offer package are the paid add-on.