# EU & France Public Tenders Scraper — TED + BOAMP, Deduped (`tenderlantern/eu-public-tenders`) Actor

Scrape EU public tenders from TED (27 countries) and French BOAMP in one deduplicated dataset, plus French contract awards (DECP). Filter by country, CPV, keyword, region and value. Monitor mode returns only new notices. Official open data, no personal data. Appels d'offres, marchés publics.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 & France Public Tenders — TED + BOAMP + DECP in one deduplicated feed

**By default, this Actor returns only public tenders that are still open (no past deadline), from the EU (TED) and France (BOAMP), with duplicates merged and no contract awards.**

Public procurement notices from the 27 EU countries (TED) and from France (BOAMP), plus French contract awards (DECP), in one dataset with duplicates merged. Built for bid teams, SMEs, tender-monitoring consultants and AI agents.

- **24 %** of raw notices were duplicates and got merged (benchmark of 50 real queries, measured 24 October 2026).
- **27** EU countries covered on TED by default (since version 0.2, 24 October 2026).
- **0** e-mail addresses, phone numbers or personal names in 3,170 notices produced by the benchmark (24 October 2026).

### Quick start (3 steps)

1. Copy one of the input examples below into the Input tab (or into the API call).
2. Click **Start**. With the default settings, a run returns 200 notices (local test, 24 October 2026: about 10 seconds; cloud runs can be slower).
3. Export the dataset as JSON, CSV or Excel, or schedule the Actor with an Apify schedule and use monitor mode (see below).

### Why this Actor?

A French tender above the EU thresholds is published **twice**: on TED and on BOAMP. Querying both sources separately means paying for and sorting duplicates.

| | This Actor | A TED-only Actor | A BOAMP-only Actor |
|---|---|---|---|
| Notices from the 27 EU countries (TED) + French national notices (BOAMP) | ✅ in one run (whole EU by default) | TED only | BOAMP only |
| TED ↔ BOAMP duplicates merged | ✅ (eForms procedure ID, then buyer + title + date) | — | — |
| Contract awards (DECP, France) | ✅ optional | — | — |
| Country filter (EU) + French region / département (NUTS ↔ départements) | ✅ | country only | ✅ |
| CPV by prefix (`72` = all IT services) | ✅ | often exact code | varies |
| Monitor mode: only notices not seen in earlier runs | ✅ | — | varies |
| Structured French summary (`libelle_structure`), dates in plain words, days left before the deadline | ✅ (deterministic, no AI) | — | varies |
| Names and contact details of people | ❌ never returned (GDPR) | sometimes | sometimes |

### Who uses it

- **Bid teams and SMEs** answering public tenders in France or elsewhere in the EU.
- **Tender-monitoring consultants** following a sector (CPV codes) for several clients.
- **AI agents** that need a clean, deduplicated answer to "which open tenders match X in region Y?".

### Input examples

IT tenders across the EU, last 3 days:

```json
{ "cpvCodes": ["72", "48"], "daysBack": 3 }
```

Germany and Austria, software (keywords match the language of the notice):

```json
{ "tedCountries": ["DEU", "AUT"], "keywords": ["Software", "software"], "daysBack": 7 }
```

Cleaning tenders in Île-de-France, new notices only:

```json
{ "keywords": ["nettoyage"], "regions": ["Île-de-France"], "daysBack": 7, "onlyNew": true, "stateKey": "nettoyage-idf" }
```

Large construction works in Hauts-de-France:

```json
{ "cpvCodes": ["45"], "regions": ["Hauts-de-France"], "minAmount": 1000000, "daysBack": 14 }
```

Recent contract awards (DECP + award notices):

```json
{ "noticeKind": "awards", "keywords": ["nettoyage"], "daysBack": 7 }
```

### Output

One item per notice, after merging. Example (a real notice, abridged):

```json
{
  "libelle_structure": "Avis de marché (services) publié le 21 octobre 2026 par Métropole Aix Marseille Provence — dépt 13, Provence-Alpes-Côte d'Azur. Objet : Maintenance logiciel Business Objects… Catégorie CPV 72267100 : Maintenance de logiciels de technologies de l'information. Valeur estimée : 205 750 € HT. Date limite de réponse : 27 novembre 2026 (J-34).",
  "kind": "avis_de_marche",
  "buyer": { "name": "Métropole Aix Marseille Provence", "country": "FRA" },
  "location": { "country": "FRA", "nuts": "FRL04", "department": "13", "region": "Provence-Alpes-Côte d'Azur" },
  "cpvMain": "72267100", "amountEUR": 205750, "deadline": "2026-11-27", "daysLeft": 34,
  "sources": ["TED", "BOAMP"], "duplicatesMerged": 1,
  "sourceRefs": [
    { "source": "TED", "id": "726965-2026", "url": "https://ted.europa.eu/fr/notice/-/detail/726965-2026" },
    { "source": "BOAMP", "id": "26-101792", "url": "https://www.boamp.fr/pages/avis/?q=idweb:26-101792" }
  ]
}
```

Each item also carries its licences, the attribution text and the links to the original notices. The run summary (notices read per source, duplicates removed, errors) is saved as `RUN_STATS` in the run's key-value store.

### Monitor mode (only new notices)

Set `onlyNew: true` and a `stateKey` (for example `it-paca`). The Actor then returns only the notices it has not returned before for that key. Pair it with an Apify schedule (for example every morning) to get a feed of new notices. Notifications (e-mail, Slack, webhooks) are set up with the standard Apify integrations; the Actor itself sends nothing.

### Use with AI agents (MCP)

Like any public Apify Actor, it can be called by AI agents through Apify's generic MCP server: `https://mcp.apify.com?tools=tenderlantern/eu-public-tenders` (requires an Apify account or token). Example question for an agent: "Which IT tenders are open in Provence-Alpes-Côte d'Azur this week?" The output is deterministic and deduplicated, with a link to every official notice.

### Limits

- **Whole EU**: keywords are matched in the language of the notice. A German notice does not contain "logiciel": for the EU, use CPV codes or keywords in several languages. Foreign titles are returned as published, with their language (no machine translation). Region and département filters only apply to France.
- **Volume read per source** (`maxPerSource`): over 7 days, TED publishes about 8,000 open tenders for the EU (7,996 on 24 October 2026). TED and DECP are filtered on the server and the Actor reads the 1,000 most recent by default; to cover the whole period, filter (CPV, country, keywords) or raise `maxPerSource`. BOAMP is read in full over the requested period by default (up to 20,000 notices), because its CPV filter is applied after reading.
- **France only for BOAMP and DECP**: they are queried only when France is in scope (`tedCountries` containing `FRA`, `EU` or `ALL`, or a region / département filter). A query for `DEU` alone returns TED notices only.
- **CPV and French national notices**: CPV codes published in BOAMP notices (EU and national forms) are read. About 8 % of open BOAMP notices publish no CPV code at all (mostly MAPA, below €90k; 171 of 2,019 on 24 October 2026). With a CPV filter, `cpvWithoutCode` decides what happens to them: `descriptor` (default) keeps a notice when one of its BOAMP descriptors matches the CPV prefix (documented table, no CPV code is invented: `cpv` stays empty and `cpvMatchedBy` is `boampDescriptor`), `include` keeps them all, `exclude` drops them.
- **Amounts**: many notices do not publish an estimated value, and the Actor never estimates one. `amountEUR` is the value published by the buyer for the procedure, or the sum of the lot values only when every lot publishes one (`amountBasis` says which). A published range is returned in `amountRangeEUR`, not in `amountEUR`.
- **DECP**: awards are published a few days after notification. Organisation names come from an embedded SIRENE cache (INSEE); sole traders (natural persons) are always masked.

### FAQ

**TED API or this Actor?** The TED API covers TED only. This Actor adds French national notices (BOAMP) and awards (DECP), merges the duplicates between sources, and returns one flat record per tender with a French structured summary.

**Does it cover French tenders below the EU thresholds?** Yes, through BOAMP (MAPA and FNS families). Some of them, mostly MAPA, publish no CPV code (see Limits, `cpvWithoutCode`).

**Why are some amounts missing?** The buyer did not publish an estimated value. Use `excludeUnknownAmount` only if you really need it.

**How are duplicates detected?** First by the eForms procedure identifier shared by TED and BOAMP, then by buyer + normalised title + publication dates within 10 days.

**Is it legal? Which licence?** Only official open-data APIs are used: TED (free reuse, Decision 2011/833/EU), BOAMP and DECP (Licence Ouverte 2.0), SIRENE (Licence Ouverte 2.0). No website scraping, no personal data. Published rate limits are respected.

### Sources & licences

See the full French text below ("Sources et licences"): TED (Supplement to the Official Journal of the EU, free reuse with source attribution, Decision 2011/833/EU; not affiliated with or endorsed by the Publications Office), BOAMP (DILA, Licence Ouverte 2.0), DECP (DAJ, Ministry of the Economy, Licence Ouverte 2.0), organisation names from INSEE SIRENE (Licence Ouverte 2.0), CPV labels (CPV 2008, Regulation (EC) No 213/2008).

***

### 🇫🇷 En français

#### Appels d'offres publics France + UE (27 pays) — TED, BOAMP, DECP en un seul flux

**Les avis de marchés publics des 27 pays de l'UE (TED) et de la France (BOAMP), plus les marchés attribués en France (DECP), dans un seul jeu de données. Par défaut, TED couvre toute l'UE. Les données sont sans doublons et filtrables par pays, région, département, CPV, mots-clés et montant, avec un libellé structuré en français (`libelle_structure`).** Seules les sources officielles en données ouvertes sont utilisées : pas de scraping de site, pas de clé API.

#### Pourquoi cet Actor ?

Un même marché français au-dessus des seuils européens est publié **deux fois** : sur TED et sur le BOAMP (famille JOUE). Interroger les deux sources séparément vous fait donc payer et trier des doublons. Sur notre banc de 50 requêtes réelles (24 octobre 2026), **24 % des avis bruts retenus étaient des doublons** (médiane par requête : 20 %), et 27 % des avis renvoyés regroupent un avis TED et son double BOAMP.

| | Cet Actor | Un Actor TED seul | Un Actor BOAMP seul |
|---|---|---|---|
| Avis des 27 pays de l'UE (TED) + avis nationaux français (BOAMP) | ✅ en une exécution (UE entière par défaut) | TED seulement | BOAMP seulement |
| Fusion des doublons TED ↔ BOAMP | ✅ (identifiant de procédure eForms, puis acheteur + objet + date) | — | — |
| Marchés attribués (DECP) | ✅ option | — | — |
| Filtre pays (UE) + région / département en France (NUTS ↔ départements) | ✅ | pays seulement | ✅ |
| CPV par préfixe (`72` = tout l'informatique) | ✅ | souvent code exact | variable |
| Mode veille « nouveaux avis seulement » | ✅ | — | variable |
| Libellé structuré en français (`libelle_structure`), dates en clair, J-n avant la date limite | ✅ (déterministe, sans IA) | — | variable |
| Noms et coordonnées de personnes | ❌ jamais exposés (RGPD) | parfois | parfois |

#### Pour qui ?

- **TPE/PME et indépendants** qui répondent aux marchés publics dans leur région.
- **Consultants et cabinets de veille** qui suivent un secteur (CPV) pour plusieurs clients.
- **Agents IA** (via le MCP Apify ou l'API) qui doivent répondre à « quels appels d'offres en cours pour X en région Y ? » avec une sortie propre et dédoublonnée.

#### Exemples d'entrée

Veille quotidienne, informatique en PACA, nouveaux avis seulement :

```json
{ "cpvCodes": ["72", "48"], "regions": ["Provence-Alpes-Côte d'Azur"], "daysBack": 3, "onlyNew": true, "stateKey": "it-paca" }
```

Appels d'offres informatiques dans toute l'UE, en plusieurs langues (réglage par défaut des pays : `EU`) :

```json
{ "cpvCodes": ["72", "48"], "daysBack": 3 }
```

Benelux seulement :

```json
{ "tedCountries": ["BEL", "NLD", "LUX"], "keywords": ["software", "logiciel", "software-ontwikkeling"] }
```

Gros travaux en Hauts-de-France :

```json
{ "cpvCodes": ["45"], "regions": ["Hauts-de-France"], "minAmount": 1000000, "daysBack": 14 }
```

Marchés attribués récemment (DECP + avis d'attribution) :

```json
{ "noticeKind": "awards", "keywords": ["nettoyage"], "daysBack": 7 }
```

#### Ce que contient chaque résultat

```json
{
  "libelle_structure": "Avis de marché (services) publié le 21 octobre 2026 par Métropole Aix Marseille Provence — dépt 13, Provence-Alpes-Côte d'Azur. Objet : Maintenance logiciel Business Objects… Catégorie CPV 72267100 : Maintenance de logiciels de technologies de l'information. Valeur estimée : 205 750 € HT. Date limite de réponse : 27 novembre 2026 (J-34).",
  "kind": "avis_de_marche",
  "title": "Maintenance logiciel Business Objects, prestations de mises à jour et assistance associées…",
  "buyer": { "name": "Métropole Aix Marseille Provence", "country": "FRA" },
  "location": { "country": "FRA", "nuts": "FRL04", "department": "13", "region": "Provence-Alpes-Côte d'Azur" },
  "cpv": [{ "code": "72267100", "label": "Maintenance de logiciels de technologies de l'information" }],
  "amountEUR": 205750,
  "publishedAt": "2026-10-21", "deadline": "2026-11-27", "daysLeft": 34,
  "sources": ["TED", "BOAMP"], "duplicatesMerged": 1,
  "sourceRefs": [
    { "source": "TED", "id": "726965-2026", "url": "https://ted.europa.eu/fr/notice/-/detail/726965-2026" },
    { "source": "BOAMP", "id": "26-101792", "url": "https://www.boamp.fr/pages/avis/?q=idweb:26-101792" }
  ],
  "licences": [ "…" ], "attribution": "Données : TED — Journal officiel de l'UE (S) ; BOAMP — DILA. Retraitées (fusion, libellé structuré)…"
}
```

#### Paramètres principaux

| Paramètre | Rôle |
|---|---|
| `keywords` | Au moins un mot présent dans l'objet ou la description (filtrage strict par défaut, ce qui évite les faux positifs du texte intégral) |
| `cpvCodes` | Préfixes CPV (`72`, `4521`, `90910000`) |
| `cpvWithoutCode` | Avis BOAMP sans code CPV quand un filtre CPV est donné : `descriptor` (défaut), `include`, `exclude` |
| `regions` / `departments` | Lieu d'exécution |
| `tedCountries` | Pays TED quand aucun filtre région/département n'est donné. `EU` (défaut) = les 27 États membres ; codes ISO 3 (`FRA`, `DEU`, `NOR`…) pour cibler ; `ALL` ou liste vide = tous les pays publiés sur TED |
| `sources` | `TED`, `BOAMP`, `DECP` |
| `noticeKind` | `tenders` (en cours), `awards` (attributions), `all` |
| `daysBack` / `publishedFrom` / `publishedTo` | Période de publication |
| `onlyOpen` | Seulement les consultations dont la date limite n'est pas passée |
| `minAmount` / `maxAmount` / `excludeUnknownAmount` | Montant en € HT (beaucoup d'avis n'en publient pas) |
| `onlyNew` + `stateKey` | Veille : ne renvoie que les avis jamais vus pour cette clé |

#### Limites (à lire)

- **UE entière** : les mots-clés sont cherchés dans la langue de l'avis. Un avis allemand ne contient pas « logiciel » : pour l'UE, utilisez des codes CPV ou des mots-clés en plusieurs langues. Les titres étrangers sont renvoyés tels quels, avec leur langue indiquée (pas de traduction automatique). Les filtres région et département ne s'appliquent qu'à la France.
- **Volume lu par source** (`maxPerSource`) : sur 7 jours, TED publie environ 8 000 appels d'offres ouverts pour l'UE (7 996 au 24/10/2026). TED et DECP sont filtrés côté serveur et l'Actor lit par défaut les 1 000 plus récents ; pour couvrir toute la période, filtrez (CPV, pays, mots-clés) ou augmentez `maxPerSource`. BOAMP est lu en entier sur la période demandée (jusqu'à 20 000 avis), car son filtre CPV s'applique après lecture.
- **BOAMP et DECP = France** : ils ne sont interrogés que si la France est dans le périmètre (`tedCountries` avec `FRA`, `EU` ou `ALL`, ou un filtre région/département). Une requête `DEU` seule ne renvoie que des avis TED.
- **CPV et BOAMP national** : les codes CPV publiés dans les avis BOAMP (formulaires européens et nationaux) sont lus. Environ 8 % des avis BOAMP en cours ne publient aucun code CPV (surtout des MAPA ; 171 sur 2 019 au 24/10/2026). Avec un filtre CPV, `cpvWithoutCode` décide : `descriptor` (défaut) garde l'avis si l'un de ses descripteurs BOAMP correspond au préfixe CPV (table documentée, aucun code CPV inventé : `cpv` reste vide et `cpvMatchedBy` vaut `boampDescriptor`), `include` les garde tous, `exclude` les écarte.
- **Montants** : beaucoup d'avis ne publient pas de valeur estimée, et l'Actor n'en estime jamais. `amountEUR` est la valeur publiée par l'acheteur pour la procédure, ou la somme des lots seulement si chaque lot publie la sienne (`amountBasis` l'indique). Une fourchette publiée va dans `amountRangeEUR`, pas dans `amountEUR`.
- **Libellé structuré** (`libelle_structure`) : il est assemblé par gabarits fixes à partir des champs officiels, sans IA et sans traduction automatique. Un avis étranger garde son titre d'origine, avec sa langue indiquée.
- **DECP** : lu via l'API Explore du jeu `decp-2022-marches-valides` (data.economie.gouv.fr), filtré côté serveur (dates, CPV, département, mots-clés, montant). Les DECP ne contiennent que des SIRET : les noms d'organisations viennent d'un cache SIRENE embarqué dans l'Actor (base SIRENE de l'INSEE, personnes morales diffusibles uniquement). L'API Recherche d'entreprises ne sert qu'en secours, pour les SIREN absents du cache ; après 3 échecs, l'Actor arrête de l'appeler. Le nom d'un entrepreneur individuel n'est jamais renvoyé. Les DECP sont publiées avec quelques jours de décalage sur la notification.
- **Données personnelles** : l'Actor ne renvoie ni nom de contact, ni e-mail, ni téléphone. Pour les titulaires DECP, les entrepreneurs individuels (personnes physiques) sont masqués.

#### Sources et licences

- **TED**, Supplément au Journal officiel de l'UE : réutilisation libre, y compris commerciale, avec mention de la source (Décision 2011/833/UE, [mentions légales TED](https://ted.europa.eu/fr/legal-notice)). Ce produit n'est ni affilié ni approuvé par l'Office des publications.
- **BOAMP**, DILA : [Licence Ouverte 2.0](https://www.etalab.gouv.fr/licence-ouverte-open-licence/).
- **DECP**, données essentielles de la commande publique (DAJ, ministère de l'Économie), jeu [`decp-2022-marches-valides`](https://data.economie.gouv.fr/explore/dataset/decp-2022-marches-valides/) : Licence Ouverte 2.0.
- **Noms d'organisations** : base SIRENE de l'INSEE (Licence Ouverte 2.0), données du 20/10/2026, via l'export public Opendatasoft `economicref-france-sirene-v3`. Secours : API Recherche d'entreprises (DINUM), Licence Ouverte 2.0.
- **Libellés CPV** : vocabulaire CPV 2008, Règlement (CE) n° 213/2008.

Chaque résultat porte ses sources, ses liens d'origine et la mention des modifications (fusion et libellé structuré).

**Limites d'usage respectées** : l'Actor envoie au plus 4 requêtes par seconde à TED, alors que la limite publiée est de 700 par minute. Il utilise uniquement l'API de recherche, sans téléchargement massif d'avis. Les requêtes vers BOAMP et DECP (Opendatasoft, quotas affichés : 2 000 000 et 50 000 appels par jour) sont espacées de 300 ms, avec reprise exponentielle sur les erreurs 429 et 5xx. L'API Recherche d'entreprises (secours) est appelée au plus 300 fois par exécution, à 200 ms d'intervalle (limite publiée : 7 par seconde).

# Actor input Schema

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

Au moins un des mots doit apparaître (texte intégral TED, objet et contenu BOAMP, objet DECP). Ex. : logiciel, nettoyage, cybersécurité.

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

Ex. 72 (services informatiques), 48 (logiciels), 45 (travaux), 90910000. Un préfixe couvre toute la sous-arborescence. Les codes CPV publiés dans les avis BOAMP (formulaires européens et nationaux) sont lus ; pour les avis BOAMP sans aucun code CPV (surtout MAPA), voir « Avis sans code CPV ».

## `cpvWithoutCode` (type: `string`):

Quand un filtre CPV est donné et qu'un avis BOAMP ne publie aucun code CPV : « descriptor » garde l'avis si l'un de ses descripteurs BOAMP correspond au préfixe demandé (table documentée, aucun code CPV n'est inventé : `cpv` reste vide et `cpvMatchedBy` = boampDescriptor) ; « include » garde tous ces avis (`cpvMatchedBy` = noCpvIncluded) ; « exclude » les écarte.

## `regions` (type: `array`):

Lieu d'exécution (TED : codes NUTS ; BOAMP/DECP : départements).

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

Numéros : 75, 13, 2A, 971… Prioritaire sur les régions.

## `tedCountries` (type: `array`):

Pays couverts sur TED quand aucun filtre région/département n'est donné. « EU » (par défaut) = les 27 États membres ; ajoutez des codes ISO 3 (NOR, CHE…) ou n'en gardez que certains (FRA, BEL, DEU). « ALL » ou liste vide = tous les pays publiés sur TED. Les filtres région/département ne visent que la France. Les mots-clés sont cherchés dans la langue de l'avis : pour l'UE entière, combinez plusieurs langues (logiciel, software, Software) ou utilisez les codes CPV. BOAMP et DECP (France uniquement) ne sont interrogés que si la France est dans le périmètre (FRA, EU, ALL, ou un filtre région/département).

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

DECP = marchés attribués (données essentielles) ; utile avec Type = attributions. Vide = TED + BOAMP pour les avis en cours ; TED + BOAMP + DECP pour les attributions.

## `noticeKind` (type: `string`):

Appels d'offres en cours, attributions, ou tout.

## `daysBack` (type: `integer`):

Ignoré si « Publiés à partir du » est renseigné.

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

AAAA-MM-JJ

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

AAAA-MM-JJ

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

Date limite de réponse ≥ aujourd'hui (les avis sans date limite restent inclus côté BOAMP).

## `minAmount` (type: `integer`):

Montant minimum (€ HT).

## `maxAmount` (type: `integer`):

Montant maximum (€ HT).

## `excludeUnknownAmount` (type: `boolean`):

Beaucoup d'avis ne publient pas de montant : à n'activer qu'en connaissance de cause.

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

Ne renvoie que les avis jamais vus lors des exécutions précédentes avec la même clé de veille. Idéal avec une planification quotidienne.

## `stateKey` (type: `string`):

Une clé par veille (ex. informatique-paca).

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

Nombre maximum d'avis.

## `maxPerSource` (type: `integer`):

Vide = TED et DECP : 1 000 avis lus au plus ; BOAMP : toute la fenêtre demandée (jusqu'à 20 000 avis), car le filtre CPV BOAMP s'applique après lecture. Une valeur (10 à 5 000) fixe le même plafond pour toutes les sources.

## `resolveNames` (type: `boolean`):

Acheteurs et titulaires via l'API Recherche d'entreprises. Les entrepreneurs individuels (personnes physiques) sont toujours masqués.

## `strictKeywords` (type: `boolean`):

Exige le mot-clé dans l'objet ou la description de l'avis (évite les faux positifs du texte intégral TED, ex. libellés CPV « à l'exception des logiciels »).

## Actor input object example

```json
{
  "keywords": [
    "logiciel"
  ],
  "cpvWithoutCode": "descriptor",
  "tedCountries": [
    "EU"
  ],
  "noticeKind": "tenders",
  "daysBack": 7,
  "onlyOpen": true,
  "excludeUnknownAmount": false,
  "onlyNew": false,
  "stateKey": "default",
  "maxResults": 200,
  "resolveNames": true,
  "strictKeywords": true
}
```

# Actor output Schema

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

Un élément par avis : type, objet, acheteur, lieu, CPV, montant, dates, sources fusionnées, liens d'origine, licences et libellé structuré en français.

## `runStats` (type: `string`):

JSON : avis lus par source, doublons retirés (duplicatesRemoved, duplicateGroupsBySources), répartition par pays et par sources, erreurs et durée.

# 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": [
        "logiciel"
    ],
    "tedCountries": [
        "EU"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tenderlantern/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": ["logiciel"],
    "tedCountries": ["EU"],
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tenderlantern/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/0lKJPu8aQhRGpYSiR/builds/UaOExe7zdkQUs1P0M/openapi.json
