{"openapi":"3.1.0","info":{"title":"API Opacte","summary":"Attestations, vérification, signature : le document ne quitte pas votre serveur en clair.","description":"Contrat publié de l'API des entreprises (290_api_contrat.md). Authentification : `Authorization: Bearer opk_…`, clé créée dans Réglages. Version : en-tête `Said-Api-Version: 1`. Erreurs : `{\"erreur\": \"<code>\", …}`. Idempotence : en-tête `Idempotency-Key` sur les créations.","version":"1"},"servers":[{"url":"https://opacte.eu"}],"paths":{"/api/account":{"get":{"tags":["Compte"],"summary":"Lire le compte","description":"L'adresse du compte, son solde de crédits (commun au site) et la marge de débit restante.","operationId":"compte_api_api_account_get","responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Compte"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/attestations":{"post":{"tags":["Attestations"],"summary":"Attester un fichier","description":"Atteste un fichier : 1 crédit. Le fichier passe en flux ; seules ses empreintes sont calculées et gardées.","operationId":"creer_attestation_api_attestations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email_visible","in":"query","required":false,"schema":{"type":"boolean","description":"Afficher l'adresse du compte à qui vérifie le document.","default":true,"title":"Email Visible"},"description":"Afficher l'adresse du compte à qui vérifie le document."},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Rejouer sans second débit, 24 heures.","title":"Idempotency-Key"},"description":"Rejouer sans second débit, 24 heures."}],"responses":{"201":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttestationCreee"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`taille_incoherente` : octets reçus ≠ `Content-Length`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"`credits_insuffisants` (avec `solde`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"409":{"description":"`requete_en_cours` : même `Idempotency-Key` en cours.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"411":{"description":"`longueur_requise`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"413":{"description":"`taille_hors_limites` (plus de 100 Mo).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"422":{"description":"`taille_hors_limites` (moins de 8 Ko).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"requestBody":{"required":true,"description":"Le fichier, brut, envoyé en flux (8 Ko à 100 Mo). Lu à la volée, jamais conservé.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}}},"get":{"tags":["Attestations"],"summary":"Lister les attestations","description":"Les attestations faites par l'API avec ce compte, les plus récentes d'abord.","operationId":"lister_attestations_api_attestations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"apres","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":26},{"type":"null"}],"description":"Curseur rendu par la page précédente.","title":"Apres"},"description":"Curseur rendu par la page précédente."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limite"}}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageAttestations"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/attestations/{id_attestation}":{"get":{"tags":["Attestations"],"summary":"Lire une attestation","description":"Le statut d'une attestation de ce compte.","operationId":"etat_attestation_api_attestations__id_attestation__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_attestation","in":"path","required":true,"schema":{"type":"string","title":"Id Attestation"}}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Attestation"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"`attestation_inconnue`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/attestations/{id_attestation}/receipt":{"get":{"tags":["Attestations"],"summary":"Lire le reçu signé","description":"Le meilleur reçu signé disponible : provisoire, puis définitif avec son ancrage.","operationId":"recu_attestation_api_attestations__id_attestation__receipt_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_attestation","in":"path","required":true,"schema":{"type":"string","title":"Id Attestation"}}],"responses":{"200":{"description":"Reçu signé (format 230).","content":{"application/json":{"schema":{}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}},"description":"Not Found"},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/verifications":{"post":{"tags":["Vérification"],"summary":"Vérifier un fichier","description":"Vérifie un fichier reçu à partir de ses empreintes (le fichier ne part pas). Gratuit, dans les limites.","operationId":"verifier_api_verifications_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Verification"}}},"required":true},"responses":{"200":{"description":"Attestations candidates, comme `POST /verification` (220).","content":{"application/json":{"schema":{}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"409":{"description":"`page_obsolete` : algorithmes requis manquants.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/circuits":{"post":{"tags":["Circuits"],"summary":"Créer un circuit de signature","description":"Crée un circuit : 1 crédit. L'initiateur est l'adresse du compte ; le lien, construit par le SDK avec la clé,\nest envoyé aux signataires par vous, jamais par Opacte.","operationId":"creer_circuit_api_circuits_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Rejouer sans second débit, 24 heures.","title":"Idempotency-Key"},"description":"Rejouer sans second débit, 24 heures."}],"responses":{"201":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CircuitCree"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"200":{"description":"Circuit déjà créé avec ce `id_circuit` (rejeu sans débit).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CircuitCree"}}}},"400":{"description":"`corps_invalide`, `adresse_invalide`, `chiffre_invalide`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"402":{"description":"`credits_insuffisants` (avec `solde`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"409":{"description":"`id_circuit_pris`, `requete_en_cours`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"413":{"description":"`taille_hors_limites` (PDF de plus de 5 Mo).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"422":{"description":"`adresse_en_double`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"requestBody":{"required":true,"description":"`multipart/form-data` : `pdf` et `manifeste` chiffrés (AES-256-GCM, IV ‖ chiffré ‖ tag, données authentifiées `id_circuit|0|pdf` et `id_circuit|0|manifeste`), `meta` (JSON : `id_circuit`, `taille_clair`, `empreintes_v0`, `signataires`, `initiateur` s'il ne signe pas). Le SDK le construit.","content":{"multipart/form-data":{"schema":{"type":"object"}}}}},"get":{"tags":["Circuits"],"summary":"Lister les circuits","description":"Les circuits créés avec ce compte (par l'API ou depuis le site), les plus récents d'abord.","operationId":"lister_circuits_api_circuits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"statut","in":"query","required":false,"schema":{"anyOf":[{"enum":["en_cours","complet","expire","annule","anomalie"],"type":"string"},{"type":"null"}],"description":"Ne garder que les circuits de ce statut.","title":"Statut"},"description":"Ne garder que les circuits de ce statut."},{"name":"apres","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Curseur rendu par la page précédente.","title":"Apres"},"description":"Curseur rendu par la page précédente."},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limite"}}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageCircuits"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/circuits/{id_circuit}":{"get":{"tags":["Circuits"],"summary":"Lire un circuit","description":"Statut, signataires (signé ou non, date), version courante, date d'effacement, attestation finale.","operationId":"etat_circuit_api_circuits__id_circuit__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_circuit","in":"path","required":true,"schema":{"type":"string","title":"Id Circuit"}}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Circuit"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"`circuit_inconnu` : absent, ou d'un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/circuits/{id_circuit}/document":{"get":{"tags":["Circuits"],"summary":"Télécharger le document chiffré","description":"Le document de la version courante (signé par tous, une fois le circuit complet), toujours chiffré.","operationId":"document_circuit_api_circuits__id_circuit__document_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_circuit","in":"path","required":true,"schema":{"type":"string","title":"Id Circuit"}}],"responses":{"200":{"description":"Version courante du PDF, **chiffrée** (en-tête `X-Version`) : le SDK la déchiffre avec la clé que vous avez gardée (données authentifiées `id_circuit|version|pdf`).","content":{"application/json":{"schema":{}},"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"`circuit_inconnu` : absent, ou d'un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"410":{"description":"`document_efface` : passé la date d'effacement.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/circuits/{id_circuit}/audit-trail":{"get":{"tags":["Circuits"],"summary":"Lire la piste d'audit","description":"Objets signés et ancrés du circuit et de chaque signature, vérifiables hors ligne : pour vos archives.","operationId":"piste_circuit_api_circuits__id_circuit__audit_trail_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_circuit","in":"path","required":true,"schema":{"type":"string","title":"Id Circuit"}}],"responses":{"200":{"description":"Objets signés et ancrés du circuit (`said:piste`).","content":{"application/json":{"schema":{}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"`circuit_inconnu` : absent, ou d'un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/circuits/{id_circuit}/remind":{"post":{"tags":["Circuits"],"summary":"Rappeler les signataires","description":"Email de rappel **sans lien** aux signataires en attente (au plus une fois par 48 heures) : ils retrouvent le\nlien dans votre message d'origine.","operationId":"relancer_api_circuits__id_circuit__remind_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_circuit","in":"path","required":true,"schema":{"type":"string","title":"Id Circuit"}}],"responses":{"202":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Relance"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`relance_recente` (avec `prochaine_le`) ou `trop_de_demandes`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"`circuit_inconnu` : absent, ou d'un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"409":{"description":"`circuit_clos`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/circuits/{id_circuit}/cancel":{"post":{"tags":["Circuits"],"summary":"Annuler un circuit","description":"Annule un circuit en cours : plus personne ne peut signer. Le crédit n'est pas rendu ; le document chiffré est\neffacé à la date prévue. Rejouer l'annulation d'un circuit déjà annulé rend le même résultat.","operationId":"annuler_api_circuits__id_circuit__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_circuit","in":"path","required":true,"schema":{"type":"string","title":"Id Circuit"}}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Circuit"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"`circuit_inconnu` : absent, ou d'un autre compte.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"409":{"description":"`circuit_clos` (avec `statut`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/webhooks":{"get":{"tags":["Webhooks"],"summary":"Lister les webhooks","description":"Les webhooks du compte et le bilan de leurs livraisons (le secret n'est jamais relisible).","operationId":"lister_webhooks_api_webhooks_get","responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/Webhook"},"type":"array","title":"Response Lister Webhooks Api Webhooks Get"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Webhooks"],"summary":"Créer un webhook","description":"Abonne une URL aux événements choisis. Chaque POST porte l'en-tête\n`Opacte-Signature: t=<secondes>,v1=<HMAC-SHA256(secret, \"t.corps\")>` ; refusez un événement de plus de\n5 minutes. Réponse `2xx` attendue en 10 secondes, sinon nouvelles tentatives (1 min, 5 min, 30 min, 2 h, 12 h,\n24 h). Seuls les faits postérieurs à la création du webhook sont envoyés.","operationId":"creer_webhook_api_webhooks_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NouveauWebhook"}}},"required":true},"responses":{"201":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCree"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`url_invalide`, `adresse_non_publique`, `corps_invalide`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"409":{"description":"`trop_de_webhooks` (10 au plus).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/webhooks/{id_webhook}":{"delete":{"tags":["Webhooks"],"summary":"Supprimer un webhook","description":"Supprime le webhook et ses livraisons en attente.","operationId":"supprimer_webhook_api_webhooks__id_webhook__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_webhook","in":"path","required":true,"schema":{"type":"string","title":"Id Webhook"}}],"responses":{"204":{"description":"Succès."},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"`webhook_inconnu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/api/webhooks/{id_webhook}/test":{"post":{"tags":["Webhooks"],"summary":"Essayer un webhook","description":"Envoie tout de suite un événement `test`, signé comme les autres, et rend la réponse obtenue (une seule\ntentative).","operationId":"essayer_webhook_api_webhooks__id_webhook__test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id_webhook","in":"path","required":true,"schema":{"type":"string","title":"Id Webhook"}}],"responses":{"200":{"description":"Succès.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EssaiWebhook"}}}},"401":{"description":"`cle_invalide` : clé absente, inconnue ou révoquée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"403":{"description":"`compte_suspendu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"`trop_de_demandes` ; en-tête `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"404":{"description":"`webhook_inconnu`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"400":{"description":"`corps_invalide` : paramètre ou corps mal formé.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}}},"components":{"schemas":{"Attestation":{"properties":{"id_attestation":{"type":"string","title":"Id Attestation"},"horodatage":{"type":"string","title":"Horodatage"},"taille":{"type":"integer","title":"Taille"},"statut":{"type":"string","enum":["provisoire","definitive","ancree"],"title":"Statut","description":"`provisoire` (reçu signé), `definitive` (inscrite dans un lot publié), `ancree` (confirmée dans Bitcoin)."},"email_visible":{"type":"boolean","title":"Email Visible"}},"type":"object","required":["id_attestation","horodatage","taille","statut","email_visible"],"title":"Attestation"},"AttestationCreee":{"properties":{"id_attestation":{"type":"string","title":"Id Attestation"},"horodatage":{"type":"string","title":"Horodatage"},"statut":{"type":"string","const":"provisoire","title":"Statut"},"recu":{"additionalProperties":true,"type":"object","title":"Recu","description":"Reçu provisoire signé (format 230)."},"jeton_recuperation":{"type":"string","title":"Jeton Recuperation","description":"À conserver : seul accès pérenne au reçu par son URL."},"url_recu":{"type":"string","title":"Url Recu"},"credits":{"type":"integer","title":"Credits","description":"Solde après le débit."}},"type":"object","required":["id_attestation","horodatage","statut","recu","jeton_recuperation","url_recu","credits"],"title":"AttestationCreee"},"AttestationFinale":{"properties":{"id_attestation":{"type":"string","title":"Id Attestation"}},"type":"object","required":["id_attestation"],"title":"AttestationFinale"},"Circuit":{"properties":{"id_circuit":{"type":"string","title":"Id Circuit"},"statut":{"type":"string","enum":["en_cours","complet","expire","annule","anomalie"],"title":"Statut"},"version":{"type":"integer","title":"Version","description":"Version courante du document (0 avant la première signature)."},"cree_le":{"type":"string","title":"Cree Le"},"complet_le":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Complet Le"},"annule_le":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Annule Le"},"disponible_jusqu_au":{"type":"string","title":"Disponible Jusqu Au","description":"Date d'effacement du document chiffré."},"document_efface":{"type":"boolean","title":"Document Efface"},"signataires":{"items":{"$ref":"#/components/schemas/SignataireCircuit"},"type":"array","title":"Signataires"},"attestation":{"anyOf":[{"$ref":"#/components/schemas/AttestationFinale"},{"type":"null"}],"description":"Attestation finale, si un participant l'a faite."}},"type":"object","required":["id_circuit","statut","version","cree_le","complet_le","annule_le","disponible_jusqu_au","document_efface","signataires","attestation"],"title":"Circuit"},"CircuitCree":{"properties":{"id_circuit":{"type":"string","title":"Id Circuit"},"version":{"type":"integer","title":"Version"},"credits":{"type":"integer","title":"Credits","description":"Solde après le débit."}},"type":"object","required":["id_circuit","version","credits"],"title":"CircuitCree"},"Compte":{"properties":{"email":{"type":"string","title":"Email"},"solde":{"type":"integer","title":"Solde","description":"Crédits de l'adresse, communs au site et à l'API."},"limites":{"$ref":"#/components/schemas/Limites"}},"type":"object","required":["email","solde","limites"],"title":"Compte"},"DerniereLivraison":{"properties":{"le":{"type":"string","title":"Le"},"reussie":{"type":"boolean","title":"Reussie"},"statut_http":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Statut Http"},"erreur":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Erreur"}},"type":"object","required":["le","reussie","statut_http","erreur"],"title":"DerniereLivraison"},"Empreinte":{"properties":{"algo":{"type":"string","maxLength":32,"title":"Algo"},"valeur":{"type":"string","maxLength":200,"title":"Valeur"}},"type":"object","required":["algo","valeur"],"title":"Empreinte"},"Erreur":{"properties":{"erreur":{"type":"string","title":"Erreur","description":"Code d'erreur stable, par exemple `credits_insuffisants`."}},"type":"object","required":["erreur"],"title":"Erreur"},"EssaiWebhook":{"properties":{"reussi":{"type":"boolean","title":"Reussi"},"statut_http":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Statut Http"},"erreur":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Erreur"}},"type":"object","required":["reussi","statut_http","erreur"],"title":"EssaiWebhook"},"Limites":{"properties":{"requetes_par_minute":{"type":"integer","title":"Requetes Par Minute"},"restantes":{"type":"integer","title":"Restantes"}},"type":"object","required":["requetes_par_minute","restantes"],"title":"Limites"},"Livraisons":{"properties":{"livrees":{"type":"integer","title":"Livrees"},"en_attente":{"type":"integer","title":"En Attente"},"abandonnees":{"type":"integer","title":"Abandonnees"}},"type":"object","required":["livrees","en_attente","abandonnees"],"title":"Livraisons"},"NouveauWebhook":{"properties":{"url":{"type":"string","maxLength":2000,"title":"Url","description":"Adresse `https://` publique qui recevra les POST."},"evenements":{"items":{"type":"string","enum":["attestation.definitive","attestation.ancree","circuit.signature","circuit.complet","circuit.expire","circuit.annule"]},"type":"array","maxItems":6,"minItems":1,"title":"Evenements"}},"additionalProperties":false,"type":"object","required":["url","evenements"],"title":"NouveauWebhook"},"PageAttestations":{"properties":{"elements":{"items":{"$ref":"#/components/schemas/Attestation"},"type":"array","title":"Elements"},"suivant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suivant","description":"Curseur de la page suivante (`apres=`), absent à la fin."}},"type":"object","required":["elements","suivant"],"title":"PageAttestations"},"PageCircuits":{"properties":{"elements":{"items":{"$ref":"#/components/schemas/Circuit"},"type":"array","title":"Elements"},"suivant":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suivant"}},"type":"object","required":["elements","suivant"],"title":"PageCircuits"},"Relance":{"properties":{"relances":{"type":"integer","title":"Relances","description":"Signataires en attente prévenus (sans lien)."}},"type":"object","required":["relances"],"title":"Relance"},"SignataireCircuit":{"properties":{"prenom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prenom","description":"Absent si le participant a été effacé."},"nom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nom"},"role":{"type":"string","enum":["initiateur_signataire","signataire"],"title":"Role"},"a_signe":{"type":"boolean","title":"A Signe"},"signe_le":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signe Le"}},"type":"object","required":["prenom","nom","role","a_signe","signe_le"],"title":"SignataireCircuit"},"Verification":{"properties":{"taille":{"type":"integer","minimum":0.0,"title":"Taille","description":"Taille du fichier en octets."},"empreintes":{"items":{"$ref":"#/components/schemas/Empreinte"},"type":"array","maxItems":32,"minItems":1,"title":"Empreintes","description":"Empreintes du fichier, calculées chez vous."}},"additionalProperties":false,"type":"object","required":["taille","empreintes"],"title":"Verification"},"Webhook":{"properties":{"id_webhook":{"type":"string","title":"Id Webhook"},"url":{"type":"string","title":"Url"},"evenements":{"items":{"type":"string"},"type":"array","title":"Evenements"},"cree_le":{"type":"string","title":"Cree Le"},"livraisons":{"$ref":"#/components/schemas/Livraisons","description":"Bilan des 30 derniers jours."},"derniere_livraison":{"anyOf":[{"$ref":"#/components/schemas/DerniereLivraison"},{"type":"null"}]}},"type":"object","required":["id_webhook","url","evenements","cree_le","livraisons","derniere_livraison"],"title":"Webhook"},"WebhookCree":{"properties":{"id_webhook":{"type":"string","title":"Id Webhook"},"url":{"type":"string","title":"Url"},"evenements":{"items":{"type":"string"},"type":"array","title":"Evenements"},"cree_le":{"type":"string","title":"Cree Le"},"secret":{"type":"string","title":"Secret","description":"Secret de signature (`whsec_…`) : montré une seule fois, à conserver."}},"type":"object","required":["id_webhook","url","evenements","cree_le","secret"],"title":"WebhookCree"}},"securitySchemes":{"HTTPBearer":{"type":"http","description":"Clé API créée dans Réglages (`opk_…`).","scheme":"bearer"}}}}