Authorization 헤더에 API 키를 Bearer 토큰으로 보냅니다. 우리는 API 키를 사용합니다. v1에서는 OAuth가 없습니다.
은행 거래내역서 추출
모든 PDF에서 거래, 잔액, 메타데이터를 추출하세요.
구조화된 JSON 출력
지원되는 10개 언어에서 일관된 스키마를 제공합니다.
거래의 99.9% 이상을 정확히 식별
실패시 자동 환불됩니다. 추출 실패 시 비용이 청구되지 않습니다.
동기 및 비동기 모드
작은 PDF의 경우 동기식, 대규모 배치의 경우 비동기 + 폴링입니다.
코드 샘플
원하는 언어로 연동하세요. 아래 예제를 참고하세요.
$ 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); 응답 형식
data, column_names 및 transaction_count 필드는 status가 "completed"일 때만 존재합니다. 그 외에는 JSON에서 생략됩니다(null이 아니라 필드 자체가 없습니다).
GET /v1/extractions/:id
200 OK — 추출 완료
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 — 추출 실행 중
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 — 추출 실패
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."
}
} 폴링 패턴
추출이 비동기 모드로 실행되면 서버 작업이 끝날 때까지 응답에 status: "processing"이 포함됩니다. data, transaction_count 및 column_names 필드를 읽기 전에 반드시 status가 "completed"인지 확인하세요. 추출이 완료될 때까지 이 필드들은 JSON에서 생략됩니다.
권장 클라이언트 폴링 주기는 5~10초입니다. 서버 작업은 10초마다 실행되므로 더 자주 폴링해도 결과가 빨라지지 않습니다.
GET /v1/extractions
200 OK — 혼합 페이지(상태별 요소 1개)
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
} 폴링 패턴
추출이 비동기 모드로 실행되면 서버 작업이 끝날 때까지 응답에 status: "processing"이 포함됩니다. data, transaction_count 및 column_names 필드를 읽기 전에 반드시 status가 "completed"인지 확인하세요. 추출이 완료될 때까지 이 필드들은 JSON에서 생략됩니다.
권장 클라이언트 폴링 주기는 5~10초입니다. 서버 작업은 10초마다 실행되므로 더 자주 폴링해도 결과가 빨라지지 않습니다.
다음을 위해 제작됨
회계 자동화
고객의 은행 거래내역서를 장부 처리 파이프라인으로 바로 가져옵니다.
대출 실사
신청자 은행 거래내역서에서 소득과 현금 흐름을 확인합니다.
개인 금융 앱
사용자가 데이터를 직접 입력하지 않고 은행 거래내역서를 연결할 수 있습니다.