Contracts Finder, Find a Tender and TED Monitor
Pricing
from $3.50 / 1,000 tender notices
Contracts Finder, Find a Tender and TED Monitor
Returns UK and EU public tender notices from Contracts Finder, Find a Tender and TED as JSON: title, buyer, country, value in EUR, deadline, CPV codes, a fit score with reasons and the notice link. Filter by sector, value and deadline; schedule it to get only new notices.
Pricing
from $3.50 / 1,000 tender notices
Rating
0.0
(0)
Developer
Omar Nagy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
This tender monitor reads UK Contracts Finder, UK Find a Tender and EU TED (Tenders Electronic Daily) in one run and returns the public tender notices that fit your sector, budget and deadline as clean JSON, best match first. Every notice comes with the buyer, country, stated value converted to EUR, deadline, CPV codes, a fit score with the reasons behind it, and the link to the official notice.
Run it once to search the last few days, or put it on a weekly schedule with Only return notices not delivered before switched on, and each run hands you only the tenders you have not seen yet.
What the tender monitor returns
One dataset row per open tender notice:
- What and who:
title,buyer,buyer_country(ISO code),sourceand the noticeurl - Money:
valueandcurrencyas the buyer stated them,value_eurconverted with ECB reference rates, and avalue_notewhen a value was a placeholder (such as 1 EUR) or in a currency with no rate - Timing:
deadline,days_to_deadline,publishedandcontract_months - Classification: the main
cpvcode, every CPV code incpv_all, and for TED the Englishcpv_label - Fit: a
scorefrom 0 to 100 and awhylist in plain words ("CPV 72220000", "stated value 85,000 EUR, under the 100,000 EUR cap", "38 days to the deadline") - Monitoring:
is_newandfirst_seenwhen only-new mode is on
Each run also saves a plain-text digest of the best notices (the DIGEST record), ready to paste into an email or a Slack message.
Who it is for
- Bid and sales teams at agencies, software houses and IT consultancies who want UK and EU public sector opportunities without checking three portals every morning
- Consultants and analysts tracking what a sector buys, from whom, and at what value
- Teams in other sectors (construction, health, facilities, marketing): change the CPV codes and keywords and the same filter works for your field
- AI agents and automations that need tender data as a tool or a scheduled feed
How to use it
- Pick the sources. Leave the list empty, or as prefilled, for all three.
- Set your sector. The defaults target IT, software and digital services (CPV divisions 72 and 48 plus a keyword list). For another sector, replace the CPV prefixes and TED CPV codes, and switch off the default exclude list if it covers your field.
- Set your limits. Maximum contract value (in any of 11 currencies), maximum contract length and the minimum days left before the deadline.
- Run it. The form starts with a 3-day window for a quick first look.
A notice qualifies when one of its CPV codes starts with one of your prefixes, or its own title matches your keywords. A limit only applies when the notice states that field: a notice that publishes no value, no contract length or no deadline is kept and scored lower, never dropped for the silence. Most public notices publish no value, so this rule is what keeps the results complete.
Get only new tenders every week
- Set Lookback window to 8 (a week plus one day of overlap).
- Switch on Only return notices not delivered before and give the store a name for this monitor, for example
it-tenders-uk-eu. - Save the input as a task and add a weekly schedule in Apify (Schedules, for example every Monday at 07:00).
- Optionally send each run to email, Slack, Google Sheets or a webhook with Apify integrations.
Each run then delivers only notices that no earlier run delivered, so a notice is paid for once.
Input example
Weekly UK and EU IT monitor, under 100,000 GBP, at least 14 days to the deadline, skipping licence renewals:
{"sources": ["contractsfinder", "findatender", "ted"],"lookbackDays": 8,"maxValue": 100000,"maxValueCurrency": "GBP","maxContractMonths": 24,"minDeadlineDays": 14,"excludeRegex": "licen[cs]e|subscription","onlyNew": true,"dedupeStore": "it-tenders-uk-eu"}
UK construction tenders of any value:
{"sources": ["contractsfinder", "findatender"],"lookbackDays": 8,"cpvPrefixes": ["45"],"keywordRegex": "\\b(construction|refurbishment|building works?)\\b","applyDefaultExclude": false,"maxValue": 0,"maxContractMonths": 120}
Output example
Two real rows from a run on 8 October 2026 (the second description is shortened here):
[{"source": "ted","id": "693714-2026","title": "Acquisition, déploiement, migration et maintien en conditions opérationnelles d'une suite collaborative, bureautique et de messagerie sécurisée en mode SaaS","buyer": "SDIS 18 Cher","buyer_country": "FR","buyer_countries": ["FR"],"value": 85000,"currency": "EUR","value_eur": 85000,"value_stated_raw": 85000,"value_note": null,"deadline": "2026-11-16T00:00:00+02:00","published": "2026-10-08T00:00:00+02:00","contract_months": 12,"days_to_deadline": 38,"sme_flag": null,"cpv": "72220000","cpv_label": "Systems and technical consultancy services","cpv_all": ["72220000", "72220000"],"score": 90,"why": ["CPV 72220000","title matches the keywords","stated value 85,000 EUR, under the 100,000 EUR cap","12 month contract","38 days to the deadline"],"url": "https://ted.europa.eu/en/notice/-/detail/693714-2026","is_new": null,"first_seen": null,"run_at": "2026-10-08T19:26:51.481Z","description": "Acquisition, déploiement, migration et maintien en conditions opérationnelles d'une suite collaborative, bureautique et de messagerie sécurisée en mode SaaS"},{"source": "contractsfinder","id": "5f4d9841-b30a-42bb-b122-3f7758606443-916959","title": "GDPR Data Audit","buyer": "Ryde Town Council","buyer_country": "GB","buyer_countries": ["GB"],"value": null,"currency": null,"value_eur": null,"value_stated_raw": null,"value_note": null,"deadline": "2026-10-26T12:00:00Z","published": "2026-10-07T13:13:57+01:00","contract_months": 3,"days_to_deadline": 18,"sme_flag": true,"cpv": "66170000","cpv_label": null,"cpv_all": ["66170000", "72222300", "79212000"],"score": 65,"why": ["CPV 72222300","no value published, so the size is unknown","3 month contract","flagged suitable for SMEs","18 days to the deadline"],"url": "https://www.contractsfinder.service.gov.uk/Notice/5f4d9841-b30a-42bb-b122-3f7758606443","is_new": null,"first_seen": null,"run_at": "2026-10-08T19:26:51.481Z","description": "Ryde Town Council invites quotations from suitably qualified organisations to carry out an independent audit of its compliance with data protection law..."}]
Besides the dataset, each run saves these records in its key-value store:
| Record | What it holds |
|---|---|
DIGEST | Plain-text digest: per-source counts, then the top notices (set by Notices shown in the digest) with buyer, value, deadline, score, reasons and link |
OUTPUT | Delivered and charged counts, and any source that failed or held more notices than were read |
RUN_SUMMARY | The window, per-source counts, the TED query as sent, every rule in force and how many notices each rule dropped |
DROPPED | Up to 500 rejected notices with the rule that dropped each one, for tuning your filter |
How notices are scored
The score orders the dataset and the digest. It adds up, capped at 100:
| Signal | Points |
|---|---|
| A CPV code in your prefixes | 25 |
| Keywords in the title (in the description only: 7) | 15 |
| Stated value under your cap (10 more under half the cap) | 30 |
| No value published | 5 |
| Stated contract length inside your cap | 10 |
| Flagged suitable for SMEs | 15 |
| Deadline beyond your minimum | 10 |
A notice is dropped when it states a value over your cap, a contract longer than your maximum or a deadline sooner than your minimum, when it matches the exclude list, or (both on by default) when it reads as a framework or purchasing system or asks for a security clearance.
Pricing
$0.005 per tender notice delivered, lower on Bronze, Silver and Gold plans. There is no start fee, and a run that delivers no notices costs nothing.
| Run | Notices | Cost on the Free plan |
|---|---|---|
| The form defaults (3 days, all three sources, IT filter), 8 October 2026 | 221 | $1.105 |
| A week (8 days, all three sources, IT filter), 8 October 2026 | 381 | $1.905 |
| Any run repeated over the same window with only-new mode on | 0 | $0 |
To spend less, narrow the filter: fewer sources, tedCountries, a tighter value cap, or your own CPV codes. With only-new mode on a schedule you pay once per notice, not once per run.
A maximum cost per run is respected. Set one and the run delivers the best-scoring notices that fit inside it, then stops and says so in the status message ("Stopped at your maximum cost: N of M results delivered."). The number of rows in your dataset always equals the number of notices charged. With only-new mode on, the notices held back stay unseen and arrive in the next run.
Use it from Claude, Cursor or any MCP client
Add this tender monitor as a tool through Apify's hosted MCP server:
https://mcp.apify.com?tools=omargnagy/tender-monitor
In Claude Code:
claude mcp add --transport http tender-monitor "https://mcp.apify.com?tools=omargnagy/tender-monitor"
In Cursor or another client that takes a JSON config:
{"mcpServers": {"tender-monitor": {"url": "https://mcp.apify.com?tools=omargnagy/tender-monitor"}}}
You connect with your Apify account, and runs are billed like any other run. Then ask in plain words, for example: "Find UK IT tenders under 100,000 GBP published this week that close in more than two weeks, and summarise the five best."
Use it from code
One HTTP call runs the Actor and returns the rows:
POST https://api.apify.com/v2/acts/omargnagy~tender-monitor/run-sync-get-dataset-itemsAuthorization: Bearer <your Apify API token>Content-Type: application/json{ "sources": ["contractsfinder", "findatender"], "lookbackDays": 8 }
Python, with the apify-client package:
from apify_client import ApifyClientclient = ApifyClient("<your Apify API token>")run = client.actor("omargnagy/tender-monitor").call(run_input={"sources": ["ted"], "tedCountries": ["IE", "NL"], "lookbackDays": 8})for notice in client.dataset(run["defaultDatasetId"]).iterate_items():print(notice["score"], notice["title"], notice["deadline"], notice["url"])
Limits
- Open tender notices only. Contracts Finder and Find a Tender are read at the tender stage, and TED for contract notices (
cn-standard,cn-social). Award notices, prior information notices and planned procurements are not included. - TED notices stay in the buyer's language. Titles and descriptions are not translated. TED rows carry the English CPV label in
cpv_label, and keyword matching works best with CPV codes for non-English notices. - Most notices publish no value. In the week to 8 October 2026, 95% of the delivered notices stated none. They are kept and scored lower.
- Converted values are approximate.
value_euruses ECB reference rates dated 8 October 2026, built into the Actor. - Page caps. Each source is read up to
maxPagespages of 100 notices (20 at most). TED is read newest first, so a cap drops its oldest notices. A long window on TED can hold more than the cap; the status message,OUTPUTand the digest then say how many were read out of how many. - Two rules are text checks, not data fields. Framework agreements and security clearances are detected from English wording, so a German "Rahmenvertrag" or a French "accord-cadre" is not caught. Add such words to
excludeRegexif you want them dropped. Both checks can be switched off. - The SME flag is rare. Contracts Finder publishes it, Find a Tender almost never does, so it adds score rather than filtering by default.
- The UK sources are filtered after download. Every UK tender notice in the window is read, then matched against your CPV codes and keywords.
FAQ
Does it only work for IT tenders?
No. IT and digital services are the default. Set cpvPrefixes and tedCpv to your sector's CPV division (45 construction, 85 health, 79 business services, 90 cleaning and waste), adjust keywordRegex, and switch off Apply the default exclude list if it would drop your sector.
How do I get a weekly email of new tenders?
Use the weekly setup above, then add an email or Slack integration to the task. The DIGEST record is plain text written for that purpose.
Why do some notices have no value?
The buyer did not publish one. The notice is kept with value: null and the reason in why. A stated value under 500 EUR (often 0 or 1) is treated as a placeholder and reported the same way, with the raw number kept in value_stated_raw.
Can I limit TED to certain countries?
Yes, with tedCountries, for example ["IE", "NL", "BE"]. It does not affect the UK sources.
Why was a notice I expected not returned?
Check RUN_SUMMARY for the rules in force and DROPPED for each rejected notice and the rule that dropped it.
How fresh is the data? Every run reads the live public APIs at run time. TED publishes new notices on working days.
Can I bid through this Actor? No. It finds and filters notices. Each row links to the official notice, where you register and respond on the buyer's own portal.
Data sources and licence
Notices come from the official public APIs of UK Contracts Finder and UK Find a Tender (Crown copyright, published under the Open Government Licence v3.0) and TED, Tenders Electronic Daily (© European Union, reused under the Commission's open data policy). Both licences ask you to credit the source when you republish the data. The Actor checks each host's robots.txt, sends at most one request per second per source, and identifies itself by its Apify Store URL.