Statement Analysis - Analyze Statement
Introduction:
The Bank Statement Analysis API automates the evaluation of single or multiple bank statements to deliver actionable financial insights. By analyzing income stability, spending patterns, and transaction histories, it enables lenders to accurately assess borrower credit risk.
Key Features:
- Multi-Statement Consolidation: Process single or multiple statements to generate one unified financial report.
- Deep Financial Insights: Automatically extract and calculate key indicators, including salary, EMIs, and transaction bounces.
- Pre-Analysis Validation: Verify document recency, required banking periods, and borrower ownership before full processing.
- Comprehensive Fraud Detection: Execute 55+ backend fraud pattern checks immediately upon document upload.
- Asynchronous Callbacks: Receive webhook notifications when the analysis report is ready for download (highly recommended for production environments).
- Customizable Output Templates: Choose from 4 distinct analysis templates by passing the templateId in your request payload. (Note: Request template IDs from [email protected]).
Supported Input Methods
The API accepts documents via:
- Direct file upload
- Public File URLs
- Pre-signed File URLs
Unsupported Formats
- Merged documents - Separate bank statement PDFs merged together
- Cheque book images
- Statements missing a running balance entry after each transaction
- Statements missing the issuing bank's name
Sample Curl:
curl --location 'https://api-preproduction.signzy.app/api/v3/statementanalysis/analyze-statement' \
--header 'Content-Type: application/json' \
--header 'Authorization: <auth-token>' \
--data '{
"authToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJyYXZpbmRyYS50aG9sdWNodXJ1QHNpZ256eS5jb20iLCJyb2xlcyI6WyJVU0VSIl0sImNsaWVudCI6ImNISmxZMmx6WVY5MFpXNWhiblF5TXprMU9BPT0iLCJ0ZW5hbnRJZCI6IjIzOTU4IiwiYWNjZXNzIjoiZmFsc2UiLCJpYXQiOjE3MTY0NDI3MDgsImV4cCI6MTcxNjUyOTEwOH0.L4b1NpTqJawXxGwSC3OqOVDXa9qgB33j2KuWuB3mMag",
"files": [
{
"fileUrl": "https://files-staging.signzy.tech/api/files/5086464/download/76a32a70eec54115ab62eae5c264aca54db8b13903d847598d114dd123cc6f24.pdf"
},
{
"fileUrl": "https://files-staging.signzy.tech/api/files/5087660/download/71d450abef3a4155980ecb41fb2a49d41c0b832b1ab64819a7f9ebcd1e9t86e5.pdf",
"password": "Sample@123#"
}
],
"customerName": "John Doe",
"statementPeriod": "6m",
"recencyDate": ""19/02/2026",
"recencyPeriod": "3m"
"callbackUrl": "https://f01d3a53-59ff-4c07-b9a6-2417599d581e.mock.pstmn.io",
"templateId": "template_1"
}'Input Parameters: Content type application json flow
Parameter | Type | Description | Mandatory/Optional |
|---|---|---|---|
authToken | String | Authentication Token Generated in the Authenticate API. | Mandatory |
files | Array | List of Files that you need analysis on | Mandatory |
files[n].fileUrl | String | Bank Statement file URL. “You can generate and pass fileURL by using upload option in API or can pass the S3 bucket url” | Mandatory |
files[n].password | String | Password of the file provided | Optional |
callbackUrl | String | an open post url where data will be posted | Optional |
templateId | String | Custom Template for Report | Optional |
customerName | String | Name of the customer which has to be matched with the statement name. | Optional |
statementPeriod | String | Period of the statement can be passed as 6m, 30m, 1y, etc. | Optional |
recencyDate | String | Users can pass the recency date from where the recency has to be checked. The format should be DD/MM/YYYY | Optional |
recencyPeriod | String | User can define the period of recency. For ex: 6m, 3m | Optional |
Input Parameters: Content type Form Data Flow

Parameter | Type | Description | Mandatory/Optional |
|---|---|---|---|
files | File | Bank statement file selected from system | Mandatory |
data | Text | Analysis details in parsable json form example: {"authToken": "eyJhbGciOiJIUzI1NiJ9.eyJhY2Nlc3MiOiJmYWxzZSIsInJvbGVzIjpbI", "files":[{"fileName" :"BS_FED (1).pdf", "password": "provide password if file is password protected" },{"fileName" :"BS_FED (2).pdf"}]} | Mandatory |
data.authToken | String | Authentication Token Generated in the Authenticate API. | Mandatory |
data.files | Array | List of Files that you need analysis on | Mandatory |
data.files[n].fileName | String | fileName of selected file. | Mandatory |
data.files[n].password | String | Password of the file provided | Optional |
data.callbackUrl | String | an open post url where data will be posted | Optional |
data.templateId | String | Custom Template for Report | Optional |
customerName | String | Name of the customer which has to be matched with the statement name. | Optional |
statementPeriod | String | Period of the statement can be passed as 6m, 3m, 1y, etc. | Optional |
recencyDate | String | Users can pass the recency date from where the recency has to be checked. The format should be DD/MM/YYYY | Optional |
recencyPeriod | String | User can define the period of recency. For ex: 6m, 3m | Optional |
Sample Response:
{
"report": {
"reportId": "PR4818638733359423",
"reportName": "ca9fcfcc-e01a-4d51-9e1c-ca3c37041a9c",
"reportStatus": "IN PROGRESS",
"reportStatusDescription": "IN PROGRESS",
"reportCamStatus": "",
"reportType": "1",
"lastUpdatedOn": "2025-06-04 12:24:48",
"createdOn": "2025-06-04 12:24:48"
},
"reportAccounts": [
{
"account": {
"accountId": "1671",
"accountNumber": "17330200002493",
"ifscCode": "FDRL0001733",
"accountType": "2",
"accountTypeName": "Current Account",
"bankId": "71",
"bankName": "Federal Bank",
"status": "INITIALISING",
"statusDescription": "INITIALISING",
"camStatus": "",
"startDate": "2023-08-03",
"endDate": "2024-01-30",
"phoneNumber": "919495966402",
"jointHolderName": "",
"accountHolderName": "ZAMBROTTA RETAIL PRIVATE LIMITED",
"micrCode": "695049022",
"branchAddress": "",
"branchName": "",
"panNumber": "",
"email": "[email protected]",
"customerAddress": "D 57 KRISHNA KRIPA PERUR NAGAR, AMBALAMUKKU, , KERALA, INDIA-695005.",
"accountOpeningDate": "",
"verifiedAccount": "2",
"analysisStartDate": "",
"analysisEndDate": "",
"analysisPeriod": "",
"transactionStartDate": "",
"transactionEndDate": "",
"currency": "INR",
"currencyFormat": "##,##,###.##",
"accountStatus": "",
"additionalData": {
"accountSubType": "Current Account"
},
"accountReferenceNumber": "PARN1671",
"lastModifiedDate": "2025-06-04 06:54:48"
},
"fileDetails": {
"accountId": 1671,
"accountReferenceNumber": "PARN1671",
"success": [
{
"fileId": 4774,
"status": "INITIALISING",
"originalName": "6c8b3bb67a241c67a420154062fa5db4.pdf",
"documentType": "BANK_STATEMENT",
"password": "",
"creatorName": "",
"producerName": "",
"statusDescription": ""
}
],
"failed": []
}
},
{
"account": {
"accountId": "1672",
"accountNumber": "XXXXXXXX2910",
"ifscCode": "",
"accountType": "1",
"accountTypeName": "Savings Account",
"bankId": "9",
"bankName": "ICICI Bank",
"status": "INITIALISING",
"statusDescription": "INITIALISING",
"camStatus": "",
"startDate": "2022-10-01",
"endDate": "2022-10-31",
"phoneNumber": "",
"jointHolderName": "",
"accountHolderName": "RESGB",
"micrCode": "",
"branchAddress": "",
"branchName": "",
"panNumber": "",
"email": "",
"customerAddress": "",
"accountOpeningDate": "",
"verifiedAccount": "2",
"analysisStartDate": "",
"analysisEndDate": "",
"analysisPeriod": "",
"transactionStartDate": "",
"transactionEndDate": "",
"currency": "INR",
"currencyFormat": "##,##,###.##",
"accountStatus": "",
"additionalData": {
"accountSubType": "Savings Account"
},
"accountReferenceNumber": "PARN1672",
"lastModifiedDate": "2025-06-04 06:54:48"
},
"fileDetails": {
"accountId": 1672,
"accountReferenceNumber": "PARN1672",
"success": [
{
"fileId": 4775,
"status": "INITIALISING",
"originalName": "b7130f4754dc4ec521f6120b20510571.pdf",
"documentType": "BANK_STATEMENT",
"password": "390401502910",
"creatorName": "",
"producerName": "",
"statusDescription": ""
}
],
"failed": []
}
}
],
"reportGst": [],
"reportCreditBureaus": []
}Output Parameters:
Parameter | Type | Description |
|---|---|---|
report | Object | Contains the overall report information. |
report.reportId | String | Unique identifier for the report. |
report.reportName | String | The internal name of the report. |
report.reportStatus | String | This shows the status of the report. The status of a report changes till it reaches the last status. The possible status for a report can be one of the following
|
report.reportStatusDescription | String | This shows detailed information about accounts in the report with status. A possible status description for a report can be one of the following
|
report.reportCamStatus | String | This shows the status of the CAM report. Possible CAM status for a report can be one of the following
|
report.reportType | String | Type of report (e.g., "1"). |
report.lastUpdatedOn | String | Date and time the report was last updated in YYYY-MM-DD HH:MM: SS format. |
report.createdOn | String | Date and time the report was created in YYYY-MM-DD HH:MM: SS format. |
reportAccounts | Array of Objects | List of accounts included in the report. |
reportAccounts[i].account | Object | Details of a specific account. |
reportAccounts[i].account.accountId | String | Unique identifier for the account. |
reportAccounts[i].account.accountNumber | String | Account number (e.g., "6012XXXXXXX4312"). |
reportAccounts[i].account.ifscCode | String | The IFSC code of the bank to which the account belongs. |
reportAccounts[i].account.accountType | String | Account type code (e.g., "1" for Savings Account, "2" for Current Account). |
reportAccounts[i].account.accountTypeName | String | Name of the account type (e.g., "Savings Account"). |
reportAccounts[i].account.bankId | String | Unique identifier for the bank. |
reportAccounts[i].account.bankName | String | Name of the bank (e.g., "State Bank of India"). |
reportAccounts[i].account.status | String | Status of the created account. The possible status for the account can be the following
|
reportAccounts[i].account.statusDescription | String | Detailed information about the status of the created account with CAM report status. Possible status description for the account can be the following
|
reportAccounts[i].account.camStatus | String | Status of the CAM report of an account. Possible CAM status for the account can be the following
|
reportAccounts[i].account.startDate | String | The start date of the account data is included in the report (YYYY-MM-DD). |
reportAccounts[i].account.endDate | String | The end date of the account data is included in the report (YYYY-MM-DD). |
reportAccounts[i].account.phoneNumber | String | Phone Number extracted from bank statement. |
reportAccounts[i].account.jointHolderName | String | Joint account holder name extracted from bank statement. |
reportAccounts[i].account.accountHolderName | String | Account holder extracted from bank statement. |
reportAccounts[i].account.micrCode | String | MICR code extracted from the bank statement. |
reportAccounts[i].account.branchAddress | String | The branch address was extracted from the statement. |
reportAccounts[i].account.branchName | String | Branch name extracted from the statement. |
reportAccounts[i].account.panNumber | String | Pan number extracted from the statement. |
reportAccounts[i].account.email | String | Email address extracted from the statement. |
reportAccounts[i].account.customerAddress | String | Customer address extracted from the statement. |
reportAccounts[i].account.accountOpeningDate | String | Account opening date extracted from the statement. |
reportAccounts[i].account.verifiedAccount | String | Verification status of the account (e.g., "2"). |
reportAccounts[i].account.analysisStartDate | String | Custom analysis start date. |
reportAccounts[i].account.analysisEndDate | String | Custom analysis end date. |
reportAccounts[i].account.analysisPeriod | String | Analysis Period of the Bank Statement |
reportAccounts[i].account.transactionStartDate | String | Transaction Start Date |
reportAccounts[i].account.transactionEndDate | String | Transaction End Date. |
reportAccounts[i].account.currency | String | Currency code (e.g., "INR"). |
reportAccounts[i].account.currencyFormat | String | Format string for displaying currency values (e.g., "##,##,###.##"). |
reportAccounts[i].account.accountStatus | String | Status of the Account |
reportAccounts[i].account.accountReferenceNumber | String | Unique reference number for the account within the report (e.g., "PARN144"). |
reportAccounts[i].account.lastModifiedDate | Date and time | Last Modified Date of the report |
reportAccounts[i].fileDetails | Object | Contains the details about the files associated with each account |
reportAccounts[i].fileDetails.accountId | Number | Account id to which the file belongs. |
reportAccounts[i].fileDetials.accountReferenceNumber | String | The account reference number to which the file belongs. |
reportAccounts[i].fileDetails.success.fileId | Number | Id of the file. |
reportAccounts[i].fileDetails.success.status | String | Status of the file. Possible statuses of a file could be
|
reportAccounts[i].fileDetails.success.originalName | String | The file name of Temporary unlocked pdf version. |
reportAccounts[i].fileDetails.success.documentType | String | Type of file uploaded. Possible values could be
|
reportAccounts[i].fileDetails.success.password | String | The password is provided while creating the account. |
reportAccounts[i].fileDetails.success.creatorName | String | Creator of the file uploaded. |
reportAccounts[i].fileDetails.success.producerName | String | Producer of the file uploaded. |
reportAccounts[i].fileDetails.success.statusDescription | String | Description of file status. |
reportAccounts[i].fileDetails.failed.originalName | String | The original name of the file has been uploaded. |
reportAccounts[i].fileDetails.failed.errorMessage | String | Error reason for the failure of file. The possible error messages could be 'Password required', 'Incorrect password', or 'Incorrect bank statement'. |
reportGst | Array | Contains a list of GST details. |
reportCreditBureaus | Array | Contains a list of credit bureau details |
Status Codes:
{
"error": {
"name": "error",
"message": "Internal Server Error",
"status": 500,
"reason": "ERROR",
"type": "Internal Server Error",
"statusCode": 500
}
}