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초마다 실행되므로 더 자주 폴링해도 결과가 빨라지지 않습니다.
다음을 위해 제작됨
회계 자동화
고객의 은행 거래내역서를 장부 처리 파이프라인으로 바로 가져옵니다.
대출 실사
신청자 은행 거래내역서에서 소득과 현금 흐름을 확인합니다.
개인 금융 앱
사용자가 데이터를 직접 입력하지 않고 은행 거래내역서를 연결할 수 있습니다.
자주 묻는 질문
API 키당 10 요청/초 및 1,000 요청/시간. 더 높은 한도가 필요하십니까? 저희에게 연락하세요.
베스트 에포트 기준으로 99% 가동률을 목표로 합니다. v1에는 계약상 SLA가 없습니다. Enterprise 수준의 보장이 필요하면 문의하세요.
실패한 추출은 자동으로 귀하의 크레딧 잔액으로 환불됩니다. 성공적인 페이지에 대해서만 비용을 지불합니다.
v1에서는 PDF만 가능합니다. 파일당 최대 20MB. 이미지 및 CSV는 나중에 지원될 예정입니다.
영어, 프랑스어, 스페인어, 독일어, 이탈리아어, 포르투갈어, 일본어, 네덜란드어, 한국어, 힌디어.