Retrieving Account Balances

After provisioning an Internal Account, you can retrieve real-time balance information via the API or webhooks. Balance Reports represent a collection of balances for an account at a given moment in time.

Balance Types

Modern Treasury provides four balance types for each Internal Account:

  • current_ledger — the current posted balance of the account. This does not account for pending inflows and outflows.
  • current_available — the balance available for use when initiating payments. This equals current_ledger minus any pending outflows.
  • current_pending_inflows — money on its way into the account that hasn't posted yet.
  • current_pending_outflows — money on its way out of the 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.

Retrieve Latest Balances on the Internal Account

Every Internal Account has a latest_balances field with the balances from its latest Balance Report. Get Internal Account and List Internal Accounts both return it.

curl --request GET \
     -u ORGANIZATION_ID:API_KEY \
     --url https://app.moderntreasury.com/api/internal_accounts/<internal_account_id> \
     -H 'content-type: application/json'

Sample Internal Account response (abbreviated):

{
  "id": "bf5f1df9-de01-40c2-9040-7ec10170a14c",
  "object": "internal_account",
  "currency": "USD",
  "latest_balances": [
    { "object": "balance", "balance_type": "current_available", "amount": 100, "amount_string": "100", "currency": "USD", "as_of_date": "2026-01-01", "as_of_time": "16:30" },
    { "object": "balance", "balance_type": "current_ledger", "amount": 235, "amount_string": "235", "currency": "USD", "as_of_date": "2026-01-01", "as_of_time": "16:30" },
    { "object": "balance", "balance_type": "current_pending_inflows", "amount": 50, "amount_string": "50", "currency": "USD", "as_of_date": "2026-01-01", "as_of_time": "16:30" },
    { "object": "balance", "balance_type": "current_pending_outflows", "amount": 135, "amount_string": "135", "currency": "USD", "as_of_date": "2026-01-01", "as_of_time": "16:30" }
  ]
}

latest_balances is empty until the account has a Balance Report.

Which Report Is Latest

The latest Balance Report is the one with the newest as-of date and time.

Modern Treasury sends two kinds of Balance Reports:

  • A real-time report each time the balance changes, with current_available, current_ledger, current_pending_inflows, and current_pending_outflows.
  • A previous-day report every day, with closing_available, closing_ledger, closing_pending_inflows, and closing_pending_outflows as of the end of the previous day.

Retrieve Balance Reports via API

To retrieve balances for a specific report, use the Get Balance Report endpoint. Set the id parameter to latest to retrieve the most recent Balance Report.

curl --request GET \
     -u ORGANIZATION_ID:API_KEY \
     --url https://app.moderntreasury.com/api/internal_accounts/<internal_account_id>/balance_reports/latest \
     -H 'content-type: application/json'

Sample Balance Report response (abbreviated):

{
  "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",
      "balance_type": "current_available",
      "as_of_date": "2026-01-01",
      "as_of_time": "16:30"
    },
    {
      "id": "1d9bd86f-2b63-453d-b55c-a9e6046aec8a",
      "amount": 235,
      "amount_string": "235",
      "object": "balance",
      "currency": "USD",
      "balance_type": "current_ledger",
      "as_of_date": "2026-01-01",
      "as_of_time": "16:30"
    },
    {
      "id": "4c1e8a52-7f3b-4d9e-a6c2-1b8f0e5d7a93",
      "amount": 50,
      "amount_string": "50",
      "object": "balance",
      "currency": "USD",
      "balance_type": "current_pending_inflows",
      "as_of_date": "2026-01-01",
      "as_of_time": "16:30"
    },
    {
      "id": "9a7d3f61-2e4c-4b8a-9f15-6c0d2e8b4a17",
      "amount": 135,
      "amount_string": "135",
      "object": "balance",
      "currency": "USD",
      "balance_type": "current_pending_outflows",
      "as_of_date": "2026-01-01",
      "as_of_time": "16:30"
    }
  ],
  "as_of_date": "2026-01-01",
  "as_of_time": "16:30",
  "balance_report_type": "real_time",
  "internal_account_id": "bf5f1df9-de01-40c2-9040-7ec10170a14c"
}

Monitor Balances via Webhooks

Subscribe to balance_report webhooks to receive real-time updates each time the account's balance changes. Each webhook payload includes all four balance types and an as_of_time indicating the time the balances are effective.

For more details on balance tracking patterns, including webhook payload examples, see Tracking Account Balances.