BOAMP open data : les appels d'offres en CSV, depuis les fichiers de la DILA
Le BOAMP publie chaque jour les avis de marchés publics français. La DILA les met à disposition en open data, sous Licence Ouverte 2.0, sous forme de fichiers XML sur echanges.dila.gouv.fr. Aucun compte ni clé API n’est nécessaire. Tous les exemples ci-dessous ont été testés le 3 novembre 2026.
1. Où sont les fichiers
Un dossier par jour : https://echanges.dila.gouv.fr/OPENDATA/BOAMP/AAAA/MM/JJ/.
Le dossier du 2 novembre 2026 contenait 166 avis, un fichier par avis (26-106020.xml, 26-106021.xml, …), de 50 à 250 Ko chacun.
curl -s https://echanges.dila.gouv.fr/OPENDATA/BOAMP/2026/11/02/ | grep -o '26-[0-9]*\.xml' | sort -u | head
curl -s https://echanges.dila.gouv.fr/OPENDATA/BOAMP/2026/11/02/26-106020.xml -o avis.xml
2. Le format
- Depuis 2024, la plupart des avis suivent le standard européen eForms (UBL 2.3) dans une enveloppe
jo:ann. On y trouve l’objet, l’acheteur (cac:ContractingParty), les codes CPV (cbc:ItemClassificationCode), la valeur estimée, la date limite et le lieu d’exécution. - Certains avis utilisent encore l’ancien format BOAMP. Prévoyez les deux.
- Les schémas officiels sont dans
/OPENDATA/BOAMP/Schemas/.
3. Pourquoi les fichiers et pas l’API OpenDataSoft
Le portail OpenDataSoft du BOAMP propose une API, mais son robots.txt interdit /api/ aux robots. Les fichiers de la DILA n’ont pas cette restriction, et c’est la source officielle de réutilisation indiquée sur data.gouv.fr.
4. Extraire en CSV (Python)
import csv, re, httpx, xml.etree.ElementTree as ET
day = "https://echanges.dila.gouv.fr/OPENDATA/BOAMP/2026/11/02/"
ids = sorted(set(re.findall(r'href="(\d{2}-\d+\.xml)"', httpx.get(day).text)))
loc = lambda t: t.split("}")[-1]
with open("boamp.csv", "w", newline="", encoding="utf-8") as f:
w = csv.writer(f); w.writerow(["avis", "objet", "cpv"])
for i in ids[:20]: # soyez raisonnable : un petit délai entre les fichiers
root = ET.fromstring(httpx.get(day + i).content)
names = [e.text for e in root.iter() if loc(e.tag) == "Name" and e.text]
cpv = [e.text for e in root.iter() if loc(e.tag) == "ItemClassificationCode" and e.text]
w.writerow([i[:-4], names[0] if names else "", cpv[0] if cpv else ""])
Le premier champ Name n’est pas toujours l’objet du marché : en production, ciblez cac:ProcurementProject/cbc:Name.
5. Sans code
Le France Public Tenders Scraper (BOAMP) sur Apify lit ces mêmes fichiers de la DILA et gère les deux formats. Il filtre par période, CPV, mots-clés, départements, type d’avis et valeur minimale, puis exporte en CSV, Excel ou JSON, éventuellement chaque jour. Vous payez par avis.
Obtenir les avis BOAMP en CSV / API →
FAQ
La réutilisation commerciale est-elle autorisée ? Oui, sous Licence Ouverte 2.0, en mentionnant la source (BOAMP, DILA).
Les avis contiennent-ils des données personnelles ? Ils peuvent contenir le nom et les coordonnées d’un contact chez l’acheteur. Si vous les réutilisez, le RGPD s’applique. Notre outil ne les extrait pas.
Quelle fréquence ? Un dossier par jour de publication (environ 150 à 250 avis par jour ouvré).
Source : BOAMP, DILA, Licence Ouverte 2.0. Exemples testés le 2026-11-03.