Version bêta : des champs peuvent être ajoutés sans préavis. Aucun champ n'est renommé ni retiré dans /api/v1. Statut et versions

Avis

Sur cette page

GET /avis

Rechercher des avis de marché

Identifiant d'opération : searchAvis

Les avis de toutes les sources actives du registre (18 à ce jour : officielles, plateformes d'acheteurs, agrégateurs), sans fenêtre de publication. Les doublons entre sources sont filtrés : un même avis publié sur plusieurs plateformes n'apparaît qu'une fois. Chaque avis porte le code de sa source (source), sa licence et la mention à afficher ; lien_source renvoie à l'avis d'origine, version (texte à la microseconde) dit où il en est de sa synchronisation et avance quand un champ servi change. Cette liste ne dépend pas du profil de la clé ; le fil classé par score est GET /opportunites. C'est la réponse à « quels marchés sont ouverts ? ». Paramètres : tous facultatifs, aucun autre n'est accepté, aucun ne peut être répété ; profil, score_min, montant_min, date_min et date_max n'existent pas ici et donnent un 400. Deux modes. MODE PAGE, dès que q, tri ou page est fourni : recherche, ouverts par défaut (statut), triés par date limite, limitée à 1000 résultats par recherche (meta.total_exact vaut false au-delà). MODE CURSEUR, par défaut : parcours de tous les avis par version croissante, pour copier la liste puis ne redemander que ce qui a changé. Page suivante : meta.curseur_suivant dans curseur (null à la dernière page) ; meta.total seulement sur la première page. En mode curseur, meta porte per_page, curseur_suivant, total et synchronise_jusqu_a (la valeur à repasser dans updated_since). Reprise des changements : updated_since = meta.synchronise_jusqu_a de la synchronisation précédente (30 jours au plus). Avec updated_since, tous les statuts sont rendus, et un avis qui n'est plus servi est rendu RÉDUIT : { id, statut: "retire", motif_retrait, canonique_id, version }, motif_retrait valant doublon (voir canonique_id), supprime ou source_coupee. Une marge de 10 minutes sépare le parcours des écritures : un avis tout juste publié apparaît en mode curseur au bout de 10 minutes. Chaque avis retiré compte comme un enregistrement servi dans le quota. acheteur.siret vaut null quand l'avis n'en porte pas. statut vaut clos quand la date limite est passée, que l'avis a été clos par lien, ou qu'il n'a pas de date limite et date de plus de 180 jours. Chaque avis dit à quel point il est renseigné, sur dix champs de même poids : description, budget, date_limite, cpv, acheteur.siret, acheteur.departement, type_marche, procedure, lien_source et nb_lots (au moins un lot déclaré). completude est un entier de 0 à 100 (100 moins 10 points par champ absent), completude_version vaut 1 (elle changera si la règle change), champs_manquants nomme les champs absents (liste vide si l'avis est complet) et nb_lots compte les lots déclarés (null si inconnu) ; ces quatre champs figurent sur chaque avis de GET /avis, de GET /avis/{id} et de GET /opportunites, et completude_min filtre. La complétude est calculée sur les champs servis : un budget, une description ou un SIRET repris d'un doublon (voir origines) compte comme présent. Celle d'une source dans GET /sources (completude_moyenne) est différente : elle compte les champs publiés par la source elle-même, sans reprise des doublons. Chaque avis non retiré porte liens.acheteur, l'adresse de la fiche publique de son acheteur sur le site (de la forme https://…/acheteurs/<siret>?src=api) ; elle vaut null quand acheteur.siret n'est pas un SIRET à 14 chiffres. Le paramètre src=api de ce lien permet à PublikConnect de mesurer le trafic que l'API apporte au site : conservez-le tel quel. Le lien peut renvoyer une page introuvable (404) dans moins de 1 % des cas : le SIRET de certains avis n'a pas de fiche acheteur. Les données de la fiche sont dans GET /acheteurs/{siret}. La forme réduite d'un avis retiré n'a pas de liens. Le contrat est en version bêta : des champs peuvent être ajoutés sans préavis, aucun n'est renommé ni retiré dans /api/v1. Périmètre requis : avis:read (403 si la clé ne le porte pas). Quota : réserve per_page enregistrements (1 pour un détail) de la famille general ; 429 quota_exceeded une fois la limite journalière atteinte.

Clé requise, périmètre avis:read.

Paramètres

NomEmplacementObligatoireTypeDescription
qquerynonstringMode page. Mots recherchés dans le titre et le nom de l'acheteur (200 caractères au plus).
sourcequerynonstringCodes de sources séparés par des virgules (boamp,aji ; 18 au plus, sans doublon). Un code inconnu ou non servi donne 400. Toutes les sources servies par défaut. En mode curseur, une source coupée est acceptée : ses avis ressortent « retirés ».
departementquerynonstringCodes de département séparés par des virgules (01 à 95, 2A, 2B, 971 à 978, 986 à 988 ; 20 au plus). Lieu d'exécution déclaré par l'acheteur.
cpvquerynonstringPréfixe de code CPV, de 2 à 8 chiffres (45 : tous les travaux de bâtiment et de génie civil).
type_marchequerynonstringNature du marché : Travaux, Services ou Fournitures (casse indifférente).
budget_minquerynonstringBudget minimal en euros (entier). Ne peut pas dépasser budget_max.
budget_maxquerynonstringBudget maximal en euros (entier).
date_limite_minquerynonstringDate limite de réponse minimale (AAAA-MM-JJ), incluse. Ne peut pas dépasser date_limite_max.
date_limite_maxquerynonstringDate limite de réponse maximale (AAAA-MM-JJ), incluse.
publie_depuisquerynonstringDate de publication minimale (AAAA-MM-JJ), incluse.
completude_minquerynonstringComplétude servie minimale, entier de 0 à 100 (completude d'un avis, par pas de 10) : n'est rendu que ce qui l'atteint. Valable dans les deux modes. Un avis qui passe sous le seuil n'est plus servi : il n'est pas rendu « retiré ».
statutquerynonouvert, clos, tousouvert (par défaut) : date limite à venir ou absente ; clos : date limite passée ou avis clos ; tous. Refusé avec updated_since, qui sert tous les statuts.
triquerynondate_limite, publicationMode page. date_limite (échéance la plus proche d'abord) ou publication (plus récents d'abord). date_limite si statut=ouvert, sinon publication.
pagequerynonstringMode page. Numéro de page, à partir de 1 (1 par défaut). page × per_page ne peut pas dépasser 1000.
per_pagequerynonstringRésultats par page : 20 par défaut en mode page, 50 en mode curseur, 100 au plus.
curseurquerynonstringMode curseur. Valeur de meta.curseur_suivant de la page précédente, à repasser telle quelle avec les mêmes filtres et le même updated_since. Un curseur illisible ou employé avec d'autres filtres donne 400 invalid_cursor. Incompatible avec q, tri et page.
updated_sincequerynonstringMode curseur. Date-heure ISO 8601 avec fuseau (2026-10-08T10:00:00Z) : ne rend que les avis nouveaux, modifiés ou retirés depuis, tous statuts. À prendre dans meta.synchronise_jusqu_a de la synchronisation précédente. Plus de 30 jours dans le passé : 400 resync_required ; dans le futur : 400. Incompatible avec statut, q, tri et page. Jamais mis en cache.

Réponses

CodeDescription
200Succès.
400invalid_parameter : Paramètre invalide. ; invalid_cursor : Curseur invalide : repartez de la première page, sans curseur, avec les mêmes filtres. ; resync_required : Fenêtre de synchronisation dépassée (30 jours) : refaites une copie complète, sans updated_since. ; page_too_deep : Page trop profonde : affinez votre recherche.
401unauthorized : Clé d'API manquante ou invalide.
403forbidden : Accès refusé : compte non Pro ou périmètre de la clé insuffisant.
429quota_exceeded : Quota journalier atteint. Il se renouvelle à minuit UTC. ; rate_limited : Trop de requêtes. Réessayez plus tard.
503unavailable : Service momentanément indisponible.

Exemple

bash
curl -H "X-API-Key: pk_live_VOTRE_CLE" "https://publikconnect.fr/api/v1/avis"

GET /avis/{id}

Détail d'un avis

Identifiant d'opération : getAvis

Un avis par identifiant (UUID, celui de GET /avis ou de GET /opportunites) : l'élément de GET /avis (complétude et version comprises), avec la description COMPLÈTE (sans coupe), plus lots (dans l'ordre des numéros : numéro, description, budget, CPV ; liste vide si aucun lot n'est déclaré), criteres (selection : critères de sélection des candidatures ; attribution : critères d'attribution et leur pondération ; objets JSON libres, rendus tels que la base les porte, ou null), duree_mois (durée du marché en mois, ou null), lieu_execution (departements : départements d'exécution, codes comme acheteur.departement, et code_nuts, ou null), date_debut_prestation (AAAA-MM-JJ ou null), forme_prix (ferme, revisable, ferme_actualisable, autre ou null), url_profil_acheteur (adresse http(s) du profil acheteur, sinon null), renseignements_complementaires (texte ou null) et capacites (economique, technique, exercice : capacités exigées des candidats, texte ou null). Un avis qui n'est plus servi (doublon ou source coupée) répond 200 sous la forme réduite { id, statut: "retire", motif_retrait, canonique_id, version }, motif_retrait valant doublon ou source_coupee. Un avis d'une source non visible de la clé, un avis d'attribution et un identifiant inconnu répondent tous 404 : la réponse est la même que pour un identifiant inconnu. Si la clé a aussi le périmètre opportunites:read et que l'avis a été noté pour le profil du compte, score et raisons sont joints ; sans ce périmètre ils sont absents. Le score et les raisons ne sortent que si l'avis figure dans le fil du compte propriétaire de la clé. La réponse n'est jamais gardée en mémoire. liens.acheteur renvoie à la fiche publique de l'acheteur (null sans SIRET d'acheteur à 14 chiffres ; le lien peut renvoyer 404 dans moins de 1 % des cas). Périmètre requis : avis:read (403 si la clé ne le porte pas). Quota : réserve per_page enregistrements (1 pour un détail) de la famille general ; 429 quota_exceeded une fois la limite journalière atteinte.

Clé requise, périmètre avis:read.

Paramètres

NomEmplacementObligatoireTypeDescription
idpathouistringIdentifiant de l'avis (UUID), tel que renvoyé par la recherche (GET /avis) ou par GET /opportunites.

Réponses

CodeDescription
200Succès.
400invalid_parameter : Paramètre invalide.
401unauthorized : Clé d'API manquante ou invalide.
403forbidden : Accès refusé : compte non Pro ou périmètre de la clé insuffisant.
404not_found : Ressource introuvable.
429quota_exceeded : Quota journalier atteint. Il se renouvelle à minuit UTC. ; rate_limited : Trop de requêtes. Réessayez plus tard.
503unavailable : Service momentanément indisponible.

Exemple

bash
curl -H "X-API-Key: pk_live_VOTRE_CLE" "https://publikconnect.fr/api/v1/avis/VOTRE_ID"

Demander une clé

  1. Avoir un compte Pro

    La clé est réservée aux comptes au plan Pro.

    Créer un compteVoir les offres

  2. Écrire au support

    support@publikconnect.fr

    Nous vérifions votre compte Pro puis vous répondons par e-mail avec votre clé.