Bank Statement Analysis
Banking & CreditTurn PDF statements into categorised transactions, income and risk indicators.
Upload bank statements, or fetch them with consent, and receive parsed transactions, categorised inflows and outflows, salary detection, EMI obligations, bounces and balance trends. Underwrite on real cash flow instead of declared income.
Endpoint
Request parameters
| Field | Type | Description |
|---|---|---|
statement_p_d_fs_with_password_if_protected
required
|
string | Statement PDFs (with password if protected) |
consent_reference_for_account_aggregator_fetch
optional
|
string | Consent reference for account-aggregator fetch |
Example request
curl -X POST https://app.emver.io/api/sandbox/v1/bank-statement-analysis \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"statement_p_d_fs_with_password_if_protected": "string",
"consent_reference_for_account_aggregator_fetch": "string"
}'
import requests
response = requests.post(
"https://app.emver.io/api/sandbox/v1/bank-statement-analysis",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Accept": "application/json",
},
json={
"statement_p_d_fs_with_password_if_protected": "string",
"consent_reference_for_account_aggregator_fetch": "string"
},
timeout=60,
)
response.raise_for_status()
data = response.json()
const response = await fetch("https://app.emver.io/api/sandbox/v1/bank-statement-analysis", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify({
"statement_p_d_fs_with_password_if_protected": "string",
"consent_reference_for_account_aggregator_fetch": "string"
}),
});
const data = await response.json();
$response = Http::withToken('YOUR_API_KEY')
->acceptJson()
->post('https://app.emver.io/api/sandbox/v1/bank-statement-analysis', {
"statement_p_d_fs_with_password_if_protected": "string",
"consent_reference_for_account_aggregator_fetch": "string"
});
$data = $response->json();
Replace YOUR_API_KEY and the placeholder values. Use the switch above to see production URLs.
Response
Structure · 200
{
"status": INTEGER,
"message": STRING,
"data": {
"parsed_transactions": STRING,
"categorised_inflows_and_outflows": STRING,
"detected_salary_credits_and_employer": STRING,
"e_m_i_and_loan_obligations": STRING,
"bounces_and_penalties": STRING,
"average_and_minimum_balances": STRING,
"tamper_check_result": STRING
}
}
Example · 200
{
"status": 200,
"message": "string",
"data": {
"parsed_transactions": "string",
"categorised_inflows_and_outflows": "string",
"detected_salary_credits_and_employer": "string",
"e_m_i_and_loan_obligations": "string",
"bounces_and_penalties": "string",
"average_and_minimum_balances": "string",
"tamper_check_result": "string"
}
}
Error · 4xx / 5xx
{
"status": INTEGER,
"message": STRING
}
See Errors & status codes for what each status means and which calls are billed.
About this API
Bank statements are the richest financial document a lender or employer can hold, and the hardest to read at scale. The Bank Statement Analysis API parses statements from every major bank, detects tampering, categorises transactions and computes the indicators credit and HR teams rely on.
It supports uploaded PDFs, including password-protected ones with the password supplied, and consented fetch through the account aggregator ecosystem where enabled.
Typical uses
- Personal and business lending. Income, obligations and bounces at a glance.
- Salary verification. Confirm declared salary and employer from credits.
- Tenant screening. Affordability evidence for rentals.
- Insurance underwriting. Financial stability signals for large policies.
Questions
- Can it fetch statements directly?
- With the person's consent through the account aggregator ecosystem, yes, where your organisation is enabled for it. Uploaded PDFs are supported for everyone.
- What happens to the statements after analysis?
- They are purged under your retention policy. The structured output is returned to you.