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
10 pedidos por segundo e 1.000 pedidos por hora por chave API. Precisa de limites superiores? Contacte-nos.
O nosso objetivo é uma disponibilidade de 99% segundo o princípio do melhor esforço. A v1 não inclui um SLA contratual; contacte-nos para acordar compromissos empresariais.
Os créditos das extrações falhadas são repostos automaticamente no seu saldo. Só paga pelas páginas processadas com sucesso.
PDF apenas na v1. Máximo de 20 MB por ficheiro. Suporte para imagem e CSV em breve.
Inglês, francês, espanhol, alemão, italiano, português, japonês, holandês, coreano, hindi.
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