# Open Tenders Daily – TED, BOAMP & UK Tenders (`shadow-tools/boamp-ted-open-tenders`) Actor

Monitor new public tenders from TED (EU), BOAMP (France) and UK portals: filters, open deadlines only, new-notices mode. Official sources, no personal data.

- **URL**: https://apify.com/shadow-tools/boamp-ted-open-tenders.md
- **Developed by:** [Shadow Tools](https://apify.com/shadow-tools) (community)
- **Categories:** Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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.

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

## Open Tenders Daily – TED, BOAMP & UK Tenders

> **Independent, unofficial tool, not affiliated with the EU, the Publications Office or the DILA** (full notice below).

Call this Actor to **list open public tenders (calls for tenders) in the EU, France and optionally the UK**, filtered by keywords, countries, CPV sector codes, French département, estimated value and publication period. Use it when an AI agent or a human needs "which tenders can we still answer about X", or, with award notice types, "who won which public contract". It does not return contact persons or award winners' personal data, and it is not a document or bid-submission tool. For past French awards with winner and amount use the *French Public Contract Awards (DECP)* Actor instead.
One call = one answer. Typical run: 5-30 s. Empty input returns the latest 20 open tenders per source of the last 2 days (the platform's default test run), so always send at least one filter for a useful answer.

#### Minimal input

| Goal | Minimal input | What comes back |
|---|---|---|
| Open tenders for a topic | `{"keywords": ["software"], "sinceDays": 7, "maxResults": 5}` | notices matching the words, newest first, from TED and BOAMP |
| One country, EU only | `{"sources": ["TED"], "countries": ["DEU"], "maxResults": 5}` | German buyers' open tenders |
| Who won contracts | `{"noticeTypes": ["can-standard"], "onlyOpen": false, "keywords": ["cloud"], "maxResults": 5}` | award notices (`noticeKind: "award"`) |
| Daily digest | `{"keywords": ["cloud"], "sinceDays": 2, "onlyNew": true}` | only notices not delivered before for these filters |

Short output (real record, 4 Nov 2026): `{"source": "TED", "publicationNumber": "739674-2026", "title": "Prestations de support de maintenance corrective et évolutive sur les produits SAP BO", "noticeKind": "call", "publicationDate": "2026-10-26", "deadline": "2026-11-30", "buyerName": "Conseil régional Auvergne-Rhône-Alpes", "buyerCountry": "FRA", "cpv": ["72261000"], "estimatedValue": 600000, "currency": "EUR", "url": "https://ted.europa.eu/fr/notice/-/detail/739674-2026"}` (full records below; every record also carries `attribution` and `extractedAt`).

#### For AI agents (MCP)

- **One call = one answer.** Default `maxResults` is 20 per source; keep it small and raise it only when the run SUMMARY says `capped: true`. Add translated keywords (`software`, `logiciel`) because notices are in many languages.
- **Errors fail fast** in the form `Field X invalid: expected Y, got Z, example W` (for example `Field countries invalid: expected a 3-letter country code (Code pays), got "FR", example ["FRA", "DEU", "BEL"].`). Fix that field and call again; no notice is charged.
- **0 results is not an error.** The run succeeds with an empty dataset and the key-value store record `SUMMARY` carries `note: "0 results: <reason / how to widen the search>"` (increase `sinceDays`, set `onlyOpen` to false, use more general keywords). The `note` also explains partial results (platform time limit, source error), the cost limit, and truncation (`maxResults reached`).
- **Sources can be skipped**: BOAMP is skipped with a CPV filter or `minEstimatedValue` (it has neither), UK when `countries` has no GBR; `SUMMARY.skipped` says so.
- **Pricing**: pay per delivered notice; set "Maximum cost per run" to cap spending.
- Notices are public-buyer data only (no personal contact data). Keep the `attribution` field if you redistribute results; always check the official notice (`url`) before answering a tender.

Monitor **new public tenders** from official sources: **TED** (Tenders Electronic Daily, the EU's public procurement journal), **BOAMP** (France's official bulletin, including contracts below the EU thresholds that TED does not cover) and, as an option, the **UK** government portals **Contracts Finder** and **Find a Tender**.

> **Independent, unofficial tool that uses the official APIs.** This is not an official application and is not affiliated with, endorsed by or operated by the European Union, the Publications Office, the DILA, the BOAMP or the UK Cabinet Office. It only retrieves the public data they publish through their official TED API and BOAMP open dataset. The stars in the icon only indicate the market whose public data this Actor retrieves.

No scraping of web pages: the Actor uses TED's official API, the BOAMP open dataset and the UK portals' open APIs, so results are stable. **No personal contact data** is collected (no contact persons, e-mails or phone numbers): only public buyers, subjects, dates and links. A small public buyer may itself be named after a person, as published in the official journal.

### Who uses it

- **Tender alerts and RFP monitoring:** get new calls for tenders matching your keywords or CPV codes every day, without checking three portals.
- **Bid and sales teams:** find public buyers and upcoming deadlines in your market (IT, consulting, training, engineering, supplies...).
- **Market intelligence:** follow award notices to see who wins which contracts, at what estimated value, in France, the EU and the UK.
- **Data pipelines:** feed a CRM, spreadsheet, dashboard or alerting tool through the Apify API, Schedules and Webhooks.

### What you get

- **Only tenders you can still answer.** By default: calls for tenders and design contests whose deadline is not passed (notices without a published deadline are kept). Award notices, modifications and prior-information notices are available as options.
- **Filters:** keywords, CPV codes, buyer country, French départements, publication period, estimated value (EUR), notice types.
- **"New notices only" mode:** schedule the Actor every day and receive only notices you have not received before for the same filters.
- **Same output for both sources** (`noticeKind`: `call`, `award`, `modification`…), with the keywords actually visible in the notice (`matchedKeywords`), a clean title, the buyer, dates, deadline, CPV, estimated value when published, and the link to the official notice.

### Quick start

1. Open the **Input** tab, pick your keywords and countries.
2. Click **Start**. Results appear in the **Dataset** (JSON, CSV, Excel, HTML table).
3. To get a daily digest, create a **Schedule** and enable **New notices only**.

Example input – open IT tenders in France and Belgium, daily:

```json
{
  "keywords": ["logiciel", "software", "cloud"],
  "countries": ["FRA", "BEL"],
  "sinceDays": 2,
  "onlyNew": true
}
```

Example input – open tenders above 500,000 EUR in the EU:

```json
{ "minEstimatedValue": 500000, "sinceDays": 7, "maxResults": 500 }
```

Example input – open UK tenders mentioning software or cloud (UK source is optional, not in the default sources):

```json
{ "sources": ["UK"], "keywords": ["software", "cloud"], "sinceDays": 7, "minEstimatedValue": 50000 }
```

Example input – French tenders in Paris and Lyon, BOAMP only:

```json
{ "sources": ["BOAMP"], "departments": ["75", "69"], "keywords": ["formation"], "sinceDays": 5 }
```

### How keywords work

- Several keywords are combined with **OR**: a notice matching any of them is returned.
- Singular/plural forms, upper/lower case and accents are largely handled by TED (checked on several words, not guaranteed for every word). A multi-word keyword is searched as an exact phrase.
- TED notices exist in several languages: add the equivalents (for example `logiciel`, `software`).
- **Where to search (TED):** "Full text" is broad (a word may appear only in the detail of the contract, and very common words such as *application* bring noise). "Title only" is precise. `matchedKeywords` tells you which keywords are visible in the title or description.
- **UK:** only open calls for tenders are covered (Contracts Finder contract notices and Find a Tender tender notices; the two portals publish different notices, no overlap seen). Keywords are matched in the title and description; `minEstimatedValue` is read in pounds (GBP) and notices without a published value are dropped; CPV filters work on the CPV codes the notices publish. The UK source is skipped if the countries filter does not include GBR, or if no "call for tenders" type is selected.
- At BOAMP the search always covers the subject of the contract. BOAMP has neither CPV codes nor amounts: with a CPV filter, a CPV exclusion or a minimum value, BOAMP is skipped (the run log says so).

### Output

One record per notice. Example (TED):

```json
{
  "source": "TED",
  "publicationNumber": "739674-2026",
  "title": "Prestations de support de maintenance corrective et évolutive sur les produits SAP BO",
  "cpvLabel": "Services d'assistance relative aux logiciels",
  "matchedKeywords": [
    "logiciel"
  ],
  "noticeType": "cn-standard",
  "noticeKind": "call",
  "contractNature": "services",
  "publicationDate": "2026-10-26",
  "deadline": "2026-11-30",
  "buyerName": "Conseil régional Auvergne-Rhône-Alpes",
  "buyerCountry": "FRA",
  "cpv": [
    "72261000"
  ],
  "estimatedValue": 600000,
  "currency": "EUR",
  "description": "Prestations de support de maintenance corrective et évolutive sur les produits SAP BO - Lot unique",
  "url": "https://ted.europa.eu/fr/notice/-/detail/739674-2026",
  "attribution": "Source: TED – Publications Office of the European Union (ted.europa.eu), © European Union, reused under Commission Decision 2011/833/EU. Data extracted on 2026-11-04.",
  "extractedAt": "2026-11-04T14:59:32.877Z"
}
```

Example (BOAMP):

```json
{
  "source": "BOAMP",
  "publicationNumber": "BOAMP-26-106511",
  "title": "EQUIPEMENTS DE PROTECTION INCENDIE (EXTINCTEURS, ROBINETS D'INCENDIE ARMES, PLANS D'EVACUATION…) : ACQUISITION, RENOUVELEMENT, MAINTENANCE ET VERIFICATION",
  "noticeType": "Avis de marché",
  "noticeKind": "call",
  "contractNature": "services",
  "publicationDate": "2026-11-04",
  "deadline": "2026-12-04",
  "buyerName": "Ville de La Rochelle",
  "buyerCountry": "FRA",
  "cpv": [],
  "matchedKeywords": [
    "maintenance"
  ],
  "estimatedValue": null,
  "currency": null,
  "description": null,
  "departments": [
    "17"
  ],
  "descriptors": [
    "Extincteur",
    "Maintenance",
    "Matériel de secours et d'incendie",
    "Sécurité incendie"
  ],
  "procedure": "Procédure Ouverte",
  "url": "https://www.boamp.fr/pages/avis/?q=idweb:26-106511",
  "attribution": "Source: DILA – BOAMP (boamp.fr), Licence Ouverte 2.0. Data extracted on 2026-11-04.",
  "extractedAt": "2026-11-04T15:00:09.213Z"
}
```

Not every notice publishes an estimated value or a deadline: those fields are then `null`. BOAMP notices carry no description text (the source does not provide one): use `title`, `descriptors` and the official link.

### Pricing and cost control

You pay per **delivered notice** (see the *Pricing* tab). Set **Maximum cost per run** to cap what a run can spend: the Actor never delivers more notices than your limit allows, and with "New notices only" the remaining ones stay new for your next run. If a run is about to hit the platform time limit, it stops searching and delivers what it already has (the log and the `SUMMARY` record say so).

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/actors/Shadow-Tools~boamp-ted-open-tenders/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"keywords":["software"],"countries":["DEU"],"maxResults":50}'
```

Use Apify **Schedules** and **Webhooks** to trigger your own workflows after each run.

### Sources, licences and disclaimer

- **TED** – Publications Office of the European Union. Published notices can be reused freely, including commercially (Commission Decision 2011/833/EU), with credit to the European Union.
- **BOAMP** – DILA, open dataset under the **Licence Ouverte 2.0** (credit to the source and the extraction date).
- **UK** – Contracts Finder and Find a Tender, Cabinet Office. *Contains public sector information licensed under the Open Government Licence v3.0.* Buyer contact details present in the source are never collected.
- Every record carries its attribution in the `attribution` field: keep it if you redistribute the data.
- This is an **independent, unofficial service**, not affiliated with the DILA, the European Union or the UK Cabinet Office. Data is provided without any guarantee of accuracy or completeness: **always check the official notice** before answering a tender.

### Support

Questions, bugs or ideas: please open an **Issue** on this Actor's page. Replies come in English or French. Include your input (without secrets) and the run link so the problem can be reproduced.

### Privacy / GDPR by design

This Actor is deliberately built **not** to return personal data about natural persons (contact names, e-mails or phone numbers of individuals). This is a design choice made to respect the GDPR.

- No contact fields are requested or read: TED is queried without the contact name / e-mail / phone fields, BOAMP and the UK portals' contact and party details are ignored. Only the buyer organisation name is kept.
- E-mail addresses and phone numbers that appear in the free-text `title` and `description` are replaced by `[e-mail removed]` / `[phone removed]`.
- Not guaranteed: free text can still mention a person's name (for example a named contact in a title), and a buyer can be a small body named after a person. The masking is pattern-based and may miss unusual formats. You remain responsible for your own use of the data.
- The Actor stores nothing about you beyond your run's own dataset and logs on Apify.

### Limits

- TED limits request rates; the Actor retries automatically. Very large requests may return partial results (stated in the log).
- `maxResults` applies per source (up to 5,000). If more notices match, the log shows the total announced so you can raise the limit.

### En français

Veille des appels d'offres publics européens (TED) et français (BOAMP, y compris sous les seuils européens). Outil non officiel qui utilise les API officielles (TED, BOAMP), sans contact personnel collecté. Par défaut : uniquement les marchés encore ouverts. Mots-clés combinés en OU, filtres par pays, département, CPV, montant, mode « nouveaux avis seulement » pour une veille quotidienne. Service indépendant, non officiel, sans lien avec l'Union européenne ni la DILA : consultez toujours l'avis officiel.

# Actor input Schema

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

Which portals to query. TED = European Union notices (contracts above the EU thresholds). BOAMP = France, including contracts below the thresholds. UK = Contracts Finder and Find a Tender (open tenders only; off by default). Example: \["TED"] for the EU only. BOAMP is skipped when a CPV filter or a minimum value is used (it has neither), or when countries do not include FRA; UK is skipped when countries do not include GBR.

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

List of words or phrases, a notice must contain any of them (OR), e.g. \["software", "logiciel", "cloud"]. A multi-word keyword is searched as an exact phrase; case, accents and plurals are largely handled. Notices exist in several languages, so add the translations. Maximum 20 keywords. Empty = no keyword filter.

## `keywordScope` (type: `string`):

Where TED looks for the keywords. "fulltext" (default, broad) also matches words that appear only in the contract details; "title" (precise) needs the word in the notice title, use it for common words such as "application". BOAMP always searches the subject of the contract. Example: "title".

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

List of eForms notice type codes, e.g. \["cn-standard"]. Default = notices you can still answer (calls for tenders, design contests); add award notices (can-standard, can-social) to follow who won contracts (competitor monitoring). BOAMP maps contract notices, awards, modifications, prior information and ex ante transparency; other types are ignored there.

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

Buyer countries as a list of 3-letter ISO codes, e.g. \["FRA", "DEU", "BEL", "ESP", "ITA", "POL", "GBR"]. Maximum 30 codes. Empty = all countries.

## `departments` (type: `array`):

French département codes as a list (BOAMP only), e.g. \["75", "69", "2A", "971"]: 2 or 3 digits, or 2A/2B for Corsica. Maximum 30. Empty = all of France.

## `cpvPrefixes` (type: `array`):

List of CPV code prefixes (2 to 8 digits), e.g. \["72", "48"] where 72 = IT services, 48 = software, 79 = business services. Maximum 30. Not available at BOAMP (it is then skipped). Empty = all sectors.

## `excludedCpvPrefixes` (type: `array`):

Optional list of CPV prefixes (2 to 8 digits) to exclude, e.g. \["45", "70", "71"] where 45 = construction, 70 = real estate, 71 = architecture and engineering. Maximum 30. Empty by default: no sector excluded.

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

Minimum estimated contract value as an integer amount, e.g. 500000 (EUR for TED; pounds, GBP, for UK). 0 = no filter. With a value, notices published without an amount in that currency are dropped and BOAMP (no amounts) is skipped.

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

true (default) drops notices whose response deadlines have all passed; notices without a published deadline are kept. Set false to include closed tenders (use it together with award notice types).

## `sinceDays` (type: `integer`):

Look back this many days from today, integer 1 to 90, e.g. 7. Keep it small (2 to 7) for fast runs; with onlyNew, 2 is enough for a daily schedule.

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

true = return only notices never delivered before for these same filters (ideal for a daily schedule; state kept between runs). false (default) = return everything matching, which is what a one-off or agent call wants.

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

Maximum notices returned per source, integer 1 to 5000, e.g. 20. Default 20; raise it only when the SUMMARY note says results were capped. A "Maximum cost per run" limit applies to the total across sources.

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

Preferred language of titles and descriptions when a notice exists in several languages; 3-letter code, one of the listed values, e.g. "ENG" (falls back to English).

## Actor input object example

```json
{
  "sources": [
    "TED",
    "BOAMP"
  ],
  "keywords": [
    "software",
    "logiciel"
  ],
  "keywordScope": "fulltext",
  "noticeTypes": [
    "cn-standard",
    "can-standard"
  ],
  "countries": [
    "FRA",
    "BEL"
  ],
  "departments": [
    "75",
    "69"
  ],
  "cpvPrefixes": [
    "72",
    "48"
  ],
  "excludedCpvPrefixes": [
    "45",
    "71"
  ],
  "minEstimatedValue": 500000,
  "onlyOpen": true,
  "sinceDays": 7,
  "onlyNew": false,
  "maxResults": 20,
  "language": "ENG"
}
```

# Actor output Schema

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

Matching notices with buyer, deadline, value, CPV codes and link to the official notice.

## `dataset` (type: `string`):

Every field of every notice, downloadable as JSON, CSV or Excel.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("shadow-tools/boamp-ted-open-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("shadow-tools/boamp-ted-open-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 '{}' |
apify call shadow-tools/boamp-ted-open-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shadow-tools/boamp-ted-open-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/31bNf7ChM41TNE5cV/builds/1VuiU2GJ5uJksdhuG/openapi.json
