{"openapi":"3.1.0","info":{"title":"API de la Boîte à outils IT — Outremer Solutions","version":"1.0.0","description":"Chaque outil de la boîte à outils, appelable par programme. Authentification par clé d'API personnelle (en-tête `Authorization: Bearer <clé>`)."},"servers":[{"url":"https://it-tools.outremer-solutions.fr"}],"security":[{"apiKey":[]}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"clé d'API"}}},"tags":[{"name":"Générateur de mots de passe","description":"Générez des mots de passe robustes ou des phrases de passe en français, avec jauge de robustesse et temps de casse estimé."},{"name":"Générateur de jetons","description":"Générez une chaîne aléatoire avec les caractères voulus : majuscules, minuscules, chiffres et symboles."},{"name":"Empreinte d'un texte","description":"Calculez l'empreinte d'un texte : MD5, SHA1, SHA224, SHA256, SHA384, SHA512, SHA3 ou RIPEMD160."},{"name":"Bcrypt","description":"Hachez un texte avec bcrypt et comparez-le à une empreinte existante (fonction de hachage de mots de passe)."},{"name":"Générateur d'UUID","description":"Générez des identifiants uniques universels (UUID v1, v3, v4, v5, NIL) à l'unité ou en lot."},{"name":"Générateur d'ULID","description":"Générez des identifiants uniques triables par ordre chronologique (ULID), au format brut ou JSON."},{"name":"Chiffrer / déchiffrer un texte","description":"Chiffrez un texte clair ou déchiffrez un texte chiffré avec AES, TripleDES, Rabbit ou RC4."},{"name":"Phrase mnémonique BIP39","description":"Générez une phrase BIP39 à partir d'une entropie existante ou aléatoire, ou retrouvez l'entropie depuis la phrase."},{"name":"Générateur HMAC","description":"Calculez un code d'authentification de message (HMAC) avec une clé secrète et la fonction de hachage de votre choix."},{"name":"Paire de clés RSA","description":"Générez une nouvelle paire de clés RSA privée et publique au format PEM."},{"name":"Robustesse d'un mot de passe","description":"Évaluez la robustesse d'un mot de passe et le temps estimé pour le casser, sans qu'il quitte votre navigateur."},{"name":"Vérification de signature PDF","description":"Vérifiez les signatures électroniques d'un fichier PDF et consultez les certificats qui les portent."},{"name":"Convertisseur de dates","description":"Convertissez une date et une heure dans les différents formats : ISO 8601, RFC, horodatage Unix, Excel…"},{"name":"Conversion de bases numériques","description":"Convertissez un nombre entre différentes bases : décimale, hexadécimale, binaire, octale, base 64…"},{"name":"Chiffres romains","description":"Convertissez des chiffres romains en nombres, et des nombres en chiffres romains."},{"name":"Base64 (fichier)","description":"Convertissez un fichier ou une image en base64, et une chaîne base64 en fichier."},{"name":"Base64 (texte)","description":"Encodez et décodez du texte dans sa représentation base64."},{"name":"Convertisseur de couleurs","description":"Convertissez une couleur entre formats : hexadécimal, RGB, HSL, HWB, LCH, CMJN et nom CSS."},{"name":"Changement de casse","description":"Transformez la casse d'un texte : camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE…"},{"name":"Alphabet OTAN","description":"Épelez un texte avec l'alphabet phonétique de l'OTAN (Alfa, Bravo, Charlie…)."},{"name":"Texte vers binaire ASCII","description":"Convertissez un texte en sa représentation binaire ASCII, et inversement."},{"name":"Texte vers Unicode","description":"Convertissez un texte en entités Unicode, et inversement."},{"name":"YAML vers JSON","description":"Convertissez du YAML en JSON, en direct."},{"name":"YAML vers TOML","description":"Analysez du YAML et convertissez-le en TOML."},{"name":"JSON vers YAML","description":"Convertissez du JSON en YAML, en direct."},{"name":"JSON vers TOML","description":"Analysez du JSON et convertissez-le en TOML."},{"name":"Conversion de listes","description":"Traitez une liste ligne par ligne : tri, inversion, dédoublonnage, préfixes, suffixes, séparateurs, casse."},{"name":"TOML vers JSON","description":"Analysez du TOML et convertissez-le en JSON."},{"name":"TOML vers YAML","description":"Analysez du TOML et convertissez-le en YAML."},{"name":"XML vers JSON","description":"Convertissez du XML en JSON."},{"name":"JSON vers XML","description":"Convertissez du JSON en XML."},{"name":"Markdown vers HTML","description":"Convertissez du Markdown en HTML, avec aperçu et impression en PDF."},{"name":"Encoder / décoder une URL","description":"Encodez un texte au format URL (« percent-encoding »), ou décodez-le."},{"name":"Entités HTML","description":"Échappez ou restaurez les entités HTML (<, >, &, \" et ')."},{"name":"Analyse d'URL","description":"Décomposez une URL : protocole, origine, identifiants, hôte, port, chemin, paramètres, ancre."},{"name":"En-tête Basic Auth","description":"Générez l'en-tête d'authentification « Basic » en base64 à partir d'un identifiant et d'un mot de passe."},{"name":"Balises Open Graph","description":"Générez les balises meta Open Graph et réseaux sociaux de votre site."},{"name":"Codes OTP (TOTP)","description":"Générez et vérifiez des codes à usage unique basés sur le temps (TOTP) pour la double authentification."},{"name":"Types MIME","description":"Retrouvez l'extension d'un type MIME, et le type MIME d'une extension."},{"name":"Lecture de JWT","description":"Décodez un jeton JWT et affichez son en-tête et ses revendications (claims)."},{"name":"Slugifier un texte","description":"Rendez un texte utilisable dans une URL, un nom de fichier ou un identifiant."},{"name":"Analyse de user-agent","description":"Identifiez navigateur, moteur, système, processeur et appareil à partir d'un user-agent."},{"name":"Codes de statut HTTP","description":"La liste des codes de statut HTTP, leur nom et leur signification."},{"name":"Comparaison de JSON","description":"Comparez deux objets JSON et visualisez leurs différences."},{"name":"Décodeur Safe Links Outlook","description":"Retrouvez l'adresse d'origine d'un lien réécrit par Microsoft Defender (Safe Links) dans Outlook."},{"name":"Analyse de message e-mail","description":"Collez ou déposez la source d'un e-mail (.eml) pour savoir s'il est malveillant : authentification, usurpation, liens et pièces jointes."},{"name":"Générateur de QR code","description":"Générez et téléchargez le QR code d'une adresse ou d'un texte, avec les couleurs de votre choix."},{"name":"QR code Wi-Fi","description":"Générez un QR code qui connecte un appareil à un réseau Wi-Fi d'un simple scan."},{"name":"Image SVG de substitution","description":"Générez des images SVG de substitution (placeholder) à utiliser dans vos maquettes."},{"name":"Port aléatoire","description":"Générez un numéro de port aléatoire hors de la plage des ports « connus » (0 à 1023)."},{"name":"Générateur de crontab","description":"Validez une expression cron et obtenez sa description en langage courant."},{"name":"Mise en forme JSON","description":"Mettez en forme un JSON pour le rendre lisible, avec tri des clés et indentation réglable."},{"name":"Minification JSON","description":"Compactez un JSON en supprimant les espaces inutiles."},{"name":"JSON vers CSV","description":"Convertissez un tableau JSON en CSV, avec détection automatique des en-têtes."},{"name":"Mise en forme SQL","description":"Mettez en forme vos requêtes SQL, pour de nombreux dialectes."},{"name":"Calculateur chmod","description":"Calculez les droits chmod (octal et symbolique) et la commande correspondante."},{"name":"docker run vers Docker Compose","description":"Transformez une commande « docker run » en fichier docker-compose."},{"name":"Mise en forme XML","description":"Mettez en forme un XML pour le rendre lisible."},{"name":"Mise en forme YAML","description":"Mettez en forme un YAML pour le rendre lisible."},{"name":"Normalisation d'adresses e-mail","description":"Normalisez des adresses e-mail (casse, points, alias « + ») pour repérer les doublons."},{"name":"Testeur d'expressions régulières","description":"Testez une expression régulière sur un texte et visualisez les correspondances et groupes."},{"name":"Calculateur de sous-réseau IPv4","description":"Analysez un bloc CIDR IPv4 : masque, plage d'adresses, diffusion, nombre d'hôtes…"},{"name":"Conversion d'adresse IPv4","description":"Convertissez une adresse IPv4 en décimal, binaire, hexadécimal ou IPv6."},{"name":"Plage d'adresses IPv4","description":"À partir d'une adresse de début et de fin, calculez le sous-réseau IPv4 et sa notation CIDR."},{"name":"Recherche d'adresse MAC","description":"Retrouvez le fabricant d'un appareil à partir de son adresse MAC."},{"name":"Générateur d'adresses MAC","description":"Générez des adresses MAC aléatoires, avec préfixe, séparateur et casse au choix."},{"name":"Générateur IPv6 ULA","description":"Générez vos adresses IPv6 locales non routables (ULA) selon la RFC 4193."},{"name":"Calculateur RAID","description":"Calculez la capacité utilisable, la parité et la tolérance aux pannes de chaque niveau de RAID (SHR, RAID 5, 6, 10…)."},{"name":"Calculatrice d'expressions","description":"Évaluez une expression mathématique, avec fonctions (sqrt, cos, sin, abs…) et unités."},{"name":"Estimation de fin (ETA)","description":"Estimez l'heure de fin et la durée d'une tâche, par exemple un téléchargement ou un traitement par lots."},{"name":"Calculateur de pourcentages","description":"Calculez un pourcentage d'une valeur, la part d'une valeur dans une autre, ou une évolution."},{"name":"Conversion de températures","description":"Convertissez des températures : Kelvin, Celsius, Fahrenheit, Rankine, Delisle, Newton, Réaumur, Rømer."},{"name":"Comparateur de mesures","description":"Comparez des séries de durées d'exécution : moyenne, variance, écart à la meilleure."},{"name":"Générateur de lorem ipsum","description":"Générez du faux texte pour vos maquettes, en paragraphes, phrases et mots réglables."},{"name":"Statistiques d'un texte","description":"Comptez caractères, mots, lignes et octets d'un texte."},{"name":"Sélecteur d'emoji","description":"Trouvez et copiez un emoji, avec son code Unicode et ses points de code."},{"name":"Masquage de chaîne","description":"Masquez une chaîne (secret, IBAN, jeton) pour la partager et l'identifier sans en révéler le contenu."},{"name":"Comparaison de textes","description":"Comparez deux textes et visualisez leurs différences."},{"name":"Générateur de numéronymes","description":"Abrégez un mot en numéronyme, comme « i18n » pour « internationalization »."},{"name":"Texte en art ASCII","description":"Dessinez un texte en grands caractères ASCII, avec de nombreuses polices."},{"name":"Analyse de numéro de téléphone","description":"Analysez, validez et formatez un numéro de téléphone : pays, indicatif, type de ligne, formats."},{"name":"Validation d'IBAN","description":"Validez et analysez un IBAN : pays, BBAN, QR-IBAN, format lisible."},{"name":"Scripts réseau","description":"Diagnostics exécutés depuis les serveurs Outremer. Clé d'API avec l'accès « scripts » requise."}],"paths":{"/api/v1/tools/password-generator/generate":{"post":{"operationId":"password-generator.generate","tags":["Générateur de mots de passe"],"summary":"Générer des mots de passe de caractères aléatoires","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"length":{"default":20,"type":"integer","minimum":4,"maximum":128},"uppercase":{"default":true,"type":"boolean"},"lowercase":{"default":true,"type":"boolean"},"numbers":{"default":true,"type":"boolean"},"symbols":{"default":true,"type":"boolean"},"excludeAmbiguous":{"default":false,"type":"boolean"},"eachClass":{"default":true,"type":"boolean"},"count":{"default":1,"type":"integer","minimum":1,"maximum":50}}},"example":{"length":16,"count":2}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"passwords":{"type":"array","items":{"type":"string"}}},"required":["passwords"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/password-generator/passphrase":{"post":{"operationId":"password-generator.passphrase","tags":["Générateur de mots de passe"],"summary":"Générer des phrases de passe (mots français)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"words":{"default":5,"type":"integer","minimum":2,"maximum":20},"separator":{"default":"hyphen","type":"string","enum":["hyphen","space","dot","underscore","none"]},"capitalize":{"default":false,"type":"boolean"},"appendNumber":{"default":false,"type":"boolean"},"stripAccents":{"default":true,"type":"boolean"},"count":{"default":1,"type":"integer","minimum":1,"maximum":50}}},"example":{"words":4,"count":2}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"passphrases":{"type":"array","items":{"type":"string"}}},"required":["passphrases"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/token-generator/generate":{"post":{"operationId":"token-generator.generate","tags":["Générateur de jetons"],"summary":"Générer un ou plusieurs jetons aléatoires","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"length":{"default":64,"type":"integer","minimum":1,"maximum":512},"uppercase":{"default":true,"type":"boolean"},"lowercase":{"default":true,"type":"boolean"},"numbers":{"default":true,"type":"boolean"},"symbols":{"default":false,"type":"boolean"},"exclude":{"default":"","description":"Caractères à exclure, ex. « 0O1lI »","type":"string","maxLength":200},"count":{"default":1,"type":"integer","minimum":1,"maximum":100}}},"example":{"length":32,"symbols":true,"count":2}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"string"}}},"required":["tokens"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/hash-text/hash":{"post":{"operationId":"hash-text.hash","tags":["Empreinte d'un texte"],"summary":"Calculer l'empreinte d'un texte (MD5, SHA-1, SHA-2, SHA-3, RIPEMD-160)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":500000},"algorithm":{"default":"SHA256","type":"string","enum":["MD5","SHA1","SHA256","SHA224","SHA512","SHA384","SHA3","RIPEMD160"]},"encoding":{"default":"Hex","description":"Encodage de l'empreinte","type":"string","enum":["Bin","Hex","Base64","Base64url"]}},"required":["text"]},"example":{"text":"Bonjour Outremer","algorithm":"SHA256"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"hash":{"type":"string"}},"required":["hash"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/hash-text/hash-all":{"post":{"operationId":"hash-text.hash-all","tags":["Empreinte d'un texte"],"summary":"Calculer l'empreinte d'un texte avec tous les algorithmes","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":500000},"encoding":{"default":"Hex","description":"Encodage de l'empreinte","type":"string","enum":["Bin","Hex","Base64","Base64url"]}},"required":["text"]},"example":{"text":"Bonjour Outremer"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"hashes":{"type":"object","propertyNames":{"type":"string","enum":["MD5","SHA1","SHA256","SHA224","SHA512","SHA384","SHA3","RIPEMD160"]},"additionalProperties":{"type":"string"},"required":["MD5","SHA1","SHA256","SHA224","SHA512","SHA384","SHA3","RIPEMD160"]}},"required":["hashes"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/bcrypt/hash":{"post":{"operationId":"bcrypt.hash","tags":["Bcrypt"],"summary":"Calculer une empreinte bcrypt","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":256},"rounds":{"default":10,"type":"integer","minimum":4,"maximum":12}},"required":["text"]},"example":{"text":"MotDePasse!2026","rounds":8}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"hash":{"type":"string"}},"required":["hash"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/bcrypt/compare":{"post":{"operationId":"bcrypt.compare","tags":["Bcrypt"],"summary":"Vérifier qu'un texte correspond à une empreinte bcrypt","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":256},"hash":{"type":"string","maxLength":100}},"required":["text","hash"]},"example":{"text":"MotDePasse!2026","hash":"$2b$04$4jRUE/LuODovloKv6biT2.awpP8kZui1n5edqsUscIVS20dI9F0IC"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"match":{"type":"boolean"},"rounds":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["match","rounds"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/uuid-generator/generate":{"post":{"operationId":"uuid-generator.generate","tags":["Générateur d'UUID"],"summary":"Générer des UUID (NIL, v1, v3, v4, v5)","description":"v3 et v5 : UUID déterministe dérivé d'un espace de noms (DNS, URL, OID, X500 ou UUID) et d'un nom.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"version":{"default":"v4","type":"string","enum":["NIL","v1","v3","v4","v5"]},"count":{"default":1,"type":"integer","minimum":1,"maximum":50},"namespace":{"type":"string","maxLength":36},"name":{"default":"","type":"string","maxLength":1000}}},"example":{"version":"v4","count":3}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"uuids":{"type":"array","items":{"type":"string"}}},"required":["uuids"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/ulid-generator/generate":{"post":{"operationId":"ulid-generator.generate","tags":["Générateur d'ULID"],"summary":"Générer des ULID","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"default":1,"type":"integer","minimum":1,"maximum":100}}},"example":{"count":3}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"ulids":{"type":"array","items":{"type":"string"}}},"required":["ulids"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/encryption/encrypt":{"post":{"operationId":"encryption.encrypt","tags":["Chiffrer / déchiffrer un texte"],"summary":"Chiffrer un texte avec une phrase secrète (AES, TripleDES, Rabbit, RC4)","description":"Format OpenSSL en Base64 (dérivation EVP_BytesToKey, sel aléatoire), comme crypto-js.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":500000},"secret":{"type":"string","minLength":1,"maxLength":1024,"description":"Phrase secrète"},"cipher":{"default":"AES","type":"string","enum":["AES","TripleDES","Rabbit","RC4"]}},"required":["text","secret"]},"example":{"text":"Bonjour Outremer","secret":"ma phrase secrète","cipher":"AES"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"encrypted":{"type":"string"}},"required":["encrypted"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/encryption/decrypt":{"post":{"operationId":"encryption.decrypt","tags":["Chiffrer / déchiffrer un texte"],"summary":"Déchiffrer un texte chiffré avec une phrase secrète","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"encrypted":{"type":"string","minLength":1,"maxLength":700000},"secret":{"type":"string","minLength":1,"maxLength":1024,"description":"Phrase secrète"},"cipher":{"default":"AES","type":"string","enum":["AES","TripleDES","Rabbit","RC4"]}},"required":["encrypted","secret"]},"example":{"encrypted":"U2FsdGVkX1/1CLpz7+nyjQ2TMI6bf1ouQvit40x+PBQW0ym57ToIQN1NLEQhRGgV","secret":"ma phrase secrète","cipher":"AES"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/bip39-generator/generate":{"post":{"operationId":"bip39-generator.generate","tags":["Phrase mnémonique BIP39"],"summary":"Générer une phrase mnémonique BIP39 aléatoire","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"words":{"default":12,"description":"12, 15, 18, 21 ou 24 mots","type":"number","enum":[12,15,18,21,24]},"language":{"default":"english","type":"string","enum":["english","french","simplifiedChinese","traditionalChinese","czech","italian","japanese","korean","portuguese","spanish"]}}},"example":{"words":12,"language":"english"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"entropy":{"type":"string"},"mnemonic":{"type":"string"}},"required":["entropy","mnemonic"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/bip39-generator/encode":{"post":{"operationId":"bip39-generator.encode","tags":["Phrase mnémonique BIP39"],"summary":"Convertir une entropie hexadécimale en phrase mnémonique BIP39","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"entropy":{"type":"string"},"language":{"default":"english","type":"string","enum":["english","french","simplifiedChinese","traditionalChinese","czech","italian","japanese","korean","portuguese","spanish"]}},"required":["entropy"]},"example":{"entropy":"00000000000000000000000000000000","language":"english"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"entropy":{"type":"string"},"mnemonic":{"type":"string"}},"required":["entropy","mnemonic"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/bip39-generator/decode":{"post":{"operationId":"bip39-generator.decode","tags":["Phrase mnémonique BIP39"],"summary":"Retrouver l'entropie d'une phrase mnémonique BIP39","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mnemonic":{"type":"string","minLength":1,"maxLength":1000},"language":{"default":"english","type":"string","enum":["english","french","simplifiedChinese","traditionalChinese","czech","italian","japanese","korean","portuguese","spanish"]}},"required":["mnemonic"]},"example":{"mnemonic":"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about","language":"english"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"entropy":{"type":"string"},"mnemonic":{"type":"string"}},"required":["entropy","mnemonic"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/bip39-generator/validate":{"post":{"operationId":"bip39-generator.validate","tags":["Phrase mnémonique BIP39"],"summary":"Vérifier une phrase mnémonique BIP39 (mots et somme de contrôle)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mnemonic":{"type":"string","minLength":1,"maxLength":1000},"language":{"default":"english","type":"string","enum":["english","french","simplifiedChinese","traditionalChinese","czech","italian","japanese","korean","portuguese","spanish"]}},"required":["mnemonic"]},"example":{"mnemonic":"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"}},"required":["valid"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/hmac-generator/generate":{"post":{"operationId":"hmac-generator.generate","tags":["Générateur HMAC"],"summary":"Calculer le HMAC d'un texte avec une clé secrète","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":500000},"secret":{"type":"string","maxLength":4096},"algorithm":{"default":"SHA256","type":"string","enum":["MD5","RIPEMD160","SHA1","SHA3","SHA224","SHA256","SHA384","SHA512"]},"encoding":{"default":"Hex","type":"string","enum":["Bin","Hex","Base64","Base64url"]}},"required":["text","secret"]},"example":{"text":"Bonjour Outremer","secret":"clé-secrète","algorithm":"SHA256"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"hmac":{"type":"string"}},"required":["hmac"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/rsa-key-pair-generator/generate":{"post":{"operationId":"rsa-key-pair-generator.generate","tags":["Paire de clés RSA"],"summary":"Générer une paire de clés RSA au format PEM","description":"Clé publique SubjectPublicKeyInfo (`BEGIN PUBLIC KEY`), clé privée PKCS#1 (`BEGIN RSA PRIVATE KEY`).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"bits":{"default":2048,"type":"integer","minimum":512,"maximum":4096,"multipleOf":8}}},"example":{"bits":1024}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"publicKeyPem":{"type":"string"},"privateKeyPem":{"type":"string"}},"required":["publicKeyPem","privateKeyPem"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/password-strength-analyser/analyze":{"post":{"operationId":"password-strength-analyser.analyze","tags":["Robustesse d'un mot de passe"],"summary":"Estimer la robustesse d'un mot de passe (force brute)","description":"Entropie déduite des classes de caractères et temps de cassage à un milliard d'essais par seconde. Ne tient pas compte des attaques par dictionnaire.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"password":{"type":"string","maxLength":1024},"guessesPerSecond":{"default":1000000000,"type":"number","minimum":1,"maximum":1000000000000000000}},"required":["password"]},"example":{"password":"Outremer#2026"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"entropy":{"type":"number"},"charsetLength":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"passwordLength":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"secondsToCrack":{"description":"null si hors de portée d'un nombre flottant","type":["number","null"]},"crackDurationFormatted":{"type":"string"},"score":{"type":"number"}},"required":["entropy","charsetLength","passwordLength","secondsToCrack","crackDurationFormatted","score"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/pdf-signature-checker/verify":{"post":{"operationId":"pdf-signature-checker.verify","tags":["Vérification de signature PDF"],"summary":"Vérifier les signatures numériques d'un PDF","description":"PDF encodé en base64 (environ 700 Ko au plus). Pour chaque signature : intégrité, authenticité (chaîne jusqu'à une autorité racine connue), expiration et certificats. Un PDF sans signature rend `signed: false`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pdf":{"type":"string","minLength":1,"maxLength":1000000,"pattern":"^[A-Za-z0-9+/]*={0,2}$","description":"Contenu du PDF en base64"}},"required":["pdf"]},"example":{"pdf":"JVBERi0xLjQKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFtdIC9Db3VudCAwID4+CmVuZG9iagp0cmFpbGVyCjw8IC9Sb290IDEgMCBSID4+CiUlRU9GCg=="}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"signed":{"type":"boolean"},"signatures":{"type":"array","items":{"type":"object","properties":{"verified":{"type":"boolean"},"authenticity":{"type":"boolean"},"integrity":{"type":"boolean"},"expired":{"type":"boolean"},"reason":{"type":["string","null"]},"contactInfo":{"type":["string","null"]},"location":{"type":["string","null"]},"name":{"type":["string","null"]},"certificates":{"type":"array","items":{"type":"object","properties":{"clientCertificate":{"type":"boolean"},"issuedBy":{"type":"object","properties":{"commonName":{"type":"string"},"organizationName":{"type":"string"},"organizationalUnitName":{"type":"string"},"countryName":{"type":"string"},"localityName":{"type":"string"},"stateOrProvinceName":{"type":"string"},"serialNumber":{"type":"string"}},"additionalProperties":false},"issuedTo":{"type":"object","properties":{"commonName":{"type":"string"},"organizationName":{"type":"string"},"organizationalUnitName":{"type":"string"},"countryName":{"type":"string"},"localityName":{"type":"string"},"stateOrProvinceName":{"type":"string"},"serialNumber":{"type":"string"}},"additionalProperties":false},"notBefore":{"type":"string"},"notAfter":{"type":"string"},"pemCertificate":{"type":"string"}},"required":["clientCertificate","issuedBy","issuedTo","notBefore","notAfter","pemCertificate"],"additionalProperties":false}}},"required":["verified","authenticity","integrity","expired","reason","contactInfo","location","name","certificates"],"additionalProperties":false}}},"required":["signed","signatures"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/date-converter/convert":{"post":{"operationId":"date-converter.convert","tags":["Convertisseur de dates"],"summary":"Convertir une date dans tous les formats (ISO, RFC, Unix, Excel, ObjectID Mongo…)","description":"Sans `from`, le format est détecté automatiquement (à défaut, analyse par le moteur JavaScript). Les formats locaux (js, fr, iso…) utilisent le fuseau horaire du serveur.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","minLength":1,"maxLength":100,"description":"Date à convertir, ex. « 2024-05-17T10:30:00Z »"},"from":{"description":"Format de la saisie ; détecté si absent","type":"string","enum":["js","fr","iso8601","iso9075","rfc3339","rfc7231","unix","timestamp","utc","mongo","excel"]}},"required":["date"]},"example":{"date":"2024-05-17T10:30:00Z"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"from":{"type":"string","enum":["js","fr","iso8601","iso9075","rfc3339","rfc7231","unix","timestamp","utc","mongo","excel"]},"formats":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["from","formats"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/base-converter/convert":{"post":{"operationId":"base-converter.convert","tags":["Conversion de bases numériques"],"summary":"Convertir un entier positif d'une base à une autre (2 à 64)","description":"Chiffres utilisés : 0-9, a-z, A-Z, +, / (précision illimitée).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"value":{"type":"string","minLength":1,"maxLength":1000,"pattern":"^[0-9a-zA-Z+/]+$"},"fromBase":{"default":10,"type":"integer","minimum":2,"maximum":64},"toBase":{"default":16,"type":"integer","minimum":2,"maximum":64}},"required":["value"]},"example":{"value":"255","fromBase":10,"toBase":2}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"value":{"type":"string"}},"required":["value"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/roman-numeral-converter/to-roman":{"post":{"operationId":"roman-numeral-converter.to-roman","tags":["Chiffres romains"],"summary":"Convertir un nombre (1 à 3999) en chiffres romains","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"number":{"type":"integer","minimum":1,"maximum":3999}},"required":["number"]},"example":{"number":2024}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"roman":{"type":"string"}},"required":["roman"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/roman-numeral-converter/from-roman":{"post":{"operationId":"roman-numeral-converter.from-roman","tags":["Chiffres romains"],"summary":"Convertir des chiffres romains en nombre","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"roman":{"type":"string","minLength":1,"maxLength":20}},"required":["roman"]},"example":{"roman":"MMXXIV"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"number":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["number"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/base64-file-converter/decode":{"post":{"operationId":"base64-file-converter.decode","tags":["Base64 (fichier)"],"summary":"Analyser un fichier encodé en base64 : type MIME, extension, nom et taille","description":"Le type MIME vient du préfixe data URL, sinon de la signature du fichier (PDF, PNG, JPEG, GIF), sinon de l'extension fournie. Le base64 nettoyé (sans préfixe ni espaces) est renvoyé.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"base64":{"type":"string","minLength":1,"maxLength":5000000,"description":"Base64, avec ou sans préfixe data URL"},"fileName":{"default":"","description":"Nom du fichier, « file » par défaut","type":"string","maxLength":200},"extension":{"default":"","type":"string","maxLength":20,"pattern":"^\\.?[A-Za-z0-9]*$"}},"required":["base64"]},"example":{"base64":"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==","fileName":"pixel"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"mimeType":{"type":"string"},"extension":{"type":"string"},"fileName":{"type":"string"},"size":{"type":"integer","minimum":0,"maximum":9007199254740991,"description":"Taille en octets"},"base64":{"type":"string"}},"required":["mimeType","extension","fileName","size","base64"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/base64-file-converter/to-data-url":{"post":{"operationId":"base64-file-converter.to-data-url","tags":["Base64 (fichier)"],"summary":"Construire une data URL à partir d'un fichier encodé en base64","description":"Sans `mimeType`, le type est détecté (préfixe, signature), sinon application/octet-stream.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"base64":{"type":"string","minLength":1,"maxLength":5000000,"description":"Base64, avec ou sans préfixe data URL"},"mimeType":{"type":"string","maxLength":100,"pattern":"^[\\w.+-]+\\/[\\w.+-]+$"}},"required":["base64"]},"example":{"base64":"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"dataUrl":{"type":"string"},"mimeType":{"type":"string"}},"required":["dataUrl","mimeType"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/base64-string-converter/encode":{"post":{"operationId":"base64-string-converter.encode","tags":["Base64 (texte)"],"summary":"Encoder un texte en base64","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"urlSafe":{"default":false,"type":"boolean"}},"required":["text"]},"example":{"text":"Bonjour Outremer"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"base64":{"type":"string"}},"required":["base64"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/base64-string-converter/decode":{"post":{"operationId":"base64-string-converter.decode","tags":["Base64 (texte)"],"summary":"Décoder une chaîne base64 en texte","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"base64":{"type":"string"},"urlSafe":{"default":false,"type":"boolean"}},"required":["base64"]},"example":{"base64":"Qm9uam91ciBPdXRyZW1lcg=="}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/color-converter/convert":{"post":{"operationId":"color-converter.convert","tags":["Convertisseur de couleurs"],"summary":"Convertir une couleur (hex, rgb, hsl, hwb, lch, cmyk, nom CSS) dans tous les formats","description":"« name » donne le nom CSS le plus proche.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"color":{"type":"string","minLength":1,"maxLength":100,"description":"ex. « #1ea54c », « rgb(255, 0, 0) », « red »"}},"required":["color"]},"example":{"color":"#1ea54c"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"hex":{"type":"string"},"rgb":{"type":"string"},"hsl":{"type":"string"},"hwb":{"type":"string"},"lch":{"type":"string"},"cmyk":{"type":"string"},"name":{"type":"string"}},"required":["hex","rgb","hsl","hwb","lch","cmyk","name"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/case-converter/convert":{"post":{"operationId":"case-converter.convert","tags":["Changement de casse"],"summary":"Convertir un texte dans différentes casses (camelCase, snake_case, kebab…)","description":"Sans `cases`, toutes les casses sont renvoyées.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":100000},"cases":{"minItems":1,"maxItems":14,"type":"array","items":{"type":"string","enum":["lower","upper","camel","capital","constant","dot","header","no","param","pascal","path","sentence","snake","mocking"]}}},"required":["text"]},"example":{"text":"Bonjour Outremer solutions","cases":["camel","snake","param"]}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"results":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}}},"required":["results"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/text-to-nato-alphabet/convert":{"post":{"operationId":"text-to-nato-alphabet.convert","tags":["Alphabet OTAN"],"summary":"Épeler un texte avec l'alphabet phonétique OTAN","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":10000}},"required":["text"]},"example":{"text":"IT tools"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"nato":{"type":"string"}},"required":["nato"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/text-to-binary/encode":{"post":{"operationId":"text-to-binary.encode","tags":["Texte vers binaire ASCII"],"summary":"Convertir un texte en binaire (8 bits par caractère)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":100000},"separator":{"default":" ","type":"string","maxLength":10}},"required":["text"]},"example":{"text":"Outremer"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"binary":{"type":"string"}},"required":["binary"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/text-to-binary/decode":{"post":{"operationId":"text-to-binary.decode","tags":["Texte vers binaire ASCII"],"summary":"Convertir du binaire en texte (caractères autres que 0 et 1 ignorés)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"binary":{"type":"string","maxLength":1000000}},"required":["binary"]},"example":{"binary":"01001001 01010100"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/text-to-unicode/encode":{"post":{"operationId":"text-to-unicode.encode","tags":["Texte vers Unicode"],"summary":"Convertir un texte en entités HTML décimales (« &#NNN; »)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":100000}},"required":["text"]},"example":{"text":"Été"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"unicode":{"type":"string"}},"required":["unicode"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/text-to-unicode/decode":{"post":{"operationId":"text-to-unicode.decode","tags":["Texte vers Unicode"],"summary":"Convertir des entités HTML décimales (« &#NNN; ») en texte","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"unicode":{"type":"string","maxLength":1000000}},"required":["unicode"]},"example":{"unicode":"&#201;&#116;&#233;"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/yaml-to-json-converter/convert":{"post":{"operationId":"yaml-to-json-converter.convert","tags":["YAML vers JSON"],"summary":"Convertir du YAML en JSON","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"yaml":{"type":"string","minLength":1,"maxLength":500000}},"required":["yaml"]},"example":{"yaml":"nom: Outremer\noutils:\n  - json\n  - yaml\n"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"json":{"type":"string"}},"required":["json"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/yaml-to-toml/convert":{"post":{"operationId":"yaml-to-toml.convert","tags":["YAML vers TOML"],"summary":"Convertir du YAML en TOML (la racine doit être un objet)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"yaml":{"type":"string","minLength":1,"maxLength":500000}},"required":["yaml"]},"example":{"yaml":"nom: Outremer\noutils:\n  - json\n  - yaml\n"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"toml":{"type":"string"}},"required":["toml"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/json-to-yaml-converter/convert":{"post":{"operationId":"json-to-yaml-converter.convert","tags":["JSON vers YAML"],"summary":"Convertir du JSON (syntaxe JSON5 tolérée) en YAML","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string","minLength":1,"maxLength":500000}},"required":["json"]},"example":{"json":"{\"nom\": \"Outremer\", \"outils\": [\"json\", \"yaml\"]}"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"yaml":{"type":"string"}},"required":["yaml"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/json-to-toml/convert":{"post":{"operationId":"json-to-toml.convert","tags":["JSON vers TOML"],"summary":"Convertir du JSON (syntaxe JSON5 tolérée) en TOML (la racine doit être un objet)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string","minLength":1,"maxLength":500000}},"required":["json"]},"example":{"json":"{\"nom\": \"Outremer\", \"outils\": [\"json\", \"toml\"]}"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"toml":{"type":"string"}},"required":["toml"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/list-converter/convert":{"post":{"operationId":"list-converter.convert","tags":["Conversion de listes"],"summary":"Transformer une liste (un élément par ligne) : tri, dédoublonnage, préfixes, séparateur","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"list":{"type":"string","maxLength":500000,"description":"Un élément par ligne"},"lowerCase":{"default":false,"type":"boolean"},"trimItems":{"default":true,"type":"boolean"},"removeDuplicates":{"default":true,"type":"boolean"},"keepLineBreaks":{"default":false,"type":"boolean"},"reverseList":{"default":false,"type":"boolean"},"sortList":{"default":null,"anyOf":[{"type":"string","enum":["asc","desc"]},{"type":"null"}]},"itemPrefix":{"default":"","type":"string","maxLength":100},"itemSuffix":{"default":"","type":"string","maxLength":100},"listPrefix":{"default":"","type":"string","maxLength":100},"listSuffix":{"default":"","type":"string","maxLength":100},"separator":{"default":", ","type":"string","maxLength":20}},"required":["list"]},"example":{"list":"banane\npomme\nbanane\nmangue","sortList":"asc","itemPrefix":"'","itemSuffix":"'","listPrefix":"(","listSuffix":")"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"result":{"type":"string"}},"required":["result"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/toml-to-json/convert":{"post":{"operationId":"toml-to-json.convert","tags":["TOML vers JSON"],"summary":"Convertir du TOML en JSON","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"toml":{"type":"string","minLength":1,"maxLength":500000}},"required":["toml"]},"example":{"toml":"nom = \"Outremer\"\noutils = [\"json\", \"toml\"]\n"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"json":{"type":"string"}},"required":["json"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/toml-to-yaml/convert":{"post":{"operationId":"toml-to-yaml.convert","tags":["TOML vers YAML"],"summary":"Convertir du TOML en YAML","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"toml":{"type":"string","minLength":1,"maxLength":500000}},"required":["toml"]},"example":{"toml":"nom = \"Outremer\"\noutils = [\"yaml\", \"toml\"]\n"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"yaml":{"type":"string"}},"required":["yaml"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/xml-to-json/convert":{"post":{"operationId":"xml-to-json.convert","tags":["XML vers JSON"],"summary":"Convertir du XML en JSON (forme compacte de xml-js : « _attributes », « _text »)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"xml":{"type":"string","minLength":1,"maxLength":500000}},"required":["xml"]},"example":{"xml":"<outil nom=\"xml\"><libelle>XML vers JSON</libelle></outil>"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"json":{"type":"string"}},"required":["json"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/json-to-xml/convert":{"post":{"operationId":"json-to-xml.convert","tags":["JSON vers XML"],"summary":"Convertir du JSON (forme compacte de xml-js, syntaxe JSON5 tolérée) en XML","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string","minLength":1,"maxLength":500000}},"required":["json"]},"example":{"json":"{\"outil\": {\"_attributes\": {\"nom\": \"xml\"}, \"libelle\": {\"_text\": \"JSON vers XML\"}}}"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"xml":{"type":"string"}},"required":["xml"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/markdown-to-html/convert":{"post":{"operationId":"markdown-to-html.convert","tags":["Markdown vers HTML"],"summary":"Convertir du Markdown (GFM) en HTML (non assaini)","description":"HTML brut produit par marked : le HTML présent dans le Markdown est conservé tel quel. Il n'est pas assaini ; assainissez-le avant de l'insérer dans une page.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"markdown":{"type":"string","maxLength":500000}},"required":["markdown"]},"example":{"markdown":"# Outremer\n\nUn **outil** pour convertir du *Markdown*."}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"html":{"type":"string"}},"required":["html"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/url-encoder/encode":{"post":{"operationId":"url-encoder.encode","tags":["Encoder / décoder une URL"],"summary":"Encoder un texte au format URL (encodeURIComponent)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":100000}},"required":["text"]},"example":{"text":"Bonjour Outremer & co ?"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"encoded":{"type":"string"}},"required":["encoded"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/url-encoder/decode":{"post":{"operationId":"url-encoder.decode","tags":["Encoder / décoder une URL"],"summary":"Décoder un texte encodé au format URL (decodeURIComponent)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"encoded":{"type":"string","maxLength":100000}},"required":["encoded"]},"example":{"encoded":"Bonjour%20Outremer%20%26%20co%20%3F"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/html-entities/escape":{"post":{"operationId":"html-entities.escape","tags":["Entités HTML"],"summary":"Échapper les caractères HTML (& < > \" ') en entités","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":100000}},"required":["text"]},"example":{"text":"<a href=\"/\">Outremer & co</a>"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"escaped":{"type":"string"}},"required":["escaped"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/html-entities/unescape":{"post":{"operationId":"html-entities.unescape","tags":["Entités HTML"],"summary":"Restaurer les entités HTML (&amp; &lt; &gt; &quot; &#39;) en caractères","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"escaped":{"type":"string","maxLength":100000}},"required":["escaped"]},"example":{"escaped":"&lt;a href=&quot;/&quot;&gt;Outremer &amp; co&lt;/a&gt;"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/url-parser/parse":{"post":{"operationId":"url-parser.parse","tags":["Analyse d'URL"],"summary":"Décomposer une URL absolue (protocole, hôte, port, chemin, paramètres…)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":8192}},"required":["url"]},"example":{"url":"https://user:pass@outremer.example:8080/chemin/page?lang=fr&q=test#section"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"protocol":{"type":"string"},"origin":{"type":"string"},"username":{"type":"string"},"password":{"type":"string"},"hostname":{"type":"string"},"port":{"type":"string"},"pathname":{"type":"string"},"search":{"type":"string"},"hash":{"type":"string"},"params":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"required":["key","value"],"additionalProperties":false}}},"required":["protocol","origin","username","password","hostname","port","pathname","search","hash","params"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/basic-auth-generator/generate":{"post":{"operationId":"basic-auth-generator.generate","tags":["En-tête Basic Auth"],"summary":"Générer l'en-tête HTTP Authorization: Basic d'un identifiant et d'un mot de passe","description":"L'identifiant ne doit pas contenir « : » (RFC 7617).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"username":{"type":"string","maxLength":1000},"password":{"type":"string","maxLength":1000}},"required":["username","password"]},"example":{"username":"admin","password":"motdepasse"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"token":{"type":"string"},"header":{"type":"string"}},"required":["token","header"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/og-meta-generator/generate":{"post":{"operationId":"og-meta-generator.generate","tags":["Balises Open Graph"],"summary":"Générer les balises meta Open Graph et Twitter d'une page","description":"Clés attendues : celles listées par l'opération « fields » (ex. type, title, description, image, url, twitter:card). Les clés inconnues sont ignorées.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"metadata":{"type":"object","propertyNames":{"type":"string","maxLength":100},"additionalProperties":{"anyOf":[{"type":"string","maxLength":2000},{"maxItems":20,"type":"array","items":{"type":"string","maxLength":2000}}]}}},"required":["metadata"]},"example":{"metadata":{"type":"website","title":"Outremer Solutions","description":"Boîte à outils informatique","url":"https://outremer.example","image":"https://outremer.example/og.png","twitter:card":"summary_large_image"}}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"html":{"type":"string"}},"required":["html"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/og-meta-generator/fields":{"post":{"operationId":"og-meta-generator.fields","tags":["Balises Open Graph"],"summary":"Lister les champs disponibles pour un type de page Open Graph","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"default":"website","type":"string","maxLength":50}}},"example":{"type":"article"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"sections":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"fields":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"multiple":{"type":"boolean"},"options":{"type":"array","items":{"type":"string"}}},"required":["key","label","multiple"],"additionalProperties":false}}},"required":["name","fields"],"additionalProperties":false}}},"required":["sections"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/otp-generator/generate-secret":{"post":{"operationId":"otp-generator.generate-secret","tags":["Codes OTP (TOTP)"],"summary":"Générer un secret TOTP base32 et son URI otpauth://","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"length":{"default":16,"description":"Longueur du secret en caractères","type":"integer","minimum":16,"maximum":64},"issuer":{"default":"IT-Tools","type":"string","minLength":1,"maxLength":100},"account":{"default":"demo-user","type":"string","minLength":1,"maxLength":100},"period":{"default":30,"description":"Période en secondes","type":"integer","minimum":5,"maximum":300},"qrCode":{"default":false,"description":"Inclure un QR code (data URL PNG)","type":"boolean"}}},"example":{"issuer":"Outremer","account":"admin@outremer.example","qrCode":true}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"secret":{"type":"string"},"uri":{"type":"string"},"qrCode":{"type":"string"}},"required":["secret","uri"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/otp-generator/generate":{"post":{"operationId":"otp-generator.generate","tags":["Codes OTP (TOTP)"],"summary":"Calculer le code TOTP (6 chiffres, SHA-1) d'un secret, à l'instant donné ou courant","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"secret":{"type":"string","minLength":8,"maxLength":128},"timestamp":{"type":"integer","minimum":0,"maximum":8640000000000000},"period":{"default":30,"description":"Période en secondes","type":"integer","minimum":5,"maximum":300}},"required":["secret"]},"example":{"secret":"JBSWY3DPEHPK3PXP","timestamp":1700000000000}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"code":{"type":"string"},"previous":{"type":"string"},"next":{"type":"string"},"counter":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"secondsRemaining":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["code","previous","next","counter","secondsRemaining"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/otp-generator/verify":{"post":{"operationId":"otp-generator.verify","tags":["Codes OTP (TOTP)"],"summary":"Vérifier un code TOTP, avec une fenêtre de tolérance en périodes","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"secret":{"type":"string","minLength":8,"maxLength":128},"code":{"type":"string","pattern":"^\\d{6}$"},"window":{"default":1,"type":"integer","minimum":0,"maximum":10},"timestamp":{"type":"integer","minimum":0,"maximum":8640000000000000},"period":{"default":30,"description":"Période en secondes","type":"integer","minimum":5,"maximum":300}},"required":["secret","code"]},"example":{"secret":"JBSWY3DPEHPK3PXP","code":"324550","timestamp":1700000000000}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"}},"required":["valid"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/mime-types/mime-type":{"post":{"operationId":"mime-types.mime-type","tags":["Types MIME"],"summary":"Type MIME d'une extension de fichier (avec ou sans point)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"extension":{"type":"string","minLength":1,"maxLength":50}},"required":["extension"]},"example":{"extension":".pdf"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"extension":{"type":"string"},"mimeType":{"type":["string","null"]}},"required":["extension","mimeType"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/mime-types/extensions":{"post":{"operationId":"mime-types.extensions","tags":["Types MIME"],"summary":"Extensions de fichier associées à un type MIME","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mimeType":{"type":"string","minLength":1,"maxLength":255}},"required":["mimeType"]},"example":{"mimeType":"image/jpeg"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"mimeType":{"type":"string"},"extensions":{"type":"array","items":{"type":"string"}}},"required":["mimeType","extensions"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/mime-types/search":{"post":{"operationId":"mime-types.search","tags":["Types MIME"],"summary":"Rechercher des types MIME par fragment de type ou d'extension","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"default":"","type":"string","maxLength":100},"limit":{"default":50,"type":"integer","minimum":1,"maximum":2000}}},"example":{"query":"json","limit":10}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"results":{"type":"array","items":{"type":"object","properties":{"mimeType":{"type":"string"},"extensions":{"type":"array","items":{"type":"string"}}},"required":["mimeType","extensions"],"additionalProperties":false}}},"required":["total","results"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/jwt-parser/decode":{"post":{"operationId":"jwt-parser.decode","tags":["Lecture de JWT"],"summary":"Décoder l'en-tête et la charge utile d'un JWT (sans vérifier la signature)","description":"Décodage seul : la signature n'est PAS vérifiée, le contenu ne doit donc pas être considéré comme fiable.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"jwt":{"type":"string","minLength":1,"maxLength":16384}},"required":["jwt"]},"example":{"jwt":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"signatureVerified":{"type":"boolean","const":false},"header":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}},"payload":{},"headerClaims":{"type":"array","items":{"type":"object","properties":{"claim":{"type":"string"},"claimDescription":{"type":"string"},"value":{"type":"string"},"friendlyValue":{"type":"string"}},"required":["claim","value"],"additionalProperties":false}},"payloadClaims":{"type":"array","items":{"type":"object","properties":{"claim":{"type":"string"},"claimDescription":{"type":"string"},"value":{"type":"string"},"friendlyValue":{"type":"string"}},"required":["claim","value"],"additionalProperties":false}}},"required":["signatureVerified","header","payload","headerClaims","payloadClaims"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/slugify-string/slugify":{"post":{"operationId":"slugify-string.slugify","tags":["Slugifier un texte"],"summary":"Transformer un texte en slug (URL, nom de fichier, identifiant)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":10000},"separator":{"default":"-","type":"string","enum":["-","_","."]},"lowercase":{"default":true,"type":"boolean"},"decamelize":{"default":true,"type":"boolean"}},"required":["text"]},"example":{"text":"Ça marche très bien à La Réunion !"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"slug":{"type":"string"}},"required":["slug"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/user-agent-parser/parse":{"post":{"operationId":"user-agent-parser.parse","tags":["Analyse de user-agent"],"summary":"Analyser un user-agent (navigateur, moteur, système, appareil, processeur)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userAgent":{"type":"string","minLength":1,"maxLength":2048}},"required":["userAgent"]},"example":{"userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"browser":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"additionalProperties":false},"engine":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"additionalProperties":false},"os":{"type":"object","properties":{"name":{"type":"string"},"version":{"type":"string"}},"additionalProperties":false},"device":{"type":"object","properties":{"model":{"type":"string"},"type":{"type":"string"},"vendor":{"type":"string"}},"additionalProperties":false},"cpu":{"type":"object","properties":{"architecture":{"type":"string"}},"additionalProperties":false}},"required":["browser","engine","os","device","cpu"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/http-status-codes/list":{"post":{"operationId":"http-status-codes.list","tags":["Codes de statut HTTP"],"summary":"Lister les codes de statut HTTP par catégorie","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{}},"example":{}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"category":{"type":"string"},"codes":{"type":"array","items":{"type":"object","properties":{"code":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["HTTP","WebDAV"]}},"required":["code","name","description","type"],"additionalProperties":false}}},"required":["category","codes"],"additionalProperties":false}}},"required":["categories"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/http-status-codes/lookup":{"post":{"operationId":"http-status-codes.lookup","tags":["Codes de statut HTTP"],"summary":"Décrire un code de statut HTTP","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"integer","minimum":100,"maximum":599}},"required":["code"]},"example":{"code":404}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"category":{"type":"string"},"status":{"type":"object","properties":{"code":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["HTTP","WebDAV"]}},"required":["code","name","description","type"],"additionalProperties":false}},"required":["category","status"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/http-status-codes/search":{"post":{"operationId":"http-status-codes.search","tags":["Codes de statut HTTP"],"summary":"Rechercher des codes de statut HTTP (code, nom, description)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":200}},"required":["query"]},"example":{"query":"not found"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"code":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["HTTP","WebDAV"]}},"required":["code","name","description","type"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/json-diff/compare":{"post":{"operationId":"json-diff.compare","tags":["Comparaison de JSON"],"summary":"Comparer deux documents JSON et lister les différences","description":"Les documents sont des chaînes JSON (syntaxe JSON5 tolérée). Chaque différence porte un chemin JSON Pointer.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"left":{"type":"string","minLength":1,"maxLength":200000},"right":{"type":"string","minLength":1,"maxLength":200000}},"required":["left","right"]},"example":{"left":"{\"nom\": \"Outremer\", \"version\": 1, \"tags\": [\"it\", \"outils\"]}","right":"{\"nom\": \"Outremer\", \"version\": 2, \"tags\": [\"it\"], \"actif\": true}"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"equal":{"type":"boolean"},"changes":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"status":{"type":"string","enum":["added","removed","updated"]},"oldValue":{},"value":{}},"required":["path","status"],"additionalProperties":false}}},"required":["equal","changes"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/safelink-decoder/decode":{"post":{"operationId":"safelink-decoder.decode","tags":["Décodeur Safe Links Outlook"],"summary":"Retrouver l'adresse d'origine d'un lien Outlook Safe Links (Microsoft Defender)","description":"Décodage local de l'URL : aucun accès réseau, le lien n'est pas suivi.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":1,"maxLength":16384}},"required":["url"]},"example":{"url":"https://eur02.safelinks.protection.outlook.com/?url=https%3A%2F%2Foutremer.example%2Fpage%3Fid%3D1&data=05%7C01&reserved=0"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/mail-analyzer/analyze":{"post":{"operationId":"mail-analyzer.analyze","tags":["Analyse de message e-mail"],"summary":"Analyser un message e-mail (source .eml) pour y repérer des indices de malveillance","description":"Analyse locale de la source du message : authentification SPF/DKIM/DMARC, usurpation de l'expéditeur, liens, pièces jointes et contenu. Aucun lien n'est suivi ; le score est un faisceau d'indices, pas une certitude.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","minLength":1,"maxLength":5242880}},"required":["message"]},"example":{"message":"Authentication-Results: mx.example; spf=pass; dkim=pass; dmarc=pass\nFrom: Équipe <equipe@outremer.example>\nSubject: Bonjour\nContent-Type: text/plain; charset=utf-8\n\nCompte rendu de la réunion."}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"verdict":{"type":"string","enum":["likely-malicious","suspicious","no-signal"]},"score":{"type":"number"},"subject":{"type":"string"},"from":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"}},"required":["name","address"],"additionalProperties":false}},"replyTo":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"address":{"type":"string"}},"required":["name","address"],"additionalProperties":false}},"returnPath":{"type":"string"},"date":{"type":"string"},"authentication":{"type":"object","properties":{"spf":{"type":"string"},"dkim":{"type":"string"},"dmarc":{"type":"string"}},"required":["spf","dkim","dmarc"],"additionalProperties":false},"originIp":{"type":"string"},"findings":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"severity":{"type":"string","enum":["info","low","medium","high"]},"category":{"type":"string"},"title":{"type":"string"},"detail":{"type":"string"},"evidence":{"type":"array","items":{"type":"string"}}},"required":["id","severity","category","title","detail","evidence"],"additionalProperties":false}},"links":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"finalUrl":{"type":"string"},"text":{"type":"string"},"flags":{"type":"array","items":{"type":"string"}}},"required":["url","finalUrl","text","flags"],"additionalProperties":false}},"attachments":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string"},"contentType":{"type":"string"},"size":{"type":"number"},"sha256":{"type":"string"}},"required":["filename","contentType","size","sha256"],"additionalProperties":false}},"indicators":{"type":"object","properties":{"urls":{"type":"array","items":{"type":"string"}},"domains":{"type":"array","items":{"type":"string"}},"ips":{"type":"array","items":{"type":"string"}},"emails":{"type":"array","items":{"type":"string"}},"hashes":{"type":"array","items":{"type":"string"}}},"required":["urls","domains","ips","emails","hashes"],"additionalProperties":false}},"required":["verdict","score","subject","from","replyTo","returnPath","date","authentication","originIp","findings","links","attachments","indicators"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/qrcode-generator/generate":{"post":{"operationId":"qrcode-generator.generate","tags":["Générateur de QR code"],"summary":"Générer un QR code (image PNG en data URL et SVG)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":2000},"foreground":{"default":"#000000ff","type":"string"},"background":{"default":"#ffffffff","type":"string"},"errorCorrectionLevel":{"default":"medium","type":"string","enum":["low","medium","quartile","high"]},"width":{"default":1024,"description":"Largeur du PNG en pixels","type":"integer","minimum":64,"maximum":2048}},"required":["text"]},"example":{"text":"https://outremer-solutions.fr","errorCorrectionLevel":"high","width":256}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"dataUrl":{"type":"string"},"svg":{"type":"string"}},"required":["dataUrl","svg"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/wifi-qrcode-generator/generate":{"post":{"operationId":"wifi-qrcode-generator.generate","tags":["QR code Wi-Fi"],"summary":"Générer un QR code de connexion Wi-Fi (PNG en data URL et SVG)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ssid":{"type":"string","minLength":1,"maxLength":64},"password":{"default":"","type":"string","maxLength":128},"encryption":{"default":"WPA","type":"string","enum":["nopass","WPA","WEP","WPA2-EAP"]},"hidden":{"default":false,"description":"Réseau masqué","type":"boolean"},"eapMethod":{"description":"Requis pour WPA2-EAP","type":"string","enum":["MD5","POTP","GTC","TLS","IKEv2","SIM","AKA","AKA'","TTLS","PWD","LEAP","PSK","FAST","TEAP","EKE","NOOB","PEAP"]},"eapIdentity":{"default":"","type":"string","maxLength":256},"eapAnonymous":{"default":false,"type":"boolean"},"eapPhase2Method":{"description":"Requis pour PEAP","type":"string","enum":["None","MSCHAPV2"]},"foreground":{"default":"#000000ff","type":"string"},"background":{"default":"#ffffffff","type":"string"}},"required":["ssid"]},"example":{"ssid":"Outremer-Invites","password":"motdepasse-solide","encryption":"WPA"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"text":{"type":"string"},"dataUrl":{"type":"string"},"svg":{"type":"string"}},"required":["text","dataUrl","svg"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/svg-placeholder-generator/generate":{"post":{"operationId":"svg-placeholder-generator.generate","tags":["Image SVG de substitution"],"summary":"Générer une image SVG de substitution (SVG et data URL)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"width":{"default":600,"type":"integer","minimum":1,"maximum":10000},"height":{"default":350,"type":"integer","minimum":1,"maximum":10000},"fontSize":{"default":26,"type":"integer","minimum":1,"maximum":1000},"bgColor":{"default":"#cccccc","type":"string","pattern":"^[#a-zA-Z0-9(),.%\\s-]{1,64}$"},"fgColor":{"default":"#333333","type":"string","pattern":"^[#a-zA-Z0-9(),.%\\s-]{1,64}$"},"useExactSize":{"default":true,"description":"Ajouter width et height au SVG","type":"boolean"},"text":{"default":"","description":"Texte affiché (par défaut : « LxH »)","type":"string","maxLength":200}}},"example":{"width":800,"height":400,"text":"Outremer"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"svg":{"type":"string"},"dataUrl":{"type":"string"}},"required":["svg","dataUrl"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/random-port-generator/generate":{"post":{"operationId":"random-port-generator.generate","tags":["Port aléatoire"],"summary":"Tirer au hasard un ou plusieurs ports entre 1024 et 65535","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"default":1,"type":"integer","minimum":1,"maximum":100}}},"example":{"count":3}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"ports":{"type":"array","items":{"type":"integer","minimum":1024,"maximum":65535}}},"required":["ports"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/crontab-generator/validate":{"post":{"operationId":"crontab-generator.validate","tags":["Générateur de crontab"],"summary":"Vérifier une expression cron","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expression":{"type":"string","minLength":1,"maxLength":200,"description":"Expression cron (5 ou 6 champs, ou raccourci « @daily »…)"}},"required":["expression"]},"example":{"expression":"*/5 1-3 * * mon"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"}},"required":["valid"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/crontab-generator/describe":{"post":{"operationId":"crontab-generator.describe","tags":["Générateur de crontab"],"summary":"Décrire une expression cron en français","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expression":{"type":"string","minLength":1,"maxLength":200,"description":"Expression cron (5 ou 6 champs, ou raccourci « @daily »…)"},"verbose":{"default":true,"type":"boolean"},"use24HourTimeFormat":{"default":true,"type":"boolean"},"dayOfWeekStartIndexZero":{"default":true,"type":"boolean"}},"required":["expression"]},"example":{"expression":"30 14 * * 1-5"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"description":{"type":"string"}},"required":["description"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/json-prettify/format":{"post":{"operationId":"json-prettify.format","tags":["Mise en forme JSON"],"summary":"Mettre en forme un JSON (syntaxe JSON5 acceptée)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string","minLength":1,"maxLength":1000000},"sortKeys":{"default":true,"type":"boolean"},"indentSize":{"default":3,"type":"integer","minimum":0,"maximum":10}},"required":["json"]},"example":{"json":"{\"hello\": \"world\", \"foo\": [1, 2]}","indentSize":2}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"json":{"type":"string"}},"required":["json"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/json-minify/minify":{"post":{"operationId":"json-minify.minify","tags":["Minification JSON"],"summary":"Minifier un JSON (syntaxe JSON5 acceptée)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string","minLength":1,"maxLength":1000000}},"required":["json"]},"example":{"json":"{\n  \"hello\": [\n    \"world\"\n  ]\n}"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"json":{"type":"string"}},"required":["json"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/json-to-csv/convert":{"post":{"operationId":"json-to-csv.convert","tags":["JSON vers CSV"],"summary":"Convertir un tableau JSON d'objets en CSV","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"json":{"type":"string","minLength":1,"maxLength":1000000,"description":"Tableau JSON (ou JSON5) d'objets"}},"required":["json"]},"example":{"json":"[{\"nom\": \"Ada\", \"age\": 36}, {\"nom\": \"Alan\", \"ville\": \"Londres\"}]"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"csv":{"type":"string"}},"required":["csv"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/sql-prettify/format":{"post":{"operationId":"sql-prettify.format","tags":["Mise en forme SQL"],"summary":"Mettre en forme une requête SQL","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sql":{"type":"string","minLength":1,"maxLength":100000},"language":{"default":"sql","type":"string","enum":["sql","bigquery","clickhouse","db2","db2i","duckdb","hive","mariadb","mysql","n1ql","plsql","postgresql","redshift","singlestoredb","snowflake","spark","sqlite","tidb","trino","tsql"]},"keywordCase":{"default":"upper","type":"string","enum":["upper","lower","preserve"]},"indentStyle":{"default":"standard","type":"string","enum":["standard","tabularLeft","tabularRight"]},"tabWidth":{"default":2,"type":"integer","minimum":1,"maximum":8},"useTabs":{"default":false,"type":"boolean"}},"required":["sql"]},"example":{"sql":"select id, nom from clients where ville = 'Saint-Denis' order by nom;","language":"postgresql"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"sql":{"type":"string"}},"required":["sql"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/chmod-calculator/compute":{"post":{"operationId":"chmod-calculator.compute","tags":["Calculateur chmod"],"summary":"Calculer les représentations octale et symbolique de droits Unix","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"permissions":{"type":"object","properties":{"owner":{"default":{},"type":"object","properties":{"read":{"default":false,"type":"boolean"},"write":{"default":false,"type":"boolean"},"execute":{"default":false,"type":"boolean"}}},"group":{"default":{},"type":"object","properties":{"read":{"default":false,"type":"boolean"},"write":{"default":false,"type":"boolean"},"execute":{"default":false,"type":"boolean"}}},"public":{"default":{},"type":"object","properties":{"read":{"default":false,"type":"boolean"},"write":{"default":false,"type":"boolean"},"execute":{"default":false,"type":"boolean"}}}}}},"required":["permissions"]},"example":{"permissions":{"owner":{"read":true,"write":true,"execute":true},"group":{"read":true,"execute":true},"public":{"read":true,"execute":true}}}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"octal":{"type":"string"},"symbolic":{"type":"string"},"command":{"type":"string"}},"required":["octal","symbolic","command"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/chmod-calculator/parse":{"post":{"operationId":"chmod-calculator.parse","tags":["Calculateur chmod"],"summary":"Détailler les droits Unix d'une représentation octale","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"octal":{"type":"string","pattern":"^[0-7]{3}$"}},"required":["octal"]},"example":{"octal":"640"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"octal":{"type":"string"},"symbolic":{"type":"string"},"command":{"type":"string"},"permissions":{"type":"object","properties":{"owner":{"type":"object","properties":{"read":{"default":false,"type":"boolean"},"write":{"default":false,"type":"boolean"},"execute":{"default":false,"type":"boolean"}},"required":["read","write","execute"],"additionalProperties":false},"group":{"type":"object","properties":{"read":{"default":false,"type":"boolean"},"write":{"default":false,"type":"boolean"},"execute":{"default":false,"type":"boolean"}},"required":["read","write","execute"],"additionalProperties":false},"public":{"type":"object","properties":{"read":{"default":false,"type":"boolean"},"write":{"default":false,"type":"boolean"},"execute":{"default":false,"type":"boolean"}},"required":["read","write","execute"],"additionalProperties":false}},"required":["owner","group","public"],"additionalProperties":false}},"required":["octal","symbolic","command","permissions"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/docker-run-to-docker-compose-converter/convert":{"post":{"operationId":"docker-run-to-docker-compose-converter.convert","tags":["docker run vers Docker Compose"],"summary":"Convertir une commande « docker run » en docker-compose.yml","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"command":{"type":"string","maxLength":10000}},"required":["command"]},"example":{"command":"docker run -d -p 80:80 --restart always --name web nginx:alpine"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"yaml":{"type":"string"},"notTranslatable":{"type":"array","items":{"type":"string"}},"notImplemented":{"type":"array","items":{"type":"string"}},"errors":{"type":"array","items":{"type":"string"}}},"required":["yaml","notTranslatable","notImplemented","errors"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/xml-formatter/format":{"post":{"operationId":"xml-formatter.format","tags":["Mise en forme XML"],"summary":"Mettre en forme un document XML","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"xml":{"type":"string","minLength":1,"maxLength":1000000},"indentSize":{"default":2,"type":"integer","minimum":0,"maximum":10},"collapseContent":{"default":true,"type":"boolean"}},"required":["xml"]},"example":{"xml":"<hello><world>foo</world><world>bar</world></hello>"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"xml":{"type":"string"}},"required":["xml"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/xml-formatter/validate":{"post":{"operationId":"xml-formatter.validate","tags":["Mise en forme XML"],"summary":"Vérifier qu'un document XML est bien formé","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"xml":{"type":"string","minLength":1,"maxLength":1000000}},"required":["xml"]},"example":{"xml":"<hello><world>foo</world></hello>"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"}},"required":["valid"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/yaml-prettify/format":{"post":{"operationId":"yaml-prettify.format","tags":["Mise en forme YAML"],"summary":"Mettre en forme un document YAML","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"yaml":{"type":"string","minLength":1,"maxLength":1000000},"sortKeys":{"default":false,"type":"boolean"},"indentSize":{"default":2,"type":"integer","minimum":1,"maximum":10}},"required":["yaml"]},"example":{"yaml":"services:\n      web:\n           image: nginx\n           ports: ['80:80']\n"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"yaml":{"type":"string"}},"required":["yaml"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/email-normalizer/normalize":{"post":{"operationId":"email-normalizer.normalize","tags":["Normalisation d'adresses e-mail"],"summary":"Normaliser des adresses e-mail (casse, points, sous-adresses, alias de domaine)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"emails":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"string","maxLength":320}}},"required":["emails"]},"example":{"emails":["Jean.Dupont+factures@GoogleMail.com","pas-une-adresse"]}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"valid":{"type":"boolean"},"normalized":{"type":["string","null"]}},"required":["input","valid","normalized"],"additionalProperties":false}}},"required":["results"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/regex-tester/test":{"post":{"operationId":"regex-tester.test","tags":["Testeur d'expressions régulières"],"summary":"Tester une expression régulière sur un texte","description":"Expression limitée à 500 caractères, texte à 100 000 caractères et nombre de correspondances à `maxMatches`. Une expression mal construite peut provoquer un retour arrière catastrophique (ReDoS) : l'exécution est interrompue au-delà de 1000 ms et l'opération échoue.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pattern":{"type":"string","minLength":1,"maxLength":500,"description":"Expression régulière, sans les barres obliques"},"text":{"type":"string","maxLength":100000},"flags":{"default":{},"type":"object","properties":{"global":{"default":true,"type":"boolean"},"ignoreCase":{"default":false,"type":"boolean"},"multiline":{"default":false,"type":"boolean"},"dotAll":{"default":true,"type":"boolean"},"unicode":{"default":true,"type":"boolean"},"unicodeSets":{"default":false,"type":"boolean"}}},"maxMatches":{"default":100,"type":"integer","minimum":1,"maximum":1000}},"required":["pattern","text"]},"example":{"pattern":"(?<user>[\\w.]+)@(?<domain>[\\w.-]+)","text":"contact@outremer.re, support@exemple.fr"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"flags":{"type":"string"},"matchCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"truncated":{"type":"boolean"},"matches":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"value":{"type":"string"},"captures":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"},"start":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"end":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["name","value","start","end"],"additionalProperties":false}},"groups":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"},"start":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"end":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["name","value","start","end"],"additionalProperties":false}}},"required":["index","value","captures","groups"],"additionalProperties":false}}},"required":["flags","matchCount","truncated","matches"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/regex-tester/validate":{"post":{"operationId":"regex-tester.validate","tags":["Testeur d'expressions régulières"],"summary":"Vérifier la syntaxe d'une expression régulière","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pattern":{"type":"string","minLength":1,"maxLength":500,"description":"Expression régulière, sans les barres obliques"},"flags":{"default":{},"type":"object","properties":{"global":{"default":true,"type":"boolean"},"ignoreCase":{"default":false,"type":"boolean"},"multiline":{"default":false,"type":"boolean"},"dotAll":{"default":true,"type":"boolean"},"unicode":{"default":true,"type":"boolean"},"unicodeSets":{"default":false,"type":"boolean"}}}},"required":["pattern"]},"example":{"pattern":"^\\d{5}$"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"flags":{"type":"string"},"error":{"type":["string","null"]}},"required":["valid","flags","error"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/ipv4-subnet-calculator/calculate":{"post":{"operationId":"ipv4-subnet-calculator.calculate","tags":["Calculateur de sous-réseau IPv4"],"summary":"Calculer les caractéristiques d'un sous-réseau IPv4","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","minLength":1,"maxLength":64,"description":"Adresse avec masque, ex. « 192.168.0.1/24 » ou « 10.0.0.0 255.0.0.0 »"}},"required":["address"]},"example":{"address":"192.168.0.1/24"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"block":{"type":"string"},"base":{"type":"string"},"mask":{"type":"string"},"binaryMask":{"type":"string"},"cidr":{"type":"string"},"wildcard":{"type":"string"},"size":{"type":"number"},"first":{"type":"string"},"last":{"type":"string"},"broadcast":{"type":["string","null"]},"ipClass":{"anyOf":[{"type":"string","enum":["A","B","C","D","E"]},{"type":"null"}]},"previousBlock":{"type":["string","null"]},"nextBlock":{"type":["string","null"]}},"required":["block","base","mask","binaryMask","cidr","wildcard","size","first","last","broadcast","ipClass","previousBlock","nextBlock"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/ipv4-address-converter/convert":{"post":{"operationId":"ipv4-address-converter.convert","tags":["Conversion d'adresse IPv4"],"summary":"Convertir une adresse IPv4 en décimal, hexadécimal, binaire et IPv6","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ip":{"type":"string","minLength":1,"maxLength":15,"description":"Adresse IPv4, ex. « 192.168.1.1 »"}},"required":["ip"]},"example":{"ip":"192.168.1.1"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"decimal":{"type":"string"},"hexadecimal":{"type":"string"},"binary":{"type":"string"},"ipv6":{"type":"string"},"ipv6Short":{"type":"string"}},"required":["decimal","hexadecimal","binary","ipv6","ipv6Short"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/ipv4-range-expander/calculate":{"post":{"operationId":"ipv4-range-expander.calculate","tags":["Plage d'adresses IPv4"],"summary":"Calculer le plus petit bloc CIDR couvrant une plage d'adresses IPv4","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"startIp":{"type":"string","minLength":1,"maxLength":15,"description":"Première adresse de la plage"},"endIp":{"type":"string","minLength":1,"maxLength":15,"description":"Dernière adresse de la plage"}},"required":["startIp","endIp"]},"example":{"startIp":"192.168.1.1","endIp":"192.168.6.255"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"oldSize":{"type":"number"},"newStart":{"type":"string"},"newEnd":{"type":"string"},"newCidr":{"type":"string"},"newSize":{"type":"number"}},"required":["oldSize","newStart","newEnd","newCidr","newSize"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/mac-address-lookup/lookup":{"post":{"operationId":"mac-address-lookup.lookup","tags":["Recherche d'adresse MAC"],"summary":"Trouver le fabricant d'une adresse MAC (base OUI de l'IEEE)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"address":{"type":"string","maxLength":17,"description":"Adresse MAC, ex. « 20:37:06:12:34:56 »"}},"required":["address"]},"example":{"address":"20:37:06:12:34:56"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"prefix":{"type":"string"},"vendor":{"type":["string","null"]}},"required":["prefix","vendor"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/mac-address-generator/generate":{"post":{"operationId":"mac-address-generator.generate","tags":["Générateur d'adresses MAC"],"summary":"Générer des adresses MAC aléatoires","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"default":1,"type":"integer","minimum":1,"maximum":100},"prefix":{"default":"","description":"Préfixe imposé, ex. « 64:16:7F »","type":"string","maxLength":17},"separator":{"default":":","type":"string","enum":[":","-",".",""]},"uppercase":{"default":true,"type":"boolean"}}},"example":{"count":3,"prefix":"64:16:7F"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"addresses":{"type":"array","items":{"type":"string"}}},"required":["addresses"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/ipv6-ula-generator/generate":{"post":{"operationId":"ipv6-ula-generator.generate","tags":["Générateur IPv6 ULA"],"summary":"Générer un préfixe IPv6 ULA (RFC 4193) à partir d'une adresse MAC","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"macAddress":{"type":"string","maxLength":17,"description":"Adresse MAC de l'interface, ex. « 20:37:06:12:34:56 »"},"timestamp":{"description":"Horodatage en millisecondes (par défaut : maintenant)","type":"integer","minimum":0,"maximum":8640000000000000}},"required":["macAddress"]},"example":{"macAddress":"20:37:06:12:34:56"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"ula":{"type":"string"},"firstBlock":{"type":"string"},"lastBlock":{"type":"string"}},"required":["ula","firstBlock","lastBlock"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/raid-calculator/calculate":{"post":{"operationId":"raid-calculator.calculate","tags":["Calculateur RAID"],"summary":"Calculer la capacité utilisable de chaque niveau de RAID (ou d'un seul)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"drives":{"minItems":1,"maxItems":64,"type":"array","items":{"type":"number","exclusiveMinimum":0,"maximum":1000000},"description":"Tailles des disques en Go (1 To = 1 000 Go)"},"level":{"description":"Limiter le calcul à un niveau","type":"string","enum":["shr","shr2","jbod","raid0","raid1","raid5","raid6","raid10"]}},"required":["drives"]},"example":{"drives":[24000,24000,24000]}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"raw":{"type":"number"},"results":{"type":"array","items":{"type":"object","properties":{"level":{"type":"string","enum":["shr","shr2","jbod","raid0","raid1","raid5","raid6","raid10"]},"available":{"type":"boolean"},"reason":{"anyOf":[{"type":"string","enum":["min-drives","even-drives"]},{"type":"null"}]},"minDrives":{"type":"number"},"usable":{"type":"number"},"redundancy":{"type":"number"},"wasted":{"type":"number"},"faultTolerance":{"type":"number"}},"required":["level","available","reason","minDrives","usable","redundancy","wasted","faultTolerance"],"additionalProperties":false}}},"required":["raw","results"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/math-evaluator/evaluate":{"post":{"operationId":"math-evaluator.evaluate","tags":["Calculatrice d'expressions"],"summary":"Évaluer une expression mathématique (mathjs)","description":"Fonctions, unités, matrices (deux dimensions au plus). Une expression par ligne. Affectations, définitions de fonction, plages « a:b » et fonctions coûteuses (ones, zeros, range, combinations, simplify, derivative…) sont refusées.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"expression":{"type":"string","minLength":1,"maxLength":1000,"description":"Ex. « sqrt(16) + 12 cm to inch »"}},"required":["expression"]},"example":{"expression":"sqrt(16) * 2\n12 cm to inch"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"result":{"type":"string"}},"required":["result"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/eta-calculator/calculate":{"post":{"operationId":"eta-calculator.calculate","tags":["Estimation de fin (ETA)"],"summary":"Estimer la durée et l'heure de fin d'une tâche","description":"Durée pour traiter `unitCount` éléments au rythme de `unitPerTimeSpan` éléments par `timeSpan` `timeUnit`, à partir de `startedAt` (maintenant par défaut).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"unitCount":{"type":"number","exclusiveMinimum":0,"maximum":1000000000000000},"unitPerTimeSpan":{"type":"number","exclusiveMinimum":0,"maximum":1000000000000000},"timeSpan":{"type":"number","exclusiveMinimum":0,"maximum":1000000000000000},"timeUnit":{"default":"min","type":"string","enum":["ms","s","min","h","d"]},"startedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["unitCount","unitPerTimeSpan","timeSpan"]},"example":{"unitCount":186,"unitPerTimeSpan":3,"timeSpan":5,"timeUnit":"min"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"durationMs":{"type":"number"},"duration":{"type":"string"},"startedAt":{"type":"string"},"endAt":{"type":["string","null"]}},"required":["durationMs","duration","startedAt","endAt"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/percentage-calculator/percentage-of":{"post":{"operationId":"percentage-calculator.percentage-of","tags":["Calculateur de pourcentages"],"summary":"Calculer X % de Y","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"percent":{"type":"number"},"value":{"type":"number"}},"required":["percent","value"]},"example":{"percent":20,"value":150}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"result":{"type":"number"}},"required":["result"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/percentage-calculator/what-percent":{"post":{"operationId":"percentage-calculator.what-percent","tags":["Calculateur de pourcentages"],"summary":"Calculer quel pourcentage X représente de Y","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"part":{"type":"number"},"total":{"type":"number"}},"required":["part","total"]},"example":{"part":30,"total":120}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"result":{"type":"number"}},"required":["result"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/percentage-calculator/change":{"post":{"operationId":"percentage-calculator.change","tags":["Calculateur de pourcentages"],"summary":"Calculer l'évolution en pourcentage entre deux valeurs","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"number"},"to":{"type":"number"}},"required":["from","to"]},"example":{"from":80,"to":100}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"result":{"type":"number"}},"required":["result"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/temperature-converter/convert":{"post":{"operationId":"temperature-converter.convert","tags":["Conversion de températures"],"summary":"Convertir une température vers toutes les échelles","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"from":{"type":"string","enum":["kelvin","celsius","fahrenheit","rankine","delisle","newton","reaumur","romer"],"description":"Échelle de la valeur fournie"},"value":{"type":"number","minimum":-1000000000000,"maximum":1000000000000}},"required":["from","value"]},"example":{"from":"celsius","value":100}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"kelvin":{"type":"number"},"celsius":{"type":"number"},"fahrenheit":{"type":"number"},"rankine":{"type":"number"},"delisle":{"type":"number"},"newton":{"type":"number"},"reaumur":{"type":"number"},"romer":{"type":"number"}},"required":["kelvin","celsius","fahrenheit","rankine","delisle","newton","reaumur","romer"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/benchmark-builder/compute":{"post":{"operationId":"benchmark-builder.compute","tags":["Comparateur de mesures"],"summary":"Classer des séries de mesures par moyenne (taille, moyenne, variance)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"suites":{"minItems":1,"maxItems":50,"type":"array","items":{"type":"object","properties":{"title":{"type":"string","maxLength":100},"measures":{"maxItems":1000,"type":"array","items":{"type":"number","minimum":-1000000000000,"maximum":1000000000000}}},"required":["title","measures"]}},"unit":{"default":"","type":"string","maxLength":20}},"required":["suites"]},"example":{"suites":[{"title":"Version A","measures":[12,14,13,15]},{"title":"Version B","measures":[9,10,11]}],"unit":"ms"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"position":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"title":{"type":"string"},"size":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"mean":{"type":"string"},"variance":{"type":"string"}},"required":["position","title","size","mean","variance"],"additionalProperties":false}},"markdown":{"type":"string"},"bulletList":{"type":"string"}},"required":["results","markdown","bulletList"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/lorem-ipsum-generator/generate":{"post":{"operationId":"lorem-ipsum-generator.generate","tags":["Générateur de lorem ipsum"],"summary":"Générer un faux texte « lorem ipsum »","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"paragraphs":{"default":1,"type":"integer","minimum":1,"maximum":20},"minSentences":{"default":3,"description":"Phrases par paragraphe (minimum)","type":"integer","minimum":1,"maximum":50},"maxSentences":{"default":8,"description":"Phrases par paragraphe (maximum)","type":"integer","minimum":1,"maximum":50},"minWords":{"default":8,"description":"Mots par phrase (minimum)","type":"integer","minimum":1,"maximum":50},"maxWords":{"default":15,"description":"Mots par phrase (maximum)","type":"integer","minimum":1,"maximum":50},"startWithLoremIpsum":{"default":true,"type":"boolean"},"asHtml":{"default":false,"description":"Paragraphes entourés de <p>","type":"boolean"}}},"example":{"paragraphs":2,"minSentences":2,"maxSentences":4}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/text-statistics/analyze":{"post":{"operationId":"text-statistics.analyze","tags":["Statistiques d'un texte"],"summary":"Compter les caractères, mots, lignes et octets d'un texte","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":100000}},"required":["text"]},"example":{"text":"Bonjour Outremer !\nDeuxième ligne."}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"characters":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"words":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"lines":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"size":{"type":"string","description":"Taille lisible, ex. « 1,5 Ko »"}},"required":["characters","words","lines","bytes","size"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/emoji-picker/search":{"post":{"operationId":"emoji-picker.search","tags":["Sélecteur d'emoji"],"summary":"Rechercher des emojis par nom, groupe ou point de code","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":100,"description":"Mots recherchés (en anglais), ex. « smile »"},"limit":{"default":20,"type":"integer","minimum":1,"maximum":100}},"required":["query"]},"example":{"query":"heart","limit":5}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"emojis":{"type":"array","items":{"type":"object","properties":{"emoji":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"group":{"type":"string"},"codePoints":{"type":"string"},"unicode":{"type":"string"}},"required":["emoji","name","slug","group","codePoints","unicode"],"additionalProperties":false}}},"required":["total","emojis"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/string-obfuscator/obfuscate":{"post":{"operationId":"string-obfuscator.obfuscate","tags":["Masquage de chaîne"],"summary":"Masquer une chaîne en gardant ses premiers et derniers caractères","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","maxLength":100000},"keepFirst":{"default":4,"type":"integer","minimum":0,"maximum":100000},"keepLast":{"default":4,"type":"integer","minimum":0,"maximum":100000},"keepSpace":{"default":true,"description":"Laisser les espaces visibles","type":"boolean"},"replacementChar":{"default":"*","type":"string","minLength":1,"maxLength":8}},"required":["text"]},"example":{"text":"4970 1234 5678 9012","keepFirst":4,"keepLast":4}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/text-diff/compare":{"post":{"operationId":"text-diff.compare","tags":["Comparaison de textes"],"summary":"Comparer deux textes (différences structurées et patch unifié)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"original":{"type":"string","maxLength":100000},"modified":{"type":"string","maxLength":100000},"granularity":{"default":"lines","type":"string","enum":["lines","words","chars"]},"ignoreCase":{"default":false,"type":"boolean"},"ignoreWhitespace":{"default":false,"type":"boolean"}},"required":["original","modified"]},"example":{"original":"Bonjour\nle monde\nfin","modified":"Bonjour\nOutremer\nfin"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"identical":{"type":"boolean"},"stats":{"type":"object","properties":{"added":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"removed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["added","removed"],"additionalProperties":false},"changes":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["equal","added","removed"]},"value":{"type":"string"},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["type","value","count"],"additionalProperties":false}},"patch":{"type":"string","description":"Diff unifié ligne à ligne (sans les options d'ignorance)"}},"required":["identical","stats","changes","patch"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/numeronym-generator/generate":{"post":{"operationId":"numeronym-generator.generate","tags":["Générateur de numéronymes"],"summary":"Générer le numéronyme d'un mot (ex. « i18n »)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"word":{"type":"string","minLength":1,"maxLength":1000}},"required":["word"]},"example":{"word":"internationalization"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"numeronym":{"type":"string"}},"required":["numeronym"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/ascii-text-drawer/render":{"post":{"operationId":"ascii-text-drawer.render","tags":["Texte en art ASCII"],"summary":"Dessiner un texte en art ASCII (polices FIGlet)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":1,"maxLength":1000},"font":{"default":"Standard","type":"string","enum":["1Row","3-D","3D Diagonal","3D-ASCII","3x5","4Max","5 Line Oblique","Acrobatic","Alligator","Alligator2","Alpha","Alphabet","AMC 3 Line","AMC 3 Liv1","AMC AAA01","AMC Neko","AMC Razor","AMC Razor2","AMC Slash","AMC Slider","AMC Thin","AMC Tubes","AMC Untitled","ANSI Compact","ANSI Regular","ANSI Shadow","ANSI-Compact","Arrows","ASCII 12","ASCII 9","ASCII New Roman","Avatar","B1FF","Babyface Lame","Babyface Leet","babyface-lame","babyface-leet","Banner","Banner3","Banner3-D","Banner4","Barbwire","Basic","Bear","Bell","Benjamin","Big","Big ASCII 12","Big ASCII 9","Big Chief","Big Money-ne","Big Money-nw","Big Money-se","Big Money-sw","Big Mono 12","Big Mono 9","Bigfig","Binary","Block","Blocks","Bloody","BlurVision ASCII","Bolger","Braced","Bright","Broadway","Broadway KB","Bubble","Bulbhead","Caligraphy","Caligraphy2","Calvin S","Cards","Catwalk","Chiseled","Chunky","Circle","Classy","Coder Mini","Coinstak","Cola","Colossal","Computer","Contessa","Contrast","Cosmike","Cosmike2","Crawford","Crawford2","Crazy","Cricket","Cursive","Cyberlarge","Cybermedium","Cybersmall","Cygnet","DANC4","Dancing Font","Decimal","Def Leppard","Delta Corps Priest 1","DiamFont","Diamond","Diet Cola","Digital","Doh","Doom","DOS Rebel","Dot Matrix","Double","Double Shorts","Dr Pepper","DWhistled","Efti Chess","Efti Font","Efti Italic","Efti Piti","Efti Robot","Efti Wall","Efti Water","Electronic","Elite","Emboss","Emboss 2","Epic","Fender","Filter","Fire Font-k","Fire Font-s","Flipped","Flower Power","Font Font","Four Tops","Fraktur","Fun Face","Fun Faces","Future","Future Smooth","Future Thin","Fuzzy","Georgi16","Georgia11","Ghost","Ghoulish","Glenyn","Goofy","Gothic","Graceful","Gradient","Graffiti","Greek","Heart Left","Heart Right","Henry 3D","Hex","Hieroglyphs","Hollywood","Horizontal Left","Horizontal Right","ICL-1900","Impossible","Invita","Isometric1","Isometric2","Isometric3","Isometric4","Italic","Ivrit","Jacky","Jazmine","Jerusalem","JS Block Letters","JS Bracket Letters","JS Capital Curves","JS Cursive","JS Stick Letters","Katakana","Kban","Keyboard","Knob","Konto","Konto Slant","Larry 3D","Larry 3D 2","LCD","Lean","Letter","Letters","Lil Devil","Line Blocks","Linguaholic Mini Block","Linguaholic Neon","Linguaholic Rounded","Linguaholic Shadow 3D","Linux","Lockergnome","Madrid","Marquee","Maxfour","Merlin1","Merlin2","Mike","Mini","miniwi","Mirror","Mnemonic","Modular","Mono 12","Mono 9","Morse","Morse2","Moscow","Mshebrew210","Muzzle","Nancyj","Nancyj-Fancy","Nancyj-Improved","Nancyj-Underlined","Nipples","NScript","NT Greek","NV Script","O8","Octal","Ogre","Old Banner","OS2","Pagga","Patorjk's Cheese","Patorjk-HeX","Pawp","Peaks","Peaks Slant","Pebbles","Pepper","Poison","Puffy","Puzzle","Pyramid","Rammstein","Rebel","Rectangles","Red Phoenix","Relief","Relief2","Reverse","Roman","Rot13","Rotated","Rounded","Rowan Cap","Rozzo","RubiFont","Runic","Runyc","S Blood","Santa Clara","Script","Serifcap","Shaded Blocky","Shadow","Shimrod","Short","SL Script","Slant","Slant Relief","Slide","Small","Small ASCII 12","Small ASCII 9","Small Block","Small Braille","Small Caps","Small Isometric1","Small Keyboard","Small Mono 12","Small Mono 9","Small Poison","Small Script","Small Shadow","Small Slant","Small Tengwar","Soft","Speed","Spliff","Stacey","Stampate","Stampatello","Standard","Star Strips","Star Wars","Stellar","Stforek","Stick Letters","Stop","Straight","Stronger Than All","Sub-Zero","Swamp Land","Swan","Sweet","Tanja","Tengwar","Term","Terrace","Test1","The Edge","Thick","Thin","THIS","Thorned","Three Point","Ticks","Ticks Slant","Tiles","Tinker-Toy","tmplr","Tombstone","Train","Trek","Tsalagi","Tubular","Twisted","Two Point","Univers","Upside Down Text","USA Flag","Varsity","Wavescape","Wavy","Weird","Wet Letter","Whimsy","WideTerm","Wow"]},"width":{"default":80,"description":"Largeur maximale (0 : illimitée)","type":"integer","minimum":0,"maximum":1000}},"required":["text"]},"example":{"text":"Outremer","font":"Standard","width":80}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"art":{"type":"string"}},"required":["art"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/phone-parser-and-formatter/parse":{"post":{"operationId":"phone-parser-and-formatter.parse","tags":["Analyse de numéro de téléphone"],"summary":"Analyser et formater un numéro de téléphone","description":"Le pays par défaut (code ISO 3166-1 alpha-2) sert aux numéros sans indicatif international.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string","minLength":1,"maxLength":64},"defaultCountry":{"default":"FR","type":"string","minLength":2,"maxLength":2}},"required":["phone"]},"example":{"phone":"0696 12 34 56","defaultCountry":"MQ"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"country":{"type":["string","null"]},"countryName":{"type":["string","null"]},"callingCode":{"type":"string"},"isValid":{"type":"boolean"},"isPossible":{"type":"boolean"},"type":{"type":["string","null"]},"international":{"type":"string"},"national":{"type":"string"},"e164":{"type":"string"},"rfc3966":{"type":"string"}},"required":["country","countryName","callingCode","isValid","isPossible","type","international","national","e164","rfc3966"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/tools/iban-validator-and-parser/validate":{"post":{"operationId":"iban-validator-and-parser.validate","tags":["Validation d'IBAN"],"summary":"Valider et analyser un IBAN","description":"Espaces et tirets ignorés. Rend la validité, les erreurs, le pays et le BBAN.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"iban":{"type":"string","minLength":1,"maxLength":64}},"required":["iban"]},"example":{"iban":"FR76 3000 6000 0112 3456 7890 189"}}}},"responses":{"200":{"description":"Succès","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object","properties":{"valid":{"type":"boolean"},"errors":{"type":"array","items":{"type":"string"}},"isQrIban":{"type":"boolean"},"countryCode":{"type":["string","null"]},"bban":{"type":["string","null"]},"friendlyFormat":{"type":"string"}},"required":["valid","errors","isQrIban","countryCode","bban","friendlyFormat"],"additionalProperties":false}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/dns-lookup":{"post":{"operationId":"scripts.dns-lookup","tags":["Scripts réseau"],"summary":"Interrogation DNS","description":"Enregistrements DNS d'un nom : A, AAAA, MX, TXT, NS, SOA, CAA, SRV…, avec leur TTL.\n\nSources : Cloudflare DNS (DoH), Google Public DNS (DoH) en secours.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"types":{"default":["A","AAAA","MX","TXT","NS","SOA","CAA"],"minItems":1,"maxItems":12,"type":"array","items":{"type":"string","enum":["A","AAAA","CNAME","MX","TXT","NS","SOA","CAA","SRV","PTR","DS","DNSKEY"]}}},"required":["domain"]},"example":{"domain":"outremer-solutions.fr"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/dns-propagation":{"post":{"operationId":"scripts.dns-propagation","tags":["Scripts réseau"],"summary":"Propagation DNS","description":"Compare la réponse de plusieurs résolveurs DNS publics (monde, Europe, Asie) pour un enregistrement et met en évidence les différences : utile pour suivre une modification DNS en cours de propagation.\n\nSources : Cloudflare DNS (DoH), Google Public DNS (DoH), RethinkDNS (DoH), AdGuard DNS (DoH), DNS.SB (DoH), AliDNS (DoH), DNSPod (DoH).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"type":{"default":"A","type":"string","enum":["A","AAAA","CNAME","MX","NS","SOA","TXT","CAA"]}},"required":["domain"]},"example":{"domain":"outremer-solutions.fr"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/whois":{"post":{"operationId":"scripts.whois","tags":["Scripts réseau"],"summary":"Whois / RDAP","description":"Informations d'enregistrement d'un domaine ou d'une adresse IP : registrar, dates, serveurs de noms, état, réseau propriétaire.\n\nSources : Registres RDAP officiels (annuaire IANA).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"}},"required":["query"]},"example":{"query":"outremer-solutions.fr"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/email-security":{"post":{"operationId":"scripts.email-security","tags":["Scripts réseau"],"summary":"Sécurité e-mail d'un domaine","description":"Diagnostic de délivrabilité : MX, SPF (avec décompte des requêtes DNS), DMARC, DKIM (sélecteurs courants), MTA-STS, TLS-RPT et BIMI.\n\nSources : Cloudflare DNS (DoH), mta-sts.<domaine> (politique MTA-STS).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"dkimSelectors":{"default":[],"maxItems":10,"type":"array","items":{"type":"string","pattern":"^[a-z0-9._-]{1,63}$"}}},"required":["domain"]},"example":{"domain":"outremer-solutions.fr"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/tls-certificate":{"post":{"operationId":"scripts.tls-certificate","tags":["Scripts réseau"],"summary":"Certificat TLS","description":"Certificat présenté par un serveur : sujet, émetteur, noms couverts, dates et jours restants avant expiration.\n\nSources : Connexion TLS directe au serveur.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"host":{"type":"string"},"port":{"default":443,"type":"integer","minimum":1,"maximum":65535}},"required":["host"]},"example":{"host":"outremer-solutions.fr"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/connection-test":{"post":{"operationId":"scripts.connection-test","tags":["Scripts réseau"],"summary":"Test de connexion","description":"Vérifie qu'un service répond vraiment, comme le ferait un client : résolution DNS, connexion TCP, négociation TLS si nécessaire, puis dialogue du protocole (bannière SSH, EHLO SMTP, PING Redis…). Limites : TCP uniquement (pas d'UDP : NTP, SNMP, TFTP, DNS UDP, OpenVPN UDP), pas de MSSQL, MongoDB, Oracle ni OpenVPN ; les ports 25 et 587 sont souvent bloqués en sortie par l'hébergeur ; une seule adresse est testée, depuis nos serveurs (pas depuis chez vous) ; une réponse conforme prouve que le service écoute, pas qu'il fonctionne en entier (aucune authentification).\n\nSources : Connexion TCP/TLS directe au serveur testé, Cloudflare DNS (DoH) pour la résolution.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"host":{"type":"string"},"service":{"default":"https","type":"string","enum":["https","http","imaps","imap","pop3s","pop3","smtps","smtp-starttls","smtp","memcached","mysql","postgresql","redis","ftp","ftps","ssh","rdp","vnc","telnet","cpanel-https","cpanel-http","mqtt","dns-tcp","dns-over-tls","whois"]},"port":{"type":"integer","minimum":1,"maximum":65535}},"required":["host"]},"example":{"host":"outremer-solutions.fr","service":"https"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/http-headers":{"post":{"operationId":"scripts.http-headers","tags":["Scripts réseau"],"summary":"En-têtes HTTP et redirections","description":"Chaîne de redirections d'une adresse, en-têtes de la réponse finale et évaluation des en-têtes de sécurité (HSTS, CSP, X-Frame-Options…).\n\nSources : Requête HTTPS directe vers l'adresse.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","maxLength":2048}},"required":["url"]},"example":{"url":"https://outremer-solutions.fr"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/blacklist-check":{"post":{"operationId":"scripts.blacklist-check","tags":["Scripts réseau"],"summary":"Listes noires (DNSBL)","description":"Présence d'une adresse IP ou d'un domaine sur les principales listes noires de spam. Les listes Spamhaus refusent les résolveurs publics et ne sont pas interrogées.\n\nSources : Cloudflare DNS (DoH) vers chaque liste.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string"}},"required":["target"]},"example":{"target":"127.0.0.2"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/ip-geolocation":{"post":{"operationId":"scripts.ip-geolocation","tags":["Scripts réseau"],"summary":"Géolocalisation d'une adresse IP","description":"Pays, continent, système autonome (ASN) et opérateur d'une adresse IP publique.\n\nSources : IPinfo (clé Outremer « ipinfo_token »).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ip":{"type":"string"}},"required":["ip"]},"example":{"ip":"1.1.1.1"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/asn-lookup":{"post":{"operationId":"scripts.asn-lookup","tags":["Scripts réseau"],"summary":"Base de données ASN","description":"Recherche d'un système autonome par numéro (ASN), nom d'organisation, adresse IP, préfixe ou point d'échange (IX) : fiche du réseau, préfixes annoncés, voisins BGP et points d'échange.\n\nSources : RIPEstat (base RIPE NCC), PeeringDB.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":100}},"required":["query"]},"example":{"query":"AS15169"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}},"/api/v1/scripts/microsoft-tenant":{"post":{"operationId":"scripts.microsoft-tenant","tags":["Scripts réseau"],"summary":"Recherche de tenant Microsoft","description":"Identifiant (GUID) du tenant Microsoft Entra ID / Microsoft 365 d'un domaine, région, cloud, type de fédération et usage d'Exchange Online.\n\nSources : Microsoft Entra ID (découverte OpenID Connect), Microsoft Entra ID (type d'espace de noms), Cloudflare DNS (DoH) pour les MX.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"anyOf":[{"type":"string"},{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"}]}},"required":["query"]},"example":{"query":"microsoft.com"}}}},"responses":{"200":{"description":"Succès (structure propre à chaque script)","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"const":true},"data":{"type":"object"}}}}}},"400":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"401":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"422":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"429":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"502":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"503":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"504":{"description":"Échec","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["validation_failed","unauthorized","not_found","payload_too_large","operation_failed","rate_limited","quota_exceeded","target_forbidden","target_not_found","target_timeout","target_unreachable","response_too_large","provider_error","credential_missing","internal_error","service_unavailable"]},"message":{"type":"string"},"fields":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}}}}}}}