# UK & EU Tenders Scraper: TED + Contracts Finder (`kratus/eu-uk-tenders-monitor`) Actor

New UK and EU public tenders in one table from the official Find a Tender, Contracts Finder and TED APIs: buyer, country, CPV codes, value, deadline and link. Filter by keyword, CPV and country. Watch mode returns only new notices for daily bid alerts. No API key.

- **URL**: https://apify.com/kratus/eu-uk-tenders-monitor.md
- **Developed by:** [Kratus](https://apify.com/kratus) (community)
- **Categories:** Lead generation, Business, Automation
- **Features:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$2.00 / 1,000 tender notices

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## UK, EU & US Tenders Scraper: Find a Tender, Contracts Finder, TED and SAM.gov

Get **new public tenders from the UK, the EU and the US in one clean table**, every day, straight from four
official sources:

- **UK Find a Tender**: the UK's main service for higher-value public contracts.
- **UK Contracts Finder**: lower-value UK contracts.
- **TED** (Tenders Electronic Daily): the EU's official journal of public procurement, covering EU and EEA
  countries.
- **SAM.gov**: US federal contract opportunities (solicitations, presolicitations, sources sought).

This tenders scraper turns government contract notices into rows you can filter, schedule and send to Excel,
Google Sheets, Slack, email or your CRM. Use it for daily **bid alerts**, **public sector sales leads** and
**procurement market research**.

> Unofficial. Not affiliated with or endorsed by the EU Publications Office (TED), the UK Cabinet Office (Find a
> Tender), Crown Commercial Service (Contracts Finder) or the US General Services Administration (SAM.gov). It
> reads their public data services.

### Why use this UK and EU tenders scraper

- **UK, EU and US in one feed.** Most tools cover only the UK, only TED or only SAM.gov. Here every notice has the
  same fields whatever the source, so one search covers three markets.
- **Big and small UK contracts.** Find a Tender and Contracts Finder together cover the large framework contracts
  and the small local ones.
- **Daily tender alerts with watch mode.** Turn on *Only new notices* and you get each tender once, never again.
  You only pay for new rows.
- **Filters that match how bid teams work.** Filter by keyword, CPV code (the whole CPV family is matched) and
  buyer country.
- **No API key, no login, no proxies.** It uses only official open data.
- **Cheap and predictable.** $2 per 1,000 notices, with no start fee.

### What data you get

One row per notice, with the same fields for all three sources:

| Field | Example | Notes |
|---|---|---|
| `sourceName` | `UK Find a Tender` | EU TED, UK Find a Tender, UK Contracts Finder or US SAM.gov |
| `noticeId` | `106389-2026` | Notice number on the source |
| `title` | `Purchase & Installation of Multibeam Echosounder System` | English title for TED when TED provides one |
| `description` | `The Scottish Ministers, Marine Directorate invites tenders…` | UK and US, up to 1,000 characters |
| `buyerName` | `Scottish Government` | The contracting authority (for SAM.gov, the federal agency) |
| `buyerCountry` | `GBR` | ISO 3-letter code (FRA, DEU, IRL, GBR, USA…) |
| `buyerCity` | `Aberdeen` | UK and US |
| `cpvCodes` | `["38114000", "38110000"]` | Common Procurement Vocabulary codes (empty for SAM.gov) |
| `deadline` | `2026-12-09T12:00:00Z` | Deadline for tenders (TED: earliest lot deadline) |
| `valueAmount` / `currency` | `120000` / `GBP` | Estimated contract value, when the buyer published one (UK) |
| `noticeType` | `cn-standard`, `tender` or `Solicitation` | TED notice type, UK stage or SAM.gov notice type |
| `status`, `mainCategory`, `procurementMethod` | `active`, `goods`, `open` | UK only |
| `publishedAt` | `2026-11-09T16:18:18Z` | Publication date |
| `url` | `https://www.find-tender.service.gov.uk/Notice/106389-2026` | Official notice page |
| `scrapedAt` | `2026-11-10T07:00:12Z` | When the row was collected |

Contact people (names, emails, phone numbers) are never collected. Emails and phone numbers inside notice
descriptions are removed, so you get organisation-level data only.

### Ready-made searches

Open one, click **Try for free**, and change the keywords or countries to fit your market:

- [UK IT and software tenders](https://apify.com/kratus/eu-uk-tenders-monitor/examples/uk-it-software-tenders)
- [UK construction tenders](https://apify.com/kratus/eu-uk-tenders-monitor/examples/uk-construction-tenders)
- [EU IT and software tenders](https://apify.com/kratus/eu-uk-tenders-monitor/examples/eu-it-software-tenders)
- [EU construction tenders (CPV 45)](https://apify.com/kratus/eu-uk-tenders-monitor/examples/eu-construction-tenders)
- [Irish public tenders](https://apify.com/kratus/eu-uk-tenders-monitor/examples/ireland-public-tenders)
- [French public tenders (appels d'offres)](https://apify.com/kratus/eu-uk-tenders-monitor/examples/france-public-tenders)
- [German public tenders (Ausschreibungen)](https://apify.com/kratus/eu-uk-tenders-monitor/examples/germany-public-tenders)

### How to get daily tender alerts in 3 steps

1. Pick the **sources** (all four by default) and add **keywords** (for example `software`, `cleaning`,
   `solar`), **CPV codes** (for example `72000000` for IT services) and **buyer countries** (for example `GBR`,
   `IRL`, `FRA`). Leave a filter empty to get everything.
2. Turn on **Only new notices**, give the search a **watchlist name**, and set **Days back** to 2.
3. Add a daily schedule in Apify Console, then send the results to Google Sheets, Slack, email, Make, Zapier or
   n8n. You can also download them as Excel, CSV or JSON.

### How much it costs

You pay **$2.00 per 1,000 notices** (pay per result), plus Apify's small platform fee. You are never charged for
notices removed by your keywords, CPV codes or countries. In watch mode you are not charged for notices you have
already received.

For example, a daily run that returns 40 new notices costs about **$0.08**, or about **$2.40 a month**. Set **Max
results** to cap the cost of any run.

### Input example

```json
{
    "sources": ["ted", "uk-find-a-tender", "uk-contracts-finder", "us-sam-gov"],
    "keywords": ["software", "data platform"],
    "cpv_codes": ["72000000", "48000000"],
    "countries": ["GBR", "IRL", "NLD"],
    "days_back": 2,
    "only_new": true,
    "watchlist_name": "it-uk-ireland-nl",
    "max_items": 200
}
```

| Input | Default | What it does |
|---|---|---|
| `sources` | all four | `ted`, `uk-find-a-tender`, `uk-contracts-finder`, `us-sam-gov` |
| `keywords` | none | Keep notices whose title, description or buyer contains one of the words |
| `cpv_codes` | none | Keep notices in these CPV families (8-digit codes; 72000000 = all IT services). SAM.gov notices have no CPV codes and are left out when this is set |
| `countries` | none | Keep buyers in these countries (ISO 3-letter codes; UK and US accepted) |
| `days_back` | 2 | Notices published in the last N days (1-60) |
| `only_new` | off | Watch mode: return only notices not returned before for this watchlist |
| `watchlist_name` | `default` | Separate memory per search |
| `include_awards` | off | Also return contract award notices (who won) |
| `max_items` | 100 | Stop after this many notices |
| `max_pages_per_source` | 20 | Safety limit, pages of 100 notices per source |

### Output example

```json
{
    "source": "uk-find-a-tender",
    "sourceName": "UK Find a Tender",
    "noticeId": "106389-2026",
    "ocid": "ocds-h6vhtk-07b7f5",
    "title": "Purchase & Installation of Multibeam Echosounder System",
    "description": "The Scottish Ministers, Marine Directorate invites tenders for the purchase and installation of replacement for the underwater components of a Teledyne Reson T50 multibeam system…",
    "buyerName": "Scottish Government",
    "buyerCountry": "GBR",
    "buyerCity": "Aberdeen",
    "noticeType": "tender",
    "status": "active",
    "mainCategory": "goods",
    "procurementMethod": "open",
    "cpvCodes": ["38114000", "38110000", "38000000"],
    "publishedAt": "2026-11-09T16:18:18Z",
    "deadline": "2026-12-09T12:00:00Z",
    "valueAmount": 120000,
    "currency": "GBP",
    "url": "https://www.find-tender.service.gov.uk/Notice/106389-2026",
    "scrapedAt": "2026-11-10T07:00:12.412Z"
}
```

### Use the tenders API with AI agents (MCP)

This Actor works as a tool for AI agents through the Apify MCP server (`https://mcp.apify.com`). Ask your agent,
for example: *"Find new UK and Irish IT tenders published in the last 2 days with a deadline after next week"*.
The input and output schemas are typed, so agents can call it without extra instructions.

### FAQ

**Is it legal to scrape public tenders?** Yes. This Actor reads official public data that the EU, the UK and the US
publish. TED data may be reused under the EU Publications Office's reuse policy, UK notice data is published under
the Open Government Licence, and SAM.gov data is US federal government information. It collects organisation-level facts only, never contact people.
Check the terms that apply to your own use of the data.

**What is the difference between Find a Tender and Contracts Finder?** Find a Tender (FTS) is the UK's main
service for higher-value public contracts. Contracts Finder lists lower-value UK contracts. Using both gives the
widest UK coverage. Since Brexit, UK tenders are no longer published on TED, so you need the UK sources and TED to
cover both the UK and the EU.

**What is SAM.gov?** SAM.gov is where US federal agencies publish contract opportunities. This Actor returns
solicitations, combined synopsis/solicitations, presolicitations and sources-sought notices that are still
active (and award notices if you turn them on). US notices use NAICS codes, not CPV, so filter them with keywords.

**What is TED?** Tenders Electronic Daily is the online version of the Supplement to the Official Journal of the
EU. Contracting authorities in EU and EEA countries publish their above-threshold tenders there.

**Which CPV code should I use?** Use the broad family code to catch everything below it. For example, `72000000`
covers all IT services, `45000000` all construction work, `90900000` cleaning services and `79000000` business
services. The Actor matches every sub-code of the code you give.

**Which notices do I get?** By default you get open calls for tenders and planned procurements (prior information
notices). Turn on *Include award notices* to also get contract awards (who won and for how much).

**Why are some TED titles not in English?** TED titles combine the country, the sector and the buyer's own title.
The buyer's part stays in its original language when TED has no English version.

**It stopped working or returns nothing.** The public APIs are sometimes slow or down for maintenance. The Actor
retries, and the run status tells you which source failed. If it keeps failing, open an issue on the Issues tab
and we will fix it.

**Can you add a country or a field?** Yes. Open an issue with the national portal or field you need.

### Changelog

See the Changelog tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/kratus/eu-uk-tenders-monitor/changelog.md

# Actor input Schema

## `sources` (type: `array`):

Which official sources to read: ted (EU Tenders Electronic Daily, 30+ countries), uk-find-a-tender (the UK's main service for higher-value contracts), uk-contracts-finder (lower-value UK contracts) and us-sam-gov (US federal contract opportunities from SAM.gov).

## `keywords` (type: `array`):

Keep only notices whose title, description or buyer contains at least one of these words (not case sensitive). Leave empty for all notices. TED titles are in English when TED provides an English title.

## `cpv_codes` (type: `array`):

Keep only notices in these CPV families, as 8-digit codes. 72000000 means all IT services, 45000000 all construction work. US SAM.gov notices have no CPV codes, so they are left out when this filter is set; use keywords for US notices. Leave empty for all sectors.

## `countries` (type: `array`):

Keep only buyers in these countries, as 3-letter ISO codes such as FRA, DEU, IRL, GBR or USA (UK and US are accepted too). Leave empty for all countries.

## `days_back` (type: `integer`):

How many days of notices to read, counted back from now. Use 1 or 2 for a daily schedule.

## `only_new` (type: `boolean`):

Remember the notices returned by earlier runs (with the same watchlist name) and return only new ones. You are not charged for notices you have already seen.

## `watchlist_name` (type: `string`):

Name for the memory used by watch mode. Use different names for different searches, for example it-ireland or construction-uk.

## `include_awards` (type: `boolean`):

Also return contract award notices (who won a contract). Off by default, so you get open calls for tenders and planned procurements. For SAM.gov this adds US award notices.

## `max_items` (type: `integer`):

Stop after this many notices. You pay per notice, so this also caps the cost of a run.

## `max_pages_per_source` (type: `integer`):

Safety limit: pages of 100 notices read from each source. Raise it when you use keywords or filters over many days.

## `delay_seconds` (type: `integer`):

Pause between pages of the same source, to stay polite to the public services.

## Actor input object example

```json
{
  "sources": [
    "ted",
    "uk-find-a-tender",
    "uk-contracts-finder",
    "us-sam-gov"
  ],
  "keywords": [
    "software"
  ],
  "cpv_codes": [],
  "countries": [],
  "days_back": 2,
  "only_new": false,
  "watchlist_name": "default",
  "include_awards": false,
  "max_items": 100,
  "max_pages_per_source": 20,
  "delay_seconds": 1
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sources": [
        "ted",
        "uk-find-a-tender",
        "uk-contracts-finder",
        "us-sam-gov"
    ],
    "keywords": [
        "software"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kratus/eu-uk-tenders-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sources": [
        "ted",
        "uk-find-a-tender",
        "uk-contracts-finder",
        "us-sam-gov",
    ],
    "keywords": ["software"],
}

# Run the Actor and wait for it to finish
run = client.actor("kratus/eu-uk-tenders-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sources": [
    "ted",
    "uk-find-a-tender",
    "uk-contracts-finder",
    "us-sam-gov"
  ],
  "keywords": [
    "software"
  ]
}' |
apify call kratus/eu-uk-tenders-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kratus/eu-uk-tenders-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/l8lS8VEeNnpNV1BqZ/builds/tKCg3Ds3Frwdd2nEW/openapi.json
