Introduction
L'API Balanzio vous permet de convertir des relevés bancaires PDF en formats de données structurées (CSV, XLSX, JSON). Notre API prend en charge les PDF texte et image (scannés) avec traitement OCR.
Traitement rapide
PDF texte en quelques secondes, OCR en <30s par page
Sécurisé et conforme au RGPD
Suppression automatique après 24h
Multi-banques
Plus de 100 banques prises en charge
Authentification
Toutes les requêtes API nécessitent une authentification à l'aide d'un jeton Bearer. Incluez votre clé API dans l'en-tête Authorization :
Authorization: Bearer YOUR_API_KEYN'exposez jamais votre clé API dans du code côté client et ne la commitez pas dans un système de contrôle de version.
Points de terminaison
URL de base
https://api.balanzio.app/api/v1Téléverser un relevé bancaire
/bank-statementTéléversez un ou plusieurs fichiers PDF pour traitement. L'API détectera automatiquement si le PDF est texte ou image (scanné).
Paramètres de la requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
files | file[] | Oui | Fichier(s) PDF à traiter (3 Mo max chacun) |
Exemple de requête
curl -X POST https://api.balanzio.app/api/v1/bank-statement \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "files=@statement.pdf"Réponse (201 Created)
[
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"filename": "statement.pdf",
"pdfType": "TEXT_BASED",
"state": "READY",
"numberOfPages": 3
}
]Champs de la réponse
| Champ | Type | Description |
|---|---|---|
uuid | string | Identifiant unique du fichier téléversé |
filename | string | Nom de fichier original |
pdfType | string | TEXT_BASED ou IMAGE_BASED |
state | string | READY (texte) ou PROCESSING (OCR) |
numberOfPages | number | Nombre total de pages dans le PDF |
Vérifier l'état du traitement
/bank-statement/statusVérifiez l'état de traitement des fichiers téléversés. Utilisez ce point de terminaison pour interroger la complétion de l'OCR.
Exemple de requête
curl -X POST https://api.balanzio.app/api/v1/bank-statement/status \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"uuids": ["550e8400-e29b-41d4-a716-446655440000"]
}'Réponse (200 OK)
[
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"filename": "statement.pdf",
"pdfType": "IMAGE_BASED",
"state": "COMPLETED",
"numberOfPages": 3,
"progress": 100
}
]Convertir au format
/bank-statement/convertConvertissez les relevés traités au format CSV, XLSX ou JSON.
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
format | string | Oui | CSV, XLSX ou JSON |
Exemple de requête (CSV)
curl -X POST "https://api.balanzio.app/api/v1/bank-statement/convert?format=CSV" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"uuid": "550e8400-e29b-41d4-a716-446655440000"
}' \
-o statement.csvExemple de requête (JSON)
curl -X POST "https://api.balanzio.app/api/v1/bank-statement/convert?format=JSON" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"uuid": "550e8400-e29b-41d4-a716-446655440000"
}'Réponse (format JSON)
{
"transactions": [
{
"date": "2024-01-15",
"description": "VIREMENT SALAIRE",
"amount": 3500.00,
"balance": 4250.50,
"currency": "EUR"
},
{
"date": "2024-01-16",
"description": "CARTE 12/01 SUPERMARCHE",
"amount": -85.30,
"balance": 4165.20,
"currency": "EUR"
}
],
"metadata": {
"bank": "BNP Paribas",
"accountNumber": "****1234",
"statementPeriod": "2024-01"
},
"warnings": []
}Définir le mot de passe PDF
/bank-statement/set-passwordFournissez le mot de passe pour les PDF protégés par mot de passe.
Exemple de requête
curl -X POST https://api.balanzio.app/api/v1/bank-statement/set-password \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"password": "mySecretPassword123"
}'Réponse (200 OK)
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"state": "READY",
"passwordSet": true
}Obtenir les infos utilisateur
/userRécupérez les informations de l'utilisateur actuel, y compris les crédits et les détails du forfait.
Exemple de requête
curl -X GET https://api.balanzio.app/api/v1/user \
-H "Authorization: Bearer YOUR_API_KEY"Réponse (200 OK)
{
"user": {
"userId": 123,
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"emailVerified": true,
"referralCode": "ABC123"
},
"credits": {
"paidCredits": 1000,
"freeCredits": 50
},
"unlimitedCredits": false,
"subscriptionCount": 1,
"plan": "pro",
"saveConvertedFiles": false,
"hasPaymentMethod": true
}Codes d'erreur
Toutes les erreurs renvoient une réponse JSON avec un code d'erreur et un message :
{
"error": "INVALID_FILE_TYPE",
"message": "Only PDF files are accepted",
"recovery": "Please upload a PDF file"
}| Statut | Code d'erreur | Description |
|---|---|---|
400 | INVALID_FILE_TYPE | Le fichier n'est pas un PDF |
400 | INVALID_FORMAT | Paramètre de format invalide (doit être CSV, XLSX ou JSON) |
401 | UNAUTHORIZED | Clé API invalide ou manquante |
403 | INSUFFICIENT_CREDITS | Pas assez de crédits pour traiter le fichier |
404 | FILE_NOT_FOUND | UUID de fichier introuvable |
413 | FILE_TOO_LARGE | Le fichier dépasse la limite de 3 Mo |
422 | PASSWORD_REQUIRED | Le PDF est protégé par mot de passe |
422 | INVALID_PASSWORD | Mot de passe PDF incorrect |
429 | RATE_LIMIT_EXCEEDED | Trop de requêtes |
500 | INTERNAL_ERROR | Erreur serveur, veuillez réessayer |
Limites de débit
Utilisateurs anonymes
• 10 requêtes par minute
• 1 page par jour
• Pas de téléversements simultanés
Utilisateurs authentifiés
• 60 requêtes par minute
• Basé sur les crédits (dépend du forfait)
• Jusqu'à 5 téléversements simultanés
En-têtes de limite de débit : Toutes les réponses incluent les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset.
Exemples de code complets
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.balanzio.app/api/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
# 1. Upload PDF
with open("statement.pdf", "rb") as f:
files = {"files": f}
response = requests.post(
f"{BASE_URL}/bank-statement",
headers=HEADERS,
files=files
)
data = response.json()
file_uuid = data[0]["uuid"]
pdf_type = data[0]["pdfType"]
print(f"Uploaded: {file_uuid} ({pdf_type})")
# 2. Poll status if OCR is needed
if pdf_type == "IMAGE_BASED":
while True:
response = requests.post(
f"{BASE_URL}/bank-statement/status",
headers=HEADERS,
json={"uuids": [file_uuid]}
)
status = response.json()[0]
if status["state"] == "COMPLETED":
print("Processing complete!")
break
elif status["state"] == "ERROR":
print("Processing failed:", status.get("error"))
break
print(f"Progress: {status.get('progress', 0)}%")
time.sleep(3)
# 3. Convert to JSON
response = requests.post(
f"{BASE_URL}/bank-statement/convert",
headers=HEADERS,
params={"format": "JSON"},
json={"uuid": file_uuid}
)
transactions = response.json()
print(f"Found {len(transactions['transactions'])} transactions")
for txn in transactions["transactions"]:
print(f"{txn['date']}: {txn['description']} - {txn['amount']} {txn['currency']}")Node.js
const FormData = require('form-data');
const fs = require('fs');
const fetch = require('node-fetch');
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://api.balanzio.app/api/v1';
const HEADERS = { 'Authorization': `Bearer ${API_KEY}` };
async function convertBankStatement() {
// 1. Upload PDF
const form = new FormData();
form.append('files', fs.createReadStream('statement.pdf'));
let response = await fetch(`${BASE_URL}/bank-statement`, {
method: 'POST',
headers: HEADERS,
body: form
});
const uploadData = await response.json();
const fileUuid = uploadData[0].uuid;
const pdfType = uploadData[0].pdfType;
console.log(`Uploaded: ${fileUuid} (${pdfType})`);
// 2. Poll status if OCR needed
if (pdfType === 'IMAGE_BASED') {
let completed = false;
while (!completed) {
response = await fetch(`${BASE_URL}/bank-statement/status`, {
method: 'POST',
headers: { ...HEADERS, 'Content-Type': 'application/json' },
body: JSON.stringify({ uuids: [fileUuid] })
});
const statusData = await response.json();
const status = statusData[0];
if (status.state === 'COMPLETED') {
console.log('Processing complete!');
completed = true;
} else if (status.state === 'ERROR') {
throw new Error(`Processing failed: ${status.error}`);
} else {
console.log(`Progress: ${status.progress || 0}%`);
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
}
// 3. Convert to JSON
response = await fetch(
`${BASE_URL}/bank-statement/convert?format=JSON`,
{
method: 'POST',
headers: { ...HEADERS, 'Content-Type': 'application/json' },
body: JSON.stringify({ uuid: fileUuid })
}
);
const transactions = await response.json();
console.log(`Found ${transactions.transactions.length} transactions`);
transactions.transactions.forEach(txn => {
console.log(`${txn.date}: ${txn.description} - ${txn.amount} ${txn.currency}`);
});
}
convertBankStatement().catch(console.error);PHP
<?php
$apiKey = 'YOUR_API_KEY';
$baseUrl = 'https://api.balanzio.app/api/v1';
// 1. Upload PDF
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$baseUrl/bank-statement");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $apiKey"
]);
$file = new CURLFile('statement.pdf', 'application/pdf', 'statement.pdf');
curl_setopt($ch, CURLOPT_POSTFIELDS, ['files' => $file]);
$response = curl_exec($ch);
$data = json_decode($response, true);
$fileUuid = $data[0]['uuid'];
$pdfType = $data[0]['pdfType'];
echo "Uploaded: $fileUuid ($pdfType)\n";
// 2. Poll status if OCR needed
if ($pdfType === 'IMAGE_BASED') {
do {
sleep(3);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$baseUrl/bank-statement/status");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $apiKey",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'uuids' => [$fileUuid]
]));
$response = curl_exec($ch);
$statusData = json_decode($response, true);
$status = $statusData[0];
echo "Progress: " . ($status['progress'] ?? 0) . "%\n";
} while ($status['state'] !== 'COMPLETED' && $status['state'] !== 'ERROR');
echo "Processing complete!\n";
}
// 3. Convert to JSON
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$baseUrl/bank-statement/convert?format=JSON");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer $apiKey",
"Content-Type: application/json"
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'uuid' => $fileUuid
]));
$response = curl_exec($ch);
$transactions = json_decode($response, true);
echo "Found " . count($transactions['transactions']) . " transactions\n";
foreach ($transactions['transactions'] as $txn) {
echo "{$txn['date']}: {$txn['description']} - {$txn['amount']} {$txn['currency']}\n";
}
curl_close($ch);
?>