مقدمة
يتيح لك API Balanzio تحويل كشوف الحسابات البنكية بصيغة PDF إلى تنسيقات بيانات منظمة (CSV، XLSX، JSON). يدعم API الخاص بنا كلاً من ملفات PDF النصية والمستندة إلى الصور (الممسوحة ضوئياً) مع معالجة OCR.
معالجة سريعة
ملفات PDF النصية في ثوانٍ، OCR في <30 ثانية لكل صفحة
آمن ومتوافق مع GDPR
حذف تلقائي بعد 24 ساعة
دعم متعدد البنوك
أكثر من 100 بنك مدعوم
المصادقة
تتطلب جميع طلبات API المصادقة باستخدام رمز Bearer. قم بتضمين مفتاح API الخاص بك في رأس التفويض:
Authorization: Bearer YOUR_API_KEYلا تكشف أبداً عن مفتاح API الخاص بك في كود جانب العميل أو تضعه في نظام التحكم بالإصدارات.
نقاط النهاية
URL الأساسي
https://api.balanzio.app/api/v1رفع كشف حساب بنكي
/bank-statementقم برفع ملف PDF واحد أو عدة ملفات للمعالجة. سيكتشف API تلقائياً ما إذا كان PDF نصياً أو مستنداً إلى صورة (ممسوح ضوئياً).
معاملات الطلب
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
files | file[] | نعم | ملف (ملفات) PDF للمعالجة (3 ميجابايت كحد أقصى لكل منها) |
مثال على الطلب
curl -X POST https://api.balanzio.app/api/v1/bank-statement \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "files=@statement.pdf"الاستجابة (201 تم الإنشاء)
[
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"filename": "statement.pdf",
"pdfType": "TEXT_BASED",
"state": "READY",
"numberOfPages": 3
}
]حقول الاستجابة
| الحقل | النوع | الوصف |
|---|---|---|
uuid | string | معرف فريد للملف المرفوع |
filename | string | اسم الملف الأصلي |
pdfType | string | TEXT_BASED أو IMAGE_BASED |
state | string | READY (نص) أو PROCESSING (OCR) |
numberOfPages | number | إجمالي الصفحات في PDF |
التحقق من حالة المعالجة
/bank-statement/statusتحقق من حالة معالجة الملفات المرفوعة. استخدم نقطة النهاية هذه للاستعلام عن اكتمال OCR.
مثال على الطلب
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"]
}'الاستجابة (200 موافق)
[
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"filename": "statement.pdf",
"pdfType": "IMAGE_BASED",
"state": "COMPLETED",
"numberOfPages": 3,
"progress": 100
}
]التحويل إلى تنسيق
/bank-statement/convertتحويل الكشوف المعالجة إلى تنسيق CSV أو XLSX أو JSON.
معاملات الاستعلام
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
format | string | نعم | CSV أو XLSX أو JSON |
مثال على الطلب (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.csvمثال على الطلب (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"
}'الاستجابة (تنسيق 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": []
}تعيين كلمة مرور PDF
/bank-statement/set-passwordتوفير كلمة مرور لملفات PDF المحمية بكلمة مرور.
مثال على الطلب
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"
}'الاستجابة (200 موافق)
{
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"state": "READY",
"passwordSet": true
}الحصول على معلومات المستخدم
/userاسترداد معلومات المستخدم الحالية، بما في ذلك الرصيد وتفاصيل الخطة.
مثال على الطلب
curl -X GET https://api.balanzio.app/api/v1/user \
-H "Authorization: Bearer YOUR_API_KEY"الاستجابة (200 موافق)
{
"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
}رموز الخطأ
ترجع جميع الأخطاء استجابة JSON مع رمز خطأ ورسالة:
{
"error": "INVALID_FILE_TYPE",
"message": "Only PDF files are accepted",
"recovery": "Please upload a PDF file"
}| الحالة | رمز الخطأ | الوصف |
|---|---|---|
400 | INVALID_FILE_TYPE | الملف ليس PDF |
400 | INVALID_FORMAT | معامل تنسيق غير صالح (يجب أن يكون CSV أو XLSX أو JSON) |
401 | UNAUTHORIZED | مفتاح API غير صالح أو مفقود |
403 | INSUFFICIENT_CREDITS | رصيد غير كافٍ لمعالجة الملف |
404 | FILE_NOT_FOUND | UUID الملف غير موجود |
413 | FILE_TOO_LARGE | الملف يتجاوز حد 3 ميجابايت |
422 | PASSWORD_REQUIRED | PDF محمي بكلمة مرور |
422 | INVALID_PASSWORD | كلمة مرور PDF غير صحيحة |
429 | RATE_LIMIT_EXCEEDED | طلبات كثيرة جداً |
500 | INTERNAL_ERROR | خطأ في الخادم، يرجى إعادة المحاولة |
حدود المعدل
المستخدمون المجهولون
• 10 طلبات في الدقيقة
• 1 صفحة في اليوم
• لا توجد عمليات رفع متزامنة
المستخدمون المصادقون
• 60 طلباً في الدقيقة
• على أساس الرصيد (يعتمد على الخطة)
• ما يصل إلى 5 عمليات رفع متزامنة
رؤوس حد المعدل: تتضمن جميع الاستجابات رؤوس X-RateLimit-Limit و X-RateLimit-Remaining و X-RateLimit-Reset.
أمثلة كود كاملة
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);
?>