Treasury
Treasury — methods, parameters, and examples for @easylabs/node.
Treasury is Easy Labs' send / withdraw / move-money toolkit, sitting alongside the standard payment flows. It handles outbound payouts to recipients (ACH, wire, RTP, same-day ACH), inter-account transfers, deposits via wire instructions or bank pulls, recurring payouts, security rules, multi-step approvals, and 1099 / W-9 collection.
The SDK groups Treasury into eleven sub-areas. Methods all live on the same client — easy.treasurySend(...), easy.listTreasuryRecipients(...), etc. — but most response payloads are currently typed loosely ({ id: string; [key: string]: unknown }) pending schema lock-down.
Methods
Send
easy.treasurySend(body); // POST /treasury/send
easy.confirmTreasurySend(body); // POST /treasury/send/confirm
easy.cancelTreasurySend(body); // POST /treasury/send/cancelconst tx = await easy.treasurySend({
recipient_id: recipient.id,
amount: 250000, // smallest currency unit
source_account_id: bankAccount.id,
method: "ach", // "wire" | "ach" | "same_day_ach" | "rtp"
memo: "May retainer",
});
await easy.confirmTreasurySend({
transaction_id: tx.data.id,
security_code: "123456", // when a security rule requires it
});Internal transfer (between owned accounts)
easy.treasuryTransfer(body); // POST /treasury/transfer
easy.confirmTreasuryTransfer(body); // POST /treasury/transfer/confirmDeposit
easy.getTreasuryWireInstructions(); // GET /treasury/deposit/wire-instructions
easy.treasuryDepositBankPull(body); // POST /treasury/deposit/bank-pullWithdraw
easy.treasuryWithdraw(body); // POST /treasury/withdraw
easy.confirmTreasuryWithdraw(body); // POST /treasury/withdraw/confirmTransactions
easy.listTreasuryTransactions(params?); // GET /treasury/transactions
easy.getTreasuryTransaction(id); // GET /treasury/transactions/:id
easy.updateTreasuryTransaction(id, body); // PATCH /treasury/transactions/:id
easy.getTreasuryTransactionSettlement(id); // GET /treasury/transactions/:id/settlement
easy.exportTreasuryTransactions(params?); // GET /treasury/transactions/exportDashboard
easy.getTreasuryDashboardSummary(); // GET /treasury/dashboard/summaryRecipients
easy.listTreasuryRecipients(params?);
easy.createTreasuryRecipient(body);
easy.getTreasuryRecipient(id);
easy.updateTreasuryRecipient(id, body);
easy.deleteTreasuryRecipient(id);
easy.addTreasuryRecipientPaymentMethod(id, body);
easy.inviteTreasuryRecipient(id);
easy.setTreasuryRecipientAutoPay(id, body);
easy.requestTreasuryRecipientW9(id);
easy.getTreasuryRecipientTaxInfo(id);
easy.setTreasuryRecipientTaxInfo(id, body);
easy.listTreasuryRecipientInvitations();
easy.acceptTreasuryRecipientInvite(body);
easy.importTreasuryRecipients(body?);
easy.getTreasuryRecipientTaxReport();
easy.getTreasuryRecipientPlaidLinkToken(body);
easy.exchangeTreasuryRecipientPlaidToken(body);const recipient = await easy.createTreasuryRecipient({
name: "Ada Lovelace",
email: "ada@example.com",
type: "person",
payment_methods: [
{ method_type: "ach", account_type: "checking", routing_number: "021000021", account_number: "1234567890" },
],
metadata: { internal_id: "vendor_42" },
});
await easy.setTreasuryRecipientAutoPay(recipient.data.id, {
amount: 500000,
frequency: "monthly",
start_date: "2026-06-01",
source_account_id: bankAccountId,
method: "ach",
memo: "Monthly retainer",
});Bank accounts
easy.listTreasuryBankAccounts();
easy.getTreasuryBankAccountLinkToken();
easy.linkTreasuryBankAccount(body);
easy.deleteTreasuryBankAccount(id);Recurring payments
easy.listTreasuryRecurringPayments(params?);
easy.createTreasuryRecurringPayment(body);
easy.getTreasuryRecurringPayment(id);
easy.updateTreasuryRecurringPayment(id, body);
easy.deleteTreasuryRecurringPayment(id);Auto-transfer rules
easy.listTreasuryAutoTransferRules();
easy.createTreasuryAutoTransferRule(body);
easy.updateTreasuryAutoTransferRule(id, body);
easy.deleteTreasuryAutoTransferRule(id);Security rules + approvals
easy.listTreasurySecurityRules();
easy.createTreasurySecurityRule(body);
easy.updateTreasurySecurityRule(id, body);
easy.deleteTreasurySecurityRule(id);
easy.createTreasuryApprovalRequest(body);
easy.resolveTreasuryApprovalRequest(id, { action: "approve" /* or "deny" */, reason });Payout links + categories
easy.listTreasuryPayoutLinks(params?);
easy.generateTreasuryPayoutLink(body);
easy.getTreasuryPayoutLink(token);
easy.submitTreasuryPayoutLink(token, body);
easy.listTreasuryCategories();
easy.createTreasuryCategory({ name, color? });
easy.deleteTreasuryCategory(id);
easy.getTreasuryCategoryUsage(id);Object shape
The Treasury request types are tightly typed (see CreateTreasuryRecipientParams, TreasurySendParams, etc.); response payloads are intentionally permissive in this SDK release:
type TreasuryTransactionData = { id: string; [key: string]: unknown };
type TreasuryRecipientData = { id: string; name: string; email: string; type: "person" | "business"; [key: string]: unknown };
type TreasuryBankAccountData = { id: string; [key: string]: unknown };
// ...etcRefer to the API reference for the canonical Treasury schemas.
Examples
Send + confirm with a security code
const send = await easy.treasurySend({
recipient_id, amount: 1500000, source_account_id, method: "wire",
});
// Out of band, your approver retrieves a code, then:
await easy.confirmTreasurySend({ transaction_id: send.data.id, security_code: "123456" });Plaid-linked recipient onboarding
const linkToken = await easy.getTreasuryRecipientPlaidLinkToken({ invitation_token });
// Hand linkToken.data.link_token to Plaid Link in the recipient's browser.
// On success, exchange the public token:
await easy.exchangeTreasuryRecipientPlaidToken({
invitation_token,
public_token,
account_id,
institution_name,
account_name,
account_mask,
});Approval flow
const tx = await easy.treasurySend({ /* … */ });
const approval = await easy.createTreasuryApprovalRequest({
transaction_id: tx.data.id,
security_rule_id: ruleId,
});
// In the approver's UI:
await easy.resolveTreasuryApprovalRequest(approval.data.id, { action: "approve" });