# France Contract Awards - BOAMP Attributions (`zkrobotics/boamp-attributions`) Actor

Who won which French public contract: buyer, winner, subject, department. Marchés publics attribués, veille concurrentielle.

- **URL**: https://apify.com/zkrobotics/boamp-attributions.md
- **Developed by:** [ZK Robotics](https://apify.com/zkrobotics) (community)
- **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 Contract Awards do?

**It tells you who won which French public contract, for how much and against how many bidders, including the national notices that other tools miss.**

In the official BOAMP data, award notices published in the national format leave the "winner" field **empty**: the winner is only written in the text ("le marché a été attribué à la société X pour un montant de..."). Tools that rely on that field miss these notices, which are mostly the **smaller contracts** that SMEs compete for. This Actor reads the text and extracts the winner, its SIRET, the amount, the lot and the number of bids.

Measured on real data in October 2026: **+28% more awards** found in one department over 30 days, and **+46% more contracts** found for one competitor over the year.

**FR :** qui a gagné quel marché public, pour combien, face à combien de concurrents. Le robot lit aussi le texte des avis nationaux (champ « titulaire » vide) : bien plus de marchés trouvés, surtout les petits.

### What you get for each award

| | Field | Example (real notice) |
|---|---|---|
| 📄 | `title`, `description` | Renouvellement urbain du quartier chemin bas d'Avignon. Travaux d'aménagement des espaces publics |
| 🏛️ | `buyer`, `buyerSiret` | Ville de Nîmes, 21300189401333 |
| 🏆 | `winners` | SA EUROVIA LR, BOUYGUES ENERGIE ET SERVICES, ... |
| 💶 | `awardedValue` | 1270896.12 (total, one amount per lot) |
| 🥊 | `bidsReceived` | number of bids, when published |
| 🧾 | `winnerDetails` | per lot: winner, SIRET, amount, number of bids |
| ✅ | `status` | awarded / unsuccessful / unknown |
| 🏷️ | `cpv`, `categories`, `departments` | 45111291, Voirie, 30 |
| 🔗 | `url` | official notice on boamp.fr |

`winnerDetails` of a real two-lot notice where the official winner field is empty (read from the text):

```json
[
  {"name": "Spie Building Solutions", "siret": null, "amount": 650000.0, "lot": "1", "bidsReceived": 2},
  {"name": "Spie Building Solutions", "siret": null, "amount": 450000.0, "lot": "2", "bidsReceived": 2}
]
```

All three formats published since 2020 are read: national notices (text), European eForms notices and the pre-2024 format. For multi-supplier framework agreements every supplier is listed, which is often more complete than the official winner field.

### Filters

- **Winner name** or **winner SIRET**: follow a competitor. The name is also searched in the text of national notices.
- **Keywords**, **departments**, **contract type**, **minimum amount**, **CPV prefixes**.
- **Only notices naming the winner** (on by default).
- **Only new notices**, for a scheduled weekly competitor report.

### How to use

1. Type a competitor's name, or choose a department and keywords, then click **Start**.
2. Export the table or connect it to your CRM or Google Sheets.
3. Schedule it weekly with **Only new notices** to receive only fresh awards.

### How much does it cost?

**$5 per 1,000 awards** returned (about $0.50 for 100), platform usage included.

### FAQ

**Is it legal?** Yes. BOAMP data is official open data under Licence Ouverte Etalab 2.0. Each row cites its source.

**Personal data?** Winners are listed as published in the official bulletin. Most are companies; a sole trader may appear under a trade name that contains a person's name. Buyer contact persons are never extracted.

**How reliable is the text reading?** On 400 real national notices, 96% were understood (winner found, or contract declared unsuccessful). The others contain no winner name.

**Other Actors by ZK Robotics:** *France Contract Renewal Radar* (contracts ending soon, with the incumbent), *France Tender Matcher* (open tenders that fit a company), *France Public Tenders*, *France Companies Leads*, *France Town Halls Contacts*.

### 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.

## `winnerName` (type: `string`):

Optionnel : suivre les marchés gagnés par un concurrent. Cherche aussi dans le texte des avis nationaux.

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

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

## `onlyWithWinner` (type: `boolean`):

Ne garder que les avis dont le gagnant est connu. Pour les avis nationaux, le gagnant est lu dans le texte de l'avis (le champ officiel est vide).

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

Montant attribué, ou estimé à défaut.

## `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.

## `winnerSiret` (type: `string`):

Optionnel : suivre un concurrent par son SIRET (14 chiffres).

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

Plafond pour maîtriser le coût.

## Actor input object example

```json
{
  "departments": [
    "59"
  ],
  "publishedSinceDays": 30,
  "onlyWithWinner": true,
  "includeUnknownValue": true,
  "onlyNew": false,
  "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 = {
    "departments": [
        "59"
    ]
};

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

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

```

## MCP server setup

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

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/sjWp8zKAuZpVo0Gy4/builds/tc2IM1NhsfuaZ0diN/openapi.json
