PDF Flow
The PDF Flow is for clients whose journey starts from a bank-statement PDF. You upload the statement with a single API call, and Signal IQ takes care of parsing, checks, ingestion, insights generation and output delivery.
The correlation id for this flow is the uploadId, returned by the upload API. Every webhook you receive for a statement carries the same uploadId, so persist it.
Upload
You upload a bank-statement PDF with a single API call. On success you receive an uploadId immediately.
See API Reference - PDF APIs for the full request, response, and error contract.
What happens inside
Once the upload is accepted, Signal IQ moves through these stages. You are kept informed at each important step via webhook (see Notifications below).
- Parse - the statement is parsed. If parsing fails, the flow ends and you receive
PDF_PARSE_FAILED. - Fraud check - a separate fraud gate runs. If it blocks, nothing enters Setu Insights and you receive
PDF_FRAUD_DETECTED. - Statement validation - a separate statement-validation gate runs. If it blocks, nothing enters Setu Insights and you receive
STATEMENT_VALIDATION_FAILED. - PDF parse success - if both gates pass, parsing succeeded (
PDF_PARSE_SUCCESS). - Data block creation - the parsed data is prepared for analysis inside Setu Insights (
FI_DATA_BLOCK_CREATION_SUCCESS). - Insights generation started - the insights job is accepted (
INSIGHTS_CREATION_STARTED). AreportIdis issued at this stage. - Insights generation success / failure - the report is produced (
INSIGHTS_CREATION_SUCCESSFUL), or the failure is reported (INSIGHTS_CREATION_FAILED). - Report availability - on success, use the
reportIdfrom the webhook to fetch your configured outputs.
Fraud and statement validation are two separate gates. Details for each are in Fraud gate and Statement-validation gate below.
Notifications you receive
Every notification is delivered as an HTTP POST to your configured webhook URL, and is wrapped in the same envelope. The correlation field in this flow is uploadId.
{
"type": "AUTO_DI_STATUS",
"data": {
"status": "<STAGE_STATUS>",
"uploadId": "fb12d1a2-1e5c-4c63-aa54-d5f1d2ec19af"
}
}Full catalogue
| # | Stage | data.status | Terminal |
|---|---|---|---|
| 1 | Parse failed | PDF_PARSE_FAILED | Yes |
| 2 | Fraud blocked | PDF_FRAUD_DETECTED | Yes |
| 3 | Validation blocked | STATEMENT_VALIDATION_FAILED | Yes |
| 4 | PDF parse success | PDF_PARSE_SUCCESS | No |
| 5 | Data block created | FI_DATA_BLOCK_CREATION_SUCCESS | No |
| 6 | Insights started | INSIGHTS_CREATION_STARTED | No |
| 7 | Insights done | INSIGHTS_CREATION_SUCCESSFUL | Yes |
| 8 | Insights failed | INSIGHTS_CREATION_FAILED | Yes |
Treat INSIGHTS_CREATION_SUCCESSFUL as terminal success, and statuses 1, 2, 3 and 8 as terminal failures.
Notification error codes
Structured errorCode / errorMessage appear on terminal failure webhooks such as PDF_PARSE_FAILED. Fraud and statement-validation blocks do not use BSP codes.
On PDF_PARSE_FAILED
| Code | Meaning | Recommended action |
|---|---|---|
BSP-105 | Bank format could not be detected | Verify or omit bankName, then resubmit |
BSP-201 | Scanned PDF - no OCR path available | Retry later or contact support |
BSP-202 | No transactions found in expected date range | Verify the statement is non-empty / correct period |
BSP-203 | Insufficient customer data | Use a complete statement with account holder info |
BSP-204 | Analysis on hold (cannot be retried automatically) | Resubmit. Contact support if it recurs |
BSP-205 | Processing timed out | Resubmit |
BSP-206 | All parsing paths unavailable / failed at submit | Retry after a short delay |
BSP-501 | Internal error during parsing | Contact support with uploadId |
BSP-502 | Parsing path unhealthy or unavailable | Retry after a short delay |
Examples of every schema
{
"type": "AUTO_DI_STATUS",
"data": {
"status": "PDF_PARSE_FAILED",
"uploadId": "fb12d1a2-1e5c-4c63-aa54-d5f1d2ec19af",
"errorCode": "BSP-105",
"errorMessage": "Unable to detect bank statement format. Please verify the bank name and resubmit."
}
}{
"type": "AUTO_DI_STATUS",
"data": {
"status": "PDF_FRAUD_DETECTED",
"uploadId": "fb12d1a2-1e5c-4c63-aa54-d5f1d2ec19af",
"fraudSignals": {
"overall": "IRREGULARITY_DETECTED",
"checks": [],
"vendorScore": null
}
}
}{
"type": "AUTO_DI_STATUS",
"data": {
"status": "STATEMENT_VALIDATION_FAILED",
"uploadId": "fb12d1a2-1e5c-4c63-aa54-d5f1d2ec19af",
"statementValidation": {
"status": "FAIL",
"issues": []
}
}
}{
"type": "AUTO_DI_STATUS",
"data": {
"status": "PDF_PARSE_SUCCESS",
"uploadId": "fb12d1a2-1e5c-4c63-aa54-d5f1d2ec19af"
}
}{
"type": "AUTO_DI_STATUS",
"data": {
"status": "FI_DATA_BLOCK_CREATION_SUCCESS",
"uploadId": "fb12d1a2-1e5c-4c63-aa54-d5f1d2ec19af",
"dataIds": ["a1b2c3d4-e5f6-7890-abcd-ef1234567890"]
}
}{
"type": "AUTO_DI_STATUS",
"data": {
"status": "INSIGHTS_CREATION_STARTED",
"uploadId": "fb12d1a2-1e5c-4c63-aa54-d5f1d2ec19af",
"reportId": "7f3e4d5c-1111-2222-3333-444455556666"
}
}{
"type": "AUTO_DI_STATUS",
"data": {
"status": "INSIGHTS_CREATION_SUCCESSFUL",
"uploadId": "fb12d1a2-1e5c-4c63-aa54-d5f1d2ec19af",
"reportId": "7f3e4d5c-1111-2222-3333-444455556666"
}
}{
"type": "AUTO_DI_STATUS",
"data": {
"status": "INSIGHTS_CREATION_FAILED",
"uploadId": "fb12d1a2-1e5c-4c63-aa54-d5f1d2ec19af",
"errorCode": "BSP-501",
"errorMessage": "Insights computation failed. Please contact support with the uploadId."
}
}Step-by-step notifications are configurable per client. They can be switched off entirely, or limited to specific stages. This is set up during onboarding.
Webhook delivery
When Signal IQ posts a notification to your webhook, handlers must be idempotent and key off uploadId.
| Your webhook responds | Behaviour |
|---|---|
2xx | Delivered - the flow continues |
4xx | Treated as a config or auth problem - not retried |
5xx / timeout / network error | Retried up to 3 times with exponential backoff. If those still fail, retried once more at end of day |
Fraud gate
Blocks when fraudSignals.overall is FRAUD or IRREGULARITY_DETECTED. Notification: PDF_FRAUD_DETECTED. Nothing is ingested into Setu Insights.
The raw fraudSignals object is forwarded so you can apply your own risk policy.
| overall value | Meaning | Does Signal IQ block? |
|---|---|---|
FRAUD | Fraud checks concluded the statement shows fraud indicators | Yes - terminal PDF_FRAUD_DETECTED |
IRREGULARITY_DETECTED | Fraud checks found irregularities or anomalies that are not a clean pass. Treat this as a risk signal, not necessarily conclusive fraud | Yes - terminal PDF_FRAUD_DETECTED |
- Signal IQ treats
FRAUDandIRREGULARITY_DETECTEDthe same for this flow: both stop processing before insights. - The webhook still includes the full
fraudSignalsobject (overall,checks,vendorScore) so you can handle the two values differently in your own systems if needed. - If
overallis neither value above, the fraud gate does not block. checksis an array of individual check results when present.vendorScoremay be a number ornull- use it only as supporting context.
Statement-validation gate
Blocks when statementValidation is present and statementValidation.status is not PASS. Notification: STATEMENT_VALIDATION_FAILED. Nothing is ingested into Setu Insights.
The raw statementValidation object is forwarded so you can apply your own risk policy.
A missing statementValidation field is not treated as a failure. The statement-validation gate only blocks when the object is present and its status is not PASS.
Getting your outputs
On INSIGHTS_CREATION_SUCCESSFUL, use the reportId from the webhook to fetch your configured outputs. See the API reference for how to fetch results.
See how Signal IQ works when you already have your own financial data.
NextBring Your Own FI Data