Veille concurrentielle : qui remporte les marchés auxquels vous répondez

Les attributions publiées dans les données essentielles de la commande publique (DECP), en JSON : quel titulaire, quel acheteur, combien d’offres reçues, quel montant. Pour choisir les consultations auxquelles répondre, situer vos prix face au titulaire sortant et suivre vos concurrents.

Les questions d’une équipe de réponse aux appels d’offres

  • Qui remporte les marchés de cet acheteur dans ma catégorie, et pour combien ? Filtrez par buyer et par préfixe CPV (cpv=45 : travaux ; 45233 : travaux routiers).
  • Qu’a remporté un concurrent cette année ? Retrouvez son identifiant par son SIREN, puis filtrez par company_id : il couvre tous ses établissements, alors que le SIRET (nif) n’en vise qu’un.
  • Faut-il répondre ? bids_received sur chaque attribution : un acheteur dont les marchés reçoivent une seule offre est soit une ouverture, soit un terrain verrouillé, et l’historique dit lequel.
  • Le titulaire sortant est-il solide ? company_id relie l’attribution à la fiche de l’entreprise : statut, comptes déposés, procédures collectives publiées.

Concurrents et concurrence, en quelques lignes

import requests

BASE = 'https://api.prometiam.com/functions/v1/risk-api'
H = {'Authorization': 'Bearer rk_live_...'}

def attributions(**filtres):
    cursor = None
    while True:
        p = {**filtres, 'limit': 100, **({'cursor': cursor} if cursor else {})}
        r = requests.get(f'{BASE}/procurement/awards', headers=H, params=p)
        r.raise_for_status()
        body = r.json()
        yield from body['data']
        cursor = (body.get('pagination') or {}).get('next_cursor')
        if not cursor:
            break

# Un concurrent : son SIREN donne son identifiant, qui couvre tous ses établissements
c = requests.get(f'{BASE}/companies/search', headers=H,
                 params={'country': 'FR', 'siren': '398762211'}).json()['data'][0]
gains = [a for a in attributions(country='FR', company_id=c['id'], date_from='2025-01-01')
         if not a['amount_is_ceiling']]
print(c['company_name'], len(gains), 'attributions,', round(sum(a['amount_eur'] or 0 for a in gains)), '€')

# Un acheteur : part de ses marchés de travaux attribués sur une seule offre
lots = list(attributions(country='FR', buyer='Toulouse', cpv='45', date_from='2025-01-01'))
seule = sum(1 for a in lots if a['bids_received'] == 1)
print(len(lots), 'attributions,', seule, 'sur une seule offre')

Ce que contient chaque attribution

Une ligne est une attribution à un titulaire : le montant est sa part telle que publiée, hors taxes quand la source le distingue, et amount_contract_eur le marché entier. Un plafond d’accord-cadre est signalé par amount_is_ceiling : laissez-le hors de toute comparaison de prix. En France, la plupart des attributions donnent le nombre d’offres reçues, mais les DECP ne publient pas d’estimation, donc pas de calcul de rabais ; en Espagne, oui. Les attributions à des personnes physiques ne sont jamais renvoyées.

Le même appel couvre l’Espagne (Plataforma de Contratación del Sector Público, y compris les marchés de faible montant), le Royaume-Uni (Contracts Finder et Find a Tender) et, au-dessus des seuils européens, l’Irlande, la Pologne et la Norvège (TED).

Ce que ce n’est pas

  • Pas une veille des appels d’offres en cours. Nous servons des attributions, c’est-à-dire des résultats : pour les consultations ouvertes, voyez le BOAMP et les profils d’acheteur.
  • Pas de note sur les candidats. Les scores bêta des acheteurs publics (France et Espagne) décrivent l’acheteur, jamais une entreprise candidate.

Pour vérifier fournisseurs et acheteurs plutôt que préparer des réponses, la même API est décrite sur la page API marchés publics.

Combien ça coûte

Chaque appel coûte 2 crédits et renvoie jusqu’à 100 attributions ; les erreurs ne coûtent rien. Une année d’attributions d’un acheteur dans une catégorie tient en général en quelques appels. Starter coûte 9,99 € par mois pour 1 000 crédits, Professional 29,99 € pour 10 000 et Scale 99,99 € pour 50 000. L’essai gratuit dure 14 jours avec 500 crédits : une carte bancaire est demandée et rien n’est prélevé pendant l’essai.

Pages associées

Démarrez votre essai gratuit de 14 jours · Documentation de l’API

L’essai dure 14 jours et comprend 500 crédits. Une carte bancaire est demandée, rien n’est prélevé pendant l’essai ; ensuite l’offre Starter (9,99 € par mois) s’applique, sauf résiliation.

Frequently asked questions

Publiez-vous les appels d’offres en cours ?
Non. Nous servons les attributions : qui a gagné, quel acheteur, le montant et le nombre d’offres. Les consultations ouvertes se trouvent au BOAMP et sur les profils d’acheteur.
D’où viennent les données françaises ?
Des données essentielles de la commande publique (DECP) consolidées, que les acheteurs publient pour leurs marchés.
Peut-on calculer le rabais par rapport à l’estimation ?
Pas en France : les DECP ne publient pas d’estimation. En Espagne, presque chaque attribution donne le budget de base, et en Irlande la plupart.
Que coûte un appel ?
2 crédits pour jusqu’à 100 attributions. Les erreurs ne coûtent rien.