For bank statement API integration, webhooks are the preferred pattern for most production workloads: they deliver parsed results and fraud scores the moment processing completes (typically 3–30 seconds), eliminate wasted polling requests, and scale to hundreds of concurrent jobs without hitting rate limits. Polling remains a valid fallback for firewall-restricted environments or simple low-volume prototypes.
What you'll learn
- Webhooks deliver bank statement parsing results with near-zero latency after completion, while polling adds up to one full polling interval of delay
- At 500 concurrent statements polled every 2 seconds, status checks generate 15,000 requests per minute before any parse jobs are submitted — webhooks reduce this overhead to zero
- Webhook handlers for financial data must implement idempotency using the event_id field to prevent duplicate transaction records from retry deliveries
- HMAC-SHA256 signature verification using timing-safe comparison is mandatory before processing any webhook payload containing bank statement data
- A hybrid pattern — webhooks as primary, background polling sweep as fallback — provides webhook-level efficiency with polling-level reliability for environments with firewall restrictions
For bank statement API integration, webhooks are the preferred pattern for most production workloads: they deliver parsed results and fraud scores the moment processing completes (typically 3–30 seconds), eliminate wasted polling requests, and scale to hundreds of concurrent jobs without hitting rate limits. Polling remains a valid fallback for firewall-restricted environments or simple low-volume prototypes.
The Core Problem: Bank Statement Processing Is Asynchronous
Bank statement parsing isn't instantaneous. Depending on statement length, format complexity, and whether a fraud review is triggered, processing can take anywhere from 3 to 30 seconds. That variability isn't a bug — it's the nature of the work.
Unlike a synchronous REST call that returns data the moment the server responds, a parse job is a background task. The API accepts your document, queues the job, and completes it later. Your application needs a strategy for finding out when "later" arrives.
That strategy is your integration pattern — and the wrong choice has real consequences: wasted API calls, blown rate limits, missed fraud alerts, or unnecessarily complex infrastructure. If you're handling batch processing bank statements at any real volume, the pattern you choose shapes everything downstream.
Why You Can't Just Wait for the Response
The simplest mental model — submit a document, wait for the parsed data to come back — breaks down quickly. HTTP connections have timeouts. A 15-second processing job will breach most client or load balancer timeout thresholds before the response arrives.
Long-running open connections also consume server resources on both ends. Background job architecture exists precisely to avoid this: ClearStaq returns a job_id immediately after accepting your document, not the parsed data. The actual work happens asynchronously in the processing queue.
The Two Standard Solutions: Push vs. Pull
Once you accept that results arrive later, you have two options for finding out when they're ready:
- Pull (polling): Your system periodically asks the API "is this job done yet?" by hitting a status endpoint on a timer.
- Push (webhooks): The API notifies your endpoint the moment the job completes — no asking required.
Both patterns are valid. The right choice depends on your infrastructure, your volume, and how quickly you need results. The rest of this guide gives you everything you need to decide — and implement — both.
What Is Polling? (And Why It's the Default Choice)
Polling means sending periodic GET requests to a job status endpoint to check whether processing has finished. It's the path of least resistance for most developers because it requires no public-facing infrastructure and works immediately behind corporate firewalls.
There are two flavors worth understanding for document processing workflows:
- Short polling: Fixed-interval requests (every 2 seconds, for example). Simple to implement, but generates significant wasted traffic when jobs take longer than a few seconds.
- Long polling: The request stays open until the server has a result or a timeout occurs. Reduces wasted request count but increases server connection overhead and requires careful timeout handling.
For ClearStaq's job status endpoint, which returns granular states — queued → processing → fraud_review → complete → failed — short polling with exponential backoff is the recommended approach. Those granular states let you build precise progress UIs without over-polling.
Short Polling vs. Long Polling for Document Jobs
Consider a 15-second processing job polled at 2-second intervals. Before you get a result, you've made roughly 7 status requests that returned nothing useful. For a handful of jobs, this is fine. At scale, it becomes a serious problem.
Long polling reduces that wasted count but introduces complexity: you need persistent connection management, server-side timeout handling, and careful error recovery when connections drop mid-wait. For most document processing integrations, the tradeoff doesn't favor long polling over a well-tuned short polling implementation with exponential backoff.
The recommended polling strategy for ClearStaq: start at a 3-second interval and double each unsuccessful poll, up to a 30-second maximum. This balances responsiveness with efficiency across the full range of processing times.
The Rate Limit Problem at Scale
Polling feels manageable until the volume climbs. Consider 500 concurrent statements polled every 2 seconds. That's 15,000 GET requests per minute — before a single parse job is submitted. Most document processing APIs enforce rate limits that polling at this frequency will exhaust quickly.
Each wasted status check consumes quota that could be used for submitting new parse jobs or fetching completed results. For strategies to manage this, see our guide on API rate limit optimization under peak loads. The short version: at meaningful scale, polling is structurally incompatible with efficient API quota usage.
What Are Webhooks? (And Why They're Usually Better)
A webhook is an HTTP POST sent by the API to a URL you control, fired the moment an event occurs. For bank statement processing, that event is job completion. Your endpoint receives the result the instant it's ready — no polling loop, no wasted requests, no rate limit pressure.
The push model is more efficient by design. Your system only receives traffic when there's something to receive. At 500 concurrent jobs, that's 500 HTTP POSTs to your endpoint. The same volume with 2-second polling generates 15,000 requests per minute, as noted above.
For real-time fraud alerts via webhooks, the advantage is even sharper. ClearStaq can fire a fraud alert event the moment a high-confidence signal is detected during parsing — before full document processing is complete. That's sub-second alert delivery to your underwriting dashboard, which no polling interval can match.
The one genuine limitation: webhooks require a publicly accessible HTTPS endpoint. That's a reasonable infrastructure requirement for any production system, but it does rule out polling's "works behind any firewall" simplicity.
How a Bank Statement Webhook Payload Is Structured
One of the most underappreciated advantages of webhooks for document processing is payload completeness. Where polling returns only a status code — requiring a follow-up GET to retrieve the actual data — a ClearStaq job.completed webhook delivers everything in a single event.
A representative payload includes:
event_type— e.g.,job.completedevent_id— unique identifier for this delivery (critical for idempotency)job_id— the job identifier returned when the document was submitteddocument— metadata (filename, page count, detected bank format)transactions[]— parsed transaction array with date, description, amount, and category for each line itemsummary— aggregate metrics: average daily balance, total deposits, total withdrawals, NSF countfraud_score— overall risk score plus individualsignals[]with type, confidence, and description
The payload conforms to the JSON RFC 8259 specification. For a detailed breakdown of what structured bank statement data looks like after parsing, our developer guide covers the full field reference.
Real-Time Fraud Alert Webhooks
ClearStaq fires fraud alert events as signals are detected during parsing — not only after the full document is processed. This distinction matters in underwriting workflows.
When a high-confidence fraud signal surfaces partway through parsing a 90-day statement, the fraud.alert event fires immediately. An underwriter's dashboard can flag the application for priority review within seconds of upload, rather than waiting for complete processing to finish.
Fraud alert webhooks and job completion webhooks are separate event types. Your system can subscribe to each independently — subscribing to fraud.alert for your review queue and job.completed for your data pipeline are independent concerns.
Webhook vs. Polling: Side-by-Side Comparison
The table below covers the dimensions that matter most for a bank statement processing integration. Use it to frame the decision for your team or stakeholders.
| Dimension | Polling | Webhooks |
|---|---|---|
| Result latency | Up to one polling interval after completion | Near-zero after processing completes |
| Wasted requests | High — multiple status checks per job | Zero — push fires once on completion |
| Rate limit impact | Significant — status checks consume quota | None — no outbound requests generated |
| Implementation complexity | Low — add a timer loop and status check | Medium — requires endpoint, signature verification, idempotency |
| Infrastructure required | No public endpoint needed | Public HTTPS endpoint required |
| Scalability | Degrades — linear increase in requests with volume | Scales cleanly — one POST per job regardless of volume |
| Fraud alert delivery | Delayed by polling interval | Real-time, fires on signal detection |
| Security surface | Outbound connections only | Inbound endpoint — requires signature verification |
| Payload completeness | Status only — follow-up GET required for data | Full parsed result in one event |
Decision Matrix: Which Pattern Fits Your Team?
Your optimal choice depends on team size, daily volume, and infrastructure constraints. Here's a practical decision framework:
| Profile | Volume | Recommended Pattern |
|---|---|---|
| Solo developer / prototype | Under 50 statements/day | Polling — faster to ship, acceptable overhead |
| Small team / growing integration | 50–500 statements/day | Webhooks strongly recommended |
| Enterprise / production lending system | 500+ statements/day | Webhooks required; polling as fallback only |
| Legacy bank / credit union tech stack | Any volume | Hybrid pattern (see section below) |
If you need real-time fraud alerts at any volume, webhooks are required — polling simply can't deliver sub-second alert latency.
When to Use Polling for Bank Statement Processing
Polling is the right choice in specific, well-defined situations. Using it in the wrong context just creates avoidable problems.
Use polling when:
- A public-facing webhook endpoint isn't feasible — common in internal tools, air-gapped environments, or environments with strict inbound firewall rules
- You're in local development or testing — polling against localhost is trivial; webhook testing requires tunnel tools like ngrok
- Volume is genuinely low (under 50 statements per day) and rate limit headroom isn't a concern
- You're building a simple one-off integration — a CPA processing 10–20 statements a day manually, for example — where webhook infrastructure is over-engineering for the use case
In every polling implementation, use exponential backoff. Never poll at a fixed aggressive interval. The cost of ignoring this advice is exhausted rate limits, not just slower results.
Implementing Polling Against ClearStaq's Job Status Endpoint
Here's the complete polling flow against ClearStaq's API:
- Submit the document:
POST /parsereturns ajob_idimmediately. Store this — it's your handle for all subsequent operations. - Check status:
GET /jobs/{job_id}/statusreturns one of:queued,processing,fraud_review,complete, orfailed. - Apply exponential backoff: Start at 3 seconds, double on each unsuccessful poll, cap at 30 seconds.
- Stop on terminal states:
completeorfailedare final. Do not continue polling after receiving either. - Fetch results: On
complete, retrieve full parsed data viaGET /jobs/{job_id}/result.
Polling Best Practices and Common Mistakes
The most common polling mistakes are also the most expensive:
- Polling below 2 seconds: Most document APIs enforce this as a rate limit floor. Don't do it.
- No maximum retry count: Always set a timeout — 20 attempts or 5 minutes, whichever comes first — to avoid infinite loops on stuck jobs.
- Not handling
fraud_review: This state indicates manual review is in progress. Processing time will be longer than typical. Your UI should communicate this, and your polling loop should continue patiently. - Not persisting job IDs: Store job IDs to durable storage. If your polling process crashes, you need to resume status checks after restart without resubmitting the document.
When to Use Webhooks for Bank Statement Processing
Webhooks should be your default for any production integration that processes more than a few dozen statements per day. The efficiency advantage compounds with volume, and the infrastructure requirement — a public HTTPS endpoint — is trivial for any production application.
Webhooks are required when:
- Real-time fraud alert delivery is needed — polling cannot achieve sub-second alert latency
- You need to trigger downstream actions immediately on completion: updating a loan origination system, notifying an underwriter, releasing a decision workflow into your bank statement processing pipeline
- Volume exceeds 50 statements per day and rate limit efficiency matters
- You want complete parsed data (transactions, fraud score, summary) delivered in a single event without a follow-up GET
Setting Up Your Webhook Endpoint
Before registering an endpoint with ClearStaq, it needs to meet these requirements:
- Public HTTPS only: HTTP endpoints are rejected. TLS is mandatory for financial data in transit.
- Respond within 5 seconds: Return
200 OKimmediately. Do not perform heavy processing synchronously in the handler. - Acknowledge, then process: The recommended pattern is to return
200 OKimmediately, enqueue the payload for async processing, and handle it in a background worker.
Register your endpoint URL and subscribe to event types in the ClearStaq dashboard or via the API registration endpoint.
ClearStaq Webhook Event Types
ClearStaq exposes four webhook event types, each subscribable independently:
job.completed— Fires when full parsing and analysis is complete. Includes the full payload: transactions, summary metrics, and fraud score.job.failed— Fires when processing fails (encrypted PDF, corrupt file, password-protected statement). Includeserror_codeanderror_messagefor programmatic handling.fraud.alert— Fires immediately when a high-confidence fraud signal is detected during parsing. Includes signal type and confidence score. Does not wait for full document processing.fraud.review_required— Fires when the fraud score crosses the manual review threshold. Use this to route applications into a human review queue automatically.
Subscribe only to the events your system needs. There's no benefit to receiving events you don't act on.
{
"status": "success",
"fraud_score": 57,
"transactions": 47,
"bank": "Chase",
"processing_time_ms": 238
}Implementing Webhooks with the ClearStaq API: Step-by-Step
If you haven't set up API credentials yet, start with the ClearStaq API quickstart before working through these steps. The implementation below assumes you have a signing secret from your webhook registration.
Here's the complete implementation flow:
- Create the endpoint: Add a route to your application that accepts POST requests at a publicly accessible HTTPS URL.
- Register in ClearStaq: Submit the endpoint URL and select the event types you want to subscribe to. Note the signing secret — you'll need it for signature verification.
- Implement signature verification: Validate the
X-ClearStaq-Signatureheader before processing any payload. This is mandatory, not optional. - Return 200 OK immediately: Acknowledge receipt before doing any work. Enqueue the
job_idfor async processing. - Process asynchronously: In a background worker, extract
transactions,fraud_score, andsummaryfrom the payload and update your application state.
Code Example: Webhook Handler with Signature Verification (Node.js)
The following Express handler demonstrates a complete, production-ready webhook implementation including HMAC-SHA256 signature verification and immediate acknowledgment:
const express = require('express');
const crypto = require('crypto');
const { enqueueJobResult } = require('./queue');
const app = express();
// Use raw body parser for signature verification
app.use('/webhooks/clearstaq', express.raw({ type: 'application/json' }));
app.post('/webhooks/clearstaq', (req, res) => {
const signature = req.headers['x-clearstaq-signature'];
const signingSecret = process.env.CLEARSTAQ_WEBHOOK_SECRET;
// Compute expected HMAC-SHA256 signature
const expectedSignature = crypto
.createHmac('sha256', signingSecret)
.update(req.body)
.digest('hex');
// Use timing-safe comparison — never use === for signature comparison
const signaturesMatch = crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expectedSignature, 'hex')
);
if (!signaturesMatch) {
return res.status(401).json({ error: 'Invalid signature' });
}
// Parse verified JSON body
const event = JSON.parse(req.body.toString());
const { event_type, event_id, job_id } = event;
// Acknowledge immediately — do not process synchronously
res.status(200).json({ received: true });
// Enqueue for async processing
enqueueJobResult({ event_type, event_id, job_id, payload: event });
});
Key points in this implementation: the raw body parser is critical — parsed JSON bodies produce a different byte sequence that breaks HMAC verification. The timing-safe comparison prevents timing attack vulnerabilities. And the response fires before the enqueue call to minimize response time.
Testing Your Webhook Integration Locally
Use ngrok or Cloudflare Tunnel to expose your localhost endpoint during development. Both create a public HTTPS URL that tunnels to your local server.
ClearStaq's dashboard includes a webhook test tool that sends sample payloads to your registered endpoint. Use it to test all event types before going to production: job.completed, job.failed, and fraud.alert each have different payload structures your handler needs to accommodate.
Critically: test your signature verification with a tampered payload. Modify one byte of a captured payload body and confirm your handler returns 401. If it doesn't, your verification logic has a bug.
Ready to Implement? Start with the Full API Docs
The ClearStaq API docs include a complete webhook integration guide with code examples, event type reference, and a test payload tool — no sales call required. Everything you need to go from zero to receiving live bank statement events is in the documentation.
Handling Failures, Retries, and Idempotency
Webhook delivery can fail. Your endpoint may be down, return a non-2xx status, or take too long to respond. For financial data, how you handle these failures matters as much as the happy path.
ClearStaq's webhook delivery system implements exponential backoff with jitter automatically. You don't need to build retry infrastructure. The retry schedule is: immediate → 30s → 2m → 10m → 30m → 2h → 12h. Failed deliveries are retried across a 24-hour window before expiring.
Because of this retry behavior, the same webhook event may be delivered more than once. Your handler must be idempotent. Failing to handle duplicate delivery is the most common and most consequential webhook implementation mistake in financial integrations — it produces duplicate transaction records in your database.
Implementing Idempotency in Your Webhook Handler
The approach mirrors Stripe's idempotency model, which is the industry standard for webhook handlers processing financial data:
- Every webhook event includes a unique
event_id. Store processed event IDs in a database table or Redis set. - Before processing any event, check: has this
event_idalready been processed? If yes, return200 OKand skip processing. - Use database upsert operations —
INSERT ... ON CONFLICT DO NOTHING— rather than plain INSERTs for transaction records as an additional safeguard. - Mark an event as processed only after all database writes are committed, not before. If your worker crashes mid-processing, the event should be reprocessed, not skipped.
This two-layer approach — event_id deduplication plus idempotent database writes — ensures that receiving the same job.completed event twice never produces duplicate records in your lending system.
What Happens When Your Endpoint Goes Down
During a planned or unplanned outage, ClearStaq queues all failed deliveries and retries them across the 24-hour window. No events are permanently lost within that window.
After 24 hours without successful delivery, events expire. To handle extended outages, implement a fallback polling sweep: when your endpoint recovers, query the status of all jobs submitted in the last 24 hours that have no recorded completion event. This catches any jobs that completed during the outage window.
Monitor webhook delivery failure rates in the ClearStaq dashboard. A sustained spike in delivery failures usually indicates an endpoint health problem rather than a ClearStaq issue. Consider a dead letter queue for events that exhaust all retries — log these for manual review rather than silently discarding them.
Webhook Security for Financial Data
Bank statement data is regulated financial information. Webhook security isn't a nice-to-have — it's a requirement. For a detailed treatment of the full security surface, see our guide on webhook security for financial APIs.
Three mandatory controls apply to any production webhook integration handling bank statement data:
- HMAC-SHA256 signature verification — Validates that the payload came from ClearStaq and wasn't tampered with in transit. Always verify before processing.
- HTTPS-only endpoints — TLS encrypts data in transit. ClearStaq rejects HTTP endpoints entirely.
- Webhook secret rotation policy — Rotate your signing secret on a schedule and immediately if it's ever exposed.
ClearStaq's webhook delivery is SOC2 compliant for bank statement processing: data in transit is encrypted and delivery infrastructure is audited. Never log the full webhook payload in plain text — mask or redact PII and account numbers in application logs.
HMAC-SHA256 Signature Verification Explained
Every ClearStaq webhook POST includes an X-ClearStaq-Signature header. The value is HMAC-SHA256(raw_request_body, webhook_signing_secret).
To verify:
- Capture the raw request body before JSON parsing — parsed and re-serialized JSON may differ byte-for-byte from the original.
- Compute
HMAC-SHA256(raw_body, signing_secret)server-side using your stored secret. - Compare your computed signature against the header value using
crypto.timingSafeEqual()in Node.js — never use===for signature comparison. Regular string equality is vulnerable to timing attacks that can leak signature bytes. - Reject any request with an invalid signature with
401. Do not process it.
Additional Security Controls
- IP allowlisting: Restrict your webhook endpoint to accept inbound requests only from ClearStaq's published IP ranges. This blocks attempts from any other source even if they construct a valid-looking request.
- Replay attack prevention: Check the
timestampfield in every event payload. Reject events with timestamps older than 5 minutes — this prevents captured payloads from being replayed later. - Secret management: Use environment variables for signing secrets. Never hardcode them in source code or commit them to version control.
- Minimal permissions: Run webhook endpoints on isolated infrastructure with the minimum permissions needed — they should only be able to write to the job result queue, nothing else.
Hybrid Approach: Combining Webhooks with Fallback Polling
A hybrid pattern uses webhooks as the primary delivery mechanism but falls back to polling when webhook delivery isn't possible or has failed. It provides webhook-level efficiency during normal operation and polling-level reliability as a safety net.
The hybrid pattern is most relevant in two scenarios. First, legacy bank and credit union tech stacks where strict inbound firewall rules block webhook delivery to internal systems. Second, as a reliability backstop: if your webhook endpoint experiences an outage, a background polling sweep catches jobs that completed during the downtime.
Implementation is straightforward: submit jobs normally and wait for webhook events. Run a background polling sweep every 5–10 minutes for any jobs older than 10 minutes with no recorded completion event. If the sweep finds a completed job, process it exactly as you would a webhook payload.
Upload
0.1sDrop any bank statement format
Parse
1.2sOCR + AI extraction
Detect
0.8sFraud & stacking analysis
Verify
0.3sIncome verification
Deliver
0.1sStructured JSON response
When Firewall Restrictions Force a Polling Fallback
Some financial institution environments block all inbound HTTP traffic to internal systems. Webhooks can't reach these endpoints directly, which is a genuine architectural constraint — not a configuration problem you can fix.
In these environments, you have two options:
- Pure polling fallback: Attempt webhook registration. If delivery consistently fails (monitor via the ClearStaq dashboard), disable webhook registration for that environment and run polling-only with exponential backoff.
- Cloud-hosted relay: Deploy a lightweight webhook receiver in AWS Lambda or GCP Cloud Functions that accepts the ClearStaq webhook and forwards results to your internal system via an outbound call the firewall permits. This is the cleaner architectural solution — it preserves webhook-level real-time delivery while working within the network constraints.
The relay pattern is particularly relevant for teams integrating ClearStaq into credit union or community bank environments where network policies haven't caught up with modern API patterns.
Frequently Asked Questions
What is the difference between webhooks and polling for a bank statement API?
Polling means your system repeatedly asks the API whether a processing job is complete — a pull model where you initiate every check. Webhooks mean the API notifies your endpoint the moment processing finishes — a push model where the API initiates delivery. For bank statement processing, webhooks eliminate wasted requests and deliver results with near-zero latency after the job completes. Polling trades efficiency for implementation simplicity.
When should I use polling instead of webhooks for document processing?
Polling is appropriate for local development, low-volume prototypes processing under 50 statements per day, or environments where inbound firewall rules prevent webhook delivery. For production workloads, webhooks are preferred because they scale without consuming rate limit quota on status checks and enable real-time fraud alert delivery that polling can't match.
How do I handle webhook failures and retries for bank statement jobs?
ClearStaq automatically retries failed webhook deliveries using exponential backoff over a 24-hour window — you don't need to build retry infrastructure. Your handler must implement idempotency using the event_id field: store processed event IDs and skip duplicate deliveries. This prevents duplicate transaction records if the same event is delivered more than once, which can happen when retries succeed after an initial delivery failure.
What payload structure should I expect from a bank statement processing webhook?
A job.completed webhook event includes the event_type, a unique event_id, the job_id, document metadata, a parsed transactions[] array, a summary object (average daily balance, total deposits, NSF count), and a fraud_score object with an overall score and individual signals[] breakdown. No follow-up GET request is needed — the full parsed result is included in the event.
How does polling affect API rate limits when processing high volumes of bank statements?
At scale, polling is extremely rate-limit-intensive. Processing 500 concurrent statements with 2-second polling intervals generates approximately 15,000 status-check requests per minute — before any parse jobs are submitted. Switching to webhooks reduces this overhead to zero. Your API quota is consumed only by actual parse job submissions and result fetches, not by status checks that return no useful data.
Stop Polling for Results Your API Is Ready to Push
Set up ClearStaq webhooks in under 30 minutes and receive parsed bank statement data, fraud scores, and real-time alerts the moment each document is processed. Start your free trial today — no credit card required.
Frequently Asked Questions
What is the difference between webhooks and polling for a bank statement API?
Polling means your system repeatedly asks the API whether a processing job is complete — a pull model where you initiate every check. Webhooks mean the API notifies your endpoint the moment processing finishes — a push model where the API initiates delivery. For bank statement processing, webhooks eliminate wasted requests and deliver results with near-zero latency after the job completes. Polling trades efficiency for implementation simplicity.
When should I use polling instead of webhooks for document processing?
Polling is appropriate for local development, low-volume prototypes processing under 50 statements per day, or environments where inbound firewall rules prevent webhook delivery. For production workloads, webhooks are preferred because they scale without consuming rate limit quota on status checks and enable real-time fraud alert delivery that polling cannot match.
How do I handle webhook failures and retries for bank statement jobs?
ClearStaq automatically retries failed webhook deliveries using exponential backoff over a 24-hour window — you don't need to build retry infrastructure. Your handler must implement idempotency using the event_id field: store processed event IDs and skip duplicate deliveries to prevent duplicate transaction records if the same event is delivered more than once.
What payload structure should I expect from a bank statement processing webhook?
A job.completed webhook event includes the event_type, a unique event_id, the job_id, document metadata, a parsed transactions array, a summary object with average daily balance and NSF count, and a fraud_score object with an overall score and individual signals breakdown. No follow-up GET request is needed — the full parsed result is included in the event.
How does polling affect API rate limits when processing high volumes of bank statements?
At scale, polling is extremely rate-limit-intensive. Processing 500 concurrent statements with 2-second polling intervals generates approximately 15,000 status-check requests per minute before any parse jobs are submitted. Switching to webhooks reduces this overhead to zero — API quota is consumed only by actual parse job submissions and result fetches, not wasted status checks.
ClearStaq Team
Engineering Team
The ClearStaq team builds AI-powered tools for bank statement parsing, fraud detection, and income verification.


