# Public Tenders – EU TED & UK Find a Tender Procurement (`ram1eal/public-tenders-search`) Actor

Search public tenders and contract notices from EU TED and UK Find a Tender in one clean English dataset: buyer, value, deadline, CPV codes, documents. Daily alerts for new tenders. Pay per notice.

- **URL**: https://apify.com/ram1eal/public-tenders-search.md
- **Developed by:** [Hiếu Trần Quang](https://apify.com/ram1eal) (community)
- **Categories:** Business, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Public Tenders – EU TED & UK Find a Tender Procurement

Find **open public tenders** and **contract awards** from the **EU's Tenders Electronic Daily (TED)** – all EU/EEA countries – and the **UK's Find a Tender** service in one clean **English** schema. Built for **B2B sales teams, bid writers, procurement consultants and AI agents** who need daily tender alerts.

**Try it free:** a test with 50 tenders costs about $0.21 – covered by the $5 monthly credit of the free Apify plan. After that, **$4 per 1,000 notices**, no subscription.

### Why this one

- **EU + UK in one schema.** One search covers 30+ countries; every notice has the same English fields.
- **English-ready.** Official English CPV category names, English title prefix for every EU notice, values converted to **EUR and USD**.
- **Built for daily alerts.** "Only new or changed notices" mode: schedule it daily and pay only for what's new.
- **Clean sourcing.** Official open procurement APIs only. No contact persons, e-mails or phone numbers.
- **Pay only for results.** Notices filtered out by your criteria are free.

### Compared with alternatives

|                 | This Actor                              | Typical alternatives |
| --------------- | --------------------------------------- | -------------------- |
| Sources         | EU TED + UK Find a Tender               | One portal           |
| Language        | English labels for CPV codes and fields | Original language    |
| Daily alerts    | Only new notices, already-seen are free | Full re-scrape       |
| Contact persons | Removed from texts                      | Often included       |

### What you get

- Title (English + original language), description, buyer name and city, country
- CPV codes with official English labels, contract nature (services / supplies / works), procedure type
- Publication date and **submission deadline**
- Estimated value (or awarded value) with currency, **EUR and USD**
- Link to the official notice

### Sample output

```json
{
  "id": "TED-704142-2026",
  "source": "ted.europa.eu",
  "noticeType": "tender",
  "title": "Germany – Financial analysis and accounting software package – Beschafft werden soll eine cloudbasierte Software-as-a-Service (SaaS)-Lösung …",
  "language": "deu",
  "buyerName": "Hochschule RheinMain, Die Präsidentin",
  "buyerCity": "Wiesbaden",
  "country": "DE",
  "cpvMain": "48440000",
  "cpvMainLabel": "Financial analysis and accounting software package",
  "contractNature": "supplies",
  "procedureType": "Open procedure",
  "publishedAt": "2026-10-14",
  "deadline": "2026-11-17",
  "url": "https://ted.europa.eu/en/notice/-/detail/704142-2026"
}
```

### How to use

1. Type what you sell (e.g. "software", "cleaning services") – or leave it empty and use the filters.
2. Pick countries (e.g. DE, FR, GB) and optionally CPV categories (e.g. 72000000 for IT services).
3. Click Start. Export to JSON, CSV or Excel – or schedule it daily with "Only new or changed notices".

### Use cases

- **Daily tender alerts** for your sector and countries, straight to Google Sheets, Slack or your CRM.
- **Market intelligence:** who buys what, and for how much, across Europe.
- **Competitor tracking:** contract awards in your category.
- **AI agents:** "Find open IT tenders in Germany closing after 1 December" via the Apify MCP server.

### Pricing

Pay per notice, platform usage included:

| Apify plan | Per 1,000 notices | Per run |
| ---------- | ----------------- | ------- |
| Free       | $4.00             | $0.005  |
| Starter    | $3.70             | $0.005  |
| Scale      | $3.30             | $0.005  |
| Business   | $2.80             | $0.005  |

Notices that don't match your filters, and unchanged notices in only-new mode, are free. Example: a daily alert returning 20 new tenders costs about $0.09.

### Cost examples

- 100 tenders: $0.40
- Daily alert for one sector (≈ 50 new notices): ≈ $0.20 per day

### Use it from code, n8n or AI agents

Run it from the Apify API, the Python or JavaScript client, n8n, Make or Zapier – or let an AI agent call it through the **Apify MCP server** (Claude, ChatGPT, Cursor).

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("ram1eal/public-tenders-search").call(run_input={"searchQuery":"software","maxItems":20})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

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

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client
  .actor('ram1eal/public-tenders-search')
  .call({ searchQuery: 'software', maxItems: 20 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**MCP:** add `ram1eal/public-tenders-search` to the Apify MCP server and ask in plain English – the agent fills the input and pays per result.

### Data sourcing & compliance

- EU: [TED API](https://docs.ted.europa.eu/api/latest/index.html) – reuse authorised by Commission Decision 2011/833/EU.
- UK: [Find a Tender](https://www.find-tender.service.gov.uk) OCDS API – Open Government Licence v3.0.
- Contact persons are never collected; e-mails and phone numbers inside descriptions are redacted.

### FAQ

- **Are titles fully translated?** EU titles start with an official English prefix (country – category) followed by the original title. Descriptions stay in the original language.
- **Why is the value sometimes missing?** Many buyers do not publish an estimated value.
- **Which UK tenders are covered?** Find a Tender (higher-value UK procurement). Contracts Finder (lower-value England) is planned.
- **What if something breaks?** Open an issue – typical response under 12 hours.

### More tools from this author

- [SAM.gov & USAspending – US Federal Contracts & Awards](https://apify.com/ram1eal/us-federal-contracts) – new US federal contract awards and SAM.gov opportunities
- [Companies House API & Company Registry – UK, France, LEI](https://apify.com/ram1eal/company-registry-search) – UK Companies House, France SIRENE & LEI search with a KYB risk score
- [Contact Info Scraper – Company Emails, Phones & Socials](https://apify.com/ram1eal/company-contact-finder) – company e-mails, phones and social profiles, GDPR-safe
- [WHOIS Lookup & Domain Checker – Age, DNS, Email, SSL](https://apify.com/ram1eal/domain-intelligence) – bulk WHOIS: domain age, DNS, email provider, SSL and risk
- [Shopify Scraper – Products, Prices, Stock & Price Monitor](https://apify.com/ram1eal/shopify-store-products) – any Shopify store: products, prices, stock, price-drop alerts
- [Tech Stack Detector – BuiltWith & Wappalyzer Alternative](https://apify.com/ram1eal/website-tech-stack) – 3,500+ technologies per website, plus the email provider
- [Impressum Scraper – German Company Data, HRB & VAT Check](https://apify.com/ram1eal/company-imprint) – German/Austrian/Swiss company data from the Impressum, VAT checked
- [SEC EDGAR API – Company Financials, 10-K Data & Filings](https://apify.com/ram1eal/sec-company-financials) – SEC EDGAR financials and 10-K/10-Q/8-K filings by ticker
- [Startup Funding Rounds – Crunchbase Alternative (SEC Form D)](https://apify.com/ram1eal/startup-funding-rounds) – US startups raising money, daily from SEC Form D

### Need custom data?

Need more countries (US SAM.gov, Australia, Latin America) or a custom feed? Open an issue describing what you need.

### Input reference

| Field            | Type    | Default      | Description                                               |
| ---------------- | ------- | ------------ | --------------------------------------------------------- |
| `searchQuery`    | string  | –            | Keyword (EU full-text search; UK title/description match) |
| `countries`      | array   | all          | ISO codes, e.g. `DE`, `FR`, `GB`                          |
| `cpvCodes`       | array   | –            | CPV codes or prefixes; sub-categories included            |
| `noticeType`     | string  | open         | `open`, `awards` or `all`                                 |
| `maxItems`       | integer | 100          | Maximum notices to return                                 |
| `onlyNew`        | boolean | false        | Only notices new or changed since the previous run        |
| `publishedSince` | date    | 7 days ago   | Published on/after                                        |
| `deadlineAfter`  | date    | today (open) | Submission deadline on/after                              |
| `minValueEur`    | integer | –            | Minimum value in EUR                                      |
| `sources`        | array   | both         | `eu`, `uk`                                                |
| `stateKey`       | string  | –            | History name for only-new mode                            |

### Changelog

- 0.1 – EU TED + UK Find a Tender, English CPV labels, EUR/USD values, only-new mode.

# Actor input Schema

## `searchQuery` (type: `string`):

What you sell or look for, e.g. "software", "cleaning services". Leave empty to use only the filters.

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

Two-letter country codes, e.g. DE, FR, GB. Empty = all EU/EEA countries and the UK.

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

CPV codes or prefixes, e.g. 72000000 (IT services) or 45 (construction work). Sub-categories are included.

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

Open calls for tender or awarded contracts.

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

Stop after this many notices. You pay per notice.

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

For daily alerts: return (and pay for) only notices new or changed since your previous run with the same search.

## `publishedSince` (type: `string`):

Only notices published on or after this date. Default: last 7 days.

## `deadlineAfter` (type: `string`):

Only tenders you can still bid on after this date. Default for open tenders: today.

## `minValueEur` (type: `integer`):

Only notices with an estimated value at least this high (converted to EUR). Notices without a value are excluded when set.

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

Which official procurement portals to search.

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

Runs with the same history name share what was already delivered. Leave empty to use one history per search.

## Actor input object example

```json
{
  "searchQuery": "software",
  "countries": [
    "DE",
    "FR"
  ],
  "noticeType": "open",
  "maxItems": 20,
  "onlyNew": false,
  "sources": [
    "eu",
    "uk"
  ]
}
```

# Actor output Schema

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

One record per notice: English title, buyer, country, CPV category with English label, contract nature, procedure, publication date, submission deadline, estimated or awarded value with EUR and USD conversion, link to the official notice. No contact persons.

## `runSummary` (type: `string`):

JSON summary of the run: requests, notices delivered and charged, notices skipped as unchanged (only-new mode), why the run stopped and error counts.

# 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 = {
    "searchQuery": "software",
    "countries": [
        "DE",
        "FR"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("ram1eal/public-tenders-search").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 = {
    "searchQuery": "software",
    "countries": [
        "DE",
        "FR",
    ],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("ram1eal/public-tenders-search").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 '{
  "searchQuery": "software",
  "countries": [
    "DE",
    "FR"
  ],
  "maxItems": 20
}' |
apify call ram1eal/public-tenders-search --silent --output-dataset

```

## MCP server setup

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

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/sbdtoFHtjTQB8cxdg/builds/Wd849jbzEJne3SbFs/openapi.json
