소개
Balanzio API를 사용하면 은행 거래 명세서 PDF를 구조화된 데이터 형식(CSV, XLSX, JSON)으로 변환할 수 있습니다. API는 OCR 처리를 통해 텍스트 기반 및 이미지 기반(스캔) PDF를 모두 지원합니다.
빠른 처리
텍스트 PDF는 몇 초, OCR은 페이지당 <30초
안전하고 GDPR 준수
24시간 후 자동 삭제
다중 은행 지원
100개 이상의 은행 지원
인증
모든 API 요청에는 Bearer 토큰을 사용한 인증이 필요합니다. Authorization 헤더에 API 키를 포함하십시오:
HTTP
Authorization: Bearer YOUR_API_KEYAPI 키를 비밀로 유지하십시오!
클라이언트 측 코드에 API 키를 노출하거나 버전 관리에 커밋하지 마십시오.
엔드포인트
기본 URL
https://api.balanzio.app/api/v1은행 거래 명세서 업로드
POST
/bank-statement처리할 하나 또는 여러 PDF 파일을 업로드하십시오. API는 PDF가 텍스트 기반인지 이미지 기반(스캔)인지 자동으로 감지합니다.
요청 매개변수
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
files | file[] | 예 | 처리할 PDF 파일 (각각 최대 3MB) |
요청 예제
curl
curl -X POST https://api.balanzio.app/api/v1/bank-statement \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "files=@statement.pdf"응답 (201 Created)
json
[
{
"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의 전체 페이지 |
처리 상태 확인
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 OK)
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 형식으로 변환하십시오.
쿼리 매개변수
| 매개변수 | 유형 | 필수 | 설명 |
|---|---|---|---|
format | string | 예 | 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 OK)
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 OK)
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_FOUND | 파일 UUID를 찾을 수 없습니다 |
413 | FILE_TOO_LARGE | 파일이 3MB 제한을 초과합니다 |
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
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);
?>