Global Tender Monitor — UK & EU Public Procurement
Pricing
from $2.10 / 1,000 tender delivereds
Global Tender Monitor — UK & EU Public Procurement
Monitor UK and EU public tenders in one feed. Returns only notices published since your last run, with buyer, contract value, deadline and CPV codes. Official sources, no API key.
Pricing
from $2.10 / 1,000 tender delivereds
Rating
0.0
(0)
Developer
Dottti
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
Watch UK and EU public tenders in one feed and get only the notices published since your last run. Buyer, contract value, deadline, CPV codes and a direct link, normalised into one schema across both sources.
Official government APIs. No API key, no scraping, no proxy needed.
Sources
| Source | Endpoint | What it gives |
|---|---|---|
| UK Find a Tender | OCDS release packages | Contract value and currency, buyer, status, deadline |
| TED (European Union) | Expert search API | 322,000+ notices across all member states |
Output
Both sources produce the same fields, so a CSV export stays rectangular and you can sort UK and EU notices together.
{"source": "uk","sourceName": "UK Find a Tender","noticeId": "ocds-h6vhtk-05a1b2","title": "Assertive Outreach Rough Sleepers","buyer": "Caerphilly County Borough Council","country": "GB","valueAmount": 2400000,"valueAmountGross": 2880000,"currency": "GBP","status": "active","publishedDate": "2026-09-14T13:45:47.000Z","deadline": "2026-10-16T11:00:00.000Z","cpvCodes": ["85300000"],"url": "https://www.find-tender.service.gov.uk/Notice/..."}
Three things handled properly
TED is multilingual and not always in English. Every TED text field arrives as a language map — {"eng": "...", "fra": "...", "hun": "..."} — and some notices carry no English at all. A preferred language is chosen, English is the fallback, and whatever the notice actually has is the last resort. Returning null because English was missing would silently drop real tenders.
IDs are namespaced by source. UK and EU both use plain numeric identifiers, so tracking them in a shared list would let one source's notice hide behind the other's. State is keyed source:id, with a test that asserts two notices numbered 100 both survive.
The first run shows you the current notices. It delivers up to maxItemsPerSource per source and remembers them. Every later run returns only what is new since the run before. RUN_SUMMARY says exactly what was delivered.
Input
| Field | What it does |
|---|---|
sources | uk, eu, or both. |
mode | new returns only unseen notices. all returns everything each run. |
keywords | Keep only notices whose title, description or buyer matches. |
tedQuery | TED's own expert-search syntax. It rejects a bare wildcard. |
language | Three-letter code for picking from TED's language maps. |
stateKey | One key per watchlist so separate schedules do not interfere. |
TED query examples
notice-title ~ (software)classification-cpv IN (72000000)buyer-country = NLD
Example: daily watch for IT contracts
{"sources": ["uk", "eu"],"mode": "new","keywords": ["software", "IT services", "cloud"],"tedQuery": "classification-cpv IN (72000000)","stateKey": "it-contracts"}
Schedule that daily. The first run returns the current notices; every run after returns only newly published ones.
Notes and limits
- Contract values are published by the UK source. TED does not include a value in this response shape, so
valueAmountisnullfor EU rows rather than estimated. - A rejected TED query returns its error message directly instead of being retried, since a syntax error will not fix itself.
- If one source fails, the other still delivers and
RUN_SUMMARYrecords the reason. - Deleting the named state store resets the baseline, and the next run records a fresh one.
Development
npm installnpm testnode src/main.js