Documentation API
Base URL : https://api.lectio.foliolabs.fr
Démarrage rapide
Quatre étapes pour obtenir votre premier résultat JSON.
- Créez un compte sur /public/register — 5 crédits d'essai offerts à l'activation.
- Validez votre adresse e-mail — cliquez sur le lien reçu dans votre boîte mail pour activer votre compte.
- Créez une clé API depuis votre tableau de bord sous Mes clés. Copiez-la immédiatement — elle ne s'affiche qu'une seule fois.
- Envoyez votre premier document :
curl -X POST https://api.lectio.foliolabs.fr/v1/invoices/parse \ -H "Authorization: Bearer <votre_clé>" \ -F "file=@facture.pdf"
Remplacez <votre_clé> par votre clé API et facture.pdf par votre fichier.
Authentification
Toutes les requêtes API nécessitent un header Authorization avec un Bearer token :
Authorization: Bearer <votre_clé>
- Créez et révoquez vos clés depuis Mes clés.
- Une clé désactivée ne peut pas être réactivée — créez-en une nouvelle si nécessaire.
- Header manquant ou clé invalide →
401 Unauthorized.
POST /v1/invoices/parse
Analyse une facture (document_type = facture). Retourne 422 si le document est un devis.
RequĂŞte
curl -X POST https://api.lectio.foliolabs.fr/v1/invoices/parse \ -H "Authorization: Bearer <votre_clé>" \ -F "file=@facture-renovation-2026.pdf"
- Format :
multipart/form-data, champfile - Taille max : 5 Mo — Pages max : 10
- PDFs natifs (texte) et PDFs scannés sont tous deux supportés.
Exemple de réponse — facture de rénovation (multi-sections, TVA mixte)
{
"document_type": "facture",
"document_number": "FAC-2026-0042",
"date": "2026-03-15",
"issuer": {
"name": "Rénovation Express SARL",
"address": "12 rue des Artisans, 69003 Lyon",
"siret": "812 345 678 00019",
"tva_intracom": "FR 22 812345678",
"email": "contact@renovation-express.fr",
"phone": "04 72 12 34 56"
},
"client": {
"name": "Dupont & Fils SARL",
"address": "8 avenue de la République, 69001 Lyon",
"siret": "923 456 789 00023",
"tva_intracom": null,
"email": null,
"phone": null
},
"line_items": [
{
"description": "Fourniture et pose de carrelage 30Ă—60",
"quantity": 60.0, "unit": "m²",
"unit_price_ht": 35.0, "tva_rate": 20.0,
"total_ht": 2100.0, "total_ttc": 2520.0,
"is_optional": false, "section": "Gros œuvre"
},
{
"description": "Main d'œuvre pose carrelage",
"quantity": 18.0, "unit": "h",
"unit_price_ht": 28.0, "tva_rate": 10.0,
"total_ht": 504.0, "total_ttc": 554.4,
"is_optional": false, "section": "Gros œuvre"
},
{
"description": "Remplacement robinetterie salle de bains",
"quantity": 3.0, "unit": null,
"unit_price_ht": 185.0, "tva_rate": 20.0,
"total_ht": 555.0, "total_ttc": 666.0,
"is_optional": false, "section": "Plomberie"
},
{
"description": "Main d'œuvre plomberie",
"quantity": 8.0, "unit": "h",
"unit_price_ht": 55.0, "tva_rate": 10.0,
"total_ht": 440.0, "total_ttc": 484.0,
"is_optional": false, "section": "Plomberie"
},
{
"description": "RevĂŞtement mural peinture (option)",
"quantity": 1.0, "unit": null,
"unit_price_ht": 1200.0, "tva_rate": 10.0,
"total_ht": 1200.0, "total_ttc": 1320.0,
"is_optional": true, "section": null
}
],
"totals": { "total_ht": 4799.0, "total_tva": 745.4, "total_ttc": 5544.4 },
"payment_terms": "30 jours net à réception de facture",
"confidence": "high",
"anomalies": ["Numéro de TVA intracommunautaire client absent"],
"pdf_type": "native_digital"
}
POST /v1/quotes/parse
Analyse un devis (document_type = devis). Retourne 422 si le document est une facture.
RequĂŞte
curl -X POST https://api.lectio.foliolabs.fr/v1/quotes/parse \ -H "Authorization: Bearer <votre_clé>" \ -F "file=@devis-projet-web.pdf"
Exemple de réponse — devis multi-phases avec ligne optionnelle
{
"document_type": "devis",
"document_number": "DEV-2026-0018",
"date": "2026-04-02",
"issuer": {
"name": "Tech Conseil SASU",
"address": "47 rue du Commerce, 75015 Paris",
"siret": "789 012 345 00034",
"tva_intracom": "FR 15 789012345",
"email": "devis@tech-conseil.fr",
"phone": "01 45 67 89 10"
},
"client": {
"name": "Groupe Martin SA",
"address": "3 boulevard Haussmann, 75009 Paris",
"siret": "634 789 012 00056",
"tva_intracom": "FR 40 634789012",
"email": "achats@groupe-martin.fr",
"phone": null
},
"line_items": [
{
"description": "Analyse des besoins et rédaction du cahier des charges",
"quantity": 5.0, "unit": "j",
"unit_price_ht": 950.0, "tva_rate": 20.0,
"total_ht": 4750.0, "total_ttc": 5700.0,
"is_optional": false, "section": "Phase 1 — Cadrage"
},
{
"description": "Développement application web — module gestion clients",
"quantity": 20.0, "unit": "j",
"unit_price_ht": 900.0, "tva_rate": 20.0,
"total_ht": 18000.0, "total_ttc": 21600.0,
"is_optional": false, "section": "Phase 2 — Développement"
},
{
"description": "Tests et recette",
"quantity": 4.0, "unit": "j",
"unit_price_ht": 800.0, "tva_rate": 20.0,
"total_ht": 3200.0, "total_ttc": 3840.0,
"is_optional": false, "section": "Phase 2 — Développement"
},
{
"description": "Formation utilisateurs (demi-journée, 10 personnes)",
"quantity": 1.0, "unit": null,
"unit_price_ht": 1800.0, "tva_rate": 20.0,
"total_ht": 1800.0, "total_ttc": 2160.0,
"is_optional": false, "section": "Phase 3 — Formation"
},
{
"description": "Contrat de maintenance corrective — 12 mois (option)",
"quantity": 12.0, "unit": "mois",
"unit_price_ht": 350.0, "tva_rate": 20.0,
"total_ht": 4200.0, "total_ttc": 5040.0,
"is_optional": true, "section": null
}
],
"totals": { "total_ht": 31950.0, "total_tva": 6390.0, "total_ttc": 38340.0 },
"payment_terms": "30 % Ă la commande, solde Ă la livraison",
"confidence": "high",
"anomalies": [],
"pdf_type": "native_digital"
}
GET /v1/account
Retourne le solde de crédits par lot d'achat. Aucun crédit consommé. Utile pour vérifier votre solde avant un traitement en masse.
RequĂŞte
curl https://api.lectio.foliolabs.fr/v1/account \ -H "Authorization: Bearer <votre_clé>"
Exemple de réponse
{
"credits_total": 347,
"batches": [
{ "credits": 47, "expires_at": "2026-12-31T23:59:59" },
{ "credits": 300, "expires_at": "2027-05-15T23:59:59" }
]
}
Les lots sont consommés dans l'ordre d'expiration (FIFO). credits_total est la somme des lots non expirés.
Niveau de confiance
Chaque réponse inclut un champ confidence qui reflète l'auto-évaluation du modèle sur la qualité de l'extraction.
Les totaux s'équilibrent et le modèle est certain de l'extraction. Intégration automatique sûre.
Incertitude mineure : cellule floue, taux de TVA ambigu, mise en page inhabituelle. Vérifiez le document avant de comptabiliser.
Doute significatif sur l'extraction. Causes typiques : PDF scanné de mauvaise qualité, mise en page non standard, document partiellement illisible. Vérification manuelle obligatoire.
Le tableau anomalies complète confidence : même une réponse high peut signaler une anomalie (ex. : écart d'arrondi sur le total TTC, numéro de TVA absent).
Vérifiez anomalies.length > 0 dans votre logique d'intégration.
Référence du schéma de réponse
Les endpoints /v1/invoices/parse et /v1/quotes/parse retournent le mĂŞme objet.
| Champ | Type | Notes |
|---|---|---|
| document_type | "facture" | "devis" | Type détecté dans le document |
| document_number | string | null | Numéro de pièce (ex. FAC-2026-0042) |
| date | string | null | Format YYYY-MM-DD |
| issuer | object | Émetteur — voir champs Party ci-dessous |
| client | object | Destinataire — mêmes champs que issuer |
| line_items | array | Toutes les lignes du document — voir ci-dessous |
| totals | object | total_ht, total_tva, total_ttc (float) |
| payment_terms | string | null | Conditions de règlement extraites |
| confidence | "high" | "medium" | "low" | Voir Niveau de confiance |
| anomalies | string[] | Liste vide si aucune anomalie détectée |
| pdf_type | "native_digital" | "scanned" | Natif = texte extractable ; scanné = traité par vision IA |
Champs Party (issuer / client)
| Champ | Type | Notes |
|---|---|---|
| name | string | null | Raison sociale ou nom |
| address | string | null | Adresse complète |
| siret | string | null | Numéro SIRET (14 chiffres) |
| tva_intracom | string | null | Numéro de TVA intracommunautaire |
| string | null | Extrait du document si présent | |
| phone | string | null | Extrait du document si présent |
Champs LineItem
| Champ | Type | Notes |
|---|---|---|
| description | string | Libellé de la ligne |
| quantity | float | Quantité |
| unit | string | null | Unité (ex. m², h, j, mois) |
| unit_price_ht | float | Prix unitaire HT (hors taxes) |
| tva_rate | float | null | Valeurs valides : 0, 2.1, 5.5, 10, 20 |
| total_ht | float | Montant HT de la ligne |
| total_ttc | float | null | Montant TTC (toutes taxes comprises) |
| is_optional | bool | Ligne optionnelle — fréquent dans les devis |
| section | string | null | En-tête de section du document si présent |
HT = hors taxes (excl. TVA) · TTC = toutes taxes comprises (incl. TVA)
Codes d'erreur
| Code | Cause | Action recommandée |
|---|---|---|
| 401 | Clé API manquante ou invalide | Vérifier le header Authorization: Bearer <clé> — gérer vos clés sur Mes clés |
| 402 | Crédits insuffisants ou expirés | Recharger sur Facturation ou vérifier le solde via GET /v1/account |
| 422 | Type de document incorrect ou contenu suspect | Appeler le bon endpoint (/v1/quotes/parse pour un devis) ; ne pas réessayer si contenu suspect détecté |
| 429 | Limite de requêtes atteinte (5/min ou 50/h) | Attendre et réessayer — respecter l'en-tête Retry-After |
| 500 | Erreur serveur | Réessayer une fois — contacter le support via Support si persistant |
Crédits & limites
- 1 document = 1 crédit, débité avant l'appel au modèle d'IA — quel que soit le résultat.
- Les crédits sont suivis par lot d'achat, chacun avec sa propre date d'expiration. Consommation FIFO (lot expirant en premier consommé en premier).
- Limite de débit : 5 requêtes/minute et 50 requêtes/heure par clé API.
- Taille de fichier : 5 Mo max — Pages : 10 pages max.
- Format accepté : PDF uniquement. PDFs natifs (texte) et PDFs scannés sont tous deux pris en charge.
Exemples de code
Python (httpx)
import httpx
API_KEY = "sk_live_..."
BASE_URL = "https://api.lectio.foliolabs.fr"
def parse_invoice(pdf_path: str) -> dict:
with open(pdf_path, "rb") as f:
response = httpx.post(
f"{BASE_URL}/v1/invoices/parse",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": (pdf_path, f, "application/pdf")},
timeout=60.0,
)
response.raise_for_status()
result = response.json()
if result["anomalies"]:
print("Anomalies :", result["anomalies"])
return result
invoice = parse_invoice("facture-2026-03.pdf")
print(f"Total TTC : {invoice['totals']['total_ttc']} € — confiance : {invoice['confidence']}")
JavaScript (fetch)
const API_KEY = "sk_live_...";
const BASE_URL = "https://api.lectio.foliolabs.fr";
async function parseInvoice(file) {
const form = new FormData();
form.append("file", file);
const res = await fetch(`${BASE_URL}/v1/invoices/parse`, {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}` },
body: form,
signal: AbortSignal.timeout(60_000),
});
if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
const result = await res.json();
if (result.anomalies.length) console.warn("Anomalies :", result.anomalies);
return result;
}
// Usage (browser file input)
document.querySelector("#file").addEventListener("change", async (e) => {
const invoice = await parseInvoice(e.target.files[0]);
console.log("Total TTC :", invoice.totals.total_ttc, "€");
});
Bonnes pratiques
- Vérifiez
confidenceetanomaliesavant d'intégrer les montants dans votre comptabilité automatisée. - Appelez
GET /v1/accountavant un traitement en masse pour confirmer que votre solde est suffisant. - Utilisez le bon endpoint selon le type de document :
/v1/quotes/parsepour les devis,/v1/invoices/parsepour les factures. Le endpoint incorrect retourne422. - Prévoyez un timeout de 60 secondes — les PDFs scannés prennent plus de temps (appel vision IA).
- N'enregistrez jamais une clé API en clair dans vos logs. En cas de compromission, révoquez-la depuis Mes clés et créez-en une nouvelle.
- Ajoutez un jitter entre les requêtes lors d'un traitement en masse pour éviter les pics de débit.
Pas encore de compte ? Créez-en un gratuitement et obtenez 5 crédits d'essai.