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.

URL de basehttps://dev.aerotask.wingleet.tech

Dé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.

Gardez la clé secrète. Utilisez-la uniquement côté serveur, jamais dans une application mobile ou une page web. En cas de fuite, demandez sa révocation : une nouvelle clé vous sera remise. Une clé peut être limitée à certaines adresses IP et à certains endpoints.

Envoyer un document

Les deux endpoints d'analyse reçoivent le fichier en multipart/form-data, dans le champ file.

Formats acceptésPDF, PNG, JPEG, WEBP, TIFF (y compris TIFF multipage)
Taille maximale20 Mo par fichier
Pages maximales50 pages par document
Non acceptésPDF 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.

Confidentialité. Les documents sont traités en mémoire puis écartés : ni le fichier ni le résultat de l'analyse ne sont conservés.

Work Extraction

POST/v1/work-extraction

Pour 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

ChampTypeDescription
datechaîne ou nullDate de réalisation, format jj/mm/aaaa. Une date écrite une seule fois pour plusieurs lignes est recopiée sur chacune.
aircraft_registrationchaîne ou nullImmatriculation, en majuscules (ex. F-HBXA).
aircraft_typechaîne ou nullType ou modèle d'avion tel qu'écrit (ex. A320-214, ATR 72-600).
ata_chapterchaîne ou nullChapitre ATA sur 2 chiffres (ex. "32", "05"). Déduit de la description seulement s'il n'y a aucune ambiguïté.
descriptionchaîneDescription fidèle et concise de la tâche, dans la langue du document.
operation_typechaîneType d'opération, parmi la liste fermée.
duration_hoursnombre ou nullDurée en heures décimales (1h30 → 1.5). Jamais estimée : null si elle n'est pas écrite.
source_pageentierPage 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.

ValeurAbréviationSignification
inspectionINSPInspection / visite / contrôle
removal_installationR/IDépose / pose / remplacement
troubleshootingTSDépannage / recherche de panne
functional_testFOTEssai fonctionnel / opérationnel
servicingSGHEntretien courant / servicing / avitaillement / lubrification
repairREPRéparation
modificationMODModification / application de SB ou AD
mel_deferralMELReport MEL / CDL
other—Autre

Certification

POST/v1/certification

Pour 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

ChampTypeDescription
document_typechaînelicence (licence de maintenance), attestation (attestation ou certificat de formation, diplôme) ou unknown (tout autre document, dont les pièces d'identité).
holder_namechaîne ou nullNom complet du titulaire tel qu'écrit, y compris pour un document unknown.
licence.numberchaîne ou nullNuméro de la licence.
licence.categorieslisteCaté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_datechaîne ou nullDate de fin de validité, jj/mm/aaaa.
licence.issuing_authoritychaîne ou nullAutorité qui a délivré la licence (ex. DGAC France).
attestation.training_titlechaîne ou nullIntitulé de la formation.
attestation.completion_datechaîne ou nullDate de réalisation (date de fin pour une période), jj/mm/aaaa.
attestation.validity_yearsnombre ou nullDurée de validité en années, uniquement si elle est écrite sur le document.
attestation.training_organisationchaîne ou nullOrganisme 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

GET/v1/usage

Consommation 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"
  }
}
HTTPCodeSignificationQue faire
401missing_api_keyClé API absenteAjouter l'en-tête Authorization
401invalid_api_keyClé inconnue ou mal copiéeVérifier la clé
401api_key_revokedClé révoquéeDemander une nouvelle clé
401api_key_expiredClé expiréeDemander une nouvelle clé
403client_disabledCompte désactivéContacter le support
403ip_not_allowedAdresse IP non autorisée pour cette cléAppeler depuis une IP autorisée
403insufficient_scopeEndpoint non inclus dans cette cléContacter le support
413file_too_largeFichier trop volumineuxRéduire ou compresser le fichier
413payload_too_largeRequête trop volumineuseRéduire ou compresser le fichier
413too_many_pagesTrop de pagesDécouper le document
413image_too_largeImage trop grande (nombre de pixels)Réduire la résolution
415unsupported_file_typeFormat non pris en chargeEnvoyer un PDF ou une image
422invalid_documentFichier illisible ou corrompuVérifier le fichier
422empty_fileFichier videVérifier le fichier
422encrypted_documentPDF protégé par mot de passeEnvoyer une version non protégée
422invalid_requestChamp file manquant ou requête mal forméeCorriger la requête
429rate_limitedTrop de requêtes par minuteAttendre Retry-After puis réessayer
429too_many_concurrent_requestsTrop de documents en cours de traitementAttendre Retry-After puis réessayer
429quota_exceededQuota mensuel atteintAttendre le mois suivant ou contacter le support
502extraction_failedLe document n'a pas pu être traitéRéessayer ; contacter le support s'il persiste
503service_unavailableService momentanément indisponibleRé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

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.