# EU & UK Public Tenders Scraper - TED & Find a Tender (`cazadores/government-tenders`) Actor

Search public procurement tenders and contract awards from TED (EU), UK Find a Tender and Contracts Finder in one clean format. Filter by keyword, CPV code, country, value and deadline. Official open data, no API key. Ideal for daily tender alerts.

- **URL**: https://apify.com/cazadores/government-tenders.md
- **Developed by:** [Juan Manuel D'Amico](https://apify.com/cazadores) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 procurement 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

## EU & UK Public Tenders Scraper — TED, Find a Tender & Contracts Finder

Find **public procurement opportunities and contract awards** from the three official European and UK databases in **one clean, normalized format**:

| Source | Coverage |
|---|---|
| **TED — Tenders Electronic Daily** | All EU/EEA tenders above EU thresholds (~1,700 new open tenders every working day) |
| **UK Find a Tender** | UK tenders above threshold |
| **UK Contracts Finder** | UK lower-value contracts |

- ✅ **Official open data** via the public APIs, no API key, no login
- ✅ **One format for all sources**: title, buyer, country, CPV codes, value, deadline, submission link, winners
- ✅ **Filters**: keywords, CPV codes, countries, minimum value, only tenders still open
- ✅ **Built for alerts**: leave the dates empty and schedule it daily or weekly — you get every **new** notice exactly once (already-delivered notices are skipped, so you never pay twice)
- ✅ **Pay per notice**, nothing else

### Who is it for?

- **Companies that bid for public contracts** — get every relevant new tender every morning (in Slack, email, Google Sheets or your CRM via Apify integrations)
- **Bid consultants and tender alert services** — one feed for the EU and UK instead of three portals
- **Sales teams** — find public buyers who are purchasing what you sell
- **Market & competitor intelligence** — award notices show who won which contracts and for how much
- **AI agents** — a simple, well-described input that works through the Apify MCP server or API

### Input

| Field | Description | Default |
|---|---|---|
| `noticeType` | `tenders` (opportunities), `awards` (who won) or `all` | `tenders` |
| `keywords` | Any of these words/phrases in title or description. TED notices are in the buyer's language — add translations (`software`, `Software`, `logiciel`) | — |
| `cpvCodes` | CPV category codes, hierarchical: `72` = all IT services, `45` = construction, `33` = medical equipment | — |
| `countries` | 2-letter buyer country codes: `DE`, `FR`, `ES`, `GB`… | all |
| `publishedFrom` / `publishedTo` | Publication date range, `YYYY-MM-DD` (max 366 days) | last 7 days |
| `onlyNew` | Skip notices already delivered by a previous run of the same search | on without dates, off with a date range |
| `onlyOpen` | Skip tenders whose deadline already passed | `true` |
| `minValue` | Minimum estimated/awarded value (in the notice's currency) | — |
| `sources` | `ted`, `uk-find-a-tender`, `uk-contracts-finder` | all |
| `maxItems` | Maximum notices returned (you pay per notice) | `1000` |

#### Examples

**Daily IT tender alert for Germany, France and the UK** (schedule it every morning):

```json
{ "keywords": ["software", "cloud", "IT services"], "cpvCodes": ["72", "48"], "countries": ["DE", "FR", "GB"] }
```

**All open construction tenders over €1M published this month:**

```json
{ "cpvCodes": ["45"], "minValue": 1000000, "publishedFrom": "2026-09-01", "publishedTo": "2026-09-30" }
```

**Who won UK contracts last week** (competitor intelligence):

```json
{ "noticeType": "awards", "countries": ["GB"], "publishedFrom": "2026-09-19", "publishedTo": "2026-09-25" }
```

### Output

One record per notice, same fields for every source:

```json
{
  "source": "Find a Tender (UK)",
  "noticeId": "091204-2026",
  "noticeType": "tender",
  "title": "H&C1025 Sexual Health Services",
  "description": "Sexual health needs in the East Riding are shaped by…",
  "buyerName": "East Riding of Yorkshire Council",
  "buyerCountry": "GB",
  "buyerCity": "Beverley",
  "cpvCodes": ["85000000", "85140000", "85141000"],
  "mainCpv": "85000000",
  "contractType": "services",
  "procedureType": "Open procedure",
  "value": 8400000,
  "currency": "GBP",
  "publishedAt": "2026-09-25",
  "deadline": "2026-10-26T12:00:00Z",
  "submissionUrl": "https://uk.eu-supply.com/app/rfq/rwlentrance_s.asp?PID=109271&B=UK",
  "documentsUrl": null,
  "winners": [],
  "winnerCountries": [],
  "language": "en",
  "url": "https://www.find-tender.service.gov.uk/Notice/091204-2026",
  "license": "Contains public sector information licensed under the Open Government Licence v3.0.",
  "ocid": "ocds-h6vhtk-077b05",
  "scrapedAt": "2026-09-27T01:48:58.440Z"
}
```

Award notices fill `winners` (company names) and `value` with the awarded amount. Export as JSON, CSV, Excel or connect to Slack, Google Sheets, email and more with Apify integrations.

### Pricing

Pay per notice returned. A focused daily alert (a few CPV codes and countries) typically returns a few dozen notices per day, so it costs a few cents per day. Use filters and `maxItems` to control cost.

### Data sources and licences

- **TED** — © European Union, Publications Office of the EU. Reuse (including commercial) authorised under Commission Decision 2011/833/EU, with source acknowledgement.
- **Find a Tender** and **Contracts Finder** — contain public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).

Every record includes a `license` field with the attribution required by its source. The actor does not copy personal contact details (names, emails or phone numbers of officials) from the notices.

### FAQ

**Why are some values or deadlines empty?** Buyers don't always publish an estimated value or a deadline. The actor never invents them. With `minValue` set, notices without a value are skipped.

**Are titles in English?** UK notices are in English. TED titles come in English when TED provides a translation (format "Country – Category – original title"); descriptions are in the buyer's language.

**How do daily alerts avoid duplicates?** With `onlyNew` (default), the actor remembers which notices it already delivered for the same search (in a key-value store of *your* Apify account) and skips them. The default 7-day window means weekends and holidays never leave gaps.

**What about weekends?** TED publishes Monday to Friday; UK sources publish a few notices on weekends. Thanks to the 7-day window and `onlyNew`, a Monday run simply returns what's new since your last run.

**How do I find CPV codes?** Use the [official CPV list](https://simap.ted.europa.eu/cpv). Shorter codes cover more: `72` matches every IT service code.

**Can I get more countries?** More official sources are on the roadmap. Open an issue with the countries you need.

# Actor input Schema

## `noticeType` (type: `string`):

'tenders' = open calls for tender (contract opportunities you can bid on). 'awards' = contract award notices (who won, for how much). 'all' = both.

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

Optional. Returns notices containing ANY of these words or phrases, in title or description (e.g. 'software', 'cloud hosting', 'road maintenance'). TED notices are in the buyer's language, so add translations for wider coverage (e.g. 'Software', 'logiciel').

## `cpvCodes` (type: `array`):

Optional. EU procurement category codes. Codes are hierarchical: '72000000' or '72' matches all IT services, '45' all construction work, '33' medical equipment. Returns notices with ANY matching code.

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

Optional. 2-letter country codes of the buying authority, e.g. DE, FR, ES, IT, PL, GB. TED covers the EU/EEA; the UK sources cover GB. Leave empty for all.

## `publishedFrom` (type: `string`):

First publication date to include, YYYY-MM-DD. Leave both dates empty for the last 7 days: combined with 'Only new notices', a daily or weekly schedule gets every notice exactly once, even after weekends and holidays.

## `publishedTo` (type: `string`):

Last publication date to include (inclusive), YYYY-MM-DD. Leave empty for today. Max range: 366 days.

## `onlyOpen` (type: `boolean`):

If true (default), skips tenders whose submission deadline has already passed. Tenders without a published deadline are kept. Doesn't affect awards.

## `onlyNew` (type: `boolean`):

Skip notices already returned by a previous run of the same search, so you never pay twice for the same notice (the list is kept in your own Apify account). Default: ON when both dates are empty (alert mode), OFF when you set a date range. Set it explicitly to override.

## `minValue` (type: `integer`):

Optional. Only notices with an estimated (tenders) or awarded (awards) value of at least this amount, in the notice's own currency. Notices without a published value are excluded when this is set.

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

Which official databases to search. Default: all three.

## `maxItems` (type: `integer`):

Maximum number of notices to return in total. You are charged per notice returned. TED alone publishes about 1,700 open tenders per working day, so use filters or this limit to control cost.

## Actor input object example

```json
{
  "noticeType": "tenders",
  "keywords": [
    "software"
  ],
  "onlyOpen": true,
  "sources": [
    "ted",
    "uk-find-a-tender",
    "uk-contracts-finder"
  ],
  "maxItems": 1000
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `allFields` (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 = {
    "keywords": [
        "software"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cazadores/government-tenders").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 = { "keywords": ["software"] }

# Run the Actor and wait for it to finish
run = client.actor("cazadores/government-tenders").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 '{
  "keywords": [
    "software"
  ]
}' |
apify call cazadores/government-tenders --silent --output-dataset

```

## MCP server setup

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

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/saRsbMpbZx8w2xb9u/builds/EwbrBeYMoRNCAj7sb/openapi.json
