Aero-task API
L'API Aero-task lit vos documents de maintenance aéronautique — PDF ou image — et en renvoie le contenu structuré en JSON : les tâches d'un livret d'expérience ou d'un work order, et les informations clés d'une licence ou d'une attestation de formation.
https://dev.aerotask.wingleet.techDémarrage rapide
Envoyez un fichier avec votre clé API :
curl -X POST https://dev.aerotask.wingleet.tech/v1/work-extraction \ -H "Authorization: Bearer VOTRE_CLE_API" \ -F "file=@livret.pdf"
La réponse arrive quand le document est entièrement traité, en général en 10 à 40 secondes selon le nombre de pages.
Authentification
Chaque requête porte votre clé API dans l'en-tête Authorization :
Authorization: Bearer atk_…
L'en-tête X-API-Key: atk_… est accepté à l'identique.
Envoyer un document
Les deux endpoints d'analyse reçoivent le fichier en multipart/form-data, dans le champ file.
| Formats acceptés | PDF, PNG, JPEG, WEBP, TIFF (y compris TIFF multipage) |
|---|---|
| Taille maximale | 20 Mo par fichier |
| Pages maximales | 50 pages par document |
| Non acceptés | PDF protégés par mot de passe, fichiers vides ou corrompus |
Le type du fichier est déterminé par son contenu, pas par son extension. Pour de meilleurs résultats : scans à 200–300 dpi, pages droites et entières, photos nettes et bien éclairées.
Work Extraction
/v1/work-extractionPour un livret d'expérience (Part-66 logbook), un work order ou une carte de travail. Renvoie une entrée par tâche de maintenance réalisée, dans l'ordre du document.
Exemple en Python
import requests
with open("livret.pdf", "rb") as f:
r = requests.post(
"https://dev.aerotask.wingleet.tech/v1/work-extraction",
headers={"Authorization": "Bearer VOTRE_CLE_API"},
files={"file": ("livret.pdf", f, "application/pdf")},
timeout=180,
)
r.raise_for_status()
for task in r.json()["tasks"]:
print(task["date"], task["ata_chapter"], task["description"])
Réponse 200
{
"request_id": "req_2b64993f76a85c5617fc4eba",
"document": { "type": "pdf", "pages": 2 },
"tasks": [
{
"date": "05/03/2025",
"aircraft_registration": "F-HBXA",
"aircraft_type": "A320-214",
"ata_chapter": "32",
"description": "Remplacement roue principale gauche",
"operation_type": "removal_installation",
"duration_hours": 1.5,
"source_page": 1
}
],
"usage": { "pages": 2 }
}
Champs d'une tâche
| Champ | Type | Description |
|---|---|---|
date | chaîne ou null | Date de réalisation, format jj/mm/aaaa. Une date écrite une seule fois pour plusieurs lignes est recopiée sur chacune. |
aircraft_registration | chaîne ou null | Immatriculation, en majuscules (ex. F-HBXA). |
aircraft_type | chaîne ou null | Type ou modèle d'avion tel qu'écrit (ex. A320-214, ATR 72-600). |
ata_chapter | chaîne ou null | Chapitre ATA sur 2 chiffres (ex. "32", "05"). Déduit de la description seulement s'il n'y a aucune ambiguïté. |
description | chaîne | Description fidèle et concise de la tâche, dans la langue du document. |
operation_type | chaîne | Type d'opération, parmi la liste fermée. |
duration_hours | nombre ou null | Durée en heures décimales (1h30 → 1.5). Jamais estimée : null si elle n'est pas écrite. |
source_page | entier | Page du document où figure la tâche (1 = première page). |
Une information absente ou illisible vaut null : elle n'est jamais inventée. Un document sans tâche renvoie "tasks": [].
Types d'opération
Liste fermée, alignée sur les types d'activité du livret d'expérience Part-66.
| Valeur | Abréviation | Signification |
|---|---|---|
inspection | INSP | Inspection / visite / contrôle |
removal_installation | R/I | Dépose / pose / remplacement |
troubleshooting | TS | Dépannage / recherche de panne |
functional_test | FOT | Essai fonctionnel / opérationnel |
servicing | SGH | Entretien courant / servicing / avitaillement / lubrification |
repair | REP | Réparation |
modification | MOD | Modification / application de SB ou AD |
mel_deferral | MEL | Report MEL / CDL |
other | — | Autre |
Certification
/v1/certificationPour une licence de maintenance, une attestation de formation, un diplôme ou un certificat. Identifie le type de document et en extrait les informations clés.
Exemple
curl -X POST https://dev.aerotask.wingleet.tech/v1/certification \ -H "Authorization: Bearer VOTRE_CLE_API" \ -F "file=@licence.jpg"
Réponse 200 — licence
{
"request_id": "req_…",
"document": { "type": "jpeg", "pages": 1 },
"document_type": "licence",
"holder_name": "DUPONT Jean",
"licence": {
"number": "FR.66.12345",
"categories": ["B1.1", "B2"],
"expiry_date": "31/12/2028",
"issuing_authority": "DGAC France"
},
"attestation": null,
"usage": { "pages": 1 }
}
Réponse 200 — attestation
{
"request_id": "req_…",
"document": { "type": "pdf", "pages": 1 },
"document_type": "attestation",
"holder_name": "Marie Martin",
"licence": null,
"attestation": {
"training_title": "Facteurs Humains",
"completion_date": "14/02/2025",
"validity_years": 2,
"training_organisation": "Aero Formation"
},
"usage": { "pages": 1 }
}
Champs
| Champ | Type | Description |
|---|---|---|
document_type | chaîne | licence (licence de maintenance), attestation (attestation ou certificat de formation, diplôme) ou unknown (tout autre document, dont les pièces d'identité). |
holder_name | chaîne ou null | Nom complet du titulaire tel qu'écrit, y compris pour un document unknown. |
licence.number | chaîne ou null | Numéro de la licence. |
licence.categories | liste | Catégories détenues, au format normalisé : A1, A2, A3, A4, B1.1, B1.2, B1.3, B1.4, B2, B2L, B3, C, L1C, L1, L2C, L2, L3H, L3G, L4, L5. Les cases vides, barrées ou « n/a » sont exclues. |
licence.expiry_date | chaîne ou null | Date de fin de validité, jj/mm/aaaa. |
licence.issuing_authority | chaîne ou null | Autorité qui a délivré la licence (ex. DGAC France). |
attestation.training_title | chaîne ou null | Intitulé de la formation. |
attestation.completion_date | chaîne ou null | Date de réalisation (date de fin pour une période), jj/mm/aaaa. |
attestation.validity_years | nombre ou null | Durée de validité en années, uniquement si elle est écrite sur le document. |
attestation.training_organisation | chaîne ou null | Organisme de formation. |
licence n'est renseigné que si document_type vaut licence, attestation que s'il vaut attestation ; l'autre vaut null. Si le fichier contient plusieurs documents, le principal est décrit (la licence si elle est présente).
Consommation
/v1/usageConsommation du mois en cours (mois calendaire UTC) et limites de votre compte.
{
"period_start": "2026-09-01T00:00:00+00:00",
"calls": 128,
"pages": 642,
"monthly_call_limit": 5000,
"monthly_page_limit": 20000,
"rate_limit_per_minute": 30
}
Une limite à null signifie « sans limite ». Seules les analyses réussies sont décomptées.
Erreurs
Toutes les erreurs ont la même forme. Basez votre code sur code, qui est stable ; message peut évoluer.
{
"error": {
"code": "quota_exceeded",
"message": "Quota mensuel de pages atteint.",
"request_id": "req_5daf04cd04416947f37824da"
}
}
| HTTP | Code | Signification | Que faire |
|---|---|---|---|
| 401 | missing_api_key | Clé API absente | Ajouter l'en-tête Authorization |
| 401 | invalid_api_key | Clé inconnue ou mal copiée | Vérifier la clé |
| 401 | api_key_revoked | Clé révoquée | Demander une nouvelle clé |
| 401 | api_key_expired | Clé expirée | Demander une nouvelle clé |
| 403 | client_disabled | Compte désactivé | Contacter le support |
| 403 | ip_not_allowed | Adresse IP non autorisée pour cette clé | Appeler depuis une IP autorisée |
| 403 | insufficient_scope | Endpoint non inclus dans cette clé | Contacter le support |
| 413 | file_too_large | Fichier trop volumineux | Réduire ou compresser le fichier |
| 413 | payload_too_large | Requête trop volumineuse | Réduire ou compresser le fichier |
| 413 | too_many_pages | Trop de pages | Découper le document |
| 413 | image_too_large | Image trop grande (nombre de pixels) | Réduire la résolution |
| 415 | unsupported_file_type | Format non pris en charge | Envoyer un PDF ou une image |
| 422 | invalid_document | Fichier illisible ou corrompu | Vérifier le fichier |
| 422 | empty_file | Fichier vide | Vérifier le fichier |
| 422 | encrypted_document | PDF protégé par mot de passe | Envoyer une version non protégée |
| 422 | invalid_request | Champ file manquant ou requête mal formée | Corriger la requête |
| 429 | rate_limited | Trop de requêtes par minute | Attendre Retry-After puis réessayer |
| 429 | too_many_concurrent_requests | Trop de documents en cours de traitement | Attendre Retry-After puis réessayer |
| 429 | quota_exceeded | Quota mensuel atteint | Attendre le mois suivant ou contacter le support |
| 502 | extraction_failed | Le document n'a pas pu être traité | Réessayer ; contacter le support s'il persiste |
| 503 | service_unavailable | Service momentanément indisponible | Réessayer plus tard |
Chaque réponse porte l'en-tête X-Request-ID. Communiquez-le pour toute demande de support.
Limites et bonnes pratiques
- Débit : un nombre maximal de requêtes par minute et de documents traités simultanément est fixé pour votre compte (voir
GET /v1/usage). Au-delà :429avec un en-têteRetry-Afteren secondes. - Quotas mensuels : appels et pages. Une fois atteints :
429 quota_exceededjusqu'au 1er du mois suivant. - Délai : prévoyez un timeout client d'au moins 180 secondes ; un long livret peut demander plus d'une minute.
- Nouvelles tentatives : réessayez sur
429(aprèsRetry-After),502et503, avec un délai croissant. Ne réessayez pas les autres erreurs4xxsans corriger la requête. - Documents longs : un fichier par document ; découpez les liasses au-delà de 50 pages.
Spécification OpenAPI
La spécification complète au format OpenAPI 3 est disponible ici : /doc/openapi.json. Elle permet de générer un client dans la plupart des langages.