{"openapi":"3.1.0","info":{"title":"AiFR.AI — API des données publiques françaises","version":"1.0.0","summary":"24,4 M d’entités, 663 K subventions, 800 K comptes publics, 643 K mandats électifs.","description":"API publique sur les finances publiques françaises. Trois paliers d'accès :\n\n- **public** — sans authentification, quota journalier par adresse IP ;\n- **user** — jeton Firebase ou clé d'extension, quota multiplié par cinq ;\n- **paid** — réglé à l'acte en USDC (schéma x402), ou débité des crédits d'un abonnement.\n\nAu-delà du quota, une capacité publique répond **429** : elle se limite, elle ne se facture pas. Seules les capacités payantes répondent **402**, avec les rails de règlement acceptés dans le corps.\n\nToutes les données proviennent de sources publiques officielles et sont redistribuées sous Licence Ouverte Etalab.","contact":{"name":"AI France Révolution","url":"https://aifr.ai/contact"},"license":{"name":"Licence Ouverte Etalab","url":"https://www.etalab.gouv.fr/licence-ouverte-open-licence/"}},"servers":[{"url":"https://aifr.ai","description":"Production"}],"tags":[{"name":"découverte","description":"Santé, tarifs, carte d’agent."},{"name":"mcp","description":"Model Context Protocol."},{"name":"french-public-data"},{"name":"subsidy-data"},{"name":"public-finance"},{"name":"transparency"},{"name":"public-officials"},{"name":"natural-language-query"},{"name":"research"},{"name":"open-data"},{"name":"schema-mapping"}],"paths":{"/searchEntities":{"get":{"operationId":"search_entities","summary":"Rechercher une entité publique française","description":"Recherche parmi 24,4 millions d'entités françaises (INSEE SIRENE) par nom, SIREN, code postal ou département. Renvoie le SIREN, la catégorie juridique, le siège et le total de subventions perçues. Couvre communes, départements, régions, intercommunalités, établissements publics, associations, entreprises. Taxonomie : french-public-data, entity-resolution, siren-lookup, company-search, open-data-france.\n\n**Accès** : public · **Tarif** : 0.000500 USDC per_call · **Quota gratuit** : 100/jour.","tags":["french-public-data"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Nom, SIREN (9 chiffres), code postal (5 chiffres) ou code département","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Nombre de résultats (1 à 20)","schema":{"type":"integer","minimum":1,"maximum":20,"default":10}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/getActorDetails":{"get":{"operationId":"get_entity_profile","summary":"Fiche complète d'une entité","description":"Profil détaillé d'une entité par son SIREN : dénomination, catégorie juridique INSEE, code NAF, effectifs, siège social, date de création, total et nombre de subventions perçues, répartition par année et par objectif. Taxonomie : french-public-data, company-profile, siren-lookup, subsidy-data.\n\n**Accès** : public · **Tarif** : 0.001000 USDC per_record · **Quota gratuit** : 50/jour.","tags":["french-public-data"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"siren","in":"query","required":true,"description":"SIREN à 9 chiffres","schema":{"type":"string","pattern":"^[0-9]{9}$"}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/getSubsidiesByActor":{"get":{"operationId":"list_entity_subsidies","summary":"Subventions perçues par une entité","description":"Liste des subventions publiques reçues par une entité : montant, année, objectif, programme budgétaire, source (PLF Jaune de l'État ou aides d'État européennes). Taxonomie : subsidy-data, public-spending, grant-tracking, french-public-data.\n\n**Accès** : user · **Tarif** : 0.002000 USDC per_call · **Quota gratuit** : 20/jour.","tags":["subsidy-data"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"siren","in":"query","required":true,"description":"SIREN à 9 chiffres","schema":{"type":"string","pattern":"^[0-9]{9}$"}},{"name":"limit","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"offset","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":0,"default":0}},{"name":"sort","in":"query","required":false,"description":"","schema":{"type":"string","enum":["year","amount","purpose"],"default":"year"}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/getPublicFinances":{"get":{"operationId":"get_public_finances","summary":"Comptes publics d'une collectivité","description":"Comptes individuels d'une commune, d'un département ou d'une région (DGFiP) sur 25 exercices : recettes, dépenses, charges de personnel, encours de dette, autofinancement, investissement, impôts locaux, dotation de l'État, population. Taxonomie : public-finance, municipal-budget, government-accounts, french-public-data.\n\n**Accès** : user · **Tarif** : 0.002000 USDC per_record · **Quota gratuit** : 20/jour.","tags":["public-finance"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"siren","in":"query","required":false,"description":"SIREN de la collectivité","schema":{"type":"string","pattern":"^[0-9]{9}$"}},{"name":"name","in":"query","required":false,"description":"Nom de la collectivité, si le SIREN est inconnu","schema":{"type":"string"}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/getTopRankings":{"get":{"operationId":"rank_entities_by_metric","summary":"Classer les collectivités sur un indicateur","description":"Classement des communes, départements ou régions sur un indicateur financier : dette par habitant, recettes par habitant, part des charges de personnel, taux d'autofinancement, effort d'investissement… Filtrable par population minimale et par exercice. Taxonomie : public-finance, benchmarking, municipal-budget, rankings.\n\n**Accès** : paid · **Tarif** : 0.004000 USDC per_call · **Quota gratuit** : 5/jour.","tags":["public-finance"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"metric","in":"query","required":true,"description":"Indicateur à classer","schema":{"type":"string","enum":["revenue","expenses","staff","debt","caf","investment","tax","dgf","population","revenue_per_hab","expenses_per_hab","staff_per_hab","debt_per_hab","caf_per_hab","invest_per_hab","tax_per_hab","staff_ratio","debt_ratio","caf_ratio","invest_ratio"]}},{"name":"type","in":"query","required":false,"description":"","schema":{"type":"string","enum":["commune","departement","region"],"default":"commune"}},{"name":"year","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":2000,"maximum":2030,"default":2024}},{"name":"minPop","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":0,"default":0}},{"name":"limit","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},{"name":"order","in":"query","required":false,"description":"","schema":{"type":"string","enum":["asc","desc"],"default":"desc"}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/getSubsidiesByPurpose":{"get":{"operationId":"get_subsidy_purpose_breakdown","summary":"Bénéficiaires par objectif de subvention","description":"Pour un objectif de subvention donné, la liste des bénéficiaires et les montants agrégés, avec la répartition par année. Permet de suivre une politique publique jusqu'à ses destinataires. Taxonomie : subsidy-data, public-spending, policy-analysis.\n\n**Accès** : paid · **Tarif** : 0.004000 USDC per_call · **Quota gratuit** : 5/jour.","tags":["subsidy-data"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"slug","in":"query","required":false,"description":"Identifiant d'URL de l'objectif","schema":{"type":"string"}},{"name":"purpose","in":"query","required":false,"description":"Libellé exact de l'objectif","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"offset","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/getTopBeneficiaries":{"get":{"operationId":"list_top_beneficiaries","summary":"Plus gros bénéficiaires de fonds publics","description":"Classement des bénéficiaires de subventions publiques par montant cumulé, pour les subventions aux associations ou les aides d'État européennes, avec filtre par année. Taxonomie : subsidy-data, public-spending, grant-tracking, rankings.\n\n**Accès** : paid · **Tarif** : 0.003000 USDC per_call · **Quota gratuit** : 5/jour.","tags":["subsidy-data"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"type","in":"query","required":false,"description":"","schema":{"type":"string","enum":["associations","state-aid","all"],"default":"associations"}},{"name":"year","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":2000,"maximum":2030}},{"name":"limit","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"name":"offset","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":0,"default":0}},{"name":"search","in":"query","required":false,"description":"Filtre sur le nom du bénéficiaire","schema":{"type":"string"}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/getOfficials":{"get":{"operationId":"search_public_officials","summary":"Rechercher un responsable public","description":"Recherche parmi les déclarations d'intérêts et de patrimoine publiées par la Haute Autorité pour la transparence de la vie publique : députés, sénateurs, élus locaux, hauts fonctionnaires. Taxonomie : transparency, public-officials, conflict-of-interest, french-public-data.\n\n**Accès** : user · **Tarif** : 0.002000 USDC per_call · **Quota gratuit** : 20/jour.","tags":["transparency"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"q","in":"query","required":false,"description":"Nom ou fonction","schema":{"type":"string"}},{"name":"department","in":"query","required":false,"description":"Code département","schema":{"type":"string"}},{"name":"type","in":"query","required":false,"description":"Type de mandat","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/getEntityElus":{"get":{"operationId":"list_entity_elected_officials","summary":"Élus rattachés à une collectivité","description":"Élus en fonction et mandats passés pour une collectivité donnée, issus du Répertoire national des élus : nom, mandat, fonction, nuance politique, début et fin de mandat. Taxonomie : public-officials, elections, local-government, french-public-data.\n\n**Accès** : user · **Tarif** : 0.002000 USDC per_call · **Quota gratuit** : 20/jour.","tags":["public-officials"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"siren","in":"query","required":true,"description":"SIREN de la collectivité","schema":{"type":"string","pattern":"^[0-9]{9}$"}},{"name":"limit","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":1,"maximum":200,"default":40}},{"name":"offset","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/getLobbyists":{"get":{"operationId":"list_lobbyists","summary":"Représentants d'intérêts","description":"Répertoire des représentants d'intérêts déclarés auprès de la HATVP : organisation, catégorie, dirigeants, clients, rattachement à une entité par SIREN. Taxonomie : transparency, lobbying, influence, french-public-data.\n\n**Accès** : user · **Tarif** : 0.002000 USDC per_call · **Quota gratuit** : 20/jour.","tags":["transparency"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"q","in":"query","required":false,"description":"Nom ou catégorie","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/askData":{"get":{"operationId":"ask_public_data_question","summary":"Poser une question en langage naturel","description":"Question libre sur les finances publiques françaises. Le service traduit la question en requêtes SQL en lecture seule sur la base, exécute, et renvoie une réponse sourcée avec les chiffres. Facturé à l’appel car il consomme un modèle de langage. Taxonomie : natural-language-query, public-finance, research, french-public-data.\n\n**Accès** : paid · **Tarif** : 0.020000 USDC per_call · **Quota gratuit** : 0/jour.","tags":["natural-language-query"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"question","in":"query","required":true,"description":"Question en français ou en anglais","schema":{"type":"string"}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/generateReport":{"get":{"operationId":"generate_entity_brief","summary":"Note d'analyse sur une entité","description":"Note rédigée sur une entité ou une collectivité : trajectoire budgétaire, subventions reçues, responsables, anomalies relevées, le tout sourcé et chiffré. Livrée en JSON structuré avec graphiques référencés. Facturé à la note. Taxonomie : research, report-generation, public-finance, due-diligence.\n\n**Accès** : paid · **Tarif** : 0.350000 USDC per_brief · **Quota gratuit** : 0/jour.","tags":["research"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"siren","in":"query","required":true,"description":"SIREN du sujet","schema":{"type":"string","pattern":"^[0-9]{9}$"}},{"name":"angle","in":"query","required":false,"description":"Angle demandé (budget, subventions, gouvernance…)","schema":{"type":"string"}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/datasets/search":{"get":{"operationId":"search_open_datasets","summary":"Chercher un jeu de données ouvert","description":"Recherche dans le catalogue data.gouv.fr : plus de 60 000 jeux publiés par l'État, les collectivités et les opérateurs. Renvoie le producteur, la licence, la fraîcheur et les ressources tabulaires exploitables. Taxonomie : open-data, dataset-discovery, data-catalog, french-public-data.\n\n**Accès** : public · **Tarif** : 0.001000 USDC per_call · **Quota gratuit** : 50/jour.","tags":["open-data"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"q","in":"query","required":true,"description":"Termes de recherche","schema":{"type":"string"}},{"name":"organization","in":"query","required":false,"description":"Identifiant d'organisation, pour restreindre","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","required":false,"description":"","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/datasets/inspect":{"get":{"operationId":"inspect_open_dataset","summary":"Lire les ressources d'un jeu de données","description":"Détail d'un jeu data.gouv.fr : description, licence, fréquence de mise à jour, et la liste de ses ressources avec le format de chacune. Taxonomie : open-data, dataset-discovery, data-catalog.\n\n**Accès** : public · **Tarif** : 0.001000 USDC per_call · **Quota gratuit** : 50/jour.","tags":["open-data"],"security":[{},{"bearerAuth":[]}],"parameters":[{"name":"id","in":"query","required":true,"description":"Identifiant ou slug du jeu","schema":{"type":"string"}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/datasets/plan":{"get":{"operationId":"plan_dataset_ingestion","summary":"Proposer un plan d'ingestion vers le modèle canonique","description":"Lit l'en-tête et un échantillon d'un fichier tabulaire ouvert, puis propose une correspondance colonne par colonne vers notre modèle canonique de subvention, avec un indice de confiance et le motif de chaque choix. Éprouve le plan sur l'échantillon et chiffre le taux de rejet AVANT tout chargement. Répond au fait que chaque collectivité publie ses subventions avec ses propres intitulés. Taxonomie : schema-mapping, data-ingestion, open-data, etl.\n\n**Accès** : user · **Tarif** : 0.005000 USDC per_call · **Quota gratuit** : 20/jour.","tags":["schema-mapping"],"security":[{"bearerAuth":[]},{"paiementX402":[]}],"parameters":[{"name":"url","in":"query","required":true,"description":"URL directe du fichier CSV ou tabulaire","schema":{"type":"string"}}],"responses":{"200":{"description":"Succès.","headers":{"X-PAYMENT-RESPONSE":{"description":"Présent si l’appel a été réglé en USDC. JSON base64 confirmant la transaction.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Requête invalide.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Authentification requise pour ce palier.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"Règlement requis. Le corps porte les rails acceptés.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Defi402"}}}},"429":{"description":"Quota journalier atteint. Se limite, ne se facture pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"503":{"description":"Service dégradé. L’en-tête Retry-After indique le délai."}}}},"/health":{"get":{"operationId":"health","summary":"État du service","description":"Répond 503 avec Retry-After quand la base est injoignable.","tags":["découverte"],"security":[{}],"parameters":[],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/pricing.json":{"get":{"operationId":"pricing_json","summary":"Tarif de chaque capacité","description":"Prix en USDC, unité facturée, palier d’accès et quota gratuit.","tags":["découverte"],"security":[{}],"parameters":[],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/.well-known/agent-card.json":{"get":{"operationId":"well_known_agent_card_json","summary":"Carte d’agent","description":"Identité, compétences, rails de règlement. Signée en ed25519 si une clé est configurée.","tags":["découverte"],"security":[{}],"parameters":[],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/.well-known/demand.json":{"get":{"operationId":"well_known_demand_json","summary":"Ce que nous cherchons à acheter","description":"Besoins de données publiés, avec prix plafond et volume.","tags":["découverte"],"security":[{}],"parameters":[],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/mcp":{"post":{"operationId":"mcp","summary":"Serveur MCP (JSON-RPC 2.0)","description":"Point d’entrée Model Context Protocol sur Streamable HTTP. `tools/list` répond sans authentification. Les mêmes capacités que ci-dessus, exposées à un agent.","tags":["mcp"],"security":[{},{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"oneOf":[{"type":"string"},{"type":"integer"}]},"method":{"type":"string","enum":["initialize","tools/list","tools/call","ping"]},"params":{"type":"object"}},"required":["jsonrpc","method"]},"examples":{"lister":{"summary":"Lister les outils","value":{"jsonrpc":"2.0","id":1,"method":"tools/list"}},"appeler":{"summary":"Appeler un outil","value":{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_entities","arguments":{"q":"lyon","limit":5}}}}}}}},"responses":{"200":{"description":"Réponse JSON-RPC.","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Jeton d'identité Firebase, ou clé d'extension `aifr_ext_…`."},"paiementX402":{"type":"apiKey","in":"header","name":"X-PAYMENT","description":"Preuve de règlement : JSON encodé en base64, `{\"network\":\"eip155:8453\"|\"solana:…\", \"transaction\":\"…\"}`. Vérifiée sur la chaîne, et consommée une seule fois."}},"schemas":{"Erreur":{"type":"object","description":"Erreur typée. Jamais un 200 contenant des excuses en HTML.","properties":{"error":{"type":"string","description":"Code lisible par une machine."},"message":{"type":"string"},"retry_after_seconds":{"type":"integer"}},"required":["error"]},"Defi402":{"type":"object","description":"Corps du 402 : les rails acceptés et le montant exact.","properties":{"x402Version":{"type":"integer","const":1},"error":{"type":"string","const":"payment_required"},"message":{"type":"string"},"accepts":{"type":"array","items":{"type":"object","properties":{"scheme":{"type":"string","const":"exact"},"network":{"type":"string","description":"Identifiant CAIP-2 du réseau."},"maxAmountRequired":{"type":"string","description":"Montant en unités atomiques (USDC : 6 décimales)."},"asset":{"type":"string","description":"Adresse du jeton."},"payTo":{"type":"string","description":"Adresse de règlement."},"resource":{"type":"string"},"maxTimeoutSeconds":{"type":"integer"}}}}}}}},"x-rate-limits":{"description":"Par identité et par jour, remis à zéro à minuit UTC.","anonyme":"quota de base, compté par adresse IP","authentifie":"quota de base multiplié par cinq","depassement":"429 pour les paliers public et user ; 402 pour le palier paid"}}