{"openapi":"3.0.0","info":{"title":"API ZKBDI","description":"API pour la gestion des flux électroniques et des domaines .b2b","contact":{"email":"support@zkbdi.com"},"license":{"name":"Propriétaire","url":"https:\/\/zkbdi.com\/licence"},"version":"1.0.0"},"servers":[{"url":"https:\/\/sandbox.zkbdi.com","description":"Serveur de test (sandbox)"},{"url":"https:\/\/api.zkbdi.com","description":"Serveur de production"}],"paths":{"\/elfatoora\/submit":{"post":{"tags":["El Fatoora"],"summary":"Déposer une facture sur El Fatoora","description":"Dépose une facture électronique au format TEIF sur la plateforme El Fatoora de TTN","operationId":"submitInvoice","parameters":[{"name":"X-Request-ID","in":"header","description":"Identifiant unique de corrélation pour tracer la requête (optionnel, généré automatiquement si absent)","required":false,"schema":{"type":"string","example":"1703001234567_abc123def456"}}],"requestBody":{"description":"Données de connexion et facture TEIF","required":true,"content":{"application\/json":{"schema":{"properties":{"mode":{"description":"mode d'envoi : sandbox ou prod","type":"string","example":"sandbox|prod"},"login":{"description":"Nom d'utilisateur El Fatoora","type":"string","example":"user123"},"password":{"description":"Mot de passe El Fatoora","type":"string","example":"password123"},"matricule":{"description":"Matricule fiscale","type":"string","example":"1234567ABC"},"documentEfact":{"description":"Facture au format TEIF (Base64)","type":"string","example":"PD94bWwgdmVyc2lvbj0..."}},"type":"object"}}}},"responses":{"200":{"description":"Facture déposée avec succès","content":{"application\/json":{"schema":{"properties":{"requestId":{"description":"Identifiant de corrélation de la requête","type":"string","example":"1703001234567_abc123def456"},"success":{"type":"boolean","example":true},"data":{"properties":{"message":{"type":"string","example":"Facture déposée avec succès"},"soap_response":{"type":"string","example":"Response from TTN"}},"type":"object"}},"type":"object"}}}},"400":{"description":"Données invalides","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"integer","example":400},"message":{"type":"string","example":"Paramètres manquants"},"details":{"type":"string","example":"Le login est obligatoire"}},"type":"object"}},"type":"object"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"integer","example":500},"message":{"type":"string","example":"Erreur interne"},"details":{"type":"string","example":"Description détaillée de l'erreur"}},"type":"object"}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/elfatoora\/search":{"post":{"tags":["El Fatoora"],"summary":"Rechercher des factures sur El Fatoora","description":"Recherche des factures électroniques selon différents critères sur la plateforme El Fatoora","operationId":"searchInvoices","requestBody":{"description":"Données de connexion et critères de recherche","required":true,"content":{"application\/json":{"schema":{"properties":{"mode":{"description":"mode d'envoi : sandbox ou prod","type":"string","example":"sandbox|prod"},"login":{"description":"Nom d'utilisateur El Fatoora","type":"string","example":"user123"},"password":{"description":"Mot de passe El Fatoora","type":"string","example":"password123"},"matricule":{"description":"Matricule fiscale","type":"string","example":"1234567ABC"},"criteria":{"description":"Critères de recherche","properties":{"documentNumber":{"description":"Numéro de facture","type":"string","example":"INV-2024-001"},"idSaveEfact":{"description":"ID unique généré par saveEfact","type":"integer","example":12345},"documentType":{"description":"Type de document","type":"string","example":"Facture"},"dateDebutProcess":{"description":"Date début traitement","type":"string","example":"2024-01-01"},"dateFinProcess":{"description":"Date fin traitement","type":"string","example":"2024-12-31"},"dateDebutDocument":{"description":"Date début document","type":"string","example":"2024-01-01"},"dateFinDocument":{"description":"Date fin document","type":"string","example":"2024-12-31"},"amountTax":{"description":"Montant TTC","type":"number","example":120.5},"amount":{"description":"Montant HT","type":"number","example":100},"generatedRef":{"description":"Référence TTN","type":"string","example":"TTN123456"}},"type":"object"}},"type":"object"}}}},"responses":{"200":{"description":"Recherche effectuée avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"data":{"properties":{"invoices":{"type":"array","items":{"properties":{"documentNumber":{"type":"string"},"idSaveEfact":{"type":"integer"},"documentType":{"type":"string"},"dateProcess":{"type":"string"},"dateDocument":{"type":"string"},"amountTax":{"type":"number"},"amount":{"type":"number"},"generatedRef":{"type":"string"},"listAcknowlegments":{"type":"array","items":{"type":"object"}},"listAttachement":{"type":"array","items":{"type":"object"}},"xmlContent":{"type":"string"},"hasErrors":{"description":"Indique si la facture contient des erreurs","type":"boolean"},"errorDetails":{"description":"Détails des erreurs si présentes","type":"object"}},"type":"object"}},"count":{"type":"integer","example":5},"hasErrors":{"description":"Indique si des erreurs ont été détectées dans les factures","type":"boolean"},"errorSummary":{"type":"array","items":{"properties":{"documentNumber":{"type":"string"},"errorDescription":{"type":"string"}},"type":"object"}}},"type":"object"}},"type":"object"}}}},"400":{"description":"Données invalides","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"integer","example":400},"message":{"type":"string","example":"Paramètres manquants"}},"type":"object"}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/elfatoora\/verify-qr":{"post":{"tags":["El Fatoora"],"summary":"Vérifier un QR Code de facture","description":"Vérifie l'authenticité d'un QR Code de facture électronique","operationId":"verifyQrCode","requestBody":{"description":"Données de connexion et QR Code","required":true,"content":{"application\/json":{"schema":{"properties":{"mode":{"description":"mode d'envoi : sandbox ou prod","type":"string","example":"sandbox|prod"},"login":{"description":"Nom d'utilisateur El Fatoora","type":"string","example":"user123"},"password":{"description":"Mot de passe El Fatoora","type":"string","example":"password123"},"matricule":{"description":"Matricule fiscale","type":"string","example":"1234567ABC"},"qrCode":{"description":"Contenu du QR Code à vérifier","type":"string","example":"QR_CODE_CONTENT_HERE"}},"type":"object"}}}},"responses":{"200":{"description":"Vérification effectuée","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"data":{"properties":{"valid":{"type":"boolean","example":true},"verification_result":{"type":"string","example":"QR Code valide"},"details":{"type":"object"}},"type":"object"}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/elfatoora\/status":{"get":{"tags":["El Fatoora"],"summary":"Vérifier le statut du service El Fatoora","description":"Vérifie si le service El Fatoora est accessible","operationId":"checkStatus","responses":{"200":{"description":"Statut du service","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"data":{"properties":{"service_available":{"type":"boolean","example":true},"wsdl_url":{"type":"string","example":"https:\/\/elfatoora.tn\/ElfatouraServices\/EfactService?wsdl"},"timestamp":{"type":"string","example":"2024-01-01 12:00:00"}},"type":"object"}},"type":"object"}}}},"503":{"description":"Service indisponible","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"properties":{"code":{"type":"integer","example":503},"message":{"type":"string","example":"Service El Fatoora indisponible"}},"type":"object"}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/convert\/{format}":{"post":{"tags":["Flux"],"summary":"Convertir un flux commercial dans un format spécifique ","description":"Convertit les données d'un flux JSON vers le format demandé (xml, csv, ubl, cii, edifact, teif, etc.)","operationId":"convertInvoice","parameters":[{"name":"X-Request-ID","in":"header","description":"Identifiant unique de corrélation pour tracer la requête (optionnel, généré automatiquement si absent)","required":false,"schema":{"type":"string","example":"1703001234567_abc123def456"}},{"name":"format","in":"path","description":"Format de sortie (xml, csv, ubl, cii, edifact, teif)","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"Données du flux au format JSON","required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/InvoiceData"}}}},"responses":{"200":{"description":"Conversion réussie","content":{"application\/json":{"schema":{"properties":{"requestId":{"description":"Identifiant de corrélation de la requête","type":"string","example":"1703001234567_abc123def456"},"success":{"type":"boolean","example":true},"txHash":{"description":"Hash de la transaction blockchain","type":"string","example":"0x123..."}},"type":"object"}}}},"400":{"description":"Données invalides","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Champs requis manquants"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"401":{"description":"Non autorisé","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/teifmanager\/licenses\/generate":{"post":{"tags":["Licenses TEIF MANAGER"],"summary":"Génère une nouvelle clé de licence","description":"Génère une clé de licence","operationId":"7386f55ad37c23e8bc9c801650dac66c","requestBody":{"required":true,"content":{"application\/json":{"schema":{"required":["tax_id","signature_serial","entity_name"],"properties":{"tax_id":{"type":"string","example":"1234567A"},"signature_serial":{"type":"string","example":"SN123456789"},"entity_name":{"description":"Nom de l'entité (max 20 caractères)","type":"string","maxLength":20,"example":"Ma Société SARL"},"expires_days":{"type":"integer","example":365},"nb_templates":{"description":"Nombre de templates autorisés (défaut: 1)","type":"integer","example":5},"multi_entity_enabled":{"description":"Multi-entité activé (défaut: false)","type":"boolean","example":true},"authorized_apps":{"description":"Applications autorisées (défaut: {})","type":"object","example":[]}},"type":"object"}}}},"responses":{"200":{"description":"Clé générée avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean"},"license_key":{"type":"string"},"tax_id":{"type":"string"},"entity_name":{"type":"string"},"signature_serial":{"type":"string"},"expires_at":{"type":"string"},"nb_templates":{"type":"integer"},"multi_entity_enabled":{"type":"boolean"},"authorized_apps":{"type":"object"}},"type":"object"}}}}}}},"\/teifmanager\/licenses\/verify":{"post":{"tags":["Licenses TEIF MANAGER"],"summary":"Vérifie la validité d'une clé de licence","description":"Vérifie une clé de licence","operationId":"1be4488136731fca86a1bcfbe1620fa3","requestBody":{"required":true,"content":{"application\/json":{"schema":{"required":["license_key"],"properties":{"license_key":{"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"Statut de la licence","content":{"application\/json":{"schema":{"properties":{"valid":{"type":"boolean"},"tax_id":{"type":"string"},"entity_name":{"type":"string"},"signature_serial":{"type":"string"},"expires_at":{"type":"string"},"nb_templates":{"type":"integer"},"multi_entity_enabled":{"type":"boolean"},"authorized_apps":{"type":"object"}},"type":"object"}}}}}}},"\/teifmanager\/licenses\/revoke":{"post":{"tags":["Licenses TEIF MANAGER"],"summary":"Révoque une clé de licence","description":"Révoque une licence","operationId":"a32102fa099d0509cf2495295485a986","requestBody":{"required":true,"content":{"application\/json":{"schema":{"required":["license_key"],"properties":{"license_key":{"type":"string"}},"type":"object"}}}},"responses":{"200":{"description":"Licence révoquée"}}}},"\/teifmanager\/licenses\/update":{"post":{"tags":["Licenses TEIF MANAGER"],"summary":"Met à jour les paramètres d'une licence existante","description":"Met à jour les paramètres d'une licence","operationId":"7315123fa1768656a320e712909b587f","requestBody":{"required":true,"content":{"application\/json":{"schema":{"required":["license_key"],"properties":{"license_key":{"type":"string"},"entity_name":{"type":"string","maxLength":20,"example":"Nouveau Nom SARL"},"nb_templates":{"type":"integer","example":10},"multi_entity_enabled":{"type":"boolean","example":true},"authorized_apps":{"type":"object","example":{"app1":{"enabled":true}}}},"type":"object"}}}},"responses":{"200":{"description":"Licence mise à jour avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean"},"message":{"type":"string"},"updated_fields":{"type":"array","items":{"type":"string"}}},"type":"object"}}}}}}},"\/api\/extract":{"post":{"tags":["Flux"],"summary":"Extraire les données d'un flux PDF","description":"Extrait les données structurées d'un fichier PDF (commandes, bon de commandes\/livraison, factures\/avoirs, avis de paiement etc.). Taille maximale: 5MB. PDF uniquement.","operationId":"extractInvoice","parameters":[{"name":"X-Request-ID","in":"header","description":"Identifiant unique de corrélation pour tracer la requête (optionnel, généré automatiquement si absent)","required":false,"schema":{"type":"string","example":"1703001234567_abc123def456"}}],"requestBody":{"description":"Fichier PDF à analyser","required":true,"content":{"multipart\/form-data":{"schema":{"required":["file"],"properties":{"file":{"description":"Fichier PDF de la facture (max 5MB)","type":"string","format":"binary"},"prompt":{"description":"Prompt personnalisé encodé en base64 (optionnel). Utilise {{SCHEMA}} pour injecter le schéma JSON et {{TEXT}} pour le texte extrait du PDF.","type":"string","example":"VGV4dGUgcGVyc29ubmFsaXPDqSBhdmVjIHt7U0NIRU1BfX0gZXQge3tURVhUfX0="}},"type":"object"}}}},"responses":{"200":{"description":"Extraction réussie","content":{"application\/json":{"schema":{"properties":{"requestId":{"description":"Identifiant de corrélation de la requête","type":"string","example":"1703001234567_abc123def456"},"success":{"type":"boolean","example":true},"data":{"$ref":"#\/components\/schemas\/InvoiceData"}},"type":"object"}}}},"400":{"description":"Fichier invalide ou prompt base64 invalide","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Le prompt fourni n'est pas un base64 valide"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"401":{"description":"Non autorisé","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur de traitement","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/prompt\/generate":{"post":{"tags":["Prompt Optimization"],"summary":"Générer un prompt optimisé basé sur des exemples de factures","description":"Upload 1-5 factures PDF exemples et génère un prompt optimisé pour le modèle cible","operationId":"generateOptimizedPrompt","parameters":[{"name":"X-Request-ID","in":"header","description":"Identifiant unique de corrélation","required":false,"schema":{"type":"string","example":"1703001234567_abc123def456"}}],"requestBody":{"description":"Fichiers PDF exemples (1-5 fichiers) et paramètres de génération","required":true,"content":{"multipart\/form-data":{"schema":{"required":["files","target_model"],"properties":{"files[]":{"description":"Fichiers PDF exemples (entre 1 et 5)","type":"array","items":{"type":"string","format":"binary"}},"target_model":{"description":"Modèle IA cible pour l'extraction","type":"string","enum":["gpt-4o-mini","deepseek","gemini-flash","gemini-flash-25","mistral-small","minimax"],"example":"gpt-4o-mini"},"meta_model":{"description":"Modèle IA pour générer le prompt (optionnel, défaut: claude-opus-4.6)","type":"string","enum":["claude-opus-4.6","claude-sonnet-4.5","claude-opus-4.5","minimax","gpt-5"],"example":"claude-opus-4.6"},"matricule":{"description":"Matricule fiscal de l'émetteur (optionnel)","type":"string","example":"1171224X"}},"type":"object"}}}},"responses":{"200":{"description":"Prompt optimisé généré avec succès","content":{"application\/json":{"schema":{"properties":{"requestId":{"type":"string"},"success":{"type":"boolean","example":true},"data":{"properties":{"optimized_prompt":{"type":"string"},"optimized_prompt_base64":{"type":"string"},"target_model":{"type":"string"},"meta_model_used":{"type":"string"},"samples_count":{"type":"integer"},"generation_duration_ms":{"type":"integer"}},"type":"object"}},"type":"object"}}}},"400":{"description":"Erreur de validation","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/api\/prompt\/test":{"post":{"tags":["Prompt Optimization"],"summary":"Tester un prompt sur des factures exemples","description":"Teste un prompt personnalisé sur 1-5 factures PDF pour valider son efficacité","operationId":"testPrompt","requestBody":{"description":"Prompt à tester et fichiers PDF","required":true,"content":{"multipart\/form-data":{"schema":{"required":["files","prompt"],"properties":{"files[]":{"description":"Fichiers PDF de test (1-5 fichiers)","type":"array","items":{"type":"string","format":"binary"}},"prompt":{"description":"Prompt à tester (encodé en base64)","type":"string"},"target_model":{"description":"Modèle IA à utiliser","type":"string","enum":["gpt-4o-mini","deepseek","gemini-flash","gemini-flash-25","mistral-small","minimax"]}},"type":"object"}}}},"responses":{"200":{"description":"Test effectué avec succès","content":{"application\/json":{"schema":{"properties":{"requestId":{"type":"string"},"success":{"type":"boolean","example":true},"data":{"properties":{"success_rate":{"type":"number"},"total_duration_ms":{"type":"integer"}},"type":"object"}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/ping":{"get":{"tags":["Statut"],"summary":"Vérifie l'état et la version de l'API","description":"Endpoint de santé qui retourne le statut actuel et la version de l'API","operationId":"pingApi","responses":{"200":{"description":"API opérationnelle","content":{"application\/json":{"schema":{"properties":{"status":{"description":"Statut de l'API","type":"string","example":"actif"},"version":{"description":"Version actuelle de l'API","type":"string","example":"1.0"}},"type":"object"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}}}},"\/openapi":{"get":{"tags":["Statut"],"summary":"Documentation de zkBDI API","description":"Endpoint de documentation qui retourne le json openapi de l'API","operationId":"openApi","responses":{"200":{"description":"Documentation de zkBDI API opérationnelle","content":{"application\/json":{"schema":{"properties":{"status":{"description":"Statut de l'API","type":"string","example":"actif"},"version":{"description":"Version actuelle de l'API","type":"string","example":"1.0"}},"type":"object"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}}}},"\/zkbdi-kyb\/tn\/extract-cin-recto":{"post":{"tags":["KYB"],"summary":"Extraire les données du RECTO de la CIN tunisienne","description":"Extraction structurée (JSON) du RECTO de la carte d'identité tunisienne. Note : estimation de la fiabilité de l'image fournie (prise de vue\/photo vs image retouchée).","operationId":"extractCINRecto","requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"required":["file"],"properties":{"file":{"description":"Image recto de la CIN (.jpg, .jpeg, .png, max 5MB)","type":"string","format":"binary"}},"type":"object"}}}},"responses":{"200":{"description":"Extraction réussie","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean"},"data":{"$ref":"#\/components\/schemas\/TNCINrectoData"}},"type":"object"}}}},"400":{"description":"Fichier invalide","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"},"error_type":{"type":"string"}},"type":"object"}}}},"500":{"description":"Erreur interne"}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-kyb\/tn\/extract-cin-verso":{"post":{"tags":["KYB"],"summary":"Extraire les données du VERSO de la CIN tunisienne","description":"Extraction structurée (JSON) du VERSO de la carte d'identité tunisienne. Note : estimation de la fiabilité de l'image fournie (prise de vue\/photo vs image retouchée).","operationId":"extractCINVerso","requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"required":["file"],"properties":{"file":{"description":"Image verso de la CIN (.jpg, .jpeg, .png, max 5MB)","type":"string","format":"binary"}},"type":"object"}}}},"responses":{"200":{"description":"Extraction réussie","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean"},"data":{"$ref":"#\/components\/schemas\/TNCINVersoData"}},"type":"object"}}}},"400":{"description":"Fichier invalide","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"},"error_type":{"type":"string"}},"type":"object"}}}},"500":{"description":"Erreur interne"}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-kyb\/tn\/extract-rne-pdf":{"post":{"tags":["KYB"],"summary":"Extraire les données structurées d'un extrait PDF RNE (registre national des entreprises) tunisien","description":"Extraction automatique d'un PDF RNE natif (pas scanné, ne doit contenir que du texte) en JSON structuré, conforme à la structure attendue par l'API.","operationId":"extractRNETunisienPDF","requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"required":["file"],"properties":{"file":{"description":"PDF RNE tunisien (natif, .pdf, max 5MB)","type":"string","format":"binary"}},"type":"object"}}}},"responses":{"200":{"description":"Extraction réussie","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean"},"data":{"type":"object"}},"type":"object"}}}},"400":{"description":"Fichier PDF invalide","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string"},"error_type":{"type":"string"}},"type":"object"}}}},"500":{"description":"Erreur interne"}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/setEdiRelay":{"post":{"tags":["Administration"],"summary":"Définir l'EDI Relay","description":"Met à jour l'adresse du contrat EDI Relay (réservé au propriétaire)","operationId":"setB2BEdiRelay","requestBody":{"description":"Nouvelle adresse du contrat EDI Relay","required":true,"content":{"application\/json":{"schema":{"required":["relay"],"properties":{"relay":{"description":"Adresse Ethereum du nouveau EDI Relay","type":"string","example":"0x123..."},"mode":{"description":"Mode de chiffrement (file, text)","type":"string","example":"file"}},"type":"object"}}}},"responses":{"200":{"description":"EDI Relay mis à jour avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètre manquant ou invalide","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Champ 'relay' requis"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"401":{"description":"Accès non autorisé","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur serveur lors de la mise à jour","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la mise à jour du EDI Relay"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/pause":{"post":{"tags":["Administration"],"summary":"Mettre en pause le contrat","description":"Pausse toutes les opérations du contrat B2B Registrar (réservé au propriétaire)","operationId":"pauseB2BRegistrar","requestBody":{"description":"Aucune donnée requise","required":false},"responses":{"200":{"description":"Contrat mis en pause avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"401":{"description":"Accès non autorisé","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur serveur lors de la pause","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la mise en pause"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/unpause":{"post":{"tags":["Administration"],"summary":"Réactiver le contrat","description":"Réactive toutes les opérations du contrat B2B Registrar après une pause (réservé au propriétaire)","operationId":"unpauseB2BRegistrar","requestBody":{"description":"Aucune donnée requise","required":false},"responses":{"200":{"description":"Contrat réactivé avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"401":{"description":"Accès non autorisé","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur serveur lors de la reprise","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la reprise"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/addToRegistrationGroup":{"post":{"tags":["Administration"],"summary":"Ajouter un membre au groupe d'inscription","description":"Ajoute une adresse au groupe d'inscription (réservé au propriétaire)","operationId":"addToRegistrationGroup_registrar","requestBody":{"description":"Adresse à ajouter au groupe d'inscription","required":true,"content":{"application\/json":{"schema":{"required":["address"],"properties":{"address":{"description":"Adresse Ethereum à ajouter","type":"string","example":"0x123..."},"mode":{"description":"Mode de chiffrement (file, text)","type":"string","example":"file"}},"type":"object"}}}},"responses":{"200":{"description":"Membre ajouté avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètre manquant ou invalide","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Champ 'address' requis"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"401":{"description":"Accès non autorisé","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur serveur lors de l'ajout","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de l'ajout au groupe"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/removeFromRegistrationGroup":{"post":{"tags":["Administration"],"summary":"Retirer un membre du groupe d'inscription","description":"Supprime une adresse du groupe d'inscription (réservé au propriétaire)","operationId":"removeFromRegistrationGroup_registrar","requestBody":{"description":"Adresse à retirer du groupe d'inscription","required":true,"content":{"application\/json":{"schema":{"required":["address"],"properties":{"address":{"description":"Adresse Ethereum à supprimer","type":"string","example":"0x123..."},"mode":{"description":"Mode de chiffrement (file, text)","type":"string","example":"file"}},"type":"object"}}}},"responses":{"200":{"description":"Membre retiré avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètre manquant ou invalide","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Champ 'address' requis"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"401":{"description":"Accès non autorisé","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur serveur lors de la suppression","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Échec de la suppression"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/register":{"post":{"tags":["Domaines"],"summary":"Enregistrer un nouveau domaine .b2b","description":"Enregistre un nouveau domaine sur la blockchain ZKBDI (réservé au groupe d'inscription)","operationId":"registerB2BDomain","requestBody":{"description":"Informations d'enregistrement","required":true,"content":{"application\/json":{"schema":{"required":["address","domain"],"properties":{"address":{"description":"Adresse Ethereum du propriétaire","type":"string","example":"0x123..."},"domain":{"description":"Nom de domaine sans l'extension .b2b","type":"string","example":"monentreprise"}},"type":"object"}}}},"responses":{"200":{"description":"Enregistrement réussi","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres requis manquants","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Champs requis : address et domain"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"401":{"description":"Non autorisé","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur serveur lors de l'enregistrement","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de l'enregistrement"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/updateDomainOwnership":{"post":{"tags":["Domaines"],"summary":"Mettre à jour la propriété d'un domaine","description":"Transfère un domaine à un nouveau propriétaire (réservé au propriétaire actuel)","operationId":"updateDomainOwnership","requestBody":{"description":"Informations d'enregistrement","required":true,"content":{"application\/json":{"schema":{"required":["address","domain"],"properties":{"address":{"description":"Adresse Ethereum du propriétaire","type":"string","example":"0x123..."},"domain":{"description":"Nom de domaine sans l'extension .b2b","type":"string","example":"monentreprise"}},"type":"object"}}}},"responses":{"200":{"description":"Propriétaire mis à jour avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Paramètres requis : domain et newOwner"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"401":{"description":"Non autorisé","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors de la mise à jour","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Échec de la mise à jour"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/transferFrom":{"post":{"tags":["Domaines"],"summary":"Transférer un NFT via transferFrom","description":"Transfère un token NFT via la méthode standard transferFrom (réservé à l'owner ou approuvé)","operationId":"transferFrom","requestBody":{"description":"Données de transfert","required":true,"content":{"application\/json":{"schema":{"required":["from","to","tokenId"],"properties":{"from":{"description":"Adresse d'origine","type":"string","example":"0x123..."},"to":{"description":"Adresse de destination","type":"string","example":"0x456..."},"tokenId":{"description":"ID du token à transférer","type":"integer","example":1}},"type":"object"}}}},"responses":{"200":{"description":"NFT transféré avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres manquants ou invalides","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Champs requis : from, to, tokenId"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"500":{"description":"Erreur serveur lors du transfert","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Échec du transfert"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/safeTransferFrom":{"post":{"tags":["Domaines"],"summary":"Transfert sécurisé d’un NFT","description":"Transfère un NFT avec données additionnelles (réservé à l'owner ou approuvé)","operationId":"safeTransferFrom","requestBody":{"description":"Données de transfert sécurisé","required":true,"content":{"application\/json":{"schema":{"required":["from","to","tokenId"],"properties":{"from":{"description":"Adresse d'origine","type":"string","example":"0x123..."},"to":{"description":"Adresse de destination","type":"string","example":"0x456..."},"tokenId":{"description":"ID du token à transférer","type":"integer","example":1},"_data":{"description":"Données additionnelles","type":"string","example":"0x00"}},"type":"object"}}}},"responses":{"200":{"description":"Transfert sécurisé réussi","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres manquants ou invalides","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Champs requis : from, to, tokenId"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"500":{"description":"Erreur serveur lors du transfert","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Échec du transfert sécurisé"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/updateValidationRule":{"post":{"tags":["Administration"],"summary":"Mettre à jour une règle de validation de domaine","description":"Met à jour les règles de validation pour un pays spécifique (réservé au propriétaire)","operationId":"updateCountryValidationRule","requestBody":{"description":"Détails de la règle de validation","required":true,"content":{"application\/json":{"schema":{"required":["countryCode","regex","length"],"properties":{"countryCode":{"description":"Code ISO du pays (ex: FR)","type":"string","example":"FR"},"regex":{"description":"Motif regex de validation","type":"string","example":"D:14"},"length":{"description":"Longueur attendue du numéro d'identification","type":"integer","example":14}},"type":"object"}}}},"responses":{"200":{"description":"Règle mise à jour avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Champs requis : countryCode, regex, length"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"500":{"description":"Erreur lors de la mise à jour","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Échec de la mise à jour"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/getDomainByAddress\/{address}":{"get":{"tags":["Domaines"],"summary":"Obtenir le domaine associé à une adresse","description":"Récupère le nom de domaine .b2b associé à une adresse Ethereum","operationId":"getDomainByAddress","parameters":[{"name":"address","in":"path","description":"Adresse Ethereum à rechercher","required":true,"schema":{"type":"string","example":"0x123..."}}],"responses":{"200":{"description":"Domaine trouvé","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"domain":{"type":"string","example":"monentreprise.b2b"}},"type":"object"}}}},"400":{"description":"Paramètre adresse manquant","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Adresse requise"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"404":{"description":"Aucun domaine trouvé","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Aucun domaine trouvé pour cette adresse"}},"type":"object"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la récupération du domaine"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/getAddressByDomain\/{domain}":{"get":{"tags":["Domaines"],"summary":"Rechercher le propriétaire d’un domaine","description":"Récupère l'adresse du propriétaire d'un domaine .b2b","operationId":"lookupB2BDomain","parameters":[{"name":"domain","in":"path","description":"Nom du domaine sans extension .b2b","required":true,"schema":{"type":"string","example":"monentreprise"}}],"responses":{"200":{"description":"Domaine trouvé","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"record":{"properties":{"domain":{"type":"string","example":"monentreprise"},"owner":{"type":"string","example":"0x123..."}},"type":"object"}},"type":"object"}}}},"400":{"description":"Paramètre domaine manquant","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Nom de domaine requis"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"404":{"description":"Domaine non trouvé","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Domaine non trouvé"}},"type":"object"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la récupération du propriétaire"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/b2b\/ownerOf\/{tokenId}":{"get":{"tags":["Domaines"],"summary":"Obtenir le propriétaire d'un token NFT","description":"Récupère l'adresse Ethereum du propriétaire d'un NFT représentant un domaine .b2b","operationId":"getB2BOwnerOf","parameters":[{"name":"tokenId","in":"path","description":"ID du token NFT (uint256)","required":true,"schema":{"type":"integer","example":1}}],"responses":{"200":{"description":"Propriétaire trouvé","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"owner":{"type":"string","example":"0x123..."}},"type":"object"}}}},"400":{"description":"Paramètre invalide","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"404":{"description":"Token non trouvé ou expiré","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/tokenURI\/{tokenId}":{"get":{"tags":["Domaines"],"summary":"Obtenir l'URI du token NFT","description":"Récupère l'URI metadata d'un token NFT représentant un domaine B2B","operationId":"tokenURI","parameters":[{"name":"tokenId","in":"path","description":"ID du token NFT","required":true,"schema":{"type":"integer","example":1}}],"responses":{"200":{"description":"URI récupérée avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"tokenURI":{"type":"string","example":"https:\/\/metadata.example.com\/domains\/1"}},"type":"object"}}}},"400":{"description":"Paramètre invalide","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"tokenId requis"},"error_type":{"type":"string","example":"validation"}},"type":"object"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la récupération de l'URI"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/totalSupply":{"get":{"tags":["Domaines"],"summary":"Obtenir le nombre total de domaines enregistrés","description":"Récupère le nombre total de domaines .b2b enregistrés via ce contrat","operationId":"getB2BTotalSupply","responses":{"200":{"description":"Nombre total récupéré avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"totalSupply":{"type":"integer","example":42}},"type":"object"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la récupération du total supply"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-registrar\/version":{"get":{"tags":["Domaines"],"summary":"Obtenir la version du contrat","description":"Récupère la version actuelle du contrat B2B Registrar","operationId":"getB2BVersion","responses":{"200":{"description":"Version récupérée avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"version":{"type":"integer","example":1}},"type":"object"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la récupération de la version"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/transmitMessage":{"post":{"tags":["Blockchain"],"summary":"Transmettre un message individuel vers un seul destinataire sur la blockchain","description":"Envoie un message chiffré ou brut vers un destinataire spécifique sur la blockchain","operationId":"transmitMessage","requestBody":{"description":"Données du message à transmettre","required":true,"content":{"application\/json":{"schema":{"required":["to","msg","private"],"properties":{"from":{"description":"Adresse de l'expéditeur","type":"string","example":"0xf728A22Feaac6A993EEE648Ee34DFA7e09067Adf"},"to":{"description":"Adresse du destinataire","type":"string","example":"0x23FF2Cd08C53159EF899f80f84Cd828E68D82D90"},"msg":{"description":"Contenu du message","type":"string","example":"Hello blockchain!"},"private":{"description":"1 pour chiffré, 0 pour non chiffré","type":"integer","enum":[0,1],"example":1},"mode":{"description":"Mode de chiffrement (file, text)","type":"string","example":"text"},"fee":{"description":"Frais de transaction en token natif","type":"number","format":"float","example":0.001000000000000000020816681711721685132943093776702880859375}},"type":"object"}}}},"responses":{"200":{"description":"Message transmis avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Transaction minée avec succès"},"result":{"properties":{"txHash":{"type":"string","example":"0x123..."},"status":{"type":"string","example":"mined"}},"type":"object"}},"type":"object"}}}},"400":{"description":"Paramètres requis manquants","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors de la transmission","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la transmission des données"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/batchTransmit":{"post":{"tags":["Blockchain"],"summary":"Transmettre un message à plusieurs destinataires","description":"Envoie un message identique à plusieurs destinataires en une seule transaction","operationId":"batchTransmitMessage","requestBody":{"description":"Données du message à transmettre","required":true,"content":{"application\/json":{"schema":{"required":["recipients","msg","private"],"properties":{"from":{"description":"Adresse de l'expéditeur","type":"string","example":"0xf728A22Feaac6A993EEE648Ee34DFA7e09067Adf"},"recipients":{"description":"Liste des adresses des destinataires","type":"array","items":{"type":"string"},"example":["0x23FF2Cd08C53159EF899f80f84Cd828E68D82D90","0x123..."]},"msg":{"description":"Contenu du message","type":"string","example":"Hello blockchain!"},"private":{"description":"1 pour chiffré, 0 pour non chiffré","type":"integer","enum":[0,1],"example":1},"mode":{"description":"Mode de chiffrement (file, text)","type":"string","example":"text"},"fee":{"description":"Frais de transaction en token natif","type":"number","format":"float","example":0.001000000000000000020816681711721685132943093776702880859375}},"type":"object"}}}},"responses":{"200":{"description":"Messages transmis avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Transaction minée avec succès"},"result":{"properties":{"txHash":{"type":"string","example":"0x123..."},"status":{"type":"string","example":"mined"}},"type":"object"}},"type":"object"}}}},"400":{"description":"Paramètres requis manquants","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors de la transmission","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la transmission des données"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/multiTransmit":{"post":{"tags":["Blockchain"],"summary":"Transmettre différents messages à plusieurs destinataires","description":"Envoie des messages différents à plusieurs destinataires en une seule transaction","operationId":"multiTransmitMessage","requestBody":{"description":"Données des messages à transmettre","required":true,"content":{"application\/json":{"schema":{"required":["recipients","messages","private"],"properties":{"from":{"description":"Adresse de l'expéditeur","type":"string","example":"0xf728A22Feaac6A993EEE648Ee34DFA7e09067Adf"},"recipients":{"description":"Liste des adresses des destinataires","type":"array","items":{"type":"string"},"example":["0x23FF2Cd08C53159EF899f80f84Cd828E68D82D90","0x123..."]},"messages":{"description":"Liste des contenus des messages","type":"array","items":{"type":"string"},"example":["Bonjour 1","Bonjour 2"]},"private":{"description":"1 pour chiffré, 0 pour non chiffré","type":"integer","enum":[0,1],"example":1},"mode":{"description":"Mode de chiffrement (file, text)","type":"string","example":"text"},"fee":{"description":"Frais de transaction en token natif","type":"number","format":"float","example":0.001000000000000000020816681711721685132943093776702880859375}},"type":"object"}}}},"responses":{"200":{"description":"Messages transmis avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Transaction minée avec succès"},"result":{"properties":{"txHash":{"type":"string","example":"0x123..."},"status":{"type":"string","example":"mined"}},"type":"object"}},"type":"object"}}}},"400":{"description":"Paramètres requis manquants","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors de la transmission","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Erreur lors de la transmission des données"},"details":{"type":"string","nullable":true}},"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/getAuthorizedGroup":{"get":{"tags":["Administration"],"summary":"Obtenir le groupe d'adresses autorisées","description":"Récupère une liste paginée des adresses autorisées à utiliser le contrat","operationId":"getAuthorizedGroup","parameters":[{"name":"start","in":"query","description":"Index de départ pour la pagination","required":false,"schema":{"type":"integer","example":0}},{"name":"count","in":"query","description":"Nombre d'adresses à récupérer (max 100)","required":false,"schema":{"type":"integer","example":10}}],"responses":{"200":{"description":"Groupe d'adresses récupéré avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"authorizedAddresses":{"type":"array","items":{"type":"string"},"example":["0x123...","0x456..."]}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/getRegistrationGroup":{"get":{"tags":["Administration"],"summary":"Obtenir le groupe d'inscription","description":"Récupère une liste paginée des membres du groupe d'inscription","operationId":"getRegistrationGroup","parameters":[{"name":"start","in":"query","description":"Index de départ pour la pagination","required":false,"schema":{"type":"integer","example":0}},{"name":"count","in":"query","description":"Nombre d'adresses à récupérer (max 100)","required":false,"schema":{"type":"integer","example":10}}],"responses":{"200":{"description":"Groupe d'inscription récupéré avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"registrationGroup":{"type":"array","items":{"type":"string"},"example":["0x123...","0x456..."]}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur serveur","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/addToRegistrationGroup":{"post":{"tags":["Administration"],"summary":"Ajouter un membre au groupe d'inscription","description":"Ajoute une adresse au groupe d'inscription qui peut gérer les autorisations","operationId":"addToRegistrationGroup_relay","requestBody":{"description":"Adresse à ajouter au groupe d'inscription","required":true,"content":{"application\/json":{"schema":{"required":["address"],"properties":{"address":{"description":"Adresse Ethereum à ajouter","type":"string","example":"0x123..."}},"type":"object"}}}},"responses":{"200":{"description":"Membre ajouté avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors de l'ajout","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/removeFromRegistrationGroup":{"post":{"tags":["Administration"],"summary":"Retirer un membre du groupe d'inscription","description":"Supprime une adresse du groupe d'inscription","operationId":"removeFromRegistrationGroup_relay","requestBody":{"description":"Adresse à retirer du groupe d'inscription","required":true,"content":{"application\/json":{"schema":{"required":["address"],"properties":{"address":{"description":"Adresse Ethereum à supprimer","type":"string","example":"0x123..."}},"type":"object"}}}},"responses":{"200":{"description":"Membre retiré avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors de la suppression","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/addAuthorizedAddress":{"post":{"tags":["Administration"],"summary":"Ajouter une adresse autorisée","description":"Ajoute une adresse aux listes des adresses autorisées à utiliser le contrat","operationId":"addAuthorizedAddress","requestBody":{"description":"Adresse à autoriser","required":true,"content":{"application\/json":{"schema":{"required":["address"],"properties":{"address":{"description":"Adresse Ethereum à autoriser","type":"string","example":"0x123..."}},"type":"object"}}}},"responses":{"200":{"description":"Adresse autorisée avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors de l'autorisation","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/removeAuthorizedAddress":{"post":{"tags":["Administration"],"summary":"Retirer une adresse autorisée","description":"Supprime une adresse de la liste des adresses autorisées à utiliser le contrat","operationId":"removeAuthorizedAddress","requestBody":{"description":"Adresse à retirer","required":true,"content":{"application\/json":{"schema":{"required":["address"],"properties":{"address":{"description":"Adresse Ethereum à supprimer","type":"string","example":"0x123..."}},"type":"object"}}}},"responses":{"200":{"description":"Adresse dé-autorisée avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors de la suppression","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/updateTransmissionCost":{"post":{"tags":["Administration"],"summary":"Mettre à jour le coût de transmission","description":"Met à jour le coût en wei nécessaire pour effectuer une transmission","operationId":"updateTransmissionCost","requestBody":{"description":"Nouveau coût de transmission","required":true,"content":{"application\/json":{"schema":{"required":["costInEther"],"properties":{"costInEther":{"description":"Nouveau coût en ETH\/wei","type":"number","format":"float","example":0.001000000000000000020816681711721685132943093776702880859375}},"type":"object"}}}},"responses":{"200":{"description":"Coût mis à jour avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors de la mise à jour","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/withdrawFunds":{"post":{"tags":["Administration"],"summary":"Retirer les fonds du contrat","description":"Permet au propriétaire de retirer un montant spécifique des fonds du contrat","operationId":"withdrawFunds","requestBody":{"description":"Montant à retirer","required":true,"content":{"application\/json":{"schema":{"required":["amountInEther"],"properties":{"amountInEther":{"description":"Montant à retirer en ETH\/wei","type":"number","format":"float","example":0.5}},"type":"object"}}}},"responses":{"200":{"description":"Fonds retirés avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"txHash":{"type":"string","example":"0x456..."}},"type":"object"}}}},"400":{"description":"Paramètres invalides","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}},"500":{"description":"Erreur lors du retrait","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}},"\/zkbdi-relay\/getContractBalance":{"get":{"tags":["Administration"],"summary":"Obtenir le solde du contrat","description":"Récupère le solde actuel du contrat en ETH","operationId":"getContractBalance","responses":{"200":{"description":"Solde récupéré avec succès","content":{"application\/json":{"schema":{"properties":{"success":{"type":"boolean","example":true},"balance":{"type":"number","format":"float","example":1.5}},"type":"object"}}}},"500":{"description":"Erreur lors de la récupération du solde","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ErrorResponse"}}}}},"security":[{"bearerAuth":[]}]}}},"components":{"schemas":{"InvoiceData":{"required":["enveloppe","parties","lignes","totaux"],"properties":{"enveloppe":{"properties":{"type":{"type":"string","example":"facture"},"identifiant":{"type":"string","example":"FAC-2025-001"},"date_creation":{"type":"string","format":"date","example":"2025-01-15"}},"type":"object"},"parties":{"properties":{"emetteur":{"properties":{"identifiants":{"type":"array","items":{"properties":{"type":{"type":"string","example":"SIRET"},"valeur":{"type":"string","example":"12345678901234"}},"type":"object"}},"nom":{"type":"string","example":"Entreprise A"},"adresse":{"properties":{"ligne1":{"type":"string","example":"123 Rue Exemple"},"ligne2":{"type":"string","example":"Etage 2","nullable":true},"code_postal":{"type":"string","example":"75001"},"ville":{"type":"string","example":"Paris"},"pays":{"type":"string","example":"France"}},"type":"object"},"contact":{"properties":{"nom":{"type":"string","example":"Jean Dupont"},"email":{"type":"string","example":"contact@entreprise.fr"},"telephone":{"type":"string","example":"+33123456789"}},"type":"object"}},"type":"object"},"destinataire":{"properties":{"identifiants":{"type":"array","items":{"properties":{"type":{"type":"string","example":"SIRET"},"valeur":{"type":"string","example":"98765432109876"}},"type":"object"}},"nom":{"type":"string","example":"Entreprise B"},"adresse":{"properties":{"ligne1":{"type":"string","example":"456 Avenue Client"},"ligne2":{"type":"string","nullable":true},"code_postal":{"type":"string","example":"69002"},"ville":{"type":"string","example":"Lyon"},"pays":{"type":"string","example":"France"}},"type":"object"},"contact":{"properties":{"nom":{"type":"string","example":"Marie Martin"},"email":{"type":"string","example":"contact@client.fr"},"telephone":{"type":"string","example":"+33456789123"}},"type":"object"}},"type":"object"}},"type":"object"},"lignes":{"type":"array","items":{"properties":{"numero":{"type":"integer","example":1},"article":{"properties":{"reference":{"type":"string","example":"PROD-001"},"description":{"type":"string","example":"Produit A"},"code_gtin":{"type":"string","example":"123456789012","nullable":true}},"type":"object"},"quantite":{"type":"number","format":"float","example":2},"prix_unitaire_ht":{"type":"number","format":"float","example":50},"montant_ht":{"type":"number","format":"float","example":100},"tva":{"properties":{"taux":{"type":"number","format":"float","example":20},"montant":{"type":"number","format":"float","example":20}},"type":"object"},"montant_ttc":{"type":"number","format":"float","example":120}},"type":"object"}},"totaux":{"properties":{"total_ht":{"type":"number","format":"float","example":100},"total_tva":{"type":"array","items":{"properties":{"taux":{"type":"number","format":"float","example":20},"base":{"type":"number","format":"float","example":100},"montant":{"type":"number","format":"float","example":20}},"type":"object"}},"total_ttc":{"type":"number","format":"float","example":120},"net_a_payer":{"type":"number","format":"float","example":120},"devise":{"type":"string","example":"EUR"}},"type":"object"}},"type":"object"},"ErrorResponse":{"properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","example":"Message d'erreur"},"details":{"type":"string","nullable":true}},"type":"object"},"TNCINrectoData":{"properties":{"card_number":{"type":"string","example":"00000001"},"first_name":{"type":"string","example":"name"},"last_name":{"type":"string","example":"last name"},"father_name":{"type":"string","example":"father name"},"date_of_birth":{"type":"string","example":"yyyy-mm-dd"},"place_of_birth":{"type":"string","example":"تونس"},"ai_image_accurate":{"type":"string","example":"95%"},"image_accurate":{"type":"string","example":"95%"}},"type":"object"},"TNCINVersoData":{"properties":{"mother_name":{"type":"string","example":"mother name"},"profession":{"type":"string","example":"profession"},"address":{"type":"string","example":"address"},"creation_date":{"type":"string","format":"date","example":"yyyy-mm-dd"},"secondary_number":{"type":"string","example":"00000002"},"ai_image_accurate":{"type":"string","example":"95%"},"image_accurate":{"type":"string","example":"95%"}},"type":"object"}},"securitySchemes":{"bearerAuth":{"type":"http","description":"Utiliser le token JWT fourni après authentification","bearerFormat":"JWT","scheme":"bearer"}}},"tags":[{"name":"Flux","description":"Extraction et conversion des flux PDF (commandes, bon de commandes\/livraison, factures\/avoirs, avis de paiement etc.)"},{"name":"Domaines","description":"Gestion des domaines .b2b"},{"name":"Blockchain","description":"Transmission de données sur la blockchain"},{"name":"El Fatoora","description":"El Fatoora"},{"name":"Licenses TEIF MANAGER","description":"Licenses TEIF MANAGER"},{"name":"Prompt Optimization","description":"Prompt Optimization"},{"name":"Statut","description":"Statut"},{"name":"KYB","description":"KYB"},{"name":"Administration","description":"Administration"}]}