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

Exemples de réponses

Sur cette page

Cette page rassemble les réponses JSON d'exemple, les appels curl et les tableaux de champs de chaque route. Les paramètres, les codes d'erreur et le détail du comportement de chaque route sont dans la référence de l'API.

Toutes les routes sont en GET. Les réponses sont en application/json, jamais mises en cache par un intermédiaire (Cache-Control: private, no-store). Dans les exemples, le début des adresses de fiches du site (champs liens) est abrégé en https://… : la vraie réponse contient l'adresse complète de la fiche sur le site PublikConnect.

GET /avis

bash
curl -H "X-API-Key: $PK_API_KEY" \
  "https://publikconnect.fr/api/v1/avis?q=voirie&departement=69&type_marche=travaux&per_page=1"
json
{
  "data": [
    {
      "id": "6f1c2a52-8d0e-4b8c-9a55-2d6f6a1b7c10",
      "source": "boamp",
      "titre": "Travaux de réfection de voirie, secteur nord",
      "acheteur": { "nom": "Commune d'Exemple", "siret": "21690123400012", "departement": "69" },
      "date_publication": "2026-10-02T00:00:00+00:00",
      "date_limite": "2026-11-14T10:00:00+00:00",
      "statut": "ouvert",
      "cpv": ["45233140"],
      "type_marche": "Travaux",
      "procedure": "MAPA",
      "budget": 180000,
      "description": "Réfection des chaussées et trottoirs de six rues du secteur nord…",
      "lien_source": "https://www.boamp.fr/avis/detail/26-000000",
      "licence": "Licence Ouverte 2.0",
      "mention": "Source : BOAMP, DILA",
      "mis_a_jour": "2026-10-03T06:12:44+00:00",
      "publie_aussi_sur": [{ "source": "marchesonline", "lien": "https://www.marchesonline.com/..." }],
      "origines": { "budget": { "origine": "jumeau", "source": "marchesonline" } },
      "liens": { "acheteur": "https://…/acheteurs/21690123400012?src=api" }
    }
  ],
  "meta": { "page": 1, "per_page": 1, "total": 37, "total_exact": true }
}

En mode curseur, la méta est { "per_page": 50, "curseur_suivant": "…", "total": 48210, "synchronise_jusqu_a": "2026-10-08T09:50:00.000Z" } : curseur_suivant vaut null sur la dernière page, total n'est donné que sur la première, et synchronise_jusqu_a est la valeur à repasser dans updated_since.

Complétude

Les quatre champs de complétude de chaque avis (la règle de calcul est décrite dans la référence de GET /avis) :

ChampValeur
completudeEntier de 0 à 100 : 100 moins 10 points par champ absent.
completude_version1. Elle changera si la règle change.
champs_manquantsNoms des champs absents, tels qu'ils figurent ci-dessus (liste vide si l'avis est complet).
nb_lotsNombre de lots déclarés, null si inconnu.

GET /avis/{id}

Champs ajoutés à ceux d'un élément de GET /avis :

ChampValeur
lotsListe, dans l'ordre des numéros : { numero, description, budget, cpv[] }. Vide si aucun lot n'est déclaré.
criteres{ selection, attribution } : objets JSON libres, rendus tels que la base les porte (selection : critères de sélection des candidatures ; attribution : critères d'attribution et leur pondération), ou null.
duree_moisDurée du marché en mois, ou null.
lieu_execution{ departements[], code_nuts } : départements d'exécution (codes comme acheteur.departement) et code NUTS, ou null.
date_debut_prestationAAAA-MM-JJ ou null.
forme_prixForme du prix (ferme, revisable, ferme_actualisable, autre) ou null.
url_profil_acheteurAdresse http(s) du profil acheteur, sinon null.
renseignements_complementairesTexte ou null.
capacites{ economique, technique, exercice } : capacités exigées des candidats, texte ou null.
bash
curl -H "X-API-Key: $PK_API_KEY" \
  https://publikconnect.fr/api/v1/avis/6f1c2a52-8d0e-4b8c-9a55-2d6f6a1b7c10
json
{
  "data": {
    "id": "6f1c2a52-8d0e-4b8c-9a55-2d6f6a1b7c10",
    "source": "boamp",
    "titre": "Travaux de réfection de voirie, secteur nord",
    "acheteur": { "nom": "Commune d'Exemple", "siret": "21690123400012", "departement": "69" },
    "date_publication": "2026-10-02T00:00:00+00:00",
    "date_limite": "2026-11-14T10:00:00+00:00",
    "statut": "ouvert",
    "cpv": ["45233140"],
    "type_marche": "Travaux",
    "procedure": "MAPA",
    "budget": 180000,
    "description": "Réfection des chaussées et trottoirs de six rues du secteur nord…",
    "lien_source": "https://www.boamp.fr/avis/detail/26-000000",
    "licence": "Licence Ouverte 2.0",
    "mention": "Source : BOAMP, DILA",
    "mis_a_jour": "2026-10-03T06:12:44+00:00",
    "version": "2026-10-03T06:12:44.512003Z",
    "completude": 90,
    "completude_version": 1,
    "champs_manquants": ["nb_lots"],
    "nb_lots": null,
    "publie_aussi_sur": [],
    "origines": {},
    "liens": { "acheteur": "https://…/acheteurs/21690123400012?src=api" },
    "lots": [],
    "criteres": { "selection": null, "attribution": { "prix": 60, "valeur technique": 40 } },
    "duree_mois": 24,
    "lieu_execution": { "departements": ["69"], "code_nuts": "FRK26" },
    "date_debut_prestation": "2027-01-15",
    "forme_prix": "ferme",
    "url_profil_acheteur": "https://www.exemple-marches.fr/profil",
    "renseignements_complementaires": null,
    "capacites": { "economique": null, "technique": null, "exercice": null }
  }
}

GET /opportunites

bash
curl -H "X-API-Key: $PK_API_KEY" \
  "https://publikconnect.fr/api/v1/opportunites?score_min=60&per_page=1"

La réponse a la même enveloppe { "data": [...], "meta": {...} } et la même forme d'avis que /avis (complétude, version, publie_aussi_sur et origines compris). Les avis d'une source non servie sont écartés de la page : meta.total peut alors dépasser le nombre d'avis renvoyés. Chaque élément porte en plus :

ChampSens
scoreScore de pertinence du profil, 0 à 100.
raisonsPourquoi ce score ; les clés possibles sont distance, metier, budget et mode.
verdictVerdict du juge métier sur cet avis pour ce profil : { "valeur": "oui" | "incertain" | "non", "raison": "…" ou null }, ou null si l'avis n'a jamais été jugé.
statut_utilisateurStatut posé par l'utilisateur dans l'application (une des neuf valeurs ci-dessus). Lecture seule : l'API n'écrit aucun statut.
vu_leDate de première consultation par l'utilisateur, ou null.
json
{
  "id": "6f1c2a52-8d0e-4b8c-9a55-2d6f6a1b7c10",
  "score": 82,
  "raisons": { "metier": "Votre activité de signalisation correspond au CPV 45233140", "distance": "À 24 km de votre établissement" },
  "verdict": { "valeur": "incertain", "raison": "Objet du marché peu précis" },
  "statut_utilisateur": "viewed",
  "vu_le": "2026-10-07T09:12:00+00:00"
}

(Seuls les champs propres au fil sont montrés ici, en plus des champs de /avis.)

GET /prestataires

bash
curl -H "X-API-Key: $PK_API_KEY" \
  "https://publikconnect.fr/api/v1/prestataires?q=voirie&departement=69&per_page=1"
json
{
  "data": [
    {
      "slug": "exemple-voirie-12345678901234",
      "nom": "EXEMPLE VOIRIE",
      "siret": "12345678901234",
      "siren": "123456789",
      "taille": "PME",
      "nb_contrats": 18,
      "montant_median": 95000,
      "cpv_principal": "45233140",
      "nb_etablissements": 2,
      "liens": { "fiche": "https://…/prestataires/exemple-voirie-12345678901234?src=api" }
    }
  ],
  "meta": { "page": 1, "per_page": 1, "total": 1, "total_exact": true }
}

GET /prestataires/{slug}

bash
curl -H "X-API-Key: $PK_API_KEY" \
  https://publikconnect.fr/api/v1/prestataires/exemple-voirie-12345678901234
json
{
  "data": {
    "slug": "exemple-voirie-12345678901234",
    "nom": "EXEMPLE VOIRIE",
    "siret": "12345678901234",
    "siren": "123456789",
    "type": "decp",
    "statistiques": {
      "total_marches": 18,
      "montant_total": 2450000,
      "montant_median": 95000,
      "croissance_12m": 12.5,
      "dernier_marche": "2026-09-12",
      "cpv_principaux": [{ "code": "45233140", "nombre": 11 }],
      "departements": [{ "code": "69", "nombre": 14 }, { "code": "01", "nombre": 4 }],
      "co_traitants": [{ "siret": "98765432109876", "nom": "EXEMPLE SIGNALISATION", "marches_communs": 3 }]
    },
    "derniers_marches": [
      {
        "objet": "Réfection de voirie communale",
        "montant": 120000,
        "acheteur": "COMMUNE D'EXEMPLE",
        "date_notification": "2026-09-12",
        "procedure": "Procédure adaptée"
      }
    ],
    "principaux_acheteurs": [
      { "siret": "21690123400019", "nom": "COMMUNE D'EXEMPLE", "nb_contrats": 6, "montant_total": 640000 }
    ],
    "contrats_a_echeance": [
      {
        "uid": "exemple-uid-1",
        "objet": "Entretien de la voirie communale",
        "acheteur": { "siret": "21690123400019", "nom": "COMMUNE D'EXEMPLE" },
        "date_notification": "2025-12-01",
        "duree_mois": 12,
        "fin_estimee": "2026-12-01",
        "estimation": true
      }
    ]
  }
}

GET /acheteurs/{siret}

Champs de la réponse :

ChampValeur
siret, siren, nomIdentité de la fiche rendue.
typeCatégorie d'organisme : Commune, EPCI / Métropole, Département, Région, État, Établissement public, Autre organisme ou Organisme public.
departement, villeCode de département officiel (comme acheteur.departement d'un avis) et ville, null si inconnus.
statistiquesHistorique de marchés (données essentielles de la commande publique) : nb_contrats, montant_total, montant_median, duree_moyenne_mois, part_pme et nb_offres_moyen (sur les 24 derniers mois), procedures et cpv_principaux ([{ procedure | code, nombre }], 5 au plus, les plus fréquents), croissance_12m (variation du montant en pourcentage) et dernier_contrat (date). Chaque mesure vaut null quand elle n'est pas calculable. statistiques vaut null quand l'acheteur n'a pas d'historique : c'est le cas d'environ un tiers des acheteurs.
principaux_titulaires10 au plus, par nombre de contrats : { siret, nom, nb_contrats }. Les titulaires non diffusibles (RGPD) sont écartés. siret vaut null s'il n'est pas connu.
avis_ouvertsNombre d'avis ouverts de l'acheteur dans les sources servies à votre clé, sans doublons ni avis d'attribution.
liens.ficheLa fiche publique du site, https://…/acheteurs/<siret>?src=api.
bash
curl -H "X-API-Key: $PK_API_KEY" \
  https://publikconnect.fr/api/v1/acheteurs/21380185500015
json
{
  "data": {
    "siret": "21380185500015",
    "siren": "213801855",
    "nom": "COMMUNE D'EXEMPLE",
    "type": "Commune",
    "departement": "38",
    "ville": "Exemple",
    "statistiques": {
      "nb_contrats": 42,
      "montant_total": 1250000,
      "montant_median": 18000,
      "duree_moyenne_mois": 14.5,
      "part_pme": 61.2,
      "nb_offres_moyen": 3.4,
      "procedures": [{ "procedure": "Procédure adaptée", "nombre": 30 }, { "procedure": "Appel d'offres ouvert", "nombre": 12 }],
      "cpv_principaux": [{ "code": "45233140", "nombre": 20 }],
      "croissance_12m": -4.5,
      "dernier_contrat": "2026-09-12"
    },
    "principaux_titulaires": [{ "siret": "12345678901234", "nom": "EXEMPLE VOIRIE", "nb_contrats": 7 }],
    "avis_ouverts": 3,
    "liens": { "fiche": "https://…/acheteurs/21380185500015?src=api" }
  }
}

GET /attributions

bash
curl -H "X-API-Key: $PK_API_KEY" \
  "https://publikconnect.fr/api/v1/attributions?acheteur_siret=21380185500015&limite=2"

GET /contrats

bash
curl -H "X-API-Key: $PK_API_KEY" \
  "https://publikconnect.fr/api/v1/contrats?titulaire_siren=911111111&q=voirie&limite=2"
json
{
  "data": [
    {
      "uid": "2026-1234-00",
      "objet": "Travaux de voirie",
      "acheteur": { "siret": "21380185500015", "nom": "COMMUNE D'EXEMPLE", "departement": "38" },
      "titulaire": { "siret": "91111111100011", "nom": "EXEMPLE VOIRIE", "departement": "69", "categorie": "PME" },
      "non_diffusible": false,
      "montant": 125000.5,
      "cpv": "45233140",
      "nature": "Marché",
      "procedure": "Procédure adaptée",
      "date_notification": "2026-09-15",
      "duree_mois": 12,
      "fin_estimee": { "date": "2027-09-15", "estimation": true },
      "lieu_execution": "38185",
      "offres_recues": 3,
      "forme_prix": "Ferme",
      "sous_traitance_declaree": false,
      "considerations": { "sociales": null, "environnementales": null },
      "marche_innovant": false
    }
  ],
  "meta": { "limite": 2, "curseur_suivant": "eyJ2IjoiMjAyNi0wOS0xNVQwMDowMDowMC4wMDAwMDBaIiwi…", "total": 14 }
}

GET /departements

bash
curl -H "X-API-Key: $PK_API_KEY" https://publikconnect.fr/api/v1/departements
json
{
  "data": [
    { "code": "01", "nom": "Ain", "avis_ouverts": 41 },
    { "code": "02", "nom": "Aisne", "avis_ouverts": 23 }
  ]
}

GET /sources

Champs de chaque source :

ChampValeur
code, libelleCode publié (celui de avis[].source et du paramètre source) et nom de la source.
categorieofficielle, plateforme_acheteurs ou agregateur.
licence, mentionLicence de la source et mention à afficher.
actiffalse : source coupée. Elle reste listée, ses avis ne sont plus servis.
rediffusableLa licence autorise la rediffusion. Une clé d'usage rediffusion ne voit que ces sources.
derniere_ingestionDate ISO 8601 du dernier avis ingéré, null si la source n'a aucun avis.
avis_ouvertsAvis ouverts servis, doublons exclus.
completude_moyenneComplétude moyenne (0 à 100) des avis ouverts, calculée sur les champs publiés par la source elle-même (sans reprise des doublons) ; null sans avis ouvert.
bash
curl -H "X-API-Key: $PK_API_KEY" https://publikconnect.fr/api/v1/sources
json
{
  "data": [
    {
      "code": "boamp",
      "libelle": "BOAMP",
      "categorie": "officielle",
      "licence": "Licence Ouverte 2.0",
      "mention": "Source : BOAMP, DILA",
      "actif": true,
      "rediffusable": true,
      "derniere_ingestion": "2026-10-08T07:30:00.123Z",
      "avis_ouverts": 1200,
      "completude_moyenne": 82
    }
  ]
}

GET /moi

bash
curl -H "X-API-Key: $PK_API_KEY" https://publikconnect.fr/api/v1/moi
json
{
  "data": {
    "cle": {
      "prefixe": "pk_live_AbCd1234",
      "nom": "Cabinet X",
      "perimetres": ["avis:read", "opportunites:read"],
      "usage": "interne",
      "creee_le": "2026-10-01T09:30:00.000Z"
    },
    "plan": "pro",
    "quota": {
      "general": { "limite": 50000, "consomme": 1200, "restant": 48800, "reinitialise_le": "2026-10-09T00:00:00.000Z" },
      "decp": { "limite": 2000, "consomme": 0, "restant": 2000, "reinitialise_le": "2026-10-09T00:00:00.000Z" }
    },
    "cles_actives": 2,
    "cles_max": 5
  }
}

GET /sante

bash
curl https://publikconnect.fr/api/v1/sante
json
{
  "data": {
    "statut": "ok",
    "base": "ok",
    "derniere_ingestion": "2026-10-08T05:12:44.000Z",
    "sources_actives": 18,
    "synchronisation": { "derniere_passe": "2026-10-08T05:20:03.000Z", "lignes_reparees": 0 },
    "version_api": "1"
  }
}

Champs de la réponse :

ChampSens
statutok, ou degrade : la base ne répond pas, l'API est coupée, aucune ingestion n'est connue, la dernière date de plus de 36 heures, la dernière passe de synchronisation date de plus de 3 heures, ou les deux dernières passes ont chacune dû réparer des lignes (le déclencheur manque des écritures).
baseok ou ko (injoignable, ou API coupée).
derniere_ingestionDate du dernier avis ingéré (ISO 8601), null si inconnue.
sources_activesNombre de sources du registre actuellement servies.
synchronisationderniere_passe : date de la dernière passe horaire qui tient à jour les versions des avis (ISO 8601), null si elle n'a jamais tourné (cela ne dégrade pas statut à lui seul) ; lignes_reparees : lignes corrigées par cette passe.
version_apiVersion de l'API : "1".

GET /openapi.json

bash
curl https://publikconnect.fr/api/v1/openapi.json
json
{ "openapi": "3.1.0", "info": { "title": "API publique PublikConnect", "version": "1.0.0-beta" }, "paths": { "…": "…" } }

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é.