# EU & UK Public Tenders: TED, Find a Tender, Contracts Finder (`opendata-feeds/eu-uk-tenders`) Actor

Government tenders and contract awards from TED (EU public procurement), UK Find a Tender and UK Contracts Finder, from their official open-data APIs, in one clean schema. Filter by keyword, country, CPV code, value and notice type; only-new mode for daily alerts. $3 per 1,000 notices.

- **URL**: https://apify.com/opendata-feeds/eu-uk-tenders.md
- **Developed by:** [OpenData Feeds](https://apify.com/opendata-feeds) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 notice delivereds

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: TED, Find a Tender and Contracts Finder in one feed

Government tenders and contract awards from **TED** (Tenders Electronic Daily, the EU's public procurement journal), the **UK Find a Tender** service and **UK Contracts Finder**, in **one clean schema**. Filter by keyword, buyer country, CPV code, value and notice type, and get only the notices you haven't seen yet.

- **3 official sources in one Actor.** All EU/EEA public procurement notices published on TED, plus UK notices above and below threshold (Find a Tender, the UK's central platform since the Procurement Act 2023), plus the below-threshold notices still published on Contracts Finder.
- **Official open-data APIs only.** No HTML scraping, no browser, no proxies, no login, so runs are fast and don't break when a website changes.
- **One schema for all three:** title, buyer organisation, buyer country, CPV codes, notice type, procedure, estimated value and currency, awarded value, published date, submission deadline, link to the official notice, short description.
- **Only-new mode for tender alerts.** Schedule it daily and it returns (and charges for) only notices it hasn't delivered before.
- **No personal data.** Contact persons, emails and phone numbers are never output.
- **$3 per 1,000 notices.** You pay only for notices delivered. Notices removed by your filters, duplicates and already-seen notices cost nothing.

#### Who uses it

- **Bid and tender consultants** watching EU and UK government tenders for their clients.
- **B2G sales teams** looking for public sector opportunities in their CPV codes and countries.
- **Market analysts** tracking contract awards, buyers and values by sector.
- **Tender alert services and newsletters** that need one normalized feed instead of three APIs.

#### Input

| Field | What it does |
|---|---|
| `sources` | `ted` (EU), `uk-fts` (Find a Tender), `uk-contracts-finder` (Contracts Finder). Default: all three. |
| `keywords` | Keep notices matching any keyword. A multi-word keyword needs all its words (`cloud hosting`). TED searches the full notice text; UK notices are matched on title, description and buyer. |
| `countries` | Buyer countries as ISO codes (`DE`, `FR`, `PL` or `DEU`). Applies to TED; UK sources run only if empty or if it includes `GB`. |
| `cpvCodes` | CPV codes or prefixes, sub-codes included: `72000000` (or `72`) = IT services, `45000000` = construction work. |
| `noticeTypes` | `competition` (calls for tender, the default), `result` (contract awards), `planning` (prior information, pipeline), `change` (corrections, updates, cancellations). |
| `publishedWithinDays` | Notices published in the last N days (1 to 90, default 7). |
| `minValue` / `maxValue` | Estimated (or awarded) value range, in the notice's own currency. Notices without a published value are dropped when set. |
| `language` | Language for TED's multilingual fields when the notice has it (default English, else the original language). |
| `includeDescription` | Short description, up to 1,000 characters (on by default). |
| `onlyNew` + `stateKey` | Return only notices not delivered by an earlier run of the same monitor. |
| `maxItems` / `maxItemsPerSource` | Stop after this many notices in total / per source. 0 = no limit. |

Example: IT tenders over €100,000 from Germany, France and the UK in the last two weeks, new ones only:

```json
{
  "sources": ["ted", "uk-fts", "uk-contracts-finder"],
  "keywords": ["software"],
  "countries": ["DE", "FR", "GB"],
  "cpvCodes": ["72000000"],
  "minValue": 100000,
  "noticeTypes": ["competition"],
  "publishedWithinDays": 14,
  "onlyNew": true,
  "stateKey": "it-tenders-de-fr-uk"
}
```

#### Output

One item per notice. Example (fictional buyer):

```json
{
  "source": "ted",
  "noticeId": "700123-2026",
  "title": "Framework agreement for cloud hosting and managed IT services",
  "summaryTitle": "Germany – IT services: consulting, software development, Internet and support – Framework agreement for cloud hosting and managed IT services",
  "buyer": "Example Municipality",
  "buyerCountry": "DE",
  "cpvCodes": ["72000000", "72400000"],
  "noticeType": "competition",
  "noticeTypeDetail": "cn-standard",
  "contractType": "services",
  "procedure": "open",
  "estimatedValue": 2400000,
  "currency": "EUR",
  "awardedValue": null,
  "publishedDate": "2026-10-28",
  "deadline": "2026-12-01T10:00:00+01:00",
  "url": "https://ted.europa.eu/en/notice/-/detail/700123-2026",
  "description": "Example Municipality is procuring a four-year framework agreement for hosting, operation and support of its business applications...",
  "fetchedAt": "2026-10-30T08:00:00.000Z"
}
```

A UK item has the same fields: `source` is `uk-fts` or `uk-contracts-finder`, `noticeTypeDetail` is the Find a Tender notice code (for example `UK4` for a tender notice) or the OCDS release tag, `summaryTitle` is `null`, and `url` links to the notice on Find a Tender or Contracts Finder.

- `estimatedValue` is the procedure value when published, else the sum of the lots when they share a currency; UK values are net of VAT when the source gives both.
- `awardedValue` is filled for contract awards (`result`).
- `deadline` is the earliest tender submission deadline.

Export as JSON, CSV, Excel or HTML, or call it from the API, Make, Zapier, n8n or an AI agent (MCP). The `SUMMARY` record shows per source how many notices were fetched, matched, skipped as already seen, and delivered, plus any source that failed (`sourceErrors`). If one source is down, the others still deliver and the run still succeeds.

#### Pricing

**Pay per event: $0.003 per notice delivered ($3 per 1,000 notices).**

| You run | You pay |
|---|---|
| A one-off search returning 200 notices | $0.60 |
| Daily alert, only-new, ≈ 30 new matching notices a day | ≈ $0.09 a day, ≈ $2.70 a month |
| Weekly snapshot of all EU IT-services calls for tender (≈ 800 notices) | $2.40 per week |

Set **Maximum cost per run** in the run options to cap spend. The Actor stops cleanly at your limit and says so in the log and in `SUMMARY.stoppedAtSpendingLimit`. Apify's free plan includes $5 of monthly usage, enough for about 1,600 notices.

#### Limits

- TED returns at most 15,000 notices per search: narrow the filters or the date range for more.
- The UK APIs have no keyword or CPV search, so the Actor reads every UK notice in your date range and filters it. Long ranges take longer (about one minute per week of Find a Tender notices); you are charged only for notices delivered.
- Value filters compare amounts in each notice's own currency; there is no currency conversion.
- Descriptions are short (1,000 characters). Follow `url` for the full official notice and tender documents.
- The Actor does not output awarded suppliers' names or any contact details.

#### Sources and licences

| Source | What it covers | Licence and attribution |
|---|---|---|
| **TED API v3** (api.ted.europa.eu, anonymous search) | Notices published in the Supplement to the Official Journal of the EU (S series): EU/EEA public procurement above EU thresholds | "© European Union, https://ted.europa.eu". Reuse is authorised under the Commission's reuse policy (Decision 2011/833/EU): "the procurement notices published in the Supplement to the Official Journal of the European Union can be freely reused, for commercial or non-commercial purposes." TED's editorial content is CC BY 4.0. This Actor changes the data: it normalizes fields, translates codes, shortens descriptions and removes contact details. Only the notices published in the Official Journal are authentic. |
| **Find a Tender OCDS API** (find-tender.service.gov.uk) | UK public procurement notices: all new procurements from 24 February 2025, and above-threshold notices before that | "Contains public sector information licensed under the Open Government Licence v3.0." Crown copyright. |
| **Contracts Finder OCDS API** (contractsfinder.service.gov.uk) | UK (England and non-devolved) below-threshold notices: the official place for procurements started before 24 February 2025; some buyers still publish new notices there | "Contains public sector information licensed under the Open Government Licence v3.0." Crown copyright. |

This Actor is not affiliated with or endorsed by the Publications Office of the European Union, the Cabinet Office or Crown Commercial Service. The sources give no guarantee of accuracy or completeness; check the official notice before you bid.

#### Personal data

Notices sometimes name a contact person or give a direct email or phone number. This Actor never reads the sources' contact fields into its output, and it removes email addresses, phone numbers and names next to contact phrases ("contact person:", "Ansprechpartner:", "Mr ...") from titles and descriptions. Buyer organisation names are kept.

#### FAQ

**Why are some UK notices on both Find a Tender and Contracts Finder?** Some older procurements were published on both. When you select both sources, a Contracts Finder notice with the same buyer and title as a Find a Tender notice in the same run is skipped and not charged.

**Why is `estimatedValue` empty?** The buyer didn't publish a value, or the lots use different currencies.

**Why is the title not in English?** `title` is the notice's original title. For TED, `summaryTitle` gives TED's own translated title (country, CPV category and the original title) in the language you choose.

**Something broke or a filter doesn't work as you expect?** Open an issue on the Issues tab with your input. Issues are answered within 24 hours.

# Actor input Schema

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

TED = EU public procurement (Official Journal S, all EU/EEA countries). Find a Tender = UK notices, above and below threshold since 24 Feb 2025. Contracts Finder = UK (England) below-threshold notices still published there.

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

Keep notices matching any keyword. A keyword with several words needs all of them ("cloud hosting"). TED searches the full notice text in every language; UK notices are matched on title, description and buyer. Empty keeps all.

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

ISO country codes of the buyer (DE, FR, PL, ... or DEU, FRA). Applies to TED. UK sources run only if this is empty or includes GB.

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

CPV codes or prefixes; sub-codes are included. 72000000 (or 72) = all IT services, 45000000 = construction work. Empty keeps all.

## `noticeTypes` (type: `array`):

competition = calls for tender (open opportunities); result = contract awards; planning = prior information and pipeline notices; change = corrections, updates, modifications and cancellations.

## `publishedWithinDays` (type: `integer`):

Notices published in the last N days (1 to 90).

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

Keep notices whose estimated (or awarded) value is at least this, in the notice's own currency. Notices with no published value are dropped when a value filter is set.

## `maxValue` (type: `integer`):

Keep notices whose estimated (or awarded) value is at most this, in the notice's own currency.

## `language` (type: `string`):

TED fields come in the notice's languages. Pick the one you want when a notice has it; otherwise English, then the original language.

## `includeDescription` (type: `boolean`):

Up to 1,000 characters, with email addresses, phone numbers and named contacts removed.

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

For scheduled runs: remember delivered notice IDs and return (and charge) only new notices.

## `stateKey` (type: `string`):

Name for the only-new memory, so different schedules keep separate lists.

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

Stop after this many notices across all sources. 0 = no limit (use the run's maximum-cost setting to cap spend).

## `maxItemsPerSource` (type: `integer`):

0 = no limit per source.

## Actor input object example

```json
{
  "sources": [
    "ted",
    "uk-fts",
    "uk-contracts-finder"
  ],
  "keywords": [
    "software"
  ],
  "countries": [],
  "cpvCodes": [],
  "noticeTypes": [
    "competition"
  ],
  "publishedWithinDays": 7,
  "language": "eng",
  "includeDescription": true,
  "onlyNew": false,
  "stateKey": "default",
  "maxItems": 1000,
  "maxItemsPerSource": 0
}
```

# Actor output Schema

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

Tender notices, one item per charged event, in the default dataset.

## `summary` (type: `string`):

Counts for the run (found, delivered, skipped, errors, spending-limit stop) in the SUMMARY record.

# 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("opendata-feeds/eu-uk-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("opendata-feeds/eu-uk-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 opendata-feeds/eu-uk-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,opendata-feeds/eu-uk-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/dGZFfmAuFmnfqte9a/builds/vU11Z3uENBmcYw6sh/openapi.json
