{"openapi":"3.1.0","info":{"title":"Givre API","version":"1.0.0","description":"API client pour les modèles personnalisés, dossiers, utilisateurs, documents, certifications Datasure, jetons et callbacks."},"servers":[{"url":"https://givre.app/api/v1","description":"Environnement courant"}],"components":{"securitySchemes":{"ApiKeyBearer":{"type":"http","scheme":"bearer","bearerFormat":"API key","description":"Utilisez la clé API en clair comme token Bearer."},"ApiKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key"}},"schemas":{"Envelope":{"type":"object","required":["success","message","data","meta","errors"],"properties":{"success":{"type":"boolean"},"message":{"type":["string","null"]},"data":{"type":["object","array","null"]},"meta":{"type":["object","array"],"properties":{"code":{"type":["string","null"],"description":"Code d'erreur lisible par une machine, présent sur chaque réponse d'erreur. Voir le catalogue des erreurs dans le guide."},"pagination":{"$ref":"#/components/schemas/Pagination"}}},"errors":{"type":["object","array","null"],"description":"null en cas de succès. Sur une erreur de validation, les messages par champ."}}},"Pagination":{"type":"object","required":["current_page","last_page","per_page","total"],"properties":{"current_page":{"type":"integer"},"last_page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}}},"Dossier":{"type":"object","required":["uuid","reference","name","status","category","source","template","assigned_user","created_at","updated_at","due_at","completed_at","missed_at","archived_at","steps","step_count","proof_count","document_count","certification_enabled","template_snapshot"],"properties":{"uuid":{"type":"string","format":"uuid"},"reference":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["active","completed","missed","archived"],"description":"missed : le dossier était encore actif à son échéance due_at. Il est en lecture seule jusqu'à sa réouverture."},"category":{"type":"string"},"source":{"type":"string","enum":["web","mobile","api","schedule"],"description":"Mode de création du dossier : web (application web), mobile (application mobile), api (API client) ou schedule (dossier récurrent). Fixé une fois à la création."},"template":{"type":"object","required":["uuid","name","icon","category"],"description":"Modèle d'origine du dossier, tel que copié à la création.","properties":{"uuid":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]},"icon":{"type":"string"},"category":{"type":["string","null"]}}},"assigned_user":{"oneOf":[{"$ref":"#/components/schemas/UserSummary"},{"type":"null"}]},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"},"due_at":{"type":["string","null"],"format":"date-time","description":"Échéance facultative (ISO 8601). Un dossier encore actif à cette date passe au statut missed."},"completed_at":{"type":["string","null"],"format":"date-time","description":"Date de finalisation du dossier (ISO 8601) ; null tant qu'il n'est pas finalisé."},"missed_at":{"type":["string","null"],"format":"date-time","description":"Date du passage au statut missed (ISO 8601) ; null sinon."},"archived_at":{"type":["string","null"],"format":"date-time","description":"Date d'archivage du dossier (ISO 8601) ; null s'il n'est pas archivé."},"steps":{"type":"array","items":{"$ref":"#/components/schemas/DossierStep"}},"step_count":{"type":"integer","description":"Nombre d'étapes."},"proof_count":{"type":"integer","description":"Nombre de preuves attendues par les étapes."},"document_count":{"type":"integer","description":"Nombre de documents rattachés au dossier."},"certification_enabled":{"type":"boolean","description":"false : le modèle de ce dossier ne certifie pas les preuves avec Datasure. Ses documents finissent en not_certified, avec leur seule empreinte SHA-256, sans consommer de jetons. Figé à la création."},"template_snapshot":{"$ref":"#/components/schemas/DossierTemplateSnapshot"}}},"DossierTemplateSnapshot":{"type":"object","required":["config"],"description":"Copie du modèle prise à la création du dossier (complétée par template-sync). config.steps reprend les étapes du dossier, avec leurs documents.","properties":{"template":{"type":"object","properties":{"uuid":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]},"category":{"type":["string","null"]},"icon":{"type":["string","null"]}}},"config":{"type":"object","required":["steps"],"properties":{"certification":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean","default":true,"description":"false : les preuves des dossiers créés depuis ce modèle sont conservées avec leur seule empreinte SHA-256, jamais envoyées à Datasure et ne consomment aucun jeton (statut not_certified). certification_format vaut alors toujours rfc3161. Une config envoyée sans ce champ garde la valeur enregistrée."}}},"proof_overlay_images":{"type":"array","description":"Images de superposition du modèle, sans leur id : les logos des preuves sont déjà résolus dans geolocation_options.logo.","items":{"type":"object","properties":{"name":{"type":"string"},"path":{"type":"string"},"x":{"type":"number","minimum":0,"maximum":100},"y":{"type":"number","minimum":0,"maximum":100},"width":{"type":"number","minimum":1,"maximum":100},"height":{"type":"number","minimum":1,"maximum":100}}}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/DossierStep"}}}}}},"DossierStep":{"type":"object","required":["name","description","allowed_roles","proofs"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"allowed_roles":{"type":"array","items":{"type":"string"},"default":[],"description":"Noms des rôles autorisés à ajouter des documents à cette étape ; les doublons sont ignorés. Vide : tous les utilisateurs pouvant modifier le dossier. Les modèles personnalisés acceptent les rôles de leur client."},"proofs":{"type":"array","items":{"$ref":"#/components/schemas/DossierProof"}}}},"DossierProof":{"type":"object","required":["name","required","capture_type","certification_format","geolocation_required","geolocation_options","documents"],"properties":{"name":{"type":"string"},"required":{"type":"boolean"},"capture_type":{"type":"string","enum":["photo","document","scan_3d","form"]},"certification_format":{"type":"string","enum":["rfc3161","pades"]},"form":{"type":"object","description":"Uniquement sur les preuves formulaire : la version du formulaire figée à la création du dossier. La preuve se remplit avec ce formulaire, jamais avec un fichier envoyé ; chaque envoi est enregistré en document PDF.","required":["uuid","version_uuid","version","name"],"properties":{"uuid":{"type":"string","format":"uuid"},"version_uuid":{"type":"string","format":"uuid"},"version":{"type":"integer"},"name":{"type":"string"}}},"geolocation_required":{"type":"boolean"},"geolocation_options":{"type":"object","required":["banner","logo"],"properties":{"banner":{"$ref":"#/components/schemas/TemplateProofBanner"},"logo":{"$ref":"#/components/schemas/DossierProofLogo"}}},"documents":{"type":"array","items":{"$ref":"#/components/schemas/ProofDocument"},"description":"Documents envoyés pour cette preuve, du plus récent au plus ancien."}}},"DossierProofLogo":{"type":"object","required":["enabled","image_id","name","path","x","y","width","height"],"description":"Logo apposé sur les photos, résolu depuis les proof_overlay_images du modèle. Désactivé, image_id, name et path valent null.","properties":{"enabled":{"type":"boolean"},"image_id":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]},"path":{"type":["string","null"]},"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}}},"ProofDocument":{"type":"object","required":["uuid","status","source","original_name","mime_type","size","hash","captured_at","device","geolocation","retry_count","failure_reason","certified_at","client_capture_id","scan","certification"],"description":"Document tel que listé dans une preuve du dossier. GET /dossiers/{uuid}/documents/{document} renvoie le Document complet.","properties":{"uuid":{"type":"string","format":"uuid"},"source":{"type":"string","enum":["web","mobile","api"]},"status":{"type":"string","enum":["pending","processing","retrying","certification_disabled","insufficient_tokens","valid","failed","not_certified"],"description":"not_certified : statut final, le modèle du dossier ne certifie pas ses preuves avec Datasure. Le fichier est conservé avec sa seule empreinte SHA-256 et n’est jamais certifié par la suite."},"original_name":{"type":"string"},"mime_type":{"type":["string","null"]},"size":{"type":"integer"},"hash":{"type":"string"},"captured_at":{"type":["string","null"],"format":"date-time","description":"Date de capture envoyée avec le dépôt (ISO 8601)."},"device":{"type":["object","null"]},"geolocation":{"type":["object","null"]},"retry_count":{"type":"integer","description":"Nombre de relances automatiques de certification déjà effectuées."},"failure_reason":{"type":["string","null"],"description":"Raison de l'échec de la certification. Les erreurs du fournisseur sont remplacées par un message générique."},"certified_at":{"type":["string","null"],"format":"date-time"},"client_capture_id":{"type":["string","null"],"description":"Le client_capture_id envoyé avec le dépôt, le cas échéant."},"scan":{"type":["object","null"],"description":"Scan 3D uniquement ; null pour tout autre document.","properties":{"summary":{"type":"object"},"has_preview":{"type":"boolean"},"photos_count":{"type":"integer"}}},"certification":{"oneOf":[{"$ref":"#/components/schemas/ProofDocumentCertification"},{"type":"null"}]}}},"ProofDocumentCertification":{"type":"object","required":["provider","mode","status","hash_algorithm","fingerprint","serial_number","error_message","requested_at","completed_at","charged_at","refunded_at","artifacts"],"description":"Dernière certification d'un document listé dans un dossier. GET /certifications/{certification} renvoie la Certification complète.","properties":{"provider":{"type":"string","example":"datasure"},"mode":{"type":"string"},"status":{"type":"string","enum":["pending","insufficient_tokens","success","failed"]},"hash_algorithm":{"type":"string","example":"sha256"},"fingerprint":{"type":"string"},"serial_number":{"type":["string","null"]},"error_message":{"type":["string","null"],"description":"Raison de l'échec de la certification. Les erreurs du fournisseur sont remplacées par un message générique."},"requested_at":{"type":["string","null"],"format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"charged_at":{"type":["string","null"],"format":"date-time"},"refunded_at":{"type":["string","null"],"format":"date-time"},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/ProofDocumentArtifact"}}}},"ProofDocumentArtifact":{"type":"object","required":["type","status","filename","error_message","generated_at"],"description":"Artefact tel que listé dans une preuve du dossier. GET /dossiers/{uuid}/documents/{document}/artifacts renvoie le CertificationArtifact complet.","properties":{"type":{"type":"string","enum":["eidas_certificate","pades_pdf"]},"status":{"type":"string","enum":["pending","insufficient_tokens","success","failed"]},"filename":{"type":["string","null"]},"error_message":{"type":["string","null"],"description":"Raison de l'échec de la génération. Les erreurs du fournisseur sont remplacées par un message générique."},"generated_at":{"type":["string","null"],"format":"date-time"}}},"UserSummary":{"type":"object","required":["uuid","name","first_name","last_name","email","status"],"properties":{"uuid":{"type":"string","format":"uuid"},"name":{"type":"string"},"first_name":{"type":"string"},"last_name":{"type":["string","null"]},"email":{"type":"string","format":"email"},"status":{"type":"string","enum":["active","inactive"]}}},"User":{"type":"object","required":["uuid","name","first_name","last_name","email","status","is_active","role","is_owner","client","created_at","updated_at"],"properties":{"uuid":{"type":"string","format":"uuid"},"name":{"type":"string"},"first_name":{"type":"string"},"last_name":{"type":["string","null"]},"email":{"type":"string","format":"email"},"status":{"type":"string","enum":["active","inactive"]},"is_active":{"type":"boolean"},"role":{"type":["string","null"]},"is_owner":{"type":"boolean"},"client":{"type":["object","null"],"properties":{"uuid":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"status":{"type":"string"}}},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"Template":{"type":"object","required":["uuid","slug","scope","status","category","name","description","icon","image","tone","certification","proof_overlay_images","steps","proof_count","published_at","archived_at","created_at","updated_at"],"properties":{"uuid":{"type":"string","format":"uuid"},"slug":{"type":"string"},"scope":{"type":"string","enum":["global","client"]},"status":{"type":"string","enum":["draft","published","archived"]},"category":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"icon":{"type":"string"},"image":{"type":["string","null"]},"tone":{"type":"string"},"certification":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean","default":true,"description":"false : les preuves des dossiers créés depuis ce modèle sont conservées avec leur seule empreinte SHA-256, jamais envoyées à Datasure et ne consomment aucun jeton (statut not_certified). certification_format vaut alors toujours rfc3161. Une config envoyée sans ce champ garde la valeur enregistrée."}}},"proof_overlay_images":{"type":"array","items":{"$ref":"#/components/schemas/TemplateProofOverlayImage"}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/TemplateStep"}},"proof_count":{"type":"integer"},"published_at":{"type":["string","null"],"format":"date-time"},"archived_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"TemplateProofOverlayImage":{"type":"object","required":["id","name","path","x","y","width","height"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"path":{"type":"string"},"x":{"type":"number","minimum":0,"maximum":100},"y":{"type":"number","minimum":0,"maximum":100},"width":{"type":"number","minimum":1,"maximum":100},"height":{"type":"number","minimum":1,"maximum":100}}},"TemplateStep":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"description":{"type":["string","null"]},"allowed_roles":{"type":"array","items":{"type":"string"},"default":[],"description":"Noms des rôles autorisés à ajouter des documents à cette étape ; les doublons sont ignorés. Vide : tous les utilisateurs pouvant modifier le dossier. Les modèles personnalisés acceptent les rôles de leur client."},"proofs":{"type":"array","items":{"$ref":"#/components/schemas/TemplateProof"}}}},"TemplateProof":{"type":"object","required":["name","certification_format"],"properties":{"name":{"type":"string"},"required":{"type":"boolean"},"capture_type":{"type":"string","enum":["photo","scan_3d","form"],"default":"photo"},"certification_format":{"type":"string","enum":["rfc3161","pades"]},"form":{"type":"object","description":"Obligatoire sur les preuves formulaire : un formulaire du constructeur que ce client peut utiliser, avec une version publiée.","properties":{"uuid":{"type":"string","format":"uuid"}}},"geolocation_required":{"type":"boolean"},"geolocation_options":{"type":"object","properties":{"banner":{"$ref":"#/components/schemas/TemplateProofBanner"},"logo":{"$ref":"#/components/schemas/TemplateProofLogo"}}}}},"TemplateProofBanner":{"type":"object","required":["enabled","fields"],"properties":{"enabled":{"type":"boolean"},"fields":{"type":"object","required":["latitude","longitude","address","date","time"],"properties":{"latitude":{"type":"boolean"},"longitude":{"type":"boolean"},"address":{"type":"boolean"},"date":{"type":"boolean"},"time":{"type":"boolean"}}}}},"TemplateProofLogo":{"type":"object","properties":{"enabled":{"type":"boolean"},"image_id":{"type":["string","null"],"format":"uuid"}}},"FormSubmission":{"type":"object","required":["uuid","client_submission_id","submitted_at","document"],"properties":{"uuid":{"type":"string","format":"uuid"},"client_submission_id":{"type":"string","format":"uuid"},"submitted_at":{"type":"string","format":"date-time"},"document":{"$ref":"#/components/schemas/Document"}}},"Document":{"type":"object","required":["uuid","step_index","proof_index","proof_name","source","status","original_name","mime_type","extension","size","hash","captured_at","device","geolocation","retry_count","failure_reason","processing_started_at","certified_at","client_capture_id","scan","certification","artifacts"],"properties":{"uuid":{"type":"string","format":"uuid"},"source":{"type":"string","enum":["web","mobile","api"]},"status":{"type":"string","enum":["pending","processing","retrying","certification_disabled","insufficient_tokens","valid","failed","not_certified"],"description":"not_certified : statut final, le modèle du dossier ne certifie pas ses preuves avec Datasure. Le fichier est conservé avec sa seule empreinte SHA-256 et n’est jamais certifié par la suite."},"original_name":{"type":"string"},"mime_type":{"type":["string","null"]},"size":{"type":"integer"},"hash":{"type":"string"},"captured_at":{"type":["string","null"],"format":"date-time","description":"Date de capture envoyée avec le dépôt (ISO 8601)."},"device":{"type":["object","null"]},"geolocation":{"type":["object","null"]},"retry_count":{"type":"integer","description":"Nombre de relances automatiques de certification déjà effectuées."},"failure_reason":{"type":["string","null"],"description":"Raison de l'échec de la certification. Les erreurs du fournisseur sont remplacées par un message générique."},"certified_at":{"type":["string","null"],"format":"date-time"},"client_capture_id":{"type":["string","null"],"description":"Le client_capture_id envoyé avec le dépôt, le cas échéant."},"step_index":{"type":"integer"},"proof_index":{"type":"integer"},"proof_name":{"type":"string"},"extension":{"type":["string","null"]},"processing_started_at":{"type":["string","null"],"format":"date-time","description":"Début de la tentative de certification en cours ; null si aucune n'est en cours."},"scan":{"type":["object","null"],"description":"Scan 3D uniquement ; null pour tout autre document.","properties":{"summary":{"type":"object"}}},"certification":{"oneOf":[{"$ref":"#/components/schemas/Certification"},{"type":"null"}]},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/CertificationArtifact"}}}},"Certification":{"type":"object","required":["uuid","provider","mode","status","hash_algorithm","fingerprint","serial_number","error_message","requested_at","completed_at","charged_at","refunded_at","artifacts"],"properties":{"uuid":{"type":"string","format":"uuid"},"provider":{"type":"string","example":"datasure"},"mode":{"type":"string"},"status":{"type":"string","enum":["pending","insufficient_tokens","success","failed"]},"hash_algorithm":{"type":"string","example":"sha256"},"fingerprint":{"type":"string"},"serial_number":{"type":["string","null"]},"error_message":{"type":["string","null"],"description":"Raison de l'échec de la certification. Les erreurs du fournisseur sont remplacées par un message générique."},"requested_at":{"type":["string","null"],"format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"charged_at":{"type":["string","null"],"format":"date-time"},"refunded_at":{"type":["string","null"],"format":"date-time"},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/CertificationArtifact"}},"document":{"type":["object","null"],"description":"Présent sur GET /certifications, GET /certifications/{certification} et POST /dossiers/{uuid}/documents/{document}/certifications ; absent de la certification imbriquée dans un document.","required":["uuid","status","original_name","hash","dossier_uuid"],"properties":{"uuid":{"type":"string","format":"uuid"},"status":{"type":"string"},"original_name":{"type":"string"},"hash":{"type":"string"},"dossier_uuid":{"type":["string","null"],"format":"uuid"}}}}},"CertificationArtifact":{"type":"object","required":["uuid","certification_uuid","type","status","filename","error_message","requested_at","generated_at"],"properties":{"uuid":{"type":"string","format":"uuid"},"certification_uuid":{"type":["string","null"],"format":"uuid"},"type":{"type":"string","enum":["eidas_certificate","pades_pdf"]},"status":{"type":"string","enum":["pending","insufficient_tokens","success","failed"]},"filename":{"type":["string","null"]},"error_message":{"type":["string","null"],"description":"Raison de l'échec de la génération. Les erreurs du fournisseur sont remplacées par un message générique."},"requested_at":{"type":["string","null"],"format":"date-time"},"generated_at":{"type":["string","null"],"format":"date-time"}}},"ArtifactResult":{"type":"object","required":["artifact"],"properties":{"artifact":{"$ref":"#/components/schemas/CertificationArtifact"}}},"QueuedCertification":{"type":"object","required":["document_uuid","status","certification"],"properties":{"document_uuid":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending","processing","retrying","certification_disabled","insufficient_tokens","valid","failed","not_certified"],"description":"not_certified : statut final, le modèle du dossier ne certifie pas ses preuves avec Datasure. Le fichier est conservé avec sa seule empreinte SHA-256 et n’est jamais certifié par la suite."},"certification":{"oneOf":[{"$ref":"#/components/schemas/Certification"},{"type":"null"}]}}},"TokenTransaction":{"type":"object","required":["type","amount","balance_after","reason","description","metadata","certification_uuid","created_at"],"properties":{"type":{"type":"string","enum":["adjustment","certification_debit","certification_refund"]},"amount":{"type":"integer","description":"Négatif pour un débit."},"balance_after":{"type":"integer"},"reason":{"type":["string","null"]},"description":{"type":["string","null"]},"metadata":{"type":["object","array"],"description":"Seules ces clés sont exposées, lorsqu'elles sont renseignées.","properties":{"artifact_type":{"type":"string","enum":["eidas_certificate","pades_pdf"]},"document_uuid":{"type":"string","format":"uuid"},"fingerprint":{"type":"string"},"serial_number":{"type":["string","null"]}}},"certification_uuid":{"type":["string","null"],"format":"uuid"},"created_at":{"type":"string","format":"date-time"}}},"TokenBalance":{"type":"object","required":["client_uuid","client_name","balance","unit_cost","expires"],"properties":{"client_uuid":{"type":"string","format":"uuid"},"client_name":{"type":"string"},"balance":{"type":"integer"},"unit_cost":{"type":"integer","example":1},"expires":{"type":"boolean","example":false}}},"DeletedDossier":{"type":"object","required":["uuid","reference","deleted"],"properties":{"uuid":{"type":"string","format":"uuid"},"reference":{"type":"string"},"deleted":{"type":"boolean","example":true}}},"ApiKeyContext":{"type":"object","required":["client","user","application","scopes"],"properties":{"client":{"type":["object","null"],"properties":{"uuid":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"status":{"type":"string"}}},"user":{"type":["object","null"],"description":"Utilisateur au nom duquel agit la clé API.","properties":{"first_name":{"type":"string"},"last_name":{"type":["string","null"]},"email":{"type":"string","format":"email"}}},"application":{"type":["object","null"],"properties":{"name":{"type":"string"},"type":{"type":"string"}}},"scopes":{"type":"array","items":{"type":"string","enum":["read","write"]}}}}}},"security":[{"ApiKeyBearer":[]},{"ApiKeyHeader":[]}],"tags":[{"name":"Health"},{"name":"Account"},{"name":"Templates"},{"name":"Dossiers"},{"name":"Users"},{"name":"Documents"},{"name":"Certifications"},{"name":"Tokens"},{"name":"Callbacks"}],"paths":{"/health":{"get":{"tags":["Health"],"summary":"Vérification de santé","description":"Un appel anonyme ne reçoit que le statut de chaque vérification. Envoyez l'en-tête X-Health-Token avec le jeton opérateur pour obtenir le détail. Limité par IP.","security":[],"parameters":[{"name":"X-Health-Token","in":"header","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"503":{"description":"Une dépendance est indisponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}}}},"/me":{"get":{"tags":["Account"],"summary":"Contexte de la clé API courante","responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ApiKeyContext"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"}},"/templates":{"get":{"tags":["Templates"],"summary":"Lister les modèles publiés disponibles pour le client","parameters":[{"name":"per_page","in":"query","required":false,"description":"Éléments par page, 25 par défaut. Les valeurs hors de 1 à 100 sont ramenées dans cet intervalle, pas refusées.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"page","in":"query","required":false,"description":"Numéro de page, à partir de 1","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Template"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read","x-permissions":["templates.view"]}},"/templates/custom":{"get":{"tags":["Templates"],"summary":"Lister les modèles personnalisés du client","parameters":[{"name":"per_page","in":"query","required":false,"description":"Éléments par page, 25 par défaut. Les valeurs hors de 1 à 100 sont ramenées dans cet intervalle, pas refusées.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"page","in":"query","required":false,"description":"Numéro de page, à partir de 1","schema":{"type":"integer","minimum":1,"default":1}},{"name":"include_archived","in":"query","required":false,"description":"Inclure les modèles personnalisés archivés","schema":{"type":"boolean"}},{"name":"status","in":"query","required":false,"description":"Filtrer par statut de modèle","schema":{"type":"string"}},{"name":"search","in":"query","required":false,"description":"Rechercher les modèles personnalisés par nom, description ou catégorie","schema":{"type":"string"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Template"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read","x-permissions":["templates.view"]},"post":{"tags":["Templates"],"summary":"Créer un brouillon de modèle personnalisé","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","category","config"],"properties":{"name":{"type":"string","example":"Client onboarding checklist"},"description":{"type":["string","null"]},"category":{"type":"string","enum":["operations","quality","logistics","other"]},"icon":{"type":"string","example":"bi-clipboard2-check"},"image":{"type":["string","null"],"example":"assets/template/images/templates/custom.png"},"tone":{"type":"string","enum":["primary","success","info","warning","danger","muted"]},"config":{"type":"object","required":["steps"],"properties":{"certification":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean","default":true,"description":"false : les preuves des dossiers créés depuis ce modèle sont conservées avec leur seule empreinte SHA-256, jamais envoyées à Datasure et ne consomment aucun jeton (statut not_certified). certification_format vaut alors toujours rfc3161. Une config envoyée sans ce champ garde la valeur enregistrée."}}},"proof_overlay_images":{"type":"array","items":{"$ref":"#/components/schemas/TemplateProofOverlayImage"}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/TemplateStep"}}}}}}}}},"responses":{"201":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write","x-permissions":["templates.create"]}},"/templates/custom/{uuid}":{"get":{"tags":["Templates"],"summary":"Afficher un modèle personnalisé","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"},"patch":{"tags":["Templates"],"summary":"Modifier un brouillon ou les métadonnées d'un modèle personnalisé","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"name":{"type":"string","example":"Client onboarding checklist"},"description":{"type":["string","null"]},"category":{"type":"string","enum":["operations","quality","logistics","other"]},"icon":{"type":"string","example":"bi-clipboard2-check"},"image":{"type":["string","null"],"example":"assets/template/images/templates/custom.png"},"tone":{"type":"string","enum":["primary","success","info","warning","danger","muted"]},"config":{"type":"object","required":["steps"],"properties":{"certification":{"type":"object","required":["enabled"],"properties":{"enabled":{"type":"boolean","default":true,"description":"false : les preuves des dossiers créés depuis ce modèle sont conservées avec leur seule empreinte SHA-256, jamais envoyées à Datasure et ne consomment aucun jeton (statut not_certified). certification_format vaut alors toujours rfc3161. Une config envoyée sans ce champ garde la valeur enregistrée."}}},"proof_overlay_images":{"type":"array","items":{"$ref":"#/components/schemas/TemplateProofOverlayImage"}},"steps":{"type":"array","items":{"$ref":"#/components/schemas/TemplateStep"}}}}}}}}},"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/templates/custom/{uuid}/publish":{"post":{"tags":["Templates"],"summary":"Publier un modèle personnalisé","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/templates/custom/{uuid}/archive":{"post":{"tags":["Templates"],"summary":"Archiver un modèle personnalisé","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/templates/custom/{uuid}/unarchive":{"post":{"tags":["Templates"],"summary":"Désarchiver un modèle personnalisé","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/templates/custom/{uuid}/duplicate":{"post":{"tags":["Templates"],"summary":"Dupliquer un modèle personnalisé en brouillon","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Template"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers":{"get":{"tags":["Dossiers"],"summary":"Lister les dossiers","parameters":[{"name":"per_page","in":"query","required":false,"description":"Éléments par page, 25 par défaut. Les valeurs hors de 1 à 100 sont ramenées dans cet intervalle, pas refusées.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"page","in":"query","required":false,"description":"Numéro de page, à partir de 1","schema":{"type":"integer","minimum":1,"default":1}},{"name":"include_archived","in":"query","required":false,"description":"Inclure les dossiers archivés","schema":{"type":"boolean"}},{"name":"status","in":"query","required":false,"description":"Filtrer par statut de dossier. archived implique include_archived.","schema":{"type":"string","enum":["active","completed","missed","archived"]}},{"name":"template_uuid","in":"query","required":false,"description":"Seulement les dossiers créés à partir de ce modèle","schema":{"type":"string"}},{"name":"search","in":"query","required":false,"description":"Rechercher les dossiers par nom ou référence","schema":{"type":"string"}},{"name":"source","in":"query","required":false,"description":"Filtrer par mode de création du dossier","schema":{"type":"string","enum":["web","mobile","api","schedule"]}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Dossier"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"},"post":{"tags":["Dossiers"],"summary":"Créer un dossier depuis un modèle","description":"Fournir un utilisateur assigné nécessite la permission d'assignation des dossiers.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["template_uuid"],"properties":{"template_uuid":{"type":"string","format":"uuid","description":"UUID du modèle renvoyé par GET /templates. Ce n'est pas un UUID de dossier."},"name":{"type":["string","null"]},"assigned_user_uuid":{"type":["string","null"],"format":"uuid","description":"UUID utilisateur client optionnel à assigner au dossier."},"due_at":{"type":["string","null"],"format":"date-time","description":"Échéance facultative, dans le futur (ISO 8601). Passé cette date, un dossier encore actif passe au statut missed."}}}}}},"responses":{"201":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"}}}]}}}},"403":{"description":"L'utilisateur de l'API ne peut pas assigner de dossiers","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"L'utilisateur sélectionné n'est pas disponible pour ce client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"L'utilisateur sélectionné est inactif ou indisponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}":{"get":{"tags":["Dossiers"],"summary":"Afficher un dossier","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"},"patch":{"tags":["Dossiers"],"summary":"Modifier le nom ou l'échéance du dossier","description":"Envoyez name, due_at ou les deux. due_at doit être dans le futur ; null supprime l'échéance. Seul un dossier actif peut être modifié.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"name":{"type":"string"},"due_at":{"type":["string","null"],"format":"date-time"}}}}}},"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"}}}]}}}},"403":{"description":"forbidden : l'utilisateur de l'API ne peut pas modifier ce dossier, ou il n'est pas actif","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : ni name ni due_at n'a été envoyé, ou due_at n'est pas dans le futur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"},"delete":{"tags":["Dossiers"],"summary":"Supprimer un dossier","description":"Supprime définitivement le dossier avec ses documents, certifications et fichiers ; cette action est irréversible. Nécessite la permission de suppression des dossiers. Les dossiers actifs, terminés et archivés peuvent être supprimés ; les dossiers archivés ne sont accessibles que si l'utilisateur API peut consulter les archives. Les transactions de jetons sont conservées et une trace d'audit est enregistrée.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Les identifiants du dossier supprimé","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DeletedDossier"}}}]}}}},"403":{"description":"forbidden : l'utilisateur API ne peut pas supprimer ce dossier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/assignee":{"post":{"tags":["Dossiers","Users"],"summary":"Assigner un utilisateur à un dossier","description":"Nécessite la permission d'assignation et un dossier actif.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["user_uuid"],"properties":{"user_uuid":{"type":"string","format":"uuid","description":"UUID utilisateur client retourné par GET /users."}}}}}},"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"}}}]}}}},"403":{"description":"Ce dossier ne peut pas être assigné par cet utilisateur de l'API","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"L'utilisateur sélectionné n'est pas disponible pour ce client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"L'utilisateur sélectionné est inactif ou indisponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"},"delete":{"tags":["Dossiers","Users"],"summary":"Retirer l'utilisateur assigné au dossier","description":"Nécessite la permission d'assignation et un dossier actif.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"}}}]}}}},"403":{"description":"Ce dossier ne peut pas être assigné par cet utilisateur de l'API","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/complete":{"post":{"tags":["Dossiers"],"summary":"Terminer un dossier","description":"Nécessite la permission dossiers.complete et un dossier actif. Terminer un dossier déjà terminé le renvoie inchangé.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"}}}]}}}},"403":{"description":"forbidden : l'utilisateur de l'API ne peut pas terminer ce dossier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"409":{"description":"invalid_state : le statut du dossier ne permet pas cette action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/reopen":{"post":{"tags":["Dossiers"],"summary":"Rouvrir un dossier terminé ou non fait","description":"Repasse un dossier terminé ou non fait à l'état actif et efface completed_at et missed_at, pour que des documents puissent de nouveau être ajoutés depuis tous les canaux. Une échéance déjà passée (toujours le cas d'un dossier non fait) est supprimée : due_at devient null. Rouvrir un dossier actif le renvoie inchangé. Les dossiers archivés doivent d'abord être désarchivés.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"}}}]}}}},"403":{"description":"forbidden : l'utilisateur API ne peut pas modifier ce dossier, ou le dossier est archivé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"409":{"description":"invalid_state : seul un dossier terminé ou non fait peut être rouvert","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/archive":{"post":{"tags":["Dossiers"],"summary":"Archiver un dossier","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"}}}]}}}},"409":{"description":"invalid_state : le statut du dossier ne permet pas cette action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/unarchive":{"post":{"tags":["Dossiers"],"summary":"Désarchiver un dossier","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"}}}]}}}},"409":{"description":"invalid_state : le statut du dossier ne permet pas cette action","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/template-sync":{"post":{"tags":["Dossiers","Templates"],"summary":"Ajouter les nouvelles étapes du modèle à un dossier","description":"Lorsque les étapes du dossier sont encore le début du modèle publié (même capture_type et certification_format par index de preuve ; les noms ne sont pas comparés, sauf sur une étape qui reçoit des preuves), les étapes finales manquantes sont ajoutées, les preuves ajoutées en fin d'étape existante y sont ajoutées, et les allowed_roles des étapes existantes sont mis à jour depuis le modèle. Les noms, index et documents des étapes et preuves existantes ne changent jamais. Les dossiers terminés sont acceptés ; un nouvel appel renvoie added_steps 0, added_proofs 0 et updated_steps 0.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Le dossier ; meta.added_steps compte les étapes ajoutées, meta.added_proofs les preuves ajoutées aux étapes existantes et meta.updated_steps les étapes existantes dont les allowed_roles ont changé (0 partout si déjà à jour)","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Dossier"},"meta":{"type":"object","required":["added_steps","added_proofs","updated_steps"],"properties":{"added_steps":{"type":"integer","minimum":0},"added_proofs":{"type":"integer","minimum":0},"updated_steps":{"type":"integer","minimum":0}}}}}]}}}},"403":{"description":"forbidden : l'utilisateur de l'API ne peut pas modifier ce dossier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"409":{"description":"template_snapshot_diverged : les étapes du dossier ne correspondent plus au début du modèle ; dossier_archived : désarchivez d'abord le dossier ; template_not_published : le modèle du dossier n'est pas publié. Rien n'a été modifié.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/documents":{"get":{"tags":["Documents"],"summary":"Lister les documents rattachés à un dossier","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"per_page","in":"query","required":false,"description":"Éléments par page, 25 par défaut. Les valeurs hors de 1 à 100 sont ramenées dans cet intervalle, pas refusées.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"page","in":"query","required":false,"description":"Numéro de page, à partir de 1","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"},"post":{"tags":["Documents"],"summary":"Envoyer un document de preuve et mettre la certification Datasure en file","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file","step_index","proof_index"],"properties":{"file":{"type":"string","format":"binary"},"step_index":{"type":"integer","minimum":0},"proof_index":{"type":"integer","minimum":0},"captured_at":{"type":["string","null"],"format":"date-time"},"client_capture_id":{"type":"string","maxLength":255,"description":"Votre identifiant unique pour cette capture. Une nouvelle tentative avec le même identifiant renvoie le document enregistré (200) au lieu d'en créer un second."},"client_sha256":{"type":"string","pattern":"^[a-fA-F0-9]{64}$","description":"SHA-256 du fichier tel que vous l'envoyez. L'envoi est refusé si le fichier reçu diffère."},"device[id]":{"type":"string"},"device[name]":{"type":"string"},"device[model]":{"type":"string"},"device[platform]":{"type":"string"},"device[os_version]":{"type":"string"},"device[app_version]":{"type":"string"}}}}}},"responses":{"201":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Document"}}}]}}}},"200":{"description":"Déjà envoyé avec ce client_capture_id : le document enregistré","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Document"}}}]}}}},"403":{"description":"forbidden : le dossier est archivé ou non fait, ou l'utilisateur de l'API ne peut pas le modifier ; step_role_forbidden : l'étape est réservée à des rôles que l'utilisateur de l'API ne possède pas. Un dossier non fait accepte encore un document dont captured_at ne dépasse pas due_at, envoyé dans les 24 heures qui suivent due_at.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"409":{"description":"capture_id_conflict : le client_capture_id est déjà lié à un autre fichier","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed, ou capture_hash_mismatch : le fichier reçu ne correspond pas à client_sha256","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"503":{"description":"document_storage_unavailable : réessayez après le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/forms":{"post":{"tags":["Documents"],"summary":"Envoyer les réponses d'une preuve formulaire","description":"Les réponses sont contrôlées selon la version du formulaire figée dans le dossier, puis enregistrées en document PDF de la preuve et certifiées comme un envoi de fichier. Un nouvel envoi crée un nouveau document.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["step_index","proof_index","form_version_uuid","client_submission_id","answers"],"properties":{"step_index":{"type":"integer","minimum":0},"proof_index":{"type":"integer","minimum":0},"form_version_uuid":{"type":"string","format":"uuid","description":"form.version_uuid de la preuve dans le dossier."},"client_submission_id":{"type":"string","format":"uuid","description":"Votre identifiant unique pour cet envoi. Réessayer avec le même identifiant et les mêmes réponses renvoie l'envoi enregistré (200)."},"answers":{"type":"object","description":"Réponses organisées comme le schéma du formulaire : une section est un objet, une section répétée une liste d'objets."},"captured_at":{"type":["string","null"],"format":"date-time"},"device":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"model":{"type":"string"},"platform":{"type":"string"},"os_version":{"type":"string"},"app_version":{"type":"string"}}}}}}}},"responses":{"201":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/FormSubmission"}}}]}}}},"200":{"description":"Déjà envoyé avec ce client_submission_id et ces réponses : l'envoi enregistré","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/FormSubmission"}}}]}}}},"403":{"description":"forbidden : le dossier est archivé ou manqué, ou l'utilisateur de l'API ne peut pas le modifier ; step_role_forbidden : l'étape est réservée à des rôles que l'utilisateur de l'API n'a pas.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"409":{"description":"submission_id_conflict : le client_submission_id a déjà été envoyé avec d'autres réponses","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed ; proof_not_form : la preuve n'est pas un formulaire ; form_version_mismatch : form_version_uuid n'est pas la version du dossier ; form_invalid : les réponses ont des problèmes, listés dans « issues » à la racine (path, code, message)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/documents/{document}":{"get":{"tags":["Documents"],"summary":"Afficher les métadonnées, la certification et les artefacts du document","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"document","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Document"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"}},"/dossiers/{uuid}/documents/{document}/download":{"get":{"tags":["Documents"],"summary":"Télécharger le document original du dossier","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"document","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"preview","in":"query","required":false,"description":"Renvoyer l'aperçu avec le bandeau de géolocalisation et d'horodatage lorsqu'il est disponible","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Fichier binaire","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"403":{"description":"Les téléchargements de documents sont désactivés pour les comptes clients.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"Le document original est introuvable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"}},"/dossiers/{uuid}/documents/{document}/artifacts":{"get":{"tags":["Documents","Certifications"],"summary":"Lister les artefacts générés pour un document","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"document","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CertificationArtifact"}}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"}},"/dossiers/{uuid}/documents/{document}/certifications":{"post":{"tags":["Certifications"],"summary":"Mettre en file la certification d'un document existant","description":"Relance la certification d'un document qui n'est pas encore valide ; un document valide est renvoyé tel quel. Les dossiers archivés répondent 404.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"document","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/QueuedCertification"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/documents/{document}/eidas-certificate":{"post":{"tags":["Certifications"],"summary":"Générer ou réutiliser le PDF de certificat eIDAS Datasure stocké","description":"La première génération réussie coûte un jeton ; les appels suivants réutilisent gratuitement le PDF enregistré.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"document","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ArtifactResult"}}}]}}}},"402":{"description":"insufficient_tokens : le client n'a plus de jeton","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_permission : l'utilisateur API ne peut pas générer d'artefacts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"409":{"description":"certification_not_ready : le document n'est pas encore certifié","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"502":{"description":"artifact_generation_failed : le prestataire a échoué, rien n'a été débité","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"},"get":{"tags":["Certifications"],"summary":"Télécharger le PDF de certificat eIDAS Datasure stocké","description":"Ne génère et ne facture jamais : appelez d'abord POST sur la même URL.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"document","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Fichier PDF","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"403":{"description":"Les téléchargements de documents sont désactivés pour les comptes clients.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"artifact_not_found : aucun certificat eIDAS n'a encore été généré","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"}},"/dossiers/{uuid}/documents/{document}/sign-pdf":{"post":{"tags":["Certifications"],"summary":"Générer ou réutiliser le PDF signé PAdES stocké pour un document PDF certifié","description":"La première génération réussie coûte un jeton ; les appels suivants réutilisent gratuitement le PDF enregistré.","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"document","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/ArtifactResult"}}}]}}}},"402":{"description":"insufficient_tokens : le client n'a plus de jeton","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_permission : l'utilisateur API ne peut pas générer d'artefacts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"409":{"description":"certification_not_ready : le document n'est pas encore certifié","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"document_not_pdf : seuls les documents PDF peuvent être signés","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"502":{"description":"artifact_generation_failed : le prestataire a échoué, rien n'a été débité","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/dossiers/{uuid}/documents/{document}/signed-pdf":{"get":{"tags":["Certifications"],"summary":"Télécharger le PDF signé PAdES stocké","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"document","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Fichier PDF","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"403":{"description":"Les téléchargements de documents sont désactivés pour les comptes clients.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"Aucun PDF signé stocké n'a été trouvé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"}},"/certifications":{"get":{"tags":["Certifications"],"summary":"Lister les certifications Datasure","parameters":[{"name":"per_page","in":"query","required":false,"description":"Éléments par page, 25 par défaut. Les valeurs hors de 1 à 100 sont ramenées dans cet intervalle, pas refusées.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"page","in":"query","required":false,"description":"Numéro de page, à partir de 1","schema":{"type":"integer","minimum":1,"default":1}},{"name":"status","in":"query","required":false,"description":"Filtrer par statut de certification","schema":{"type":"string","enum":["pending","insufficient_tokens","success","failed"]}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Certification"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read","x-permissions":["dossiers.view","dossiers.view_all"]}},"/certifications/{certification}":{"get":{"tags":["Certifications"],"summary":"Afficher une certification","parameters":[{"name":"certification","in":"path","required":true,"description":"UUID de la certification.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Certification"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read","x-permissions":["dossiers.view","dossiers.view_all"]}},"/users":{"get":{"tags":["Users"],"summary":"Lister les utilisateurs client","parameters":[{"name":"per_page","in":"query","required":false,"description":"Éléments par page, 25 par défaut. Les valeurs hors de 1 à 100 sont ramenées dans cet intervalle, pas refusées.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"page","in":"query","required":false,"description":"Numéro de page, à partir de 1","schema":{"type":"integer","minimum":1,"default":1}},{"name":"status","in":"query","required":false,"description":"Filtrer les utilisateurs par statut actif ou inactif","schema":{"type":"string","enum":["active","inactive"]}},{"name":"search","in":"query","required":false,"description":"Rechercher les utilisateurs par nom ou e-mail","schema":{"type":"string"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/User"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"},"post":{"tags":["Users"],"summary":"Créer un utilisateur client","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["first_name","email"],"properties":{"first_name":{"type":"string","example":"Alex"},"last_name":{"type":["string","null"],"example":"Martin"},"email":{"type":"string","format":"email","example":"alex@example.com"},"password":{"type":"string","format":"password"},"password_hash":{"type":"string","description":"Empreinte de mot de passe bcrypt/argon facultative, importée telle quelle. À utiliser à la place de password."},"role":{"type":["string","null"],"enum":["admin","manager","inspecteur","user","api-consumer"]},"is_owner":{"type":"boolean","example":false},"is_active":{"type":"boolean","example":true}},"oneOf":[{"required":["password"]},{"required":["password_hash"]}]}}}},"responses":{"201":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/users/{uuid}":{"get":{"tags":["Users"],"summary":"Afficher un utilisateur client","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read"},"patch":{"tags":["Users"],"summary":"Modifier un utilisateur client","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"first_name":{"type":"string","example":"Alex"},"last_name":{"type":["string","null"],"example":"Martin"},"email":{"type":"string","format":"email","example":"alex@example.com"},"password":{"type":"string","format":"password"},"password_hash":{"type":"string","description":"Empreinte de mot de passe bcrypt/argon facultative, importée telle quelle. À utiliser à la place de password."},"role":{"type":["string","null"],"enum":["admin","manager","inspecteur","user","api-consumer"]},"is_owner":{"type":"boolean","example":false},"is_active":{"type":"boolean","example":true}}}}}},"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/users/{uuid}/activate":{"post":{"tags":["Users"],"summary":"Activer un utilisateur client","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/users/{uuid}/deactivate":{"post":{"tags":["Users"],"summary":"Désactiver un utilisateur client","parameters":[{"name":"uuid","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/User"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"404":{"description":"not_found : ressource inconnue ou appartenant à un autre client","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"write"}},"/tokens/balance":{"get":{"tags":["Tokens"],"summary":"Lire le solde de jetons client","responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"$ref":"#/components/schemas/TokenBalance"}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read","x-permissions":["dashboard.costs"]}},"/tokens/transactions":{"get":{"tags":["Tokens"],"summary":"Lister l'historique des transactions de jetons","parameters":[{"name":"per_page","in":"query","required":false,"description":"Éléments par page, 25 par défaut. Les valeurs hors de 1 à 100 sont ramenées dans cet intervalle, pas refusées.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"page","in":"query","required":false,"description":"Numéro de page, à partir de 1","schema":{"type":"integer","minimum":1,"default":1}}],"responses":{"200":{"description":"Réponse réussie","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Envelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TokenTransaction"}},"meta":{"type":"object","required":["pagination"],"properties":{"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}]}}}},"401":{"description":"invalid_api_key ou api_key_not_valid (expirée ou révoquée)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"403":{"description":"missing_api_scope ou missing_permission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"422":{"description":"validation_failed : voir errors","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"429":{"description":"too_many_requests : attendez le délai Retry-After","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"description":"Réponse d'erreur","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}}},"x-scope":"read","x-permissions":["dashboard.costs"]}}},"x-callback-signature":{"header":"X-Givre-Signature","format":"t={unix_timestamp},sha256={hmac}","algorithm":"HMAC-SHA256","signed_payload":"HMAC-SHA256 de « {timestamp}.{raw body} » ({raw body} étant le corps brut de la requête) avec le secret de callback. Rejetez les callbacks dont l’horodatage date de plus de 5 minutes pour bloquer les rejeux."},"x-callback-delivery":{"timeout_seconds":10,"success":"Toute réponse 2xx acquitte le callback.","idempotency":"Un même événement peut arriver plusieurs fois : utilisez Idempotency-Key pour ignorer les doublons."}}