API d'extraction de relevés bancaires
API REST pour convertir des PDFs de relevés bancaires en JSON structuré. 99 % de précision, remboursement automatique en cas d'échec.
$ curl https://api.bankstatementlab.com/v1/extractions \
-H "Authorization: Bearer bsl_live_..." \
-F "file=@statement.pdf" Extraction de relevés
Extrayez les transactions, soldes et métadonnées de n'importe quel PDF.
Sortie JSON structurée
Schéma prévisible dans les 10 langues supportées.
99 % de précision
Remboursement automatique en cas d'échec. Aucun débit pour les extractions échouées.
Modes sync & async
Synchrone pour petits PDFs, async + polling pour gros lots.
Exemples de code
Intégrez dans n'importe quel langage. Exemples ci-dessous.
$ curl https://api.bankstatementlab.com/v1/extractions \
-H "Authorization: Bearer bsl_live_..." \
-F "file=@statement.pdf" const form = new FormData();
form.append("file", fs.createReadStream("statement.pdf"));
const res = await fetch("https://api.bankstatementlab.com/v1/extractions", {
method: "POST",
headers: { Authorization: `Bearer $${process.env.BSL_KEY}` },
body: form,
});
const data = await res.json(); import requests
with open("statement.pdf", "rb") as f:
r = requests.post(
"https://api.bankstatementlab.com/v1/extractions",
headers={"Authorization": f"Bearer {BSL_KEY}"},
files={"file": f},
)
data = r.json() $ch = curl_init("https://api.bankstatementlab.com/v1/extractions");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Bearer " . getenv("BSL_KEY")]);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
"file" => new CURLFile("statement.pdf"),
]);
$data = json_decode(curl_exec($ch), true); Forme des réponses
Les champs data, column_names et transaction_count ne sont présents que lorsque status vaut "completed". Sinon, ils sont omis du JSON (absents, pas null).
GET /v1/extractions/:id
200 OK — Extraction terminée
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "ext_3f8a9b2c1d4e5f6a7b8c9d0e",
"status": "completed",
"file_name": "statement-march-2026.pdf",
"created_at": "2026-03-15T10:23:00.000Z",
"completed_at": "2026-03-15T10:23:18.000Z",
"page_count": 3,
"credits_charged": 3,
"api_key_id": "ak_abc123",
"column_names": ["Date", "Description", "Amount"],
"transaction_count": 42,
"data": {
"columns": ["Date", "Description", "Amount"],
"transactions": [
["2026-03-01", "VIREMENT SEPA", "1500.00"],
["2026-03-02", "CB CARREFOUR", "-45.20"]
]
}
} 200 OK — Extraction en cours
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "ext_3f8a9b2c1d4e5f6a7b8c9d0e",
"status": "processing",
"file_name": "statement-march-2026.pdf",
"created_at": "2026-03-15T10:23:00.000Z",
"page_count": 3,
"credits_charged": 3,
"api_key_id": "ak_abc123"
} 200 OK — Extraction échouée
HTTP/1.1 200 OK
Content-Type: application/json
{
"id": "ext_3f8a9b2c1d4e5f6a7b8c9d0e",
"status": "failed",
"file_name": "statement-march-2026.pdf",
"created_at": "2026-03-15T10:23:00.000Z",
"completed_at": "2026-03-15T10:23:32.000Z",
"page_count": 3,
"credits_charged": 3,
"api_key_id": "ak_abc123",
"error": {
"type": "extraction_failed",
"message": "Extraction failed due to an internal error. Contact support if the issue persists."
}
} Pattern de polling
Lorsqu'une extraction est lancée en mode async, la réponse contient status: "processing" tant que le worker n'a pas terminé. Vérifiez toujours que status vaut "completed" AVANT de lire les champs data, transaction_count et column_names — ils sont omis du JSON tant que l'extraction n'est pas finie.
Fréquence de polling recommandée côté client : 5 à 10 secondes. Le worker côté serveur tourne toutes les 10 secondes — un polling plus rapide n'accélérera pas le résultat.
GET /v1/extractions
200 OK — Page mixte (un élément par état)
HTTP/1.1 200 OK
Content-Type: application/json
{
"data": [
{
"id": "ext_001",
"status": "completed",
"file_name": "march.pdf",
"created_at": "2026-03-15T10:00:00.000Z",
"completed_at": "2026-03-15T10:00:18.000Z",
"page_count": 3,
"credits_charged": 3,
"api_key_id": "ak_abc123",
"column_names": ["Date", "Description", "Amount"],
"transaction_count": 42
},
{
"id": "ext_002",
"status": "processing",
"file_name": "april.pdf",
"created_at": "2026-04-15T10:00:00.000Z",
"page_count": 5,
"credits_charged": 5,
"api_key_id": "ak_abc123"
},
{
"id": "ext_003",
"status": "failed",
"file_name": "may.pdf",
"created_at": "2026-05-15T10:00:00.000Z",
"completed_at": "2026-05-15T10:00:42.000Z",
"page_count": 2,
"credits_charged": 2,
"api_key_id": "ak_abc123",
"error": {
"type": "extraction_failed",
"message": "Extraction failed due to an internal error. Contact support if the issue persists."
}
}
],
"has_more": false
} Pattern de polling
Lorsqu'une extraction est lancée en mode async, la réponse contient status: "processing" tant que le worker n'a pas terminé. Vérifiez toujours que status vaut "completed" AVANT de lire les champs data, transaction_count et column_names — ils sont omis du JSON tant que l'extraction n'est pas finie.
Fréquence de polling recommandée côté client : 5 à 10 secondes. Le worker côté serveur tourne toutes les 10 secondes — un polling plus rapide n'accélérera pas le résultat.
Conçu pour
Automatisation comptable
Importez les relevés clients directement dans votre pipeline comptable.
Vérification de crédit
Vérifiez revenus et flux de trésorerie depuis les relevés des demandeurs.
Apps finances personnelles
Permettez à vos utilisateurs de connecter leurs relevés sans saisie manuelle.
Mêmes crédits, web + API
1 crédit = 1 page. Paiement à l'usage, sans engagement mensuel.
Voir les tarifs →Questions fréquentes
Envoyez votre clé API en Bearer token dans le header Authorization. Nous utilisons des clés API — pas d'OAuth en v1.
10 requêtes/seconde et 1 000 requêtes/heure par clé API. Besoin de plus ? Contactez-nous.
Nous visons 99 % de disponibilité (best-effort). Pas de SLA contractuel en v1 — contactez-nous pour des engagements entreprise.
Les extractions échouées sont automatiquement remboursées sur votre solde. Vous ne payez que les pages réussies.
PDF uniquement en v1. Max 20 Mo par fichier. Support images et CSV à venir.
Anglais, français, espagnol, allemand, italien, portugais, japonais, néerlandais, coréen, hindi.
Commencez à intégrer dès aujourd'hui
Le plan Free inclut 5 crédits. Aucune carte bancaire requise.
Obtenir une clé API