TypeScript SDK for the FlowCheck API — unified access to Stripe payouts, Shopify orders, and bank transaction data.
npm install @flowcheck/sdkimport { FlowCheck } from "@flowcheck/sdk";
const fc = new FlowCheck("fc_live_...");
// Get cash flow for the last 30 days
const { data } = await fc.cashflow("30d");
console.log(`Net: $${data.net / 100}`);
// List Shopify payouts only
const shopify = await fc.payouts({ source: "shopify" });
console.log(`${shopify.data.length} Shopify payouts`);
// Check for unmatched payouts
const summary = await fc.reconciliationSummary();
console.log(summary.data.summary);curl https://developer.usepopup.com/api/v0/cashflow?window=30d \
-H "Authorization: Bearer fc_live_..."{
"data": {
"window": "30d",
"total_inflow": 523400,
"total_outflow": 187600,
"net": 335800,
"daily": [
{ "date": "2026-03-05", "inflow": 18200, "outflow": 4300, "net": 13900 },
{ "date": "2026-03-04", "inflow": 22100, "outflow": 6800, "net": 15300 }
]
},
"meta": {
"request_id": "req_abc123",
"timestamp": "2026-03-05T10:00:00Z",
"version": "v0"
},
"errors": []
}All amounts are in cents (USD).
| Method | HTTP | Description |
|---|---|---|
register(email) |
POST /auth/register |
Create account (no key needed) |
registrationStatus(token) |
GET /auth/register/status |
Check registration / get API key |
| Method | HTTP | Description |
|---|---|---|
balance() |
GET /balance |
Stripe + bank balances |
cashflow(window?) |
GET /cashflow |
Revenue, expenses, net by day |
payouts(params?) |
GET /payouts |
Stripe + Shopify payouts with match status |
payout(id) |
GET /payouts/:id |
Single payout with bank match |
transactions(params?) |
GET /transactions |
Bank transactions from Plaid |
discrepancies(params?) |
GET /discrepancies |
Missing or mismatched amounts |
reconciliationSummary() |
GET /reconcile/summary |
30-day reconciliation summary |
reconciliation(payoutId) |
GET /reconcile/:id |
Per-payout reconciliation detail |
| Method | HTTP | Description |
|---|---|---|
agentPosition() |
GET /agent/position |
Full financial snapshot for AI agents |
agentAlerts() |
GET /agent/alerts |
Active issues for AI agents |
| Method | HTTP | Description |
|---|---|---|
connectStripe(restrictedKey) |
POST /connect/stripe |
Connect Stripe account |
connectShopify(shop, accessToken) |
POST /connect/shopify |
Connect Shopify store |
createPlaidLinkToken() |
POST /connect/plaid/link-token |
Start Plaid bank connection |
exchangePlaidToken(publicToken) |
POST /connect/plaid/exchange |
Complete Plaid connection |
| Method | HTTP | Description |
|---|---|---|
webhooks() |
GET /webhooks |
List webhook endpoints |
createWebhook(url, events) |
POST /webhooks |
Register webhook endpoint |
deleteWebhook(id) |
DELETE /webhooks/:id |
Remove webhook endpoint |
| Method | HTTP | Description |
|---|---|---|
upgradePlan(plan) |
POST /billing/upgrade |
Get checkout URL to upgrade (works at 0 credits) |
topUp() |
POST /billing/topup |
Buy 100 credits for $5 |
// All payouts
const all = await fc.payouts();
// Stripe only
const stripe = await fc.payouts({ source: "stripe" });
// Shopify only
const shopify = await fc.payouts({ source: "shopify" });List endpoints (payouts, transactions, discrepancies) support cursor-based pagination:
const first = await fc.payouts({ limit: 10 });
console.log(first.data); // first 10 payouts
if (first.meta.has_more) {
const next = await fc.payouts({ limit: 10, cursor: first.meta.cursor });
console.log(next.data); // next 10 payouts
}The SDK throws on non-2xx responses. The error includes status and body:
try {
await fc.balance();
} catch (err) {
if (err.status === 401) {
console.log("Invalid API key");
}
if (err.status === 402) {
console.log("Out of credits — upgrade or top up");
// Programmatic upgrade:
const { data } = await fc.upgradePlan("starter");
console.log(`Upgrade at: ${data.checkout_url}`);
}
console.log(err.body); // full error response
}Sign up at developer.usepopup.com to get your API key. 7-day free trial with 100 credits included.
MIT