# EU & UK Public Tenders Scraper (TED + Find a Tender) (`augmentedhuman/eu-public-tenders-scraper`) Actor

Find new public procurement tenders across the EU/EEA (TED) and the UK (Find a Tender) by keyword, CPV code, country or value. Deadlines, buyers, CPV, estimated value, winners, links. Official open-data APIs; only-new mode for daily tender alerts.

- **URL**: https://apify.com/augmentedhuman/eu-public-tenders-scraper.md
- **Developed by:** [Augmented Human](https://apify.com/augmentedhuman) (community)
- **Categories:** Business, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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 API for tender alerts and bid leads

**Find public procurement tenders across Europe and the UK in one run.** This Actor searches **TED (Tenders Electronic Daily)** – the EU Official Journal with every above-threshold tender from the 27 EU countries + EEA – and the **UK Find a Tender Service**, then returns clean, normalised tender data: title in your language, buyer, country, deadline, CPV codes, estimated value, procedure, winners, submission link and PDF.

Built and maintained by **Augmented Human**.

✅ Official open-data APIs only (no scraping of web pages) · ✅ No login, no API key · ✅ ~1,200 tenders in ~30 s · ✅ Only-new mode for daily **tender alerts** · ✅ No personal contact data · ✅ Ready for AI agents (MCP / API)

### What does this tender scraper do?

- 🔎 Searches by **keywords in any EU language** (`software`, `logiciel`, `Software`, `cybersécurité`…)
- 🏷️ Filters by **CPV codes** (prefix aware: `72000000` = all IT services, `45000000` = all construction), **buyer countries**, **minimum estimated value** and publication window
- 📢 Returns **open calls for tender** (bid now), **contract awards** (who won and for how much) or **prior information notices** (future pipeline)
- 🌍 Titles and descriptions in your **preferred language** (TED publishes in up to 24 languages)
- 🔔 **Only new notices since previous run** → schedule daily and push to Slack, e-mail, Google Sheets or your CRM
- 🤖 Structured JSON ideal for AI bid-qualification agents and RAG

### Use cases

- **SMEs, consultancies, IT & construction companies** looking for public contracts to bid on (public-sector lead generation)
- **Bid managers & tender-alert services** who need a reliable, low-cost EU + UK feed
- **Sales teams** selling to the public sector: who buys what, when, and from whom
- **Market intelligence**: track contract awards, winners and awarded values by CPV or country
- **Researchers & journalists** analysing public spending
- **AI agents** that qualify tenders against a company profile

### How to get tender alerts (step by step)

1. Click **Try for free**, enter keywords and/or CPV codes, choose countries.
2. Set **Published in the last N days** (e.g. 7) and **Notice type** = Open calls for tender.
3. Run, then export to Excel / CSV / JSON or connect via the API.
4. For alerts: enable **Only new notices**, set a **State key**, and schedule the Actor daily.

### Input example

```json
{
  "keywords": ["software", "logiciel", "cloud"],
  "countries": ["FR", "BE", "DE"],
  "cpvCodes": ["72000000", "48000000"],
  "noticeScope": "competition",
  "publishedWithinDays": 7,
  "onlyNewNotices": true,
  "stateKey": "it-tenders-fr-be-de"
}
```

### Output example

Real row from a test run (fields shortened):

```json
{
  "source": "TED",
  "noticeId": "700355-2026",
  "title": "Germany – Software package and information systems – RV VMWare Reseller Wettbewerb",
  "buyerName": "Dataport AöR", "buyerCity": "Altenholz", "buyerCountry": "DEU",
  "publishedAt": "2026-10-12", "deadline": "2026-10-16", "deadlineTime": "12:00:00+02:00",
  "noticeType": "cn-standard", "procedureType": "open", "contractNature": ["supplies"],
  "cpvCodes": ["48000000"],
  "estimatedValue": null, "currency": null,
  "durationValue": 4, "durationUnit": "YEAR",
  "winners": [],
  "submissionUrl": "https://fbhh-evergabe.web.hamburg.de/…",
  "url": "https://ted.europa.eu/en/notice/-/detail/700355-2026",
  "pdfUrl": "https://ted.europa.eu/en/notice/700355-2026/pdf",
  "isNew": true
}
```

Another notice from the same run shows a published value: `"estimatedValue": 103500000, "currency": "NOK"` (Alta kommune, electronic patient journal system).

### How much does it cost?

See the **Pricing** tab for the current price. The Actor only calls official APIs and is very light: a cloud test returned 316 tenders (TED 300, UK 16) in ~50 seconds using ~0.0034 compute units. With only-new mode, a daily alert for a typical niche returns just the handful of new notices each day.

### How an AI agent can call it

- **Apify MCP server**: add `augmentedhuman/eu-public-tenders-scraper` as a tool via `https://mcp.apify.com` in any MCP client (Claude, Cursor, ChatGPT connectors…). The agent passes keywords / CPV / countries and gets structured tenders back.
- **One HTTP call** (synchronous, returns the dataset):

```bash
curl -X POST "https://api.apify.com/v2/acts/augmentedhuman~eu-public-tenders-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"keywords":["cybersecurity"],"countries":["FR","DE"],"publishedWithinDays":7,"maxResults":100}'
```

- **Python**: `ApifyClient(token).actor("augmentedhuman/eu-public-tenders-scraper").call(run_input={...})`
- Works from Make, Zapier, n8n and LangChain through the standard Apify integrations.

### How does it compare to other tender tools?

Honest note: there are other TED scrapers in Apify Store, and commercial tender-alert platforms (with human-curated national and regional sources) cover far more below-threshold tenders. Choose this Actor if you want **TED + UK Find a Tender in one schema**, **CPV / value / country filters**, **only-new daily alerts**, and raw data you own and can pipe anywhere. It does **not** cover national below-threshold portals (e.g. France's BOAMP) – if you need those, combine it with a national source.

### Data sources & legal

- **TED** – Publications Office of the EU, Search API v3 (anonymous, free reuse; fair-use limits respected).
- **UK Find a Tender** – OCDS API, Open Government Licence v3.0.
- Contact-person names, e-mails and phone numbers are **never collected**.
- France's BOAMP below-threshold notices are not included (its API's robots.txt disallows bots); French above-threshold tenders are on TED.
  Not legal advice; check the licences for your use case.

### FAQ

**Why do some notices have no estimated value?** Buyers are not obliged to publish it; roughly half of TED notices include it.

**Can I get awarded contracts and winners?** Yes, set Notice type = Contract awards (`noticeScope: "result"`).

**Can I pass a raw TED expert query?** Yes, use *Extra TED expert query*.

**Which countries are covered?** All EU/EEA countries publishing on TED, plus the UK via Find a Tender.

**Issues?** Use the **Issues** tab – the Actor is health-checked daily.

# Actor input Schema

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

Full-text keywords. TED: matched in any language of the notice (add local terms: 'software', 'logiciel', 'Software'). UK: matched in title and description. Empty = all tenders.

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

TED covers all above-threshold public tenders in the EU/EEA (France, Germany, Spain, Italy, Poland...). Find a Tender is the UK's official portal (not on TED since Brexit).

## `noticeScope` (type: `string`):

'competition' = tenders you can still bid on. 'result' = who won (market intelligence).

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

Look-back window on publication date.

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

ISO country codes, 2 or 3 letters (FR, DE, BE, ES, IT, NL or FRA, DEU...). Empty = all countries.

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

Common Procurement Vocabulary codes (TED + UK). A code ending in zeros is a prefix: '72000000' = all IT services, '45000000' = all construction. Full codes match exactly.

## `minEstimatedValue` (type: `integer`):

Drop notices whose published estimated value (in the notice currency) is below this. Notices without a published value are dropped when set.

## `preferredLanguages` (type: `array`):

TED publishes titles in up to 24 EU languages. 3-letter codes in priority order (eng, fra, deu, spa, ita, nld, pol...).

## `tedExpertQuery` (type: `string`):

Optional clause appended with AND, using TED expert-search syntax, e.g. procedure-type=open.

## `onlyNewNotices` (type: `boolean`):

For scheduled daily tender alerts: output (and pay for) only notices you have not received before with the same State key.

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

Separate memory per watch-list when using 'Only new notices'.

## `maxResults` (type: `integer`):

Upper bound of notices per source (TED, UK) per run. The run also stops when your max cost per run is reached.

## Actor input object example

```json
{
  "keywords": [
    "software",
    "logiciel",
    "cloud",
    "cybersecurity"
  ],
  "sources": [
    "ted",
    "uk_fts"
  ],
  "noticeScope": "competition",
  "publishedWithinDays": 7,
  "countries": [],
  "cpvCodes": [],
  "preferredLanguages": [
    "eng",
    "fra",
    "deu",
    "spa",
    "ita"
  ],
  "onlyNewNotices": false,
  "stateKey": "default",
  "maxResults": 1000
}
```

# Actor output Schema

## `tenders` (type: `string`):

No description

## `stats` (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",
        "logiciel",
        "cloud",
        "cybersecurity"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("augmentedhuman/eu-public-tenders-scraper").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",
        "logiciel",
        "cloud",
        "cybersecurity",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("augmentedhuman/eu-public-tenders-scraper").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",
    "logiciel",
    "cloud",
    "cybersecurity"
  ]
}' |
apify call augmentedhuman/eu-public-tenders-scraper --silent --output-dataset

```

## MCP server setup

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

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/7bSYs6K32E80ooaqQ/builds/eRchCz3aR689JQcML/openapi.json
