{"openapi":"3.0.3","info":{"title":"OCR Service","version":"1.0.0","description":"Lecture de texte (OCR) par Tesseract : lignes, mots, boîtes et confiance."},"paths":{"/v1/health":{"get":{"summary":"État du service","responses":{"200":{"description":"Prêt","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"version":{"type":"string"},"tesseract":{"type":"string"},"langues":{"type":"array","items":{"type":"string"}}}}}}},"503":{"description":"Tesseract absent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}},"/v1/limites":{"get":{"summary":"Limites de l'accès public et ce qu'il reste pour l'adresse appelante","description":"Sans clé. Avec une clé (Authorization: Bearer), `cle` dit si elle est valide.","responses":{"200":{"description":"Limites","content":{"application/json":{"schema":{"type":"object","properties":{"cleRequise":{"type":"boolean"},"cle":{"type":"string","enum":["inutile","absente","valide","invalide"]},"publicOuvert":{"type":"boolean"},"ouvert":{"type":"boolean","description":"Cet appelant peut-il lire ?"},"limites":{"type":"object","nullable":true,"properties":{"parHeure":{"type":"integer"},"parJour":{"type":"integer"},"maxMo":{"type":"number"},"zones":{"type":"integer"},"restantHeure":{"type":"integer"},"restantJour":{"type":"integer"},"reessayerDans":{"type":"integer"}}},"maxMo":{"type":"number"},"langues":{"type":"string"}}}}}}}}},"/v1/ocr":{"post":{"summary":"Lire le texte d'une image","description":"Image en corps brut (image/png, image/jpeg, image/webp) ou JSON { image: \"<base64>\", ...paramètres }. 15 Mo au plus. Sans clé d'API, l'accès public est limité : 20 lectures par heure et 60 par jour et par adresse IP, 5 Mo au plus, 8 zones au plus, une lecture publique à la fois. Une clé valide n'est jamais limitée.","security":[{},{"bearer":[]}],"parameters":[{"name":"langues","in":"query","required":false,"schema":{"type":"string","default":"fra+eng","description":"Langues Tesseract séparées par « + »."},"description":"Langues Tesseract séparées par « + »."},{"name":"psm","in":"query","required":false,"schema":{"description":"Mode de découpage Tesseract. « auto » essaie 11 (texte épars) et 6 (bloc uniforme) et garde la meilleure lecture.","default":"auto","oneOf":[{"type":"string","enum":["auto"]},{"type":"integer","enum":[3,4,6,7,8,11,12,13]}]},"description":"Mode de découpage Tesseract. « auto » essaie 11 (texte épars) et 6 (bloc uniforme) et garde la meilleure lecture."},{"name":"agrandir","in":"query","required":false,"schema":{"description":"Facteur d'agrandissement avant lecture (1 à 4). « auto » : agrandit ×2 à ×4 quand le texte est petit.","default":"auto","oneOf":[{"type":"string","enum":["auto"]},{"type":"number","minimum":1,"maximum":4}]},"description":"Facteur d'agrandissement avant lecture (1 à 4). « auto » : agrandit ×2 à ×4 quand le texte est petit."},{"name":"inverser","in":"query","required":false,"schema":{"description":"Inverser l'image (texte clair sur fond sombre). « auto » : détecte le fond.","default":"auto","oneOf":[{"type":"string","enum":["auto"]},{"type":"boolean"}]},"description":"Inverser l'image (texte clair sur fond sombre). « auto » : détecte le fond."},{"name":"zones","in":"query","required":false,"schema":{"type":"string"},"description":"Rectangles lus séparément. En query : JSON encodé."}],"requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}},"application/json":{"schema":{"type":"object","required":["image"],"properties":{"image":{"type":"string","format":"byte","description":"Image en base64 (le préfixe data: est toléré)."},"langues":{"type":"string","default":"fra+eng","description":"Langues Tesseract séparées par « + »."},"psm":{"description":"Mode de découpage Tesseract. « auto » essaie 11 (texte épars) et 6 (bloc uniforme) et garde la meilleure lecture.","default":"auto","oneOf":[{"type":"string","enum":["auto"]},{"type":"integer","enum":[3,4,6,7,8,11,12,13]}]},"agrandir":{"description":"Facteur d'agrandissement avant lecture (1 à 4). « auto » : agrandit ×2 à ×4 quand le texte est petit.","default":"auto","oneOf":[{"type":"string","enum":["auto"]},{"type":"number","minimum":1,"maximum":4}]},"inverser":{"description":"Inverser l'image (texte clair sur fond sombre). « auto » : détecte le fond.","default":"auto","oneOf":[{"type":"string","enum":["auto"]},{"type":"boolean"}]},"zones":{"type":"array","description":"Rectangles lus séparément. En query : JSON encodé.","items":{"allOf":[{"$ref":"#/components/schemas/Boite"},{"type":"object","properties":{"id":{"description":"Rendu tel quel dans la réponse (défaut : l'indice)."}}}]}}}}}}},"responses":{"200":{"description":"Texte lu","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resultat"}}}},"400":{"description":"Entrée invalide (ou trop de zones pour l'accès public)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"401":{"description":"Clé fausse","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"413":{"description":"Image trop grosse","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"429":{"description":"Limite de l'accès public atteinte. En-têtes Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining.","content":{"application/json":{"schema":{"type":"object","required":["erreur","reessayerDans"],"properties":{"erreur":{"type":"string"},"reessayerDans":{"type":"integer","description":"Secondes."}}}}}},"503":{"description":"File pleine ou Tesseract absent","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}},"504":{"description":"Lecture trop longue","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Erreur"}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}},"schemas":{"Boite":{"type":"object","required":["x","y","l","h"],"properties":{"x":{"type":"integer"},"y":{"type":"integer"},"l":{"type":"integer","description":"Largeur."},"h":{"type":"integer","description":"Hauteur."}},"description":"Rectangle en pixels de l'image d'origine (origine en haut à gauche)."},"Mot":{"type":"object","required":["texte","confiance","boite"],"properties":{"texte":{"type":"string"},"confiance":{"type":"number","minimum":0,"maximum":100},"boite":{"$ref":"#/components/schemas/Boite"}}},"Ligne":{"type":"object","required":["texte","confiance","boite","mots"],"properties":{"texte":{"type":"string"},"confiance":{"type":"number","minimum":0,"maximum":100,"description":"Moyenne des mots."},"boite":{"$ref":"#/components/schemas/Boite"},"mots":{"type":"array","items":{"$ref":"#/components/schemas/Mot"}}}},"Erreur":{"type":"object","required":["erreur"],"properties":{"erreur":{"type":"string"}}},"Zone":{"type":"object","required":["id","boite","texte","lignes"],"properties":{"id":{},"boite":{"$ref":"#/components/schemas/Boite"},"texte":{"type":"string"},"lignes":{"type":"array","items":{"$ref":"#/components/schemas/Ligne"}},"psm":{"type":"integer"},"agrandissement":{"type":"number"},"inverse":{"type":"boolean"}}},"Resultat":{"type":"object","required":["largeur","hauteur","dureeMs","texte","lignes"],"properties":{"largeur":{"type":"integer"},"hauteur":{"type":"integer"},"dureeMs":{"type":"integer"},"texte":{"type":"string","description":"Texte complet, un paragraphe séparé du suivant par une ligne vide."},"lignes":{"type":"array","items":{"$ref":"#/components/schemas/Ligne"}},"zones":{"type":"array","items":{"$ref":"#/components/schemas/Zone"},"description":"Présent seulement si des zones ont été demandées ; texte et lignes en sont alors la concaténation."},"psm":{"type":"integer"},"agrandissement":{"type":"number"},"inverse":{"type":"boolean"}}}}}}