Envie a sua chave API como token Bearer no cabeçalho Authorization. Utilizamos chaves API; não existe OAuth na v1.
API de extração de extrato bancário
API REST para converter extratos bancários em PDF em JSON estruturado. 99,9%+ das transações corretamente identificadas, reembolso automático em caso de falha.
$ curl https://api.bankstatementlab.com/v1/extractions \
-H "Authorization: Bearer bsl_live_..." \
-F "file=@statement.pdf" Extração de extratos bancários
Extraia transações, saldos e metadados de qualquer PDF.
Saída JSON estruturada
Esquema previsível nas 10 línguas suportadas.
99,9%+ das transações corretamente identificadas
Os créditos são reembolsados automaticamente em caso de falha. Não são cobradas extrações falhadas.
Modos síncrono e assíncrono
Síncrono para PDFs pequenos, assíncrono + polling para lotes grandes.
Exemplos de código
Integre em qualquer língua. Exemplos abaixo.
$ 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); Formato das respostas
Os campos data, column_names e transaction_count só estão presentes quando status é igual a "completed". Caso contrário, são omitidos do JSON (ausentes, não null).
GET /v1/extractions/:id
200 OK — Extração concluída
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 — Extração em curso
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 — Extração falhada
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."
}
} Padrão de polling
Quando uma extração é executada no modo async, a resposta contém status: "processing" até o worker terminar. Verifique sempre se status é igual a "completed" ANTES de ler os campos data, transaction_count e column_names; estes são omitidos do JSON até a extração estar concluída.
Frequência de polling recomendada no cliente: 5 a 10 segundos. O worker no servidor é executado a cada 10 segundos; consultar mais depressa não acelera o resultado.
GET /v1/extractions
200 OK — Página mista (um elemento por estado)
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
} Padrão de polling
Quando uma extração é executada no modo async, a resposta contém status: "processing" até o worker terminar. Verifique sempre se status é igual a "completed" ANTES de ler os campos data, transaction_count e column_names; estes são omitidos do JSON até a extração estar concluída.
Frequência de polling recomendada no cliente: 5 a 10 segundos. O worker no servidor é executado a cada 10 segundos; consultar mais depressa não acelera o resultado.
Concebida para
Automação contabilística
Importe extratos de clientes diretamente para o seu pipeline de contabilidade.
Due diligence de empréstimos
Verifique a receita e o fluxo de caixa dos extratos bancários do requerente.
Aplicações de finanças pessoais
Permita que os utilizadores liguem os seus extratos sem introdução manual de dados.
Mesmos créditos, web + API
1 crédito = 1 página. Os créditos são partilhados com o plano Pro ou Business; não existe um mínimo separado para a API.
Ver preços →Perguntas frequentes
Comece a construir hoje
O nível gratuito inclui 5 créditos. Não é necessário cartão de crédito.
Obtenha a sua chave API