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.

Start free → 5-min quickstart npm i @multiversal-ventures/brook
Independently verified Any bank · any PDF Plaid-shaped output Provenance cert — coming
connect.ts
1 // your existing flow, unchanged
2 const { collect } = useBrook({ publishableKey })
3 try {
4   await plaid()
5 } catch (E) {
6   // upload popup, resolves on upload
7   const { exchangeRef } = await collect()
8   // server swaps ref → identical Plaid schema ✓
9 }

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. By default collect() opens the upload popup while the borrower's still there. Pass popup: false with borrower.email to send 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 @multiversal-ventures/brook — public on npm, no auth or .npmrc needed.

2

Catch + call Brook

In your existing catch, call collect() from useBrook(). It opens the upload popup and resolves with an exchangeRef. 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 "@multiversal-ventures/brook"
2
3 const { collect } = useBrook({ publishableKey })
4
5 // upload popup, resolves when borrower uploads
6 const { exchangeRef } = await collect()
7
8 // server swaps ref → 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.

The upload popup opens right where Plaid failed. Bounced before finishing? The popup: false + email mode catches them later. Same portal, same result.

Drop it in as a React hook, vanilla JS, or a zero-SDK hosted page. Same popup, any stack.

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
Need data to never leave your perimeter? Deploy Brook in your own cloud (VPC or on-prem) on the Enterprise tier — same API, your infrastructure, your keys. See pricing →
// 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 deploy Brook inside your own cloud, your brand on the borrower experience, and volume pricing.
  • Deploy in your cloud (VPC / on-prem) — data never leaves
  • 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() }

Get early access to Brook.

Limited private beta. We onboard you personally and wire it into your stack with you.

Read the docs
try { plaid() } catch (E) { useBrook() }