> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hyperprop.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get account balances (bulk, reconciliation-friendly)

> Returns the current balance of every trading account in your organization in one compact list — one row per account, balance fields only, no plan/rule/trader/purchase detail.

Use this to reconcile the balances you hold against ours. It is the authoritative post-fill balance, the same value `GET /organization/trading-accounts/{id}` reports as `currentBalance`; it just comes back for hundreds of accounts per call instead of one.

**Each row:**

| Field | Meaning |
|-------|---------|
| `currentBalance` | Balance after the last booked fill (realized P&L, fees and commissions applied). Open positions are not marked in. |
| `realizedPnl` | `currentBalance − initialBalance` — what you get by summing `pnl − fee − commission` over every fill on the account. |
| `highWaterMark` | Highest balance the account has reached (drawdown reference for trailing rules). |
| `dailyStartingBalance` | Balance at the start of the current trading day. |
| `updatedAt` | When the account last changed (fill, status change, day roll). |

**Incremental sync:**
Store the `asOf` value from a response and pass it back as `?updatedSince=` on the next call; you get only the accounts that changed in between, ordered most-recently-changed first.

**Example queries:**
```http
# Every account, 500 per page
GET /organization/balances?limit=500

# Just the accounts that changed since your last pass
GET /organization/balances?updatedSince=2026-09-08T13:00:00Z

# A specific set of accounts
GET /organization/balances?accountId=7c9e6679-...,9d1e6679-...

# One customer's accounts
GET /organization/balances?customerId=mffu-cust-4471
```

**Pagination:** offset/limit, or follow `pagination.nextCursor` for stable paging while balances keep moving.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/organization/balances
openapi: 3.0.0
info:
  title: Hyperprop Platform API
  version: 1.0.0
  description: >-
    REST API for the Hyperprop Trading Platform — provision evaluation and
    funded trading accounts, manage traders and plans, react to account
    lifecycle events via signed webhooks, and reconcile billing. Built for prop
    firms integrating from their own backend.


    Authentication, quick start, error handling, idempotency, pagination, custom
    metadata, webhooks, and the MCP connector are documented at
    https://docs.hyperprop.com.
  x-logo:
    url: https://app.hyperprop.com/logo-icon.svg
    altText: Hyperprop
    href: https://hyperprop.com
servers:
  - url: https://api.hyperprop.com/platform
    description: Production
security: []
tags:
  - name: Authentication
    description: >-
      User authentication - signup, signin, signout, password reset, email
      verification, OAuth, and MFA
  - name: User
    description: >-
      User account management - profile, notifications, agreements, dismissals,
      and audit logs. Requires Bearer token.
  - name: Organization
    description: >-
      Organization management - profile, team, trading accounts, plans, and
      rules. Supports **dual authentication**: Bearer JWT token (dashboard
      users) OR X-API-Key (programmatic access).
  - name: Market Data
    description: CME futures contracts and market data. Requires Bearer token.
  - name: Indicator Builder
    description: >-
      AI-assisted authoring of custom Hyperprop Script indicators for the web
      terminal. Requires Bearer token.
  - name: System
    description: System endpoints - health checks and connectivity
paths:
  /v1/organization/balances:
    get:
      tags:
        - Organization
      summary: Get account balances (bulk, reconciliation-friendly)
      description: >-
        Returns the current balance of every trading account in your
        organization in one compact list — one row per account, balance fields
        only, no plan/rule/trader/purchase detail.


        Use this to reconcile the balances you hold against ours. It is the
        authoritative post-fill balance, the same value `GET
        /organization/trading-accounts/{id}` reports as `currentBalance`; it
        just comes back for hundreds of accounts per call instead of one.


        **Each row:**


        | Field | Meaning |

        |-------|---------|

        | `currentBalance` | Balance after the last booked fill (realized P&L,
        fees and commissions applied). Open positions are not marked in. |

        | `realizedPnl` | `currentBalance − initialBalance` — what you get by
        summing `pnl − fee − commission` over every fill on the account. |

        | `highWaterMark` | Highest balance the account has reached (drawdown
        reference for trailing rules). |

        | `dailyStartingBalance` | Balance at the start of the current trading
        day. |

        | `updatedAt` | When the account last changed (fill, status change, day
        roll). |


        **Incremental sync:**

        Store the `asOf` value from a response and pass it back as
        `?updatedSince=` on the next call; you get only the accounts that
        changed in between, ordered most-recently-changed first.


        **Example queries:**

        ```http

        # Every account, 500 per page

        GET /organization/balances?limit=500


        # Just the accounts that changed since your last pass

        GET /organization/balances?updatedSince=2026-09-08T13:00:00Z


        # A specific set of accounts

        GET /organization/balances?accountId=7c9e6679-...,9d1e6679-...


        # One customer's accounts

        GET /organization/balances?customerId=mffu-cust-4471

        ```


        **Pagination:** offset/limit, or follow `pagination.nextCursor` for
        stable paging while balances keep moving.
      operationId: getV1OrganizationBalances
      parameters:
        - description: >-
            Scope to specific accounts: one account UUID or a comma-separated
            list (max 200). Every ID must belong to your organization, otherwise
            404 ACCOUNT_NOT_FOUND.
          name: accountId
          in: query
          required: false
          schema:
            type: string
        - description: >-
            Exact match on the customerId you set at account creation — all
            balances for one of your customers.
          name: customerId
          in: query
          required: false
          schema:
            type: string
            maxLength: 255
        - description: Filter by account status
          name: status
          in: query
          required: false
          schema:
            type: string
            enum:
              - not_started
              - in_progress
              - passed
              - failed
              - expired
        - description: >-
            Only accounts whose balance or state changed at or after this
            instant (ISO 8601). Use the `asOf` value from your previous response
            to fetch just what moved since then.
          x-format:
            isoDate: true
          name: updatedSince
          in: query
          required: false
          schema:
            type: string
        - description: 'Results per page (default: 100, max: 500)'
          name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 500
            default: 100
        - description: Skip this many results (for pagination)
          name: offset
          in: query
          schema:
            type: integer
            minimum: 0
            default: 0
        - description: >-
            Cursor for pagination. Pass the `nextCursor` value from the previous
            response to get the next page. When using cursor, do not send
            `offset` — it will be ignored.


            **How it works:** The cursor is an opaque string that points to the
            last item you received. The server uses it to efficiently fetch the
            next set of results without scanning previous pages.


            **Backwards compatible:** If you don't send a cursor, offset/limit
            pagination works as before.
          name: cursor
          in: query
          required: false
          schema:
            type: string
      responses:
        '200':
          description: Success - Returns one balance row per account
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model57'
        '400':
          description: Bad request - too many account IDs or invalid parameters
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model58'
        '401':
          description: Unauthorized - Invalid or missing API key / session
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model59'
        '404':
          description: >-
            Not found - one or more accountId values do not belong to your
            organization
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model60'
        '500':
          description: An unexpected error occurred
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Model5'
      security:
        - Bearer: []
        - X-API-Key: []
components:
  schemas:
    Model57:
      type: object
      properties:
        success:
          type: boolean
          example: true
        data:
          $ref: '#/components/schemas/Model56'
    Model58:
      type: object
      properties:
        statusCode:
          type: number
          example: 400
        error:
          type: string
          example: Bad Request
        message:
          type: string
          example: accountId accepts at most 200 IDs per request
        code:
          type: string
          example: TOO_MANY_ACCOUNT_IDS
    Model59:
      type: object
      properties:
        statusCode:
          type: number
          example: 401
        error:
          type: string
          example: Unauthorized
        message:
          type: string
          example: Invalid or expired session
    Model60:
      type: object
      properties:
        statusCode:
          type: number
          example: 404
        error:
          type: string
          example: Not Found
        message:
          type: string
          example: >-
            Account(s) not found in your organization:
            9d1e6679-7425-40de-944b-e07fc1f90ae8
        code:
          type: string
          example: ACCOUNT_NOT_FOUND
    Model5:
      type: object
      properties:
        success:
          type: boolean
          description: Always false on errors
          example: false
        statusCode:
          type: number
          example: 500
        error:
          type: string
          example: Internal Server Error
        message:
          type: string
          example: An unexpected error occurred
        code:
          type: string
          description: Machine-readable error code — switch on this, not on message text
          example: INTERNAL_ERROR
    Model56:
      type: object
      example:
        organizationId: a6fcc0ce-eb28-4f43-b256-96a3144b0d34
        asOf: '2026-09-08T15:42:10.318Z'
        balances:
          - accountId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
            accountNumber: ACC-7845KXPQ
            customerId: mffu-cust-4471
            type: evaluation
            status: in_progress
            initialBalance: 25000
            currentBalance: 25806.63
            realizedPnl: 806.63
            highWaterMark: 25955.41
            dailyStartingBalance: 25434.67
            updatedAt: '2026-09-08T15:41:52.104Z'
        pagination:
          total: 1
          limit: 100
          offset: 0
          hasMore: false
          nextCursor: null
      properties:
        organizationId:
          type: string
          description: Your organization ID
        asOf:
          type: string
          description: >-
            Server time the list was produced (ISO 8601). Feed it back as
            ?updatedSince= for incremental sync.
        balances:
          $ref: '#/components/schemas/balances'
        pagination:
          $ref: '#/components/schemas/Model55'
    balances:
      type: array
      items:
        $ref: '#/components/schemas/Model54'
    Model55:
      type: object
      properties:
        total:
          type: number
        limit:
          type: number
        offset:
          type: number
        hasMore:
          type: boolean
        nextCursor:
          type: string
          description: >-
            Cursor for the next page. Pass as ?cursor= to get the next set of
            results. Null if no more results.
    Model54:
      type: object
      properties:
        accountId:
          type: string
          description: Account ID
        accountNumber:
          type: string
          description: Human-readable account number
        customerId:
          type: string
          description: Your customer ID for this account, if set
        type:
          type: string
          description: Account type (evaluation, sim_funded, competition)
        status:
          type: string
          description: Current account status
        initialBalance:
          type: number
          description: Starting balance
        currentBalance:
          type: number
          description: Balance after the last booked fill
        realizedPnl:
          type: number
          description: currentBalance − initialBalance
        highWaterMark:
          type: number
          description: Highest balance achieved
        dailyStartingBalance:
          type: number
          description: Balance at the start of the current trading day
        updatedAt:
          type: string
          description: When the account last changed
  securitySchemes:
    Bearer:
      type: apiKey
      name: Authorization
      in: header
      description: >-
        JWT Bearer token for user session auth. Format: "Bearer {token}". Used
        by User and Organization endpoints.
    X-API-Key:
      type: apiKey
      name: X-API-Key
      in: header
      description: >-
        Organization API key for programmatic access. Format: "hp_live_{key}".
        Used by Organization endpoints as an alternative to Bearer token. Keys
        are managed in the dashboard.

````

## Related topics

- [Bulk update trading accounts](/platform-api/organization/bulk-update-trading-accounts.md)
- [Payout queue — bulk payout eligibility](/platform-api/organization/payout-queue-—-bulk-payout-eligibility.md)
- [Introduction](/introduction.md)
- [Reconcile a trading day in one call](/platform-api/organization/reconcile-a-trading-day-in-one-call.md)
- [Bulk-create unlinked accounts with import keys](/platform-api/organization/bulk-create-unlinked-accounts-with-import-keys.md)
