# France Public Tenders - BOAMP Appels d'offres (`zkrobotics/boamp-appels-offres`) Actor

Open French public tenders from the official BOAMP with estimated value, CPV, deadline and documents link, plus each buyer's 24-month track record: usual suppliers and likely competitors. Filters by keyword, department, value, CPV. Daily alerts without duplicates.

- **URL**: https://apify.com/zkrobotics/boamp-appels-offres.md
- **Developed by:** [ZK Robotics](https://apify.com/zkrobotics) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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

### What does France Public Tenders do?

**It collects open French public tenders from the official BOAMP and tells you, for each one, who the buyer usually works with.**

Every day, French public buyers (towns, regions, hospitals, universities, State agencies) publish hundreds of calls for tenders in the BOAMP. This Actor filters them by keyword, department, contract type, **estimated value** and **CPV code**, and adds what tender feeds usually do not give you: the **buyer's track record** over the last 24 months, its regular suppliers, and the **likely competitors** for this kind of purchase.

**FR :** appels d'offres publics en cours, filtrés par mots-clés, départements, montant estimé et code CPV, avec pour chaque avis l'historique de l'acheteur (ses fournisseurs habituels) et les concurrents probables.

### What you get for each tender

| | Field | Example (real notice, October 2026) |
|---|---|---|
| 📄 | `title`, `description` | Prestations globales de fabrication, d'agencement scénographique, d'éclairage et de signalétique... |
| 🏛️ | `buyer`, `buyerSiret`, `buyerCity` | SPL LE SEAQUARIUM, 33791211700047, LE GRAU DU ROI |
| 💶 | `estimatedValue` | 122000 (€ excl. VAT, when published) |
| 🏷️ | `cpv`, `categories`, `contractTypes` | 92521000, Equipement muséographique, SERVICES |
| ⏰ | `deadline`, `publishedAt` | 2026-10-28T12:00:00+00:00, 2026-10-06 |
| 📥 | `documentsUrl` | where to download the tender documents (DCE) |
| 🔎 | `buyerHistory` | buyer's awards over 24 months, top suppliers, likely competitors |
| 🔗 | `url` | official notice on boamp.fr |

`buyerHistory` for a real medical devices tender of the CHU de Lille:

```json
{
  "awardsLast24Months": 119,
  "medianAwardedValue": 600000,
  "lastAwardDate": "2026-10-06",
  "topSuppliers": [{"name": "COOK FRANCE", "contracts": 5}, {"name": "BOSTON SCIENTIFIC", "contracts": 4}],
  "similarAwards": 20,
  "likelyCompetitors": [{"name": "COOK FRANCE", "contracts": 5}, {"name": "MEDTRONIC FRANCE", "contracts": 4}]
}
```

`likelyCompetitors` are the companies that won this buyer's past contracts in the same CPV family as the tender. The history reads all award notice formats, including national ones where the winner is only written in the text, so small contracts are counted too.

### Filters

- **Keywords**, **departments**, **contract type** (works, services, supplies).
- **Estimated value** min / max, and whether to keep notices without a published value.
- **CPV code prefixes**, e.g. `4533` (heating and plumbing), `9091` (cleaning), `72` (IT).
- **Only new notices**: returns only what you have not received yet for the same filters. Schedule the Actor daily and you get a clean alert with no duplicates.
- **Buyer history** on or off.

### How to use

1. Set your filters (the form is prefilled with an example) and click **Start**.
2. Open the table, or export to Excel, CSV or JSON.
3. For a daily alert: turn on **Only new notices**, add a **Schedule**, and connect e-mail, Slack, Google Sheets or your CRM.

### How much does it cost?

**$5 per 1,000 tenders** returned (about $0.50 for 100), platform usage included. Runs that find nothing cost almost nothing. Apify's free plan includes $5 of monthly credit.

### FAQ

**Is it legal?** Yes. BOAMP data is official open data under Licence Ouverte Etalab 2.0, which allows commercial reuse with attribution. Each row cites its source.

**Personal data?** Contact persons named in notices are never extracted.

**How fresh?** The BOAMP is updated twice a day and the Actor reads it live.

**Other Actors by ZK Robotics:**

- *France Tender Matcher*: give a SIRET, get the open tenders that fit that company, scored and explained.
- *France Contract Renewal Radar*: public contracts ending in the coming months, with the incumbent.
- *France Contract Awards*: who won which contract, including national notices other tools miss.
- *France Companies Leads* and *France Town Halls Contacts* for prospecting.

**Missing a field or filter?** Open an issue on the Actor page.

### Source and licence

BOAMP - DILA, Licence Ouverte Etalab 2.0. Not affiliated with the French administration.

# Actor input Schema

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

Recherchés dans l'objet du marché (un seul suffit). Vide = tous.

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

Codes de départements, ex. 59, 62, 75, 2A.

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

Travaux, services ou fournitures. Vide = tous.

## `publishedSinceDays` (type: `integer`):

Ne garder que les avis publiés ces N derniers jours.

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

Exclut les avis dont la date limite de réponse est passée.

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

Ex. 50000.

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

Ex. 500000.

## `includeUnknownValue` (type: `boolean`):

Beaucoup d'avis ne publient pas de montant. Décochez pour ne garder que ceux qui en ont un.

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

Ex. 4531 (installations électriques), 9091 (nettoyage), 72 (informatique). Vide = tous.

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

Ne renvoie que les avis jamais renvoyés lors d'un précédent lancement avec les mêmes filtres. Idéal avec un lancement programmé chaque jour.

## `includeBuyerHistory` (type: `boolean`):

Pour chaque avis : marchés attribués par cet acheteur sur 24 mois, ses principaux fournisseurs et les concurrents probables pour ce type d'achat (même famille CPV).

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

Plafond pour maîtriser le coût.

## Actor input object example

```json
{
  "keywords": [
    "électricité"
  ],
  "departments": [
    "59"
  ],
  "publishedSinceDays": 7,
  "onlyOpen": true,
  "includeUnknownValue": true,
  "onlyNew": false,
  "includeBuyerHistory": true,
  "maxItems": 500
}
```

# Actor output Schema

## `results` (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": [
        "électricité"
    ],
    "departments": [
        "59"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("zkrobotics/boamp-appels-offres").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": ["électricité"],
    "departments": ["59"],
}

# Run the Actor and wait for it to finish
run = client.actor("zkrobotics/boamp-appels-offres").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": [
    "électricité"
  ],
  "departments": [
    "59"
  ]
}' |
apify call zkrobotics/boamp-appels-offres --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zkrobotics/boamp-appels-offres"
        }
    }
}
```

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/mwsgD2rOq230YzcJv/builds/P3qslfBeekS8bJM2c/openapi.json
