Documentation API

L'API PRISME expose les mêmes données factuelles que la plateforme (votes, profils sur 27 axes publiés, partis, élus, programmes) pour une intégration programmatique. Schéma OpenAPI complet et interactif ci-dessous.

Premier appel, sans clé

Les endpoints publics répondent sans clé, sans compte et sans en-tête particulier :

curl "https://api.prisme.vote/votes/recent?country=FR&limit=20"

Niveaux d'accès

  • Anonyme - agrégats et listes résumées, sans en-tête. Les endpoints de détail répondent 401.
  • Compte gratuit (JWT) - tout, avec un quota mensuel de consultations détaillées (10/mois, dédupliquées : revoir le même scrutin ne décompte pas).
  • Premium (JWT) - consultations détaillées illimitées.
  • Business (offre Entreprise, sur devis) - premium + clés API d'extraction, valables 6 heures après leur création. L'usage est compté par organisation, sans plafond ni facturation à la requête.

Gratuit à vie, jamais métré : le quiz, tous les agrégats, et la vérification à la source (« Vérifier au scrutin », viewer de documents). On paie l'analyse, jamais le registre.

Le mur métré (endpoints de détail)

Chaque réponse d'un endpoint métré (200 comme 402) porte les en-têtes X-Prisme-Reads-Limit, X-Prisme-Reads-Remaining, X-Prisme-Reads-Reset et X-Prisme-Wall-Mode. Mode actuel : enforce, en production depuis le 8 juillet 2026 : au-delà du quota, l'endpoint répond 402 avec un corps unifié :

{"code": "QUOTA_DETAIL_REACHED", "message": "Quota mensuel de consultations détaillées atteint", "quota": 10, "quota_used": 10, "quota_remaining": 0, "reset_at": "2026-08-01T00:00:00Z", "upgrade_url": "/compte/upgrade"}

Toutes les erreurs 401 / 402 / 403 / 429 partagent le même schéma {"code", "message", …}.

Authentification

JWT Cognito (Authorization: Bearer, ID token) : identifie votre compte sur les routes de données et débloque les consultations détaillées. Clé API (X-API-Key, gérée dans le hub Développeurs, tier business) : si une clé est présentée, elle est validée et rate-limitée (free 60 req/min, business 600 req/min : 429 + Retry-After + X-RateLimit-* en rafale) et la consommation est comptée par organisation, sans plafond mensuel ni facturation. Une clé API est temporaire : elle expire 6 heures après sa création.

# Agrégats - ouvert à tous curl "https://api.prisme.vote/votes/recent?country=FR&limit=20" # Détail - compte requis (401 sans jeton) curl -H "Authorization: Bearer $ID_TOKEN" "https://api.prisme.vote/scrutins/FR-AN-17-1234" # Clé API - validée + rate-limitée quand présente curl -H "X-API-Key: $PRISME_KEY" "https://api.prisme.vote/votes/recent"

Documentation interactive (OpenAPI)

Référence complète, testable, des endpoints publics - générée depuis l'API (toujours à jour). Les endpoints métrés y documentent leurs réponses 401/402 et leurs en-têtes.

Swagger UI → ReDoc → openapi.json

Endpoints

Votes & Scrutins 🔒 /votes/recent, /scrutins, /votes/search Listes et résumés : accès ouvert (projection agrégée en anonyme). Détail d'un scrutin/vote : compte requis (métré).
Lois /lois/search, /lois/{id} Dossiers législatifs, chronologie, votes liés - accès ouvert.
Profils & Questions /questions, /profile Quiz politique et calcul de profil - gratuit à vie, jamais métré.
Partis /parties, /parties/ranges, /parties/{code}/evolution, /parties/{code}/semaines Positions agrégées des partis et des groupes, séries trimestrielle et hebdomadaire d'un groupe - accès ouvert.
Représentants 🔒 /representatives Profils agrégés (27 axes publiés) : ouverts. Historique de votes complet : compte requis (métré).
Élus locaux 🔒 /elus/search, /elus/{id} Identités et mandats : ouverts. Historique de votes / programmes complets : compte requis (métré).
Élections 🔒 /elections/{id}/candidates Listes de candidats : ouvertes. Fiche candidat avec programme complet : compte requis (métré).
Gouvernement /government Composition actuelle du gouvernement - accès ouvert.
Délibérations 🔒 /deliberations/recent Listes et profils agrégés : ouverts. Délibération complète : compte requis (métré).
Discours présidentiels 🔒 /discours/recent Listes et profils agrégés : ouverts. Texte intégral d'un discours : compte requis (métré). Depuis le 18 octobre 2026, sans paramètre source, les routes fusionnent le site de l'Élysée et vie-publique.fr (DILA) ; chaque item porte source et kind. Passez source=ELYSEE pour l'ancien comportement.
Programmes 🔒 /programmes/{election}/candidates Résumés et axes agrégés : ouverts. Programme complet d'un candidat : compte requis (métré).
Consommation /usage Votre consommation API (scope user|org|key, jour|mois) - JWT requis.

🔒 = famille contenant des endpoints de détail métrés (compte requis, quota mensuel).

Série hebdomadaire d'un groupe

GET /parties/{code}/semaines : chaque semaine qui compte au moins un scrutin, le classement de l'Assemblée recalculé sur les 12 mois de scrutins qui finissent à son dernier scrutin (bornés au début de la législature). Public, sans clé. Les codes de groupes servis sont dans parti_semaines_groupes de GET /paysage/overton.

curl -s 'https://api.prisme.vote/parties/RN/semaines?source=FR-AN&legislature=17'

Forme de la réponse depuis la calibration unique (1.9.5.0), réduite à deux semaines :

{
  "party_code": "RN", "chambre": "AN", "a_jour": true, "calcule_le": "2026-10-08",
  "methode_version": "…", "ecart_un_an": null,
  "ecart_un_an_absence": "dernier_point_en_rupture",
  "semaines": [
    {"dimanche": "2024-10-13", "legislature": "17", "en_cours": false,
     "periode": {"debut": "2024-07-18", "fin": "2024-10-09", "jours": 84, "raccourcie": true, "scrutins": 3},
     "scrutins_semaine": 3, "calibration": null, "rupture_classement": false,
     "left_right": null, "absence": "sous_le_seuil", "segment": null},
    {"dimanche": "2026-10-11", "legislature": "17", "en_cours": true,
     "periode": {"debut": "2025-10-07", "fin": "2026-10-06", "jours": 365, "raccourcie": false, "scrutins": 4283},
     "scrutins_semaine": 31, "calibration": "lineaire", "rupture_classement": false,
     "left_right": 48, "absence": null, "segment": 10}
  ]
}
  • Identité d'une semaine : (legislature, dimanche) ; autour d'une dissolution, un même dimanche peut avoir deux entrées.
  • absence : sous_le_seuil (le calcul de la semaine ne rend rien : moins de 30 scrutins, 5 groupes ou 10 votes par groupe), absent_du_modele (la semaine est mesurée, pas ce groupe ; équivaut à moins_de_scrutins de /evolution), null (mesurée).
  • calibration : lineaire, une droite ajustée sur les notes des programmes, la même chaque semaine (depuis 1.9.5.0 ; une série calculée avant peut porter une autre étiquette) ; null sans mesure. sous_le_seuil couvre aussi une semaine dont les ancres se contredisent (pente ≤ 0).
  • en_cours : semaine pas encore finie au jour du calcul. rupture_classement : le dernier point (le classement) s'écarte de 2 points ou plus du calcul de la série pour ce groupe.
  • segment : morceau de courbe, change à chaque législature, rupture ou semaine non mesurée (et à un changement de calibration dans une série d'avant 1.9.5.0). ecart_un_an ou ecart_un_an_absence : debut_de_legislature, pas_de_mesure, dernier_point_en_rupture, changement_de_calibration (série d'avant 1.9.5.0). Liste ouverte : un client doit accepter une valeur qu'il ne connaît pas.
  • Filtres : legislature (code) et depuis (AAAA-MM-JJ, dimanche à cette date ou après) ; ils ne changent ni les segments ni l'écart. Erreurs : 503 tant que la série n'est pas calculée, 404 pour une source ou un groupe sans série, 422 pour un paramètre illisible.
  • Les niveaux ne se comparent pas d'une législature à l'autre ; deux séries de methode_version différentes ne se comparent pas point à point.

Quotas, pagination & équité

  • Un throttling global protège l'API (équité, anti-aspiration). Les listes ont un plafond de taille dur par endpoint.
  • Rate-limit par clé API : free 60 req/min, business 600 req/min, appliqué dès qu'une clé est présentée. Chaque clé expire 6 heures après sa création. La consommation mensuelle est comptée par organisation, mais elle n'est ni plafonnée ni facturée. Voir Tarifs.
  • Pagination par limit / offset, avec un plafond serveur par endpoint.
  • Les listes renvoient un résumé ; le détail complet (texte intégral, propositions) s'obtient par identifiant - avec un compte (voir « Le mur métré »).

Changelog API

  • 2026-10-09 - Changement F30 : une seule calibration, la droite. Le classement, les élus et les deux séries passent par la même droite ajustée sur les notes des programmes ; le classement, les élus et la série trimestrielle (valeurs et fourchettes) ne changent pas, la série hebdomadaire est recalculée (ses semaines calculées avec une cubique sont réécrites, elle n'est plus coupée par un changement de calibration). calibration a les mêmes sept clés pour l'Assemblée et le Sénat (degre, repli_lineaire, monotone_sur_projection, bornes_projection, residus, recalibre, libelle) : le Sénat gagne recalibre et libelle. Constantes depuis 1.9.5.0 : degre 1, repli_lineaire false (il valait true à l'Assemblée : la droite est la méthode, pas un repli), monotone_sur_projection true, recalibre false, libelle lineaire. Sur GET /parties/display:block; padding:1rem 1.2rem; border-radius:14px; background:#0f172a; color:#e2e8f0; font-family:'SFMono-Regular',Consolas,monospace; font-size:0.9rem; overflow-x:auto; white-space:pre; line-height:1.5;/semaines : ecart_un_an_absence gagne dernier_point_en_rupture (liste ouverte) ; rupture_classement ne dit plus qu'un écart de 2 points ou plus ; methode_version change au déploiement, puis au précalcul qui suit : deux methode_version ne se comparent pas point à point. Les constantes valent pour toute section calculée depuis 1.9.5.0 ; une section Sénat gardée d'un calcul plus ancien (Sénat en échec) garde sa forme d'alors.
  • 2026-10-08 - Série hebdomadaire d'un groupe. Nouvelle route GET /parties/{code}/semaines (voir Série hebdomadaire d'un groupe). Sur GET /paysage/overton : parti_semaines_groupes (groupes de la série et leurs législatures) et calibration de l'Assemblée (même objet que chambres.SENAT.calibration, plus recalibre et libelle) sont ajoutés.
  • 2026-10-08 - Période déclarée du gauche-droite. Les positions se calculent sur les 12 mois de scrutins qui précèdent le dernier scrutin, bornés au début de la législature. Sur GET /paysage/overton : periode.fenetre_modele et chambres.SENAT.fenetre_modele sont ajoutés ({debut, fin, jours, legislature, scrutins, scrutins_departageants, regle, …}), ainsi que parti_series_groupes (groupes de la courbe trimestrielle et leurs législatures). Sur les représentants : left_right_fenetre ({debut, fin}, placé ou non ; un élu absent_du_paysage a moins de 10 votes départageant la gauche et la droite sur cette période). Changement de sens sur GET /parties/profiles/v2 : axes.left_right est la position du groupe dans le paysage (la même que /paysage et /parties, absente si le paysage ne place pas le groupe) ; l'ancienne moyenne des élus est servie sous left_right_des_elus ({moyenne, min, max, n}).
  • 2026-10 - Paysage et représentants. Sur GET /paysage/overton : echelle.bande_democratique est retiré ; echelle.reperes_bareme est ajouté (liste de repères {valeur, libelle}) ; genere_le, pays et chambres.SENAT sont ajoutés (groupes du Sénat et sénateurs, avec leur propre calibration). Sur les représentants (GET /representatives/profiles/v2, /representatives, /representatives/{id}) : axes.left_right peut désormais valoir null ; left_right_source et left_right_unavailable_reason sont ajoutés, ce dernier avec les valeurs absent_du_paysage, non_inscrit, chambre_absente, paysage_illisible, paysage_perime et pays_different. La valeur de left_right des élus change : c'est désormais le même calcul que celui de leur groupe sur le paysage.
  • 2026-08 - Programmes /list. tour ajouté (additif) ; display_name corrigé (accents restitués) ; candidate_id est l'identifiant stable, ne jamais apparier par nom. Tri : tour, puis parti, puis nom. Le registre de vérification est mis en cache 15 minutes côté API (un changement de statut peut mettre jusqu'à 15 min à se propager) ; le détail d'un document pending n'est pas métré.
  • 2026-07 - Pivot segmentation. Les endpoints de détail (votes par élu d'un scrutin, axes fins d'un vote, textes intégraux, historiques complets, programmes complets) exigent désormais un compte (401 en anonyme) et portent le compteur mensuel de consultations détaillées (en-têtes X-Prisme-Reads-*, mode observe : aucun 402 émis). Les listes publiques servent une projection agrégée en anonyme. Les clés X-API-Key présentées sur les routes de données sont désormais validées, rate-limitées et comptées. Aucune clé API n'avait été émise avant ce changement : aucun consommateur existant n'est cassé.