Contracts Finder, Find a Tender and TED Monitor avatar

Contracts Finder, Find a Tender and TED Monitor

Pricing

from $3.50 / 1,000 tender notices

Go to Apify Store
Contracts Finder, Find a Tender and TED Monitor

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

Omar Nagy

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Security

Limited permissions

Share

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), source and the notice url
  • Money: value and currency as the buyer stated them, value_eur converted with ECB reference rates, and a value_note when a value was a placeholder (such as 1 EUR) or in a currency with no rate
  • Timing: deadline, days_to_deadline, published and contract_months
  • Classification: the main cpv code, every CPV code in cpv_all, and for TED the English cpv_label
  • Fit: a score from 0 to 100 and a why list in plain words ("CPV 72220000", "stated value 85,000 EUR, under the 100,000 EUR cap", "38 days to the deadline")
  • Monitoring: is_new and first_seen when 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

  1. Pick the sources. Leave the list empty, or as prefilled, for all three.
  2. 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.
  3. Set your limits. Maximum contract value (in any of 11 currencies), maximum contract length and the minimum days left before the deadline.
  4. 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

  1. Set Lookback window to 8 (a week plus one day of overlap).
  2. Switch on Only return notices not delivered before and give the store a name for this monitor, for example it-tenders-uk-eu.
  3. Save the input as a task and add a weekly schedule in Apify (Schedules, for example every Monday at 07:00).
  4. 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:

RecordWhat it holds
DIGESTPlain-text digest: per-source counts, then the top notices (set by Notices shown in the digest) with buyer, value, deadline, score, reasons and link
OUTPUTDelivered and charged counts, and any source that failed or held more notices than were read
RUN_SUMMARYThe window, per-source counts, the TED query as sent, every rule in force and how many notices each rule dropped
DROPPEDUp 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:

SignalPoints
A CPV code in your prefixes25
Keywords in the title (in the description only: 7)15
Stated value under your cap (10 more under half the cap)30
No value published5
Stated contract length inside your cap10
Flagged suitable for SMEs15
Deadline beyond your minimum10

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.

RunNoticesCost on the Free plan
The form defaults (3 days, all three sources, IT filter), 8 October 2026221$1.105
A week (8 days, all three sources, IT filter), 8 October 2026381$1.905
Any run repeated over the same window with only-new mode on0$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-items
Authorization: Bearer <your Apify API token>
Content-Type: application/json
{ "sources": ["contractsfinder", "findatender"], "lookbackDays": 8 }

Python, with the apify-client package:

from apify_client import ApifyClient
client = 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_eur uses ECB reference rates dated 8 October 2026, built into the Actor.
  • Page caps. Each source is read up to maxPages pages 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, OUTPUT and 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 excludeRegex if 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.