Easy Labs
SDKsNode.jsResources

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/cancel
const 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/confirm

Deposit

easy.getTreasuryWireInstructions();   // GET  /treasury/deposit/wire-instructions
easy.treasuryDepositBankPull(body);   // POST /treasury/deposit/bank-pull

Withdraw

easy.treasuryWithdraw(body);          // POST /treasury/withdraw
easy.confirmTreasuryWithdraw(body);   // POST /treasury/withdraw/confirm

Transactions

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/export

Dashboard

easy.getTreasuryDashboardSummary();   // GET /treasury/dashboard/summary

Recipients

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 });
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 };
// ...etc

Refer 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" });

On this page