Integration Workbench· Plaid + Astrada
https://sandbox.plaid.comDemo mode
Payment data integration

A working Plaid integration,
built to your security bar.

Run the real Plaid Sandbox flow end to end, see why “Plaid” and “Astrada” are two different decisions, and check the integration against a payments-grade security list. No secrets shipped to the browser.

integration-map.ts
// two products, one confusing brief
Plaidbank accounts (Link, Auth, Transfer)
Astradacard-network data (BYOC, webhooks)
 
// neither is a card gateway
charge a card? → Stripe / Adyen
 
// secret boundary
browser sees link_token
server keeps PLAID_SECRET
01 · The integration, running

Click through the real Plaid Sandbox flow

Four steps, each backed by an actual server route using the official plaid Node SDK against sandbox.plaid.com. Every secret-bearing call renders in the dark server lane so you can see the trust boundary.

1
Create a Link token

The server requests a short-lived link_token. Your client_id and secret are attached here, on the server. They never reach the browser.

POST /link/token/create
2
Connect a bank with Plaid Link

Plaid Link runs in the browser. The user picks an institution and authenticates. On success Link hands back a one-time public_token. Demo mode simulates Link returning the public_token.

Plaid Link · onSuccess
🔒 Run step 1 first
3
Exchange for an access token

The server swaps the public_token for a long-lived access_token, then seals it (AES-256-GCM) into an opaque token_handle. The browser only ever sees a masked preview and the handle.

POST /item/public_token/exchange
🔒 Connect a bank first
4
Read accounts

The server unseals the handle back into the access token and calls /accounts/get. For ACH, the same token also drives /auth/get (account + routing) and a processor token for Stripe or Dwolla.

POST /accounts/get
🔒 Exchange the token first
02 · The question worth asking first

Plaid or Astrada? It depends on what “payment” means

The brief names both as if they were one product. They are not. Tell me which outcome you are after and the right integration falls out immediately.

Use Plaid. Link the account, then /auth/get returns the account + routing numbers and a processor token feeds Stripe or Dwolla for ACH (or use Plaid Transfer directly). Astrada does not touch bank accounts.
Plaidbank-account connectivity
Connects
Bank accounts: depository, credit, loans, investments, via an OAuth-style Link flow.
For payments
/auth/get for account + routing; processor tokens to Stripe / Dwolla; or Plaid Transfer for ACH.
Integration flow
/link/token/create Link public_token /item/public_token/exchange access_token /auth · /transactions
Data source
Aggregated from the bank, request/response model.
Astradacard-network transaction data
Connects
Existing Visa / Mastercard cards: bring-your-own-card, any issuer, no bank login.
For payments
Real-time spend visibility for expense / spend-management platforms, 10+ structured fields per transaction at authorization.
Integration flow
POST /subaccounts CardSubscription (enroll) webhook transaction.created (auth, ms) webhook transaction.updated (settle)
Data source
Direct from card networks, event/webhook model.
03 · Security & compliance

The checklist a payments integration is judged on

You asked for a strong grasp of security protocols and industry standards. Here is the working list, with an honest status on each.

Secrets stay server-side
Live in this build

client_id and secret are attached on the server route only. Step 1 above shows exactly what the browser receives versus what never leaves the server.

No secret in the client bundle
Live in this build

View source or open the network tab. There is no key in the JavaScript and no key in any response body. Every privileged call is a POST to our own route.

Sealed access tokens
Coded pattern

The long-lived access_token is sealed with AES-256-GCM before the browser sees a handle, so the client holds opaque ciphertext, never a usable token.

Webhook signature verification
Coded pattern

Plaid signs webhooks as a JWT (ES256) in the Plaid-Verification header. Verify the key via /webhook_verification_key/get, check iat freshness, and compare request_body_sha256 in constant time.

Minimal PCI-DSS scope
Coded pattern

Neither integration requires storing raw card numbers. Plaid handles bank credentials; Astrada receives masked card + transaction data from the networks. That keeps PCI scope small. Confirm the exact SAQ with a QSA.

Encrypted token storage at rest
Production step

In production each item's access_token is persisted encrypted, keyed by item_id, with key access scoped to the payment service and rotated.

Idempotent, retried webhooks
Production step

Webhook delivery is at-least-once. Handlers dedupe on event id and are safe to replay, so a settlement update never double-posts.

Data minimization + retention
Production step

Store only the fields the product uses, set a retention window, and honor deletion requests. TLS 1.2+ in transit, no tokens written to logs.

Pills are honest about state. “Live in this build” is verifiable right now on this page. “Coded pattern” is implemented in the source. “Production step” is scoped work for the engagement, not yet wired here.