Ce que contient l'API, comment les champs sont structurés, ce sur quoi vous pouvez compter, et à quelle fréquence les données arrivent.
TenderAPI agrège deux sources officielles de marchés publics :
FR, DE, IT, ES, UK.2,5 M+ tenders (avis publiés) et 1,7 M+ awards (résultats d'attribution) à date.
L'API expose deux ressources principales :
tenders — les avis publiés (appels d'offres ouverts ou clôturés).awards — les résultats d'attribution (qui a gagné, pour combien, quand).country suit la norme ISO 3166-1 alpha-2 (FR, DE, IT, ES, UK…).2026-05-21T08:00:00Z).cpv_codes et cpv_family sont des tableaux JSON de codes CPV (Common Procurement Vocabulary).descripteur_libelles_folded est une version normalisée (minuscules, sans accents) pour la recherche FTS (Full-Text Search).keyword= est le paramètre canonique (FTS5 multi-tokens AND, accent-insensible). Les alias q= et search= sont acceptés pour convention REST. Pour une recherche OR explicite : keyword=BIM OR "maquette numerique". Listes virgule/pipe non parsées comme OR — utilisez le mot-clé OR.GB est aliasé vers UK (convention TED legacy).awarded_at_sourcePour chaque award, ce champ indique d'où vient la date d'attribution. C'est utile pour interpréter la précision de awarded_at :
eForms — date exacte de décision (notices TED post juin 2024).ted_legacy_decision — date de conclusion du contrat extraite du XML legacy.ted_legacy_publication — utilisé en repli quand la date de décision est absente ou aberrante côté source : on prend alors la date de publication de la notice.boamp_pub_legacy et variantes — dates issues de la chaîne BOAMP.Les taux ci-dessous indiquent la proportion de lignes où le champ est renseigné, mesurée sur la totalité du corpus actuel. Ils dépendent essentiellement du format imposé par la source à l'autorité contractante au moment de la publication.
| Champ | BOAMP | TED legacy | TED eForms |
|---|---|---|---|
title | 100% | 100% | 100% |
buyer_name | 100% | 100% | 100% |
cpv_codes | 62% | 100% | 100% |
buyer_siret | 77% | 16% | 95% |
deadline | 86% | 95% | 89% |
budget_max | 0% | 38% | 6% |
department (FR) | 100% | 91% | 95% |
| Champ | BOAMP | TED legacy | TED eForms |
|---|---|---|---|
winner_name | 91% | 85% | 100% |
winner_siret | 74% | 14% | 94% |
amount | 78% | 78% | 96% |
awarded_at | 95% | 100% | 100% |
budget_max = 0% sur BOAMP : le format BOAMP n'expose pas de champ budget structuré. Le montant n'est connu qu'à l'attribution (champ amount dans /awards).buyer_siret et winner_siret faibles en TED legacy (~14-16%) : le format XML pré-2024 publié par TED n'exige pas l'identifiant SIRET français. Ce champ devient quasi systématique avec le format eForms (~95%).cpv_codes = 62% sur BOAMP : une partie des avis BOAMP anciens publient des descripteurs textuels sans code CPV machine-lisible. Pour ces lignes, descripteur_libelles reste exploitable via la recherche FTS.budget_max faible sur eForms (6%) : le format eForms rend le champ optionnel et la majorité des autorités contractantes ne le renseignent pas. Le montant final reste disponible côté /awards.department sur TED : la déduction du département français s'appuie d'abord sur le code NUTS3 fourni par la notice, complétée par un mapping buyer_siret → INSEE commune → département (via SIRENE). Le résidu (~5-9%) correspond aux avis sans NUTS3 ni SIRET acheteur exploitable.
Ces taux reflètent ce que les sources officielles publient effectivement, et constituent une limite intrinsèque à ces sources — pas de notre traitement. Pour les lignes où un champ est null, c'est qu'il était absent ou non parsable dans la donnée source.
L'ingestion des nouvelles publications est entièrement automatisée :
La latence typique entre la publication officielle d'un avis et sa disponibilité dans l'API est inférieure à 24 heures.
Chaque jour, les tenders dont la date limite de remise des offres est dépassée basculent automatiquement de status="open" à status="closed". Les avis sans date limite renseignée (rectificatifs, accords-cadres permanents, anciens MAPA) restent en open par défaut — pour les exclure, ajoutez deadline_after=now à votre requête.