The tender radar that found nothing on day one
210 tenders collected, none of them ours. Instead of loosening the filters, we asked why — and found an encrypted PDF, a €677 alert subscription, and a public API nobody documents.
We built a radar for Portuguese public tenders. On its first day it collected 210 procedures and not one of them was work for us. Zero.
The temptation, at that moment, is to loosen the filters until the screen shows something. We didn't. A system that always finds something isn't a radar — it's a mirror. Instead we asked why it was empty, and the answer taught us more about public procurement in Portugal than any handbook would.
TED is the wrong market
We started with TED, the EU's Official Journal. Public API, no key, decent documentation. Two weeks of Portuguese notices produced 250 records, of which two scored above zero.
TED only publishes above the European thresholds. A municipality's €48,000 contract for an exhibition never appears there — and that is exactly the size of the work we do. The cleanest source was the least useful one.
The national gazette publishes everything, and hides what matters inside an encrypted PDF
Next came Diário da República, series II. In a single day: 238 items, 35 of them procedure notices — more municipal tenders than TED carries in a month.
But the RSS feed gives you the notice number, the buyer, the subject and a link. No deadline, no base price, no CPV code. That lives in the PDF. And the state printing office publishes those PDFs encrypted — standard security handler, AES-128, with no user password.
Decrypting is possible in plain PHP, deriving the key the way the format specifies. We did it. But it is worth saying out loud what this means: information the law requires to be public reaches the citizen inside a ciphered file.
The platforms sell you what is already public
Portugal has four electronic procurement platforms licensed by IMPIC. They all offer alerts for your line of business. We looked up the prices, which they publish themselves:
- ComprasPT — daily tender notifications: €180 per year. Membership packs: €567, €1,515 or €3,884 per year.
- anoGov — daily alerts only inside the packs: €677, €1,620 or €3,989 per year.
Basic registration is free, as the law requires. Being told that a tender exists in your field is a paid service. (Prices as published in September 2026; ComprasPT's list is dated 11 February 2025.)
Then we found the API nobody documents
Portal BASE, run by IMPIC, is the official repository of Portuguese public contracting. The site is a JavaScript application talking to its own server. We went to see what it asks for.
POST https://www.base.gov.pt/Base4/pt/resultados/
type=search_anuncios&version=109.0&query=…&page=0&size=25
It answers in JSON. Buyer, designation, procedure type, base price, publication date, proposal deadline — already in separate fields. 251,784 notices. No key, no registration, no account.
Same story on VORTAL: the public search of active tenders is a POST returning 605 ongoing Portuguese procedures, and the detail page carries the CPV code, the buyer's tax number and the procurement documents. Also without an account.
There is nothing clandestine here. These are tender notices — legally mandated publicity that must be reachable by anyone. The difference is that the machine-readable form is documented nowhere, and someone charges €180 a year to email it to you.
What the radar does with it
Every tender is scored by explainable rules: terms in the subject, CPV code against our target list, base price inside our working range, enough time left to write a proposal. The screen shows the score and, when you open it, the arithmetic line by line — “CPV 72413000 on the target list, +30”.
That matters because the decision isn't the algorithm's. It belongs to whoever is about to spend two weeks writing a bid.
What is still unsolved, stated plainly
- Over 40% of the collection has no CPV code. It comes from the gazette (inside the PDF) and from BASE (in the detail view, one request away). Without CPV, scoring leans on vocabulary — and vocabulary fails: we caught “repair of the platforms along the ecopaths” as possible digital platform work.
- BASE rate-limits. After an intensive collection it starts answering
200with an empty body. We treat that as a visible error, never as “no tenders found” — the most important rule we wrote. - The alert threshold sat at 85 while the best tender in the whole collection scored 46. The radar would never ring. It wasn't a lack of tenders: it was the bar.
The part dashboards don't show
A pretty screen with six scored tenders is easy to manufacture. What counts is the first day with zero, and resisting the urge to move the numbers until they look better.
An honest radar has to be able to say “there is nothing for you today”. If it can't say that, it is worth nothing when it says the opposite.