# French & EU Public Tenders + Contract Award Winners (`geckostar/marches-publics-france-ue`) Actor

Daily public tenders and contract awards from BOAMP (France, all values) and TED (EU): buyer, CPV, deadline, estimated value, and for awards the amount and winning companies with verified SIREN. Filter by keywords, CPV, French département, country. $5 per 1,000 notices.

- **URL**: https://apify.com/geckostar/marches-publics-france-ue.md
- **Developed by:** [Gecko Lab](https://apify.com/geckostar) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 notice founds

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

## French & EU Public Tenders: notices and contract awards (BOAMP + TED)

Public tenders and contract award notices from BOAMP (France, all amounts) and TED (European Union, above EU
thresholds), filtered by keywords, CPV codes, French departments and buyer countries. On TED award notices, winning
French companies are named under their official name, with SIREN and SIRET checked in the Sirene register; schedule a
daily run to get alerts. For bid teams, business developers and market analysts.
**Price: $0.005 per notice saved ($5 per 1,000); notices read and filtered out are free.**

For each notice: subject, buyer, CPV codes, place, procedure, response deadline, estimated value. For each result:
awarded amount and, on TED, the **winning companies**. No language model.

### Sources (public, no key needed)

| Source | Used for | Rate used |
|---|---|---|
| BOAMP, `boamp` dataset (DILA, `boamp-datadila.opendatasoft.com`, Licence Ouverte 2.0) | contract notices and award results, day by day | 5 requests/s at most |
| TED, Search API v3 (Publications Office of the EU, `api.ted.europa.eu`) | contract notices (competition) and award notices (result) | 2 requests/s at most |
| Recherche d'entreprises API (`recherche-entreprises.api.gouv.fr`, Licence Ouverte 2.0) | check of French winners identified by a SIRET | 5 requests/s at most |

Sources: BOAMP (DILA), Licence Ouverte 2.0 (Etalab); TED (© European Union, re-use authorised, Decision
2011/833/EU); Recherche d'entreprises API (DINUM, INSEE data). Each row gives its source and access date
(`mention_source`, `consulte_le`). Any re-use must keep this notice.

### Winners and personal data

Published winners are **verified companies**. The tool never copies buyers' contact details (names, e-mails,
phones), a winner declared or identified as a natural person, a street address, or a winner name typed by the buyer.

- **TED**: a winner is only named if it is identified by a French SIREN, SIRET or VAT number and the Sirene register
  confirms it as a company open to diffusion. It is then published under its **official name** (Sirene register), with
  its SIREN and SIRET. Masked and only counted (`titulaires_masques`, `motifs_masquage`): sole traders, companies with
  restricted diffusion (that opted out of the publication of their data), invalid French identifiers, winners without
  an identifier, those who objected, and any winner whose check failed. A **foreign** winner (non-French identifier, or
  identifier from a contract awarded outside France) is kept with its name as published on TED and its national
  identifier, without address or contact.
- **BOAMP**: winners have no identifier there and therefore cannot be checked. No name is published: only their
  number (`nombre_titulaires`) and the awarded amount; see the official notice (`titulaires_non_publies`).

A result may still contain personal data published by the buyer: a company whose name includes its director's name, a
foreign winner trading under their own name, or a name cited in the subject or description of a notice.

- Controller for the tool: the publisher named in the legal notice. Legal basis: legitimate interest (GDPR art.
  6(1)(f)) in making public procurement known from its official publications.
- Retention: the publisher keeps no results. Data is read on each run and stored only in the user's Apify account.
  The run log contains no SIRET and no winner name.
- Your rights: any data subject may object to appearing in the results or exercise their rights of access and
  erasure by writing to the contact address, with the SIREN or, failing that, the exact name and the identifier shown
  in the notice. The winner is masked in later runs within one month. Complaints may be lodged with the CNIL
  (cnil.fr).

**Your obligations as a user.** You become the controller of the data you retrieve for your own purposes: inform the
data subjects of the origin of the data at first contact (GDPR art. 14), respect their right to object and the rules
on direct marketing (French postal and electronic communications code, art. L34-5).

### Input

| Field | Default | Purpose |
|---|---|---|
| `dateFrom` / `dateTo` | last 7 days | Publication dates, 31 days at most, not in the future |
| `noticeType` | `all` | `tenders`, `awards` (results) or `all` |
| `sources` | both | `boamp`, `ted` |
| `keywords` | none | At least one word present in the subject, description or descriptors (accents and case ignored); 20 at most. Notices are mostly in French |
| `cpvCodes` | none | CPV codes or code prefixes: `72`, `4521`, `79341000` |
| `departements` | all of France | BOAMP only: `01`…`95`, `2A`, `2B`, `971`…`989` |
| `countries` | `FRA` | TED only: three-letter country codes (`BEL`, `DEU`…) |
| `maxItems` | 200 | Notices saved at most (≤ 10,000) |

Entered values that go into the BOAMP and TED queries (dates, types, departments, countries) are validated against a
closed list or a regular expression; keywords and CPV codes are applied locally.

### Output

One row per notice (deduplicated by source and notice number): `source`, `id`, `type` (`avis` = notice or
`resultat` = award), `objet`, `description`, `acheteur` (`nom`, `siret` or `identifiant`, `pays`, `ville`), `lieu`
(`departements`, `nuts`), `type_marche`, `procedure`, `famille`, `cpv`, `descripteurs`, `date_publication`,
`date_limite_reponse`, `valeur_estimee_ht`, `montant_attribue_ht`, `titulaires` (`nom`, `identifiant`, and for a
verified French company `siren` and `siret`), `nombre_titulaires`, `titulaires_masques`, `motifs_masquage`,
`titulaires_non_publies`, `avis_initial`, `url`, `mention_source`, `consulte_le`. Output field names are in French.

The same contract published on BOAMP and TED gives two rows, one per source, each charged. If a source publishes more
notices in a day than the tool can read (10,000 on BOAMP, 5,000 on TED), the day is flagged incomplete in the summary
(`jours_tronques`) and in the final message.

### Pricing

Single event `notice-found`, **$0.005** per notice **saved** (after filters). Example: 1,000 notices = $5. Nothing is
charged for notices read and discarded (outside keywords or CPV, duplicates, unreadable notices). The run stops
cleanly at `maxItems` or at your spending limit. Cost safeguards: 250 notices read per notice requested (between
5,000 and 50,000), and 25 minutes per run at most.

### Related Actors

- [New Companies in France](https://apify.com/geckostar/nouvelles-societes-france): companies newly registered in
  France, from official BODACC creation notices, filtered by department and NAF code.
- [Companies Hiring in France](https://apify.com/geckostar/entreprises-qui-recrutent): establishments France Travail
  rates as likely to hire within 6 months, by job or sector and area.

***

## Version française — Marchés publics France + UE

Appels d'offres et résultats de marchés publics publiés au **BOAMP** (France, tous montants) et sur **TED**
(Union européenne, au-dessus des seuils européens), lus jour par jour. Pour chaque avis : objet, acheteur,
codes CPV, lieu, procédure, date limite de réponse, valeur estimée. Pour chaque résultat : montant attribué
et, sur TED, **sociétés titulaires** sous leur nom officiel, avec SIREN et SIRET contrôlés au répertoire Sirene.
Filtres : mots-clés, codes CPV, départements (BOAMP), pays de l'acheteur (TED). Aucun modèle de langage.

### Sources (publiques, sans clé)

| Source | Usage | Débit utilisé |
|---|---|---|
| BOAMP, jeu `boamp` (DILA, `boamp-datadila.opendatasoft.com`, Licence Ouverte 2.0) | avis de marché et résultats de marché, jour par jour | 5 req/s au plus |
| TED, API Search v3 (Office des publications de l'UE, `api.ted.europa.eu`) | avis de marché (competition) et avis d'attribution (result) | 2 req/s au plus |
| API Recherche d'entreprises (`recherche-entreprises.api.gouv.fr`, Licence Ouverte 2.0) | contrôle des titulaires français identifiés par un SIRET | 5 req/s au plus |

Sources : BOAMP (DILA), Licence Ouverte 2.0 (Etalab) ; TED (© Union européenne, réutilisation autorisée,
décision 2011/833/UE) ; API Recherche d'entreprises (DINUM, données INSEE). Chaque ligne indique sa source et
la date de consultation (`mention_source`, `consulte_le`). Toute réutilisation doit conserver cette mention.

### Titulaires et données personnelles

Les titulaires publiés sont des **sociétés contrôlées**. L'outil ne reprend jamais les contacts des acheteurs
(noms, courriels, téléphones), ni un titulaire déclaré ou identifié comme personne physique, ni une adresse de
voie, ni un nom de titulaire saisi par l'acheteur.

- **TED** : un titulaire n'est nommé que s'il est identifié par un SIREN, un SIRET ou un numéro de TVA français,
  et que le répertoire Sirene le confirme comme société diffusible. Il est alors publié sous son **nom officiel**
  (répertoire Sirene), avec son SIREN et son SIRET. Sont masqués et seulement comptés (`titulaires_masques`,
  `motifs_masquage`) : les entrepreneurs individuels, les entreprises en diffusion partielle (opposées à la
  diffusion de leurs données), les identifiants français invalides, les titulaires sans identifiant, ceux qui
  ont fait opposition, et tout titulaire dont le contrôle a échoué. Un titulaire **étranger** (identifiant non
  français, ou identifiant d'un marché passé hors de France) est repris avec son nom tel que publié sur TED et
  son identifiant national, sans adresse ni contact.
- **BOAMP** : les titulaires n'y ont pas d'identifiant et ne peuvent donc pas être contrôlés. Aucun nom n'est
  publié : seulement leur nombre (`nombre_titulaires`) et le montant attribué ; consultez l'avis officiel
  (`titulaires_non_publies`).

Un résultat peut toutefois contenir une donnée personnelle publiée par l'acheteur : société dont la
dénomination reprend le nom de son dirigeant, titulaire étranger exerçant en nom propre, ou nom cité dans
l'objet ou la description d'un avis.

- Responsable de l'outil : l'éditeur indiqué dans les mentions légales. Base légale : intérêt légitime (RGPD,
  art. 6.1.f) à faire connaître la commande publique à partir de ses publications officielles.
- Conservation : l'éditeur ne garde aucun résultat. Les données sont lues à chaque exécution et enregistrées
  dans le seul compte Apify de l'utilisateur. Le journal d'exécution ne contient ni SIRET ni nom de titulaire.
- Vos droits : toute personne concernée peut s'opposer à figurer dans les résultats ou exercer ses droits
  d'accès et d'effacement en écrivant à l'adresse de contact, avec le SIREN ou, à défaut, la dénomination
  exacte et l'identifiant figurant dans l'avis. Le titulaire est masqué
  dans les exécutions suivantes dans un délai d'un mois. Réclamation possible auprès de la CNIL (cnil.fr).

**Vos obligations en tant qu'utilisateur.** Vous devenez responsable du traitement des données que vous
récupérez pour vos propres finalités : informez les personnes concernées de l'origine des données lors du
premier contact (RGPD, art. 14), respectez leur droit d'opposition et les règles de prospection commerciale
(code des postes et des communications électroniques, art. L34-5).

### Entrée

| Champ | Défaut | Rôle |
|---|---|---|
| `dateFrom` / `dateTo` | 7 derniers jours | Dates de publication, 31 jours au plus, pas dans le futur |
| `noticeType` | `all` | `tenders` (appels d'offres), `awards` (résultats) ou `all` |
| `sources` | les deux | `boamp`, `ted` |
| `keywords` | aucun | Un mot au moins présent dans l'objet, la description ou les descripteurs (sans accents ni majuscules) ; 20 au plus |
| `cpvCodes` | aucun | Codes CPV ou débuts de code : `72`, `4521`, `79341000` |
| `departements` | toute la France | BOAMP seulement : `01`…`95`, `2A`, `2B`, `971`…`989` |
| `countries` | `FRA` | TED seulement : codes pays à trois lettres (`BEL`, `DEU`…) |
| `maxItems` | 200 | Avis enregistrés au plus (≤ 10 000) |

Les valeurs saisies qui entrent dans les requêtes du BOAMP et de TED (dates, types, départements, pays) sont
validées par liste fermée ou expression régulière ; les mots-clés et les codes CPV sont appliqués localement.

### Sortie

Une ligne par avis (dédoublonnée par source et numéro d'avis) : `source`, `id`, `type` (`avis` ou
`resultat`), `objet`, `description`, `acheteur` (`nom`, `siret` ou `identifiant`, `pays`, `ville`), `lieu`
(`departements`, `nuts`), `type_marche`, `procedure`, `famille`, `cpv`, `descripteurs`, `date_publication`,
`date_limite_reponse`, `valeur_estimee_ht`, `montant_attribue_ht`, `titulaires` (`nom`, `identifiant`,
et pour une société française contrôlée `siren` et `siret`), `nombre_titulaires`, `titulaires_masques`, `motifs_masquage`, `titulaires_non_publies`,
`avis_initial`, `url`, `mention_source`, `consulte_le`.

Un même marché publié au BOAMP et sur TED donne deux lignes, une par source, chacune facturée. Si une source
publie plus d'avis en un jour que l'outil ne peut en lire (10 000 au BOAMP, 5 000 sur TED), le jour est signalé
incomplet dans le bilan (`jours_tronques`) et dans le message de fin.

### Facturation

Événement unique `notice-found`, **0,005 $** par avis, facturé pour chaque avis **enregistré** (après filtres). Rien n'est facturé
pour les avis lus et écartés (hors mots-clés ou CPV, doublons, avis illisibles). L'exécution s'arrête
proprement à `maxItems` ou à la limite de dépense. Garde-fous de coût : 250 avis lus par avis demandé
(entre 5 000 et 50 000), et 25 minutes d'exécution au plus.

***

### Conditions d'utilisation / Terms

Outil destiné aux professionnels. Il reprend les avis publiés au BOAMP et sur TED tels que les acheteurs les
ont rédigés : montants, dates et titulaires peuvent être incomplets ou rectifiés par un avis ultérieur. Seul
l'avis officiel fait foi, en particulier pour la date limite de réponse. Les données sont lues au moment de
l'exécution, sans garantie d'exhaustivité ni d'actualité. L'éditeur ne répond pas des décisions prises sur la
seule base de ces résultats, ni de l'usage que l'utilisateur en fait, dans les limites permises par la loi.
Cette clause n'écarte aucun droit que la loi réserve aux consommateurs, notamment la garantie légale de
conformité des contenus et services numériques.

Intended for business use. Notices are reproduced as published by contracting authorities: amounts, dates and
winners may be incomplete or corrected later. Only the official notice is authoritative, especially for
deadlines. No guarantee of completeness or freshness. To the extent permitted by law, the developer is not
liable for decisions based solely on these results or for the user's use of them. Nothing here limits
statutory consumer rights.

### Mentions légales / Legal notice

- Éditeur et vendeur / Publisher and seller : Audric Moussaoui, entrepreneur individuel (EI), pseudonyme « geckostar » / pseudonym "geckostar"
- Adresse / Address : 88 rue Oberkampf, 75011 Paris, France
- Téléphone / Phone : +33 6 95 11 28 15
- Courriel / E-mail : audricmm@gmail.com
- SIREN : en cours d'attribution, déclaration d'activité déposée le 24/10/2026 / being assigned, registration filed on 24 October 2026
- Directeur de la publication / Publication director : Audric Moussaoui
- TVA non applicable, art. 293 B du CGI / VAT not applicable (French VAT franchise, art. 293 B CGI)
- Hébergement / Hosting : Apify Technologies s.r.o., Vodičkova 704/36, 110 00 Prague 1, République tchèque / Czech Republic (hello@apify.com)

# Actor input Schema

## `dateFrom` (type: `string`):

Publication date (YYYY-MM-DD). Default: 6 days before the end date. 31 days at most per run.

## `dateTo` (type: `string`):

Publication date (YYYY-MM-DD). Default: today.

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

Open tenders, results (contract awards, with winners and amounts), or both.

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

BOAMP (France, all amounts) and TED (European Union, above EU thresholds). Empty: both.

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

A notice is kept if it contains one of these words (title, description, descriptors), ignoring accents and case. Notices are mostly in French: “informatique”, “nettoyage”… Up to 20. Empty: all notices.

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

CPV codes or code prefixes: “72” (IT services), “45” (construction work), “79341000”… Notices without a CPV code are then skipped. Empty: all.

## `departements` (type: `array`):

French department codes of BOAMP notices: 31, 75, 2A, 971… No effect on TED. Empty: all of France.

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

Three-letter country codes (ISO 3166-1 alpha-3): FRA, BEL, DEU, ESP… No effect on BOAMP. Default: FRA.

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

The run stops once this many notices are saved.

## Actor input object example

```json
{
  "noticeType": "all",
  "sources": [
    "boamp",
    "ted"
  ],
  "keywords": [
    "informatique"
  ],
  "countries": [
    "FRA"
  ],
  "maxItems": 20
}
```

# Actor output Schema

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

Une ligne par avis enregistré (tous facturés). Les avis hors filtres ne sont ni enregistrés ni facturés ; voir le bilan.

## `bilan` (type: `string`):

Compteurs de l'exécution : avis lus, enregistrés, facturés, titulaires masqués.

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

// Run the Actor and wait for it to finish
const run = await client.actor("geckostar/marches-publics-france-ue").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": ["informatique"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("geckostar/marches-publics-france-ue").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": [
    "informatique"
  ],
  "maxItems": 20
}' |
apify call geckostar/marches-publics-france-ue --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,geckostar/marches-publics-france-ue"
        }
    }
}
```

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/tgBOeLlGJkCb8ACT7/builds/uJsjdoHq4WQlRYPCm/openapi.json
