본문 바로가기

Bank statement extraction API

REST API to convert PDF bank statements into structured JSON. 99% accuracy, auto-refunded on failure.

$ curl https://api.bankstatementlab.com/v1/extractions \
  -H "Authorization: Bearer bsl_live_..." \
  -F "file=@statement.pdf"

Bank statements extraction

Extract transactions, balances and metadata from any PDF.

Structured JSON output

Predictable schema across 10 supported languages.

99% accuracy

Auto-refunded on failure. No charge for failed extractions.

Sync & async modes

Synchronous for small PDFs, async + polling for large batches.

Code samples

Integrate in any language. Examples below.

$ curl https://api.bankstatementlab.com/v1/extractions \
  -H "Authorization: Bearer bsl_live_..." \
  -F "file=@statement.pdf"

응답 형식

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 — 혼합 페이지 (상태별로 한 항목)

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초마다 실행됩니다 — 더 빠르게 폴링해도 결과가 빨라지지 않습니다.

Built for

Accounting automation

Import client statements directly into your bookkeeping pipeline.

Lending due diligence

Verify income and cash flow from applicant bank statements.

Personal finance apps

Let users connect their statements without manual data entry.

Same credits, web + API

1 credit = 1 page. Pay per use, no monthly minimum.

See pricing →

Frequently asked questions

Send your API key as a Bearer token in the Authorization header. We use API keys — no OAuth in v1.

10 requests/second and 1,000 requests/hour per API key. Need higher limits? Contact us.

We target 99% uptime on a best-effort basis. No contractual SLA in v1 — reach out for enterprise commitments.

Failed extractions are automatically refunded to your credit balance. You only pay for successful pages.

PDF only in v1. Max 20 MB per file. Image and CSV support coming later.

English, French, Spanish, German, Italian, Portuguese, Japanese, Dutch, Korean, Hindi.

Start building today

Free tier includes 5 credits. No credit card required.

Get your API key