توثيق API

مرجع كامل لتكامل API تحويل كشوف الحسابات البنكية Balanzio

مقدمة

يتيح لك API Balanzio تحويل كشوف الحسابات البنكية بصيغة PDF إلى تنسيقات بيانات منظمة (CSV، XLSX، JSON). يدعم API الخاص بنا كلاً من ملفات PDF النصية والمستندة إلى الصور (الممسوحة ضوئياً) مع معالجة OCR.

معالجة سريعة

ملفات PDF النصية في ثوانٍ، OCR في <30 ثانية لكل صفحة

آمن ومتوافق مع GDPR

حذف تلقائي بعد 24 ساعة

دعم متعدد البنوك

أكثر من 100 بنك مدعوم

المصادقة

تتطلب جميع طلبات API المصادقة باستخدام رمز Bearer. قم بتضمين مفتاح API الخاص بك في رأس التفويض:

HTTP
Authorization: Bearer YOUR_API_KEY
احتفظ بمفتاح API الخاص بك سرياً!

لا تكشف أبداً عن مفتاح API الخاص بك في كود جانب العميل أو تضعه في نظام التحكم بالإصدارات.

نقاط النهاية

URL الأساسي

https://api.balanzio.app/api/v1

رفع كشف حساب بنكي

POST
/bank-statement

قم برفع ملف PDF واحد أو عدة ملفات للمعالجة. سيكتشف API تلقائياً ما إذا كان PDF نصياً أو مستنداً إلى صورة (ممسوح ضوئياً).

معاملات الطلب

المعاملالنوعمطلوبالوصف
filesfile[]نعمملف (ملفات) PDF للمعالجة (3 ميجابايت كحد أقصى لكل منها)

مثال على الطلب

curl
curl -X POST https://api.balanzio.app/api/v1/bank-statement \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "files=@statement.pdf"

الاستجابة (201 تم الإنشاء)

json
[
  {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "filename": "statement.pdf",
    "pdfType": "TEXT_BASED",
    "state": "READY",
    "numberOfPages": 3
  }
]

حقول الاستجابة

الحقلالنوعالوصف
uuidstringمعرف فريد للملف المرفوع
filenamestringاسم الملف الأصلي
pdfTypestringTEXT_BASED أو IMAGE_BASED
statestringREADY (نص) أو PROCESSING (OCR)
numberOfPagesnumberإجمالي الصفحات في PDF

التحقق من حالة المعالجة

POST
/bank-statement/status

تحقق من حالة معالجة الملفات المرفوعة. استخدم نقطة النهاية هذه للاستعلام عن اكتمال OCR.

مثال على الطلب

curl
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 موافق)

json
[
  {
    "uuid": "550e8400-e29b-41d4-a716-446655440000",
    "filename": "statement.pdf",
    "pdfType": "IMAGE_BASED",
    "state": "COMPLETED",
    "numberOfPages": 3,
    "progress": 100
  }
]

التحويل إلى تنسيق

POST
/bank-statement/convert

تحويل الكشوف المعالجة إلى تنسيق CSV أو XLSX أو JSON.

معاملات الاستعلام

المعاملالنوعمطلوبالوصف
formatstringنعمCSV أو XLSX أو JSON

مثال على الطلب (CSV)

curl
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
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)

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

POST
/bank-statement/set-password

توفير كلمة مرور لملفات PDF المحمية بكلمة مرور.

مثال على الطلب

curl
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 موافق)

json
{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "state": "READY",
  "passwordSet": true
}

الحصول على معلومات المستخدم

GET
/user

استرداد معلومات المستخدم الحالية، بما في ذلك الرصيد وتفاصيل الخطة.

مثال على الطلب

curl
curl -X GET https://api.balanzio.app/api/v1/user \
  -H "Authorization: Bearer YOUR_API_KEY"

الاستجابة (200 موافق)

json
{
  "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 مع رمز خطأ ورسالة:

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_FOUNDUUID الملف غير موجود
413
FILE_TOO_LARGEالملف يتجاوز حد 3 ميجابايت
422
PASSWORD_REQUIREDPDF محمي بكلمة مرور
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

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

javascript
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
<?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);
?>

تحتاج مساعدة؟

الدعم

فريق الدعم لدينا هنا لمساعدتك على التكامل بنجاح.

مجموعة Postman

قم بتنزيل مجموعة Postman الخاصة بنا لاختبار جميع نقاط النهاية بسهولة.