Checking Plaid status…
durable agentic failover · pay only when it works

When Plaid faceplants,
Brook catches it.

The exception handler for your Plaid integration. When the bank link fails, we collect the borrower's statement (popup or email) and return it in the exact Plaid schema you already parse. Verified, drop-in, pay only when it works.

Independently verified Certificate of provenance Full audit trail Tamper-checked source
connect.ts
1 // your existing flow, unchanged
2 try {
3   await plaid()
4 } catch (E) {
5   // live popup on your page...
6   await useBrook({ embed: true })
7   // ...or async email link:
8   // useBrook({ email })
9 }
10 // → identical Plaid schema. drop-in. ✓

Reads statements from

Any bankAny credit unionAny format Scanned PDFDigital PDFMulti-account Even the weird ones
// catch (E) { … }

One catch block. That's the whole product.

Brook does exactly one thing: handle the exception when Plaid can't connect. Pop our upload widget on your page or email the borrower a link, read the PDF, and return in the same call. No workflow, no rules engine, no chasing.

Popup or email, your call

One flag picks the mode. embed: true drops the upload popup on your page while the borrower's still there. email sends a link for later. Same portal either way.

Durable compute

The email path doesn't time out. It waits. Minutes or days, Brook holds the request open and resolves it the moment the borrower uploads.

Identical Plaid schema

We don't even change the format. Output matches Plaid's exact data types, field for field. Your existing parser just works. Nothing downstream changes.

Independently verified

Every statement is checked at the source: document hash, tamper detection, line-level confidence. Not a guess, a verified read you can stand behind.

Certificate of provenance

Turn it on per call and get a full provenance + audit certificate: where the data came from, how it was read, exportable for underwriting and compliance.

Pay only when it works

No seats, no subscription, no charge for a borrower who never replies. You pay when Brook returns verified data. That's it.

// how it works

Wire it once. Forget it forever.

1

Install the SDK

npm i brook and drop in your API key.

2

Catch + call Brook

In your existing catch, call useBrook(): pass embed: true for a popup or email for a link. That's the whole integration.

3

Borrower uploads, we read

Popup on your page or a one-click email link. The borrower drops their PDF, we parse it. The email path holds the call open until they do.

4

Get Plaid-shaped data back

Normalized transactions return in the same request, in Plaid's exact schema. Your downstream logic doesn't change. You only pay for this step.

brook.ts
1 import { useBrook } from "brook"
2
3 // live popup, borrower's still on the page
4 const data = await useBrook({ embed: true })
5
6 // or async: email a link, durable wait:
7 // useBrook({ email: borrower.email })
8
9 // data.transactions[] in Plaid schema, 1:1 ✓
// how this actually works

It lives inside the Plaid flow you already built.

Brook isn't a new integration to design around. It's the fallback that fires in your existing catch block: same screen, same schema, same workflow. The borrower never knows the bank connection failed.

your app
01

Plaid can't connect

Bank link times out or fails. Your existing Plaid call throws, exactly like today.

brook
02

Popup or email, your pick

Your catch calls useBrook(): drop our popup on the page, or email a link. Same portal.

borrower
03

They upload a statement

Any bank, any format PDF. One drop. No account, no app, no back-and-forth.

brook
04

Same Plaid schema, back to you

We read the PDF and return it in Plaid's exact shape. Your downstream logic never knows the difference.

// what the borrower sees

Your screen. Your brand. Our fallback under it.

With embed: true the borrower never leaves your page. The upload popup renders right where Plaid failed. Bounced before finishing? The email mode catches them later. Same portal, same result.

Default popup & email are plain and simple. Want your logo and copy, or email sent from your own domain (custom MX)? See pricing →
app.yourlendingco.com/verify
couldn't reach your bank

Upload your bank statement

No worries, we couldn't connect automatically. Drop your statement and we'll take it from here.

Drag a PDF here, or
Choose file
// secure by default

Borrower data you never have to babysit.

We handle the most sensitive document a person owns. So we hold it for exactly as long as the call runs, and not a second more.

Zero data retention

Statements are processed in memory and purged the moment we return. Nothing persists on our side. Ever.

Encrypted end-to-end

TLS 1.3 in transit, AES-256 at rest for the brief window of processing. Keys scoped per request.

Never trains a model

Borrower documents are never used for training, never resold, never shared. Single purpose: your call.

Audit trail on tap

Every access logged and attributable. Full audit export per borrower, per call, on demand.

SOC 2 Type II GDPR ready CCPA compliant PCI-aware handling Data residency options
// pricing

Pay per statement. Nothing else.

No seats, no subscription, no minimums. You're billed only when Brook returns a verified statement in Plaid's schema.

Default · usage-based
$5/ verified statement
One flat price per successful result. A borrower who never uploads costs you nothing.
  • Popup (embed) and email modes
  • Any bank, any format PDF
  • Returned in Plaid's exact schema
  • Durable compute, wait days if needed
  • Zero data retention, verified output
  • No charge on no-upload
Certified · per statement
$12/ certified statement
Everything in Default, plus a full Certificate of Provenance on any call. Defensible enough to put in front of an auditor.
  • Certificate of provenance per statement
  • Source document hash & tamper check
  • Full extraction audit trail
  • Line-level confidence & verification log
  • Exportable for compliance & underwriting
  • Toggle per call, only pay when you need it
Custom · enterprise
Let's talk
Everything in Certified, plus your brand on the borrower experience and volume pricing.
  • Email from your own domain (custom MX)
  • Your logo and custom copy
  • Volume & committed-use rates
  • Data residency options
  • SSO, audit export, SLAs
  • Priority support
Provenance & audit certificate available on any call from Certified up, not on the $5 tier. Prices in USD; volume discounts apply automatically.
// finally { ship() }

Stop losing borrowers to someone else's outage.

One catch block. Popup or email. You only pay when it works.

try { plaid() } catch (E) { useBrook() }