{"openapi":"3.1.0","info":{"title":"Aero-task API","description":"\nAnalyse de documents de maintenance aéronautique (PDF ou image) et restitution structurée en JSON.\nDocumentation : /doc.\n\nAuthentification : en-tête `Authorization: Bearer <clé API>` (ou `X-API-Key: <clé API>`).\nEnvoi : `multipart/form-data`, champ `file`.\nErreurs : `{\"error\": {\"code\", \"message\", \"request_id\"}}`.\n","version":"1.0.0"},"servers":[{"url":"https://dev.aerotask.wingleet.tech"}],"paths":{"/v1/work-extraction":{"post":{"tags":["Extraction"],"summary":"Work Extraction — livret d'expérience / work order","description":"Extrait la liste des tâches de maintenance d'un livret d'expérience (Part-66 logbook) ou d'un work order : date, immatriculation, type avion, chapitre ATA, description, type d'opération (liste fermée) et durée en heures.","operationId":"work_extraction_v1_work_extraction_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DocumentUpload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkExtractionResponse"}}}},"401":{"description":"Clé API absente, invalide, révoquée ou expirée","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Compte désactivé, IP non autorisée ou endpoint non inclus dans la clé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Fichier trop volumineux ou trop de pages","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"Format non pris en charge (PDF, PNG, JPEG, WEBP, TIFF)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Document illisible, vide ou protégé par mot de passe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Limite de débit, de traitements simultanés ou quota mensuel atteint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Le document n'a pas pu être traité","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service temporairement indisponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/certification":{"post":{"tags":["Extraction"],"summary":"Certification — licence / attestation / diplôme","description":"Identifie le type de document (licence, attestation, unknown) et en extrait le titulaire, puis pour une licence le numéro, les catégories détenues, la fin de validité et l'autorité ; pour une attestation l'intitulé, la date, la validité en années si elle est écrite et l'organisme de formation.","operationId":"certification_v1_certification_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/DocumentUpload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CertificationResponse"}}}},"401":{"description":"Clé API absente, invalide, révoquée ou expirée","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Compte désactivé, IP non autorisée ou endpoint non inclus dans la clé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"Fichier trop volumineux ou trop de pages","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"Format non pris en charge (PDF, PNG, JPEG, WEBP, TIFF)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Document illisible, vide ou protégé par mot de passe","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Limite de débit, de traitements simultanés ou quota mensuel atteint","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Le document n'a pas pu être traité","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service temporairement indisponible","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/usage":{"get":{"tags":["Compte"],"summary":"Consommation du mois en cours","operationId":"usage_v1_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientUsageResponse"}}}},"401":{"description":"Clé API absente, invalide, révoquée ou expirée","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Compte désactivé, IP non autorisée ou endpoint non inclus dans la clé","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"AttestationInfo":{"properties":{"training_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Title","description":"Intitulé de la formation. null si absent."},"completion_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Completion Date","description":"Date de réalisation (date de fin si période), format jj/mm/aaaa. null si absente."},"validity_years":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Validity Years","description":"Durée de validité en années UNIQUEMENT si elle est écrite sur le document, sinon null."},"training_organisation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Training Organisation","description":"Organisme de formation. null si absent."}},"type":"object","required":["training_title","completion_date","validity_years","training_organisation"],"title":"AttestationInfo"},"DocumentUpload":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File","description":"Document à analyser : PDF ou image (PNG, JPEG, WEBP, TIFF)."}},"type":"object","required":["file"],"title":"DocumentUpload"},"CertificationResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"document":{"$ref":"#/components/schemas/DocumentInfo"},"document_type":{"type":"string","enum":["licence","attestation","unknown"],"title":"Document Type"},"holder_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Holder Name"},"licence":{"anyOf":[{"$ref":"#/components/schemas/LicenceInfo"},{"type":"null"}]},"attestation":{"anyOf":[{"$ref":"#/components/schemas/AttestationInfo"},{"type":"null"}]},"usage":{"$ref":"#/components/schemas/UsageInfo"}},"type":"object","required":["request_id","document","document_type","holder_name","licence","attestation","usage"],"title":"CertificationResponse"},"ClientUsageResponse":{"properties":{"period_start":{"type":"string","title":"Period Start","description":"Début du mois en cours (UTC, ISO 8601)."},"calls":{"type":"integer","title":"Calls"},"pages":{"type":"integer","title":"Pages"},"monthly_call_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Call Limit"},"monthly_page_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Page Limit"},"rate_limit_per_minute":{"type":"integer","title":"Rate Limit Per Minute"}},"type":"object","required":["period_start","calls","pages","monthly_call_limit","monthly_page_limit","rate_limit_per_minute"],"title":"ClientUsageResponse"},"DocumentInfo":{"properties":{"type":{"type":"string","enum":["pdf","png","jpeg","webp","tiff"],"title":"Type"},"pages":{"type":"integer","title":"Pages"}},"type":"object","required":["type","pages"],"title":"DocumentInfo"},"ErrorDetail":{"properties":{"code":{"type":"string","title":"Code","description":"Code stable, à utiliser dans votre code (ex. quota_exceeded)."},"message":{"type":"string","title":"Message","description":"Message lisible, susceptible d'évoluer."},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Identifiant de la requête, à communiquer au support."}},"type":"object","required":["code","message","request_id"],"title":"ErrorDetail"},"ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/ErrorDetail"}},"type":"object","required":["error"],"title":"ErrorResponse"},"LicenceInfo":{"properties":{"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","description":"Numéro de la licence tel qu'écrit. null si absent."},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","description":"Catégories effectivement détenues (A1, B1.1, B2, B2L, C…), sans les cases vides / n/a."},"expiry_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiry Date","description":"Date de fin de validité de la licence, format jj/mm/aaaa. null si absente."},"issuing_authority":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issuing Authority","description":"Autorité ayant délivré la licence (ex. DGAC France, UK CAA). null si absente."}},"type":"object","required":["number","categories","expiry_date","issuing_authority"],"title":"LicenceInfo"},"UsageInfo":{"properties":{"pages":{"type":"integer","title":"Pages","description":"Nombre de pages analysées, décomptées de votre quota."}},"type":"object","required":["pages"],"title":"UsageInfo"},"WorkExtractionResponse":{"properties":{"request_id":{"type":"string","title":"Request Id"},"document":{"$ref":"#/components/schemas/DocumentInfo"},"tasks":{"items":{"$ref":"#/components/schemas/WorkTask"},"type":"array","title":"Tasks"},"usage":{"$ref":"#/components/schemas/UsageInfo"}},"type":"object","required":["request_id","document","tasks","usage"],"title":"WorkExtractionResponse"},"WorkTask":{"properties":{"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date","description":"Date de réalisation de la tâche, format jj/mm/aaaa. null si absente ou illisible."},"aircraft_registration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aircraft Registration","description":"Immatriculation de l'avion (ex. F-HBNA). null si absente."},"aircraft_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Aircraft Type","description":"Type / modèle d'avion tel qu'écrit (ex. A320-214, ATR 72-600). null si absent."},"ata_chapter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ata Chapter","description":"Chapitre ATA sur 2 chiffres (ex. \"32\", \"05\"). null si inconnu."},"description":{"type":"string","title":"Description","description":"Description fidèle et concise de la tâche réalisée, dans la langue du document."},"operation_type":{"type":"string","enum":["inspection","removal_installation","troubleshooting","functional_test","servicing","repair","modification","mel_deferral","other"],"title":"Operation Type","description":"Type d'opération (liste fermée)."},"duration_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Hours","description":"Durée de la tâche en heures décimales (1h30 = 1.5). null si non écrite."},"source_page":{"type":"integer","title":"Source Page","description":"Numéro de la page du document où figure la tâche (1 = première page)."}},"type":"object","required":["date","aircraft_registration","aircraft_type","ata_chapter","description","operation_type","duration_hours","source_page"],"title":"WorkTask"}}}}