> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.ntropy.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.ntropy.com/_mcp/server.

# Bank Statements

The Bank Statements API allows you to manage and extract information from bank statements. Bank statements must be in a PDF format.

The API provides two workflows. The main [extraction](#extraction) workflow, that extracts account holder information, account information and transaction records. The
[Fast Verification](./fast-verification) workflow that quickly identifies key details about the 
institution and the account holder by looking at the beginning of the bank statement.


# Extraction
The extraction process of bank statement information is an asynchronous operation with the following stages that are
encoded in the `status` attribute:

| Status       | Description                                                                        |
|--------------|------------------------------------------------------------------------------------|
| `processing` | The upload was successful and extraction is in progress.                           |
| `completed`  | The extraction was successful, you may fetch the results.                          |
| `error`      | An error occurred during extraction. Check the field `error` for more information. |

## Submit a bank statement
When you submit a bank statement you will receive an identifier of the bank statement `id` that you can later use
to check its `status` or to fetch the extraction results once they're ready. 

<EndpointRequestSnippet endpoint="POST /v3/bank_statements" />
<Accordion title="See the full raw output">
    <EndpointResponseSnippet endpoint="POST /v3/bank_statements" />
</Accordion>


## Webhooks

In production environments, we strongly recommend
that you integrate with the bank statements API via [webhooks](./webhooks). 

Whenever there's a `status` change (with the exception of the initial `processing` status) the webhook
will be called with the bank statement resource. Each event includes an event type, allowing you to easily categorize
and handle different status updates.

## Polling

If you're unable to integrate via webhooks, you can also *poll* for changes in the bank statements that you have 
submitted.

<EndpointRequestSnippet endpoint="GET /v3/bank_statements/{id}/results" />
<Accordion title='See the full raw output'>
    <EndpointResponseSnippet endpoint="GET /v3/bank_statements/{id}/results" />
</Accordion>


# Enriching transactions

Once you have the transactions from your bank statement, you may want to submit them for enrichment.
Using the SDK, you can convert a bank statement transaction to an enrichment input transaction.

**`SDK`**

```python title="SDK"
from ntropy_sdk import SDK

sdk = SDK("cd1H...Wmhl")
results = sdk.bank_statements.results("7f8dceac-2848-472d-b5c3-55cdbaf35a9b")
txs = [
    tx.to_transaction_input(account_holder_id="35b927b6-6fda-40aa-93b8-95b47c2b2cad")
    for tx in results.accounts[0].transactions
]
batch = sdk.batches.create(
    operation="POST /v3/transactions",
    data=[tx.dict() for tx in txs],
)
```

-----------------------------------------------------