GET /avis a deux modes. Le mode page (dès que q, tri ou page est fourni) est une recherche, limitée à 1 000 résultats. Le mode curseur (celui par défaut) parcourt tous les avis par version croissante : c'est lui qui sert à copier la liste dans votre base, puis à ne redemander que ce qui a changé.
- Copie complète. Appelez
GET /avis?per_page=100(sansupdated_since). Tant quemeta.curseur_suivantn'est pasnull, rappelez aveccurseur=<meta.curseur_suivant>, les mêmes filtres et le mêmeper_pagesi possible.meta.total(nombre d'avis du parcours) n'est donné que sur la première page. Par défaut seuls les avisouvertsont servis (statut=closoustatut=touspour les autres). - Retenez
meta.synchronise_jusqu_ade la dernière page. - Reprise. Plus tard, rappelez la même boucle avec
updated_since=<synchronise_jusqu_a retenu>: vous ne recevez que les avis nouveaux, modifiés ou retirés depuis. Tous les statuts sont servis (statutest refusé avecupdated_since). Retenez à nouveau lesynchronise_jusqu_ade la dernière page, même quand elle est vide. Un avis déjà copié qui passeclosrevient avecstatut: "clos": écrasez-le comme les autres.
bash
BASE=https://publikconnect.fr/api/v1
SINCE="" # vide pour la copie complète, sinon le synchronise_jusqu_a retenu à la synchronisation précédente
CURSEUR=""
while :; do
PAGE=$(curl -sf -H "X-API-Key: $PK_API_KEY" -G "$BASE/avis" \
--data-urlencode "per_page=100" \
${SINCE:+--data-urlencode "updated_since=$SINCE"} \
${CURSEUR:+--data-urlencode "curseur=$CURSEUR"}) || { echo "arrêt : relancez la même boucle"; exit 1; }
# À appliquer à votre base : "statut":"retire" => supprimer l'avis par id ; sinon l'écraser par id.
echo "$PAGE" | jq -c '.data[]' >> changements.jsonl
CURSEUR=$(echo "$PAGE" | jq -r '.meta.curseur_suivant // empty')
if [ -z "$CURSEUR" ]; then
echo "$PAGE" | jq -r '.meta.synchronise_jusqu_a' > prochain_updated_since.txt # à retenir
break
fi
doneRègles :
- Écrasez par
id. Un même avis peut revenir (la reprise relit une marge, une page peut être rejouée) : l'écriture doit être idempotente. Comparez au besoinversion, un texte à la microseconde (2026-10-08T08:00:00.123456Z) qui avance chaque fois qu'un champ servi change ; comparez-la comme du texte, jamais comme une date. - Marge de 10 minutes. Aucun avis écrit depuis moins de 10 minutes n'est servi : un avis tout juste publié apparaît en mode curseur au bout de 10 minutes. En contrepartie,
synchronise_jusqu_a(« maintenant moins 10 minutes ») ne fait jamais sauter un avis. - Avis retirés. Avec
updated_since, un avis qui n'est plus servi revient sous une forme réduite, à retirer de votre copie :{ "id": "…", "statut": "retire", "motif_retrait": "doublon", "canonique_id": "…", "version": "…" }.motif_retraitvautdoublon(l'avis est le doublon d'un autre :canonique_iddésigne celui qui le remplace),supprime(l'avis n'existe plus) ousource_coupee(sa source n'est plus servie). Pour les deux derniers,canonique_idestnull. Aucun autre champ n'est rendu. Un avis retiré compte comme un enregistrement servi dans le quota. - Fenêtre de 30 jours.
updated_sincene peut pas remonter à plus de 30 jours (la trace d'un avis supprimé n'est gardée que 35 jours) : au-delà, la réponse est un400de coderesync_required, et il faut refaire une copie complète. Une date dans le futur ou mal formée donneinvalid_parameter.updated_sinces'écrit en ISO 8601 avec fuseau (2026-10-08T09:50:00Z) ; utilisez la valeur desynchronise_jusqu_atelle quelle. - Curseur. Il est opaque : ne le fabriquez pas. Il n'est valable qu'avec les filtres (et le même
updated_since) de la requête qui l'a produit ; sinon, ou s'il est illisible, la réponse est un400de codeinvalid_cursoret il faut repartir de la première page. Sur la dernière page,curseur_suivantvautnull. - Sources. Dans ce mode,
sourceaccepte aussi le code d'une source coupée, pour que les avis de cette source ressortent « retirés » (source_coupee).
Demander une clé
Avoir un compte Pro
La clé est réservée aux comptes au plan Pro.
Écrire au support
Nous vérifions votre compte Pro puis vous répondons par e-mail avec votre clé.