# EU Public Tenders Scraper: TED, BOAMP, Procurement & Awards (`euroscrape/eu-public-tenders`) Actor

Scrape public tenders and contract awards from all of Europe (TED), plus French national tenders (BOAMP) and awarded contracts (DECP). Deadlines, values in €, buyer contacts, winners per lot with bids received, official company data and daily alerts.

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

## Pricing

from $2.10 / 1,000 open tender delivereds

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

## EU Public Tenders Scraper: TED, BOAMP, Procurement & Awards

**Find public contracts to bid on anywhere in Europe, and see who wins them.** One Actor searches the official EU journal (TED, all countries), French national tenders (BOAMP) and all French awarded contracts (DECP), with the same clean fields everywhere:

- 📢 **Open tenders**: deadline and days left, estimated value in €, buyer and contact email, category, lots, links to the documents and to submit.
- 🏆 **Contract awards**: **who won each lot, for how much, and against how many bids**, with the winners' size, city, national ID and contact.
- 🇫🇷 **France in depth**: small national tenders (MAPA, below EU thresholds) and every awarded contract from 40,000 €, with official company data for French winners (activity, headcount, creation date).
- 🔔 **Daily alerts**: schedule it with a monitor name and get only new notices, on Telegram, Discord, Slack or a webhook.
- 📊 **Free summary**: value per country and category, top buyers, top winners, average bids per lot and share of single-bid lots.

| Source | Coverage | Mode |
|---|---|---|
| **TED** (Tenders Electronic Daily) | All EU countries + Norway, Iceland, Liechtenstein, Switzerland and candidate countries, above EU thresholds | Tenders & awards |
| **BOAMP** | France, national tenders below EU thresholds (EU-level French notices come from TED, without duplicates) | Tenders |
| **DECP** | France, all contracts awarded from 40,000 € (published by the buyers) | Awards |

### ✨ Why this Actor

| | |
|---|---|
| 🌍 **One search, all of Europe** | TED and the French national sources in one dataset, with the same fields, values in euros and one summary. |
| 🗣️ **Search in English, find every language** | Keywords are matched against the official category of each notice in 8 languages, so `software` also finds *Softwarepflege*, *oprogramowanie* or *logiciel* tenders. Notices that only mention your keyword in passing are removed. |
| 🏆 **Winners per lot, not just a name** | Each award is read from the official eForms data of the notice: result of every lot, winning company or consortium, value and number of bids received. |
| 🏢 **Company data for French winners** | Legal name, SIRET, activity code and label, headcount and creation date from the official French business register, free. DECP winners get a name even though the source only gives a number. |
| 🎯 **Clean data** | Placeholder values (0, 1, −1 €) removed, earliest deadline across lots, deadline type (tenders or requests to participate), CPV labels in 8 languages, values converted with the ECB daily rates. |
| 🔒 **Privacy-aware** | Only service mailboxes are kept (e.g. `vergabestelle@…`, `marches@…`). Personal addresses like firstname.lastname@ are removed. |
| 💸 **Fair price** | You pay per notice delivered. The summary is free. |

### 🎯 Use cases

- **Bid managers and SMEs**: every new tender in your field and region, with the deadline, the value and the documents link, every morning.
- **Sales and business development**: companies that just won public contracts need suppliers, subcontractors, staff and financing. Each award gives you the winner, the amount and a contact.
- **Competitive intelligence**: who wins in your category, at what price, against how many bids, and which buyers use which suppliers.
- **Consultants, journalists and researchers**: single-bid contracts, SME share, top suppliers per buyer or per country.

### 🚀 Examples

**IT tenders in Germany and Austria above 100,000 €, at least 10 days before the deadline:**

```json
{
  "mode": "tenders",
  "cpvCodes": ["72", "48"],
  "countries": ["DE", "AT"],
  "minValueEur": 100000,
  "minDaysToDeadline": 10,
  "sortBy": "deadline"
}
```

**Daily Telegram alert for cleaning tenders around Lyon (schedule the Actor every morning):**

```json
{
  "mode": "tenders",
  "keywords": ["nettoyage", "propreté", "cleaning"],
  "frenchDepartments": ["69", "01", "38"],
  "publishedWithinDays": 3,
  "monitorName": "cleaning-lyon",
  "telegramBotToken": "123456:ABC…",
  "telegramChatId": "123456789"
}
```

**Who wins medical supply contracts in Poland, and at what price:**

```json
{ "mode": "awards", "cpvCodes": ["33"], "countries": ["PL"], "publishedWithinDays": 30, "maxItems": 500 }
```

### 📦 Output

**An open tender** (real data, 30 Sept 2026):

```json
{
  "type": "tender",
  "source": "TED",
  "noticeId": "673192-2026",
  "url": "https://ted.europa.eu/en/notice/-/detail/673192-2026",
  "publishedAt": "2026-09-30",
  "country": "DE",
  "buyerName": "Entwicklungsverbund SolumSTAR der Länder …",
  "buyerCity": "München",
  "buyerEmail": "vergabestelle@olg-m.bayern.de",
  "title": "Pflege, Weiterentwicklung und Support der Individualsoftware SolumSTAR und SolumWEB",
  "language": "de",
  "contractType": "services",
  "procedureType": "Negotiated with call",
  "mainCpv": "72250000",
  "mainCpvLabel": "System and support services",
  "estimatedValueEur": 31019070,
  "deadline": "2026-10-29T11:00:00.000Z",
  "deadlineType": "requests_to_participate",
  "daysLeft": 28,
  "isFrameworkAgreement": true,
  "documentsUrl": "https://www.evergabe.bayern.de/…",
  "publicationLevel": "EU"
}
```

**A contract award** (real data, 30 Sept 2026, shortened: 10 winners, 18 lots):

```json
{
  "type": "award",
  "source": "TED",
  "noticeId": "673800-2026",
  "country": "PL",
  "buyerName": "Wojskowy Instytut Medyczny - Państwowy Instytut Badawczy",
  "title": "Dostawa produktów leczniczych i wyrobów medycznych do Wojskowego Instytutu Medycznego - PIB.",
  "mainCpvLabel": "Antineoplastic agents",
  "awardedValue": 5721673,
  "awardedCurrency": "PLN",
  "awardedValueEur": 1309607,
  "contractSignedOn": "2026-09-22",
  "winnersCount": 10,
  "winners": [
    { "name": "Urtica Sp. z o.o.", "nationalId": "NIP: 8942556799", "city": "Wrocław", "size": "large", "email": "przetargi@urtica.pl", "lotsWon": 4, "awardedValue": 4093120, "currency": "PLN", "awardedValueEur": 936855.12 },
    { "name": "Centrala Farmaceutyczna Cefarm S.A.", "nationalId": "NIP: 5250004220", "city": "Warszawa", "size": "large", "email": "przetargi@cefarm.com.pl", "lotsWon": 5, "awardedValue": 1072500, "currency": "PLN", "awardedValueEur": 245479.51 },
    "…"
  ],
  "lots": [
    { "lotId": "LOT-0068", "title": "Pakiet Nr 23.4", "status": "awarded", "bidsReceived": 1, "winners": ["InPharm Sp. z o.o."], "awardedValue": 7800, "currency": "PLN", "contractSignedOn": "2026-09-22" },
    { "lotId": "LOT-0069", "title": "Pakiet Nr 23.5", "status": "awarded", "bidsReceived": 4, "winners": ["Centrala Farmaceutyczna Cefarm S.A."], "awardedValue": 113000, "currency": "PLN", "contractSignedOn": "2026-09-22" },
    "…"
  ]
}
```

**The free summary** (awards in 5 countries, 60 notices):

```json
{
  "type": "summary",
  "mode": "awards",
  "notices": 60,
  "totalValueEur": 141090802,
  "distinctWinners": 179,
  "competition": { "lotsWithBidCount": 211, "averageBidsPerLot": 2, "singleBidLotsPct": 57 },
  "smeWinnersPct": 63,
  "topWinnersByValue": ["…"],
  "byCountry": ["…"],
  "topCategories": ["…"],
  "topBuyers": ["…"]
}
```

The dataset has three ready-made views: **Notices**, **Open tenders** and **Winners** (one row per winning company).

### 🧮 Data and method

- **TED**: official search API of the EU Publications Office. Award results come from the official eForms data of each notice (lot results, tenders, winning parties, amounts, bids received).
- **BOAMP** and **DECP**: official French open data (DILA, Ministry of Economy). EU-level French notices are taken from TED only, so there are no duplicates.
- **Company data**: French business register (INSEE/INPI "Recherche d'entreprises" API) for French winners and DECP buyers.
- **Categories**: CPV 2008 labels from the EU Publications Office. **Currencies**: European Central Bank reference rates of the day.
- **Freshness**: TED and BOAMP publish new notices every working day. DECP contract data is published by the buyers after signature, usually within days.

### 💰 Pricing

Pay per event:

| Event | Price |
|---|---|
| Run start | $0.003 |
| Open tender delivered | $0.003 (**$3 per 1,000 tenders**) |
| Contract award delivered (winners per lot, bids, company data) | $0.005 |
| Summary | free |

Apify subscribers pay less: −10% (Starter), −20% (Scale), −30% (Business).

Example: a daily monitor that returns about 20 new tenders costs about $0.06 a day. Set a **maximum cost per run** in the run options and the Actor stops cleanly when it's reached.

### ❓ FAQ

**Why do I get fewer French results with English keywords?** BOAMP and DECP notices are written in French and only have a French title. Add French keywords (e.g. `logiciel`, `nettoyage`, `travaux`) or use CPV codes, which work in every language.

**Why doesn't a tender show an estimated value?** Many buyers don't publish it. Keep `includeWithoutValue` on to receive them anyway, or turn it off to receive only notices with a value in your range.

**What does `deadlineType: requests_to_participate` mean?** In restricted and negotiated procedures you first ask to take part; the deadline shown is for that request.

**Does it cover the United Kingdom?** Only the UK notices still published on TED. UK-wide tenders are published on the UK government's own services since 2021.

**How does monitoring work?** Set a `monitorName` and schedule the Actor (for example every morning with `publishedWithinDays: 3`). The first run saves the current notices as a baseline and doesn't send alerts. Each next run returns only notices not seen before and sends up to `maxNotifications` alerts.

**Is it legal?** The Actor only reads official open data published for re-use (TED, BOAMP, DECP, French business register) at a moderate pace, and removes personal email addresses. You are responsible for how you use the data under the GDPR.

### ⭐ Your feedback

If this Actor saves you time, a short review on Apify Store helps other users find it. Missing a field, a country or a filter? Say it in your review: the most requested features are added first.

### 🔗 More from EuroScrape

- [France Real Estate Sold Prices (DVF): €/m², Sales & Trends](https://apify.com/euroscrape/france-property-prices): every property sale registered by the French State — real prices, €/m², addresses, GPS, market trends per city and alerts on new sales.
- [EU VAT Number Validator (VIES): Bulk Check, Proof & Alerts](https://apify.com/euroscrape/vat-validator): validate VAT numbers in bulk against the EU's official registry, with consultation proof for tax audits and alerts when a customer's number becomes invalid.
- [EU Second-Hand Marketplaces Scraper: Vinted, OLX & More](https://apify.com/euroscrape/eu-marketplace-deals): one search on the top second-hand marketplace of 18 European countries, prices in €, cheapest country and resale margin.
- [French Companies Scraper (SIRENE)](https://apify.com/euroscrape/france-companies): every French company by activity, area and size, with verified websites and emails.
- [UK Companies House Scraper](https://apify.com/euroscrape/uk-companies): UK companies by SIC code and location, with directors, websites and emails.
- [Website Tech Stack Detector: 280+ Technologies, Leads & Signals](https://apify.com/euroscrape/website-intelligence): 280+ technologies, company identity, contacts and sales signals for any website.
- [Impressum & Legal Notice Scraper (EU)](https://apify.com/euroscrape/company-identity): legal identity, registry numbers and VAT IDs from any website, registry-verified.
- [Kleinanzeigen Scraper: Deal Finder & Price-Drop Alerts](https://apify.com/euroscrape/kleinanzeigen-scraper): German classifieds with view counts, full seller details and instant alerts.
- [Google Hotels Scraper: Prices from Every Booking Site](https://apify.com/euroscrape/google-hotels-prices): hotel prices for any destination and dates, with the price on every booking site, rate parity, price calendars and alerts.
- [App Store Reviews Scraper + Google Play Reviews](https://apify.com/euroscrape/app-reviews): reviews from both stores in 58 countries, rating by version and country, alerts on new negative reviews.
- [Google Flights Scraper: Cheapest Dates, Prices & Price History](https://apify.com/euroscrape/google-flights-prices): flight prices for any route and dates, cheapest day to fly, typical price range, CO2 and price-drop alerts.
- [Vinted Scraper: 26 Countries, Deals, Alerts & Seller Data](https://apify.com/euroscrape/vinted-scraper): search Vinted across 26 countries, prices with buyer fees, seller ratings, cheapest-country comparison and instant alerts on new listings.

# Actor input Schema

## `mode` (type: `string`):

<b>Open tenders</b>: calls for tender you can still bid on (deadline, estimated value, buyer contact, documents link). <b>Contract awards</b>: who won which contract, for how much and against how many bids (winners with company details).

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

Words or phrases searched in the title, description, lots and official category of each notice. English keywords also find notices in other languages through their official category (e.g. "software" finds German, Polish or Spanish software tenders). For French national notices (BOAMP, DECP), add French keywords too (e.g. "logiciel"). Leave empty to get everything matching the other filters.

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

Official EU procurement categories, as codes or prefixes: "72" = IT services, "48" = software packages, "45" = construction work, "79" = business services, "90" = cleaning & environment, "33" = medical equipment, "71" = architecture & engineering. The most reliable filter across languages.

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

Countries of the buyer (2-letter codes). Leave empty for all of Europe (EU, EEA, Switzerland and candidate countries).

## `frenchDepartments` (type: `array`):

France only: department numbers, e.g. "69", "75", "2A", "974". Selecting departments limits the search to France.

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

Notices published in the last N days. For daily monitoring, 2 or 3 days is enough.

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

Optional: exact start date (YYYY-MM-DD). Overrides "Published in the last (days)".

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

Optional: end date (YYYY-MM-DD).

## `contractTypes` (type: `array`):

Leave empty for all.

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

Estimated value (tenders) or awarded value (awards), converted to euros.

## `maxValueEur` (type: `integer`):

Estimated value (tenders) or awarded value (awards), converted to euros.

## `includeWithoutValue` (type: `boolean`):

Many buyers do not publish the estimated value. Uncheck to keep only notices with a value in your range.

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

Open tenders mode: skip calls whose deadline has passed.

## `minDaysToDeadline` (type: `integer`):

Open tenders mode: skip calls closing sooner than this (time to prepare a bid).

## `buyerKeywords` (type: `array`):

Keep only notices whose buyer name contains one of these words (e.g. "hospital", "university", "Stadt").

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

TED = all EU-level tenders and awards (all countries). BOAMP = French national tenders below EU thresholds. DECP = all French contracts awarded from 40,000 €.

## `onlyWithWinners` (type: `boolean`):

Contract awards mode: skip notices where no contract was awarded (procedure closed, lots not awarded).

## `enrichWinners` (type: `boolean`):

From the French business register (free): legal name, activity (NAF), headcount, creation date, SIRET.

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

Language of the CPV category labels and of the TED links. Titles and descriptions stay in their original language.

## `sortBy` (type: `string`):

Order of the notices in the dataset.

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

Maximum number of notices in the dataset (you pay per notice).

## `includeSummary` (type: `boolean`):

One extra free item: notices and value per country and category, top buyers and, for awards, top winners, average bids per lot and share of single-bid lots.

## `monitorName` (type: `string`):

Set a name and schedule the Actor (e.g. daily): each run then returns only notices not seen before and can alert you. The first run saves the current notices as a baseline.

## `telegramBotToken` (type: `string`):

Alerts on Telegram: create a bot with @BotFather and paste its token.

## `telegramChatId` (type: `string`):

Your chat ID (send a message to your bot, then open api.telegram.org/bot<token>/getUpdates).

## `discordWebhookUrl` (type: `string`):

Alerts in a Discord channel: Channel settings → Integrations → Webhooks.

## `slackWebhookUrl` (type: `string`):

Alerts in Slack: create an Incoming Webhook for your channel.

## `webhookUrl` (type: `string`):

Receives one POST per run with all new notices (Make, Zapier, n8n, your CRM…).

## `maxNotifications` (type: `integer`):

Maximum number of alert messages per run (the webhook always receives all new notices in one POST).

## Actor input object example

```json
{
  "mode": "tenders",
  "keywords": [
    "software"
  ],
  "publishedWithinDays": 7,
  "includeWithoutValue": true,
  "onlyOpen": true,
  "minDaysToDeadline": 0,
  "sources": [
    "ted",
    "boamp",
    "decp"
  ],
  "onlyWithWinners": true,
  "enrichWinners": true,
  "language": "en",
  "sortBy": "newest",
  "maxItems": 50,
  "includeSummary": true,
  "maxNotifications": 30
}
```

# Actor output Schema

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

Tenders and awards with value, deadline and winners.

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

Open calls with buyer contact, deadline and documents link.

## `winners` (type: `string`):

One row per winning company, with value and contact.

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

Counters for this run (items found, output, errors).

# 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"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("euroscrape/eu-public-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"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("euroscrape/eu-public-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"
  ],
  "maxItems": 50
}' |
apify call euroscrape/eu-public-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,euroscrape/eu-public-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/gkDh59236cXcOkmJh/builds/daxsCXoP6RGcfLiFd/openapi.json
