Tracking Account Balances

Modern Treasury sends you real-time balance updates via webhooks each time your account's balance changes. You can also poll for balances using the Modern Treasury API.

Balance Reports and Balance Types

Balance Reports represent a collection of balances for an account at a given moment in time. Modern Treasury specifically provides real-time Balance Reports that contain four types of balances:

  • current_ledger is the current posted balance of your account. This balance does not account for pending inflows and outflows.
  • current_available is the current balance available for use when initiating payments from this account. This balance is equal to your current_ledger minus any pending outflows.
  • current_pending_inflows is money on its way into your account that hasn't posted yet.
  • current_pending_outflows is money on its way out of your account that hasn't posted yet.

Previous day Balance Reports (balance_report_type of previous_day) contain the end-of-day versions of these balances: closing_ledger, closing_available, closing_pending_inflows, and closing_pending_outflows.

Ingesting Balances via Webhooks

Each time an account's balance changes, Modern Treasury sends a Balance Report webhook. The webhook contains all four balance types mentioned above and an as_of_time indicating the time the balances are effective.

Sample Balance Report webhook:

{
  "event": "created",
  "data": {
    "id": "b9382713-ce26-4864-9327-289bd7c62a25",
    "object": "balance_report",
    "balances": [
      {
        "id": "805637d6-980d-4a34-8ff6-c3e1e33cd504",
        "amount": 100,
        "amount_string": "100",
        "object": "balance",
        "currency": "USD",
        "live_mode": true,
        "as_of_date": "2026-01-01",
        "as_of_time": "16:30",
        "created_at": "2026-01-01T20:40:35Z",
        "updated_at": "2026-01-01T20:40:35Z",
        "value_date": "2026-01-01",
        "vendor_code": "current_available",
        "balance_type": "current_available",
        "vendor_code_type": "modern_treasury"
      },
      {
        "id": "1d9bd86f-2b63-453d-b55c-a9e6046aec8a",
        "amount": 235,
        "amount_string": "235",
        "object": "balance",
        "currency": "USD",
        "live_mode": true,
        "as_of_date": "2026-01-01",
        "as_of_time": "16:30",
        "created_at": "2026-01-01T20:40:35Z",
        "updated_at": "2026-01-01T20:40:35Z",
        "value_date": "2026-01-01",
        "vendor_code": "current_ledger",
        "balance_type": "current_ledger",
        "vendor_code_type": "modern_treasury"
      },
      {
        "id": "4c1e8a52-7f3b-4d9e-a6c2-1b8f0e5d7a93",
        "amount": 50,
        "amount_string": "50",
        "object": "balance",
        "currency": "USD",
        "live_mode": true,
        "as_of_date": "2026-01-01",
        "as_of_time": "16:30",
        "created_at": "2026-01-01T20:40:35Z",
        "updated_at": "2026-01-01T20:40:35Z",
        "value_date": "2026-01-01",
        "vendor_code": "current_pending_inflows",
        "balance_type": "current_pending_inflows",
        "vendor_code_type": "modern_treasury"
      },
      {
        "id": "9a7d3f61-2e4c-4b8a-9f15-6c0d2e8b4a17",
        "amount": 135,
        "amount_string": "135",
        "object": "balance",
        "currency": "USD",
        "live_mode": true,
        "as_of_date": "2026-01-01",
        "as_of_time": "16:30",
        "created_at": "2026-01-01T20:40:35Z",
        "updated_at": "2026-01-01T20:40:35Z",
        "value_date": "2026-01-01",
        "vendor_code": "current_pending_outflows",
        "balance_type": "current_pending_outflows",
        "vendor_code_type": "modern_treasury"
      }
    ],
    "live_mode": true,
    "as_of_date": "2026-01-01",
    "as_of_time": "16:30",
    "created_at": "2026-01-01T20:40:35Z",
    "updated_at": "2026-01-01T20:40:35Z",
    "interest_rate": null,
    "balance_report_type": "real_time",
    "internal_account_id": "bf5f1df9-de01-40c2-9040-7ec10170a14c"
  }
}

Fetching Balances via the API

To poll an account's balances, read latest_balances on Get Internal Account or List Internal Accounts. It holds the balances from the account's latest Balance Report. See Which Report Is Latest.

To retrieve balances for a specific report, use Get Balance Report. You'll need to specify the internal_account_id and can fetch the most recent balance available by setting the id to latest.

To fetch Balance Reports for a specific account, use List Balance Reports with the account's internal_account_id.