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

# Get virtual account balance

> Read how much a virtual account has available.

The account has to be open before it can report a balance; until then the call returns a `400`. The `virtual_account.activated` webhook is what tells you it is open — see [Webhooks](/webhooks/overview).



## OpenAPI

````yaml /openapi/kira-api.2026-04-14.json get /v1/virtual-accounts/{virtual_account_id}/balance
openapi: 3.1.0
info:
  title: Kira API
  version: '2026-04-14'
  description: >-
    REST API for users, KYC/KYB verification, virtual accounts, payouts,
    recipients, and webhooks. Every request requires an `x-api-key` header and a
    bearer access token (see Authentication). Pin your account to version
    `2026-04-14` before integrating.
  contact:
    name: Kira API Support
    email: support@kirafin.ai
servers:
  - url: https://api.balampay.com
    description: Production
  - url: https://api.balampay.com/sandbox
    description: Sandbox
security:
  - bearerAuth: []
    apiKeyAuth: []
tags:
  - name: Authentication
  - name: Versioning
  - name: Users
  - name: Virtual Accounts
  - name: Recipients
  - name: Quotations
  - name: Payouts
  - name: Reference
paths:
  /v1/virtual-accounts/{virtual_account_id}/balance:
    get:
      tags:
        - Virtual Accounts
      summary: Get virtual account balance
      description: >-
        Read how much a virtual account has available.


        The account has to be open before it can report a balance; until then
        the call returns a `400`. The `virtual_account.activated` webhook is
        what tells you it is open — see [Webhooks](/webhooks/overview).
      operationId: get_v1-virtual-accounts-virtual-account-id-balance
      parameters:
        - in: path
          name: virtual_account_id
          required: true
          schema:
            type: string
            format: uuid
          description: UUID of the account to read the balance of.
        - in: header
          name: X-Api-Version
          required: false
          description: >-
            Version applied to this request. It wins over your account's pinned
            version — see [Versioning](/using-the-api/versioning).
          schema:
            type: string
            example: '2026-04-14'
      responses:
        '200':
          description: Success.
          content:
            application/json:
              schema:
                type: object
                properties:
                  available_balance:
                    type: number
                    description: >-
                      How much the account has available, in the currency named
                      below. Always returned.


                      In sandbox it comes from a simulated bank.
                  reserved_balance:
                    type: number
                    description: >-
                      Money reserved against payouts already submitted that have
                      not settled yet. Still the account's money — it returns to
                      `available_balance` if such a payout fails or is cancelled
                      — but not available to send again. Always returned; `0`
                      when nothing is reserved.
                  currency:
                    type: string
                    description: Currency of the balance. Always `USD`.
              example:
                available_balance: 1000
                reserved_balance: 0
                currency: USD
        '400':
          description: >-
            Either the id is malformed, or the account cannot report a balance
            yet. Read `error` to tell them apart: `Invalid request data` is the
            id, `Bad Request` is the account.


            When it is the account, the message names where the bank has got to,
            so you know whether to retry now or wait.
          content:
            application/json:
              examples:
                malformed-id:
                  summary: The id is not a UUID
                  value:
                    error: Invalid request data
                    details:
                      - path: id
                        message: Invalid virtual account ID format
                        code: invalid_string
                not-active:
                  summary: The bank is still opening the account
                  value:
                    statusCode: 400
                    error: Bad Request
                    message: 'Virtual account is not active. Current status: activating'
                    timestamp: '2026-09-01T12:00:00.000Z'
                not-provisioned:
                  summary: >-
                    The account is open but the bank has not finished setting it
                    up
                  value:
                    statusCode: 400
                    error: Bad Request
                    message: Account not fully provisioned. Please try again later.
                    timestamp: '2026-09-01T12:00:00.000Z'
        '403':
          description: >-
            Your request was turned away before it reached the API. The message
            talks about routing, but any of these causes it:


            - The `x-api-key` header is missing or wrong.

            - Your bearer token has expired. Get a new one from [Get access
            token](/api-reference/authentication/get-access-token).

            - The path or the HTTP method does not match. In sandbox, check that
            the path sits under the `/sandbox` prefix.


            A missing `Authorization` header comes back as a `401` with the same
            body.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                code: invalid_request
                message: >-
                  The request could not be matched to a valid route, or was
                  malformed. Verify the path and HTTP method against the API
                  reference. This is a routing or request error, not a
                  credentials or signature problem.
        '404':
          description: >-
            No account of yours has that id. The same body comes back whether
            the id does not exist or the account belongs to another account
            holder, so it never reveals which.
          content:
            application/json:
              schema:
                type: object
                properties:
                  statusCode:
                    type: integer
                    description: Repeats the HTTP status.
                  error:
                    type: string
                    description: The status name.
                  message:
                    type: string
                    description: What went wrong, in one sentence.
                  timestamp:
                    type: string
                    description: When the call was rejected, as an ISO 8601 timestamp.
              example:
                statusCode: 404
                error: Not Found
                message: Virtual account 11111111-2222-3333-4444-555555555555 not found
                timestamp: '2026-09-01T12:00:00.000Z'
        '503':
          description: >-
            The bank did not answer. Nothing is wrong with your request or the
            account — retry, and treat a run of these as the bank being down
            rather than as a zero balance.
          content:
            application/json:
              schema:
                type: object
                properties:
                  statusCode:
                    type: integer
                    description: Repeats the HTTP status.
                  error:
                    type: string
                    description: The status name.
                  message:
                    type: string
                    description: What went wrong, in one sentence.
                  timestamp:
                    type: string
                    description: When the call was rejected, as an ISO 8601 timestamp.
              example:
                statusCode: 503
                error: Service Unavailable
                message: >-
                  Balance is temporarily unavailable for this account. Please
                  try again later.
                timestamp: '2026-09-01T12:00:00.000Z'
      security:
        - bearerAuth: []
          apiKeyAuth: []
      servers:
        - url: https://api.balampay.com/sandbox
          description: Sandbox
        - url: https://api.balampay.com
          description: Production
components:
  schemas:
    ErrorResponse:
      type: object
      properties:
        message:
          type: string
        code:
          type: string
        statusCode:
          type: number
        error:
          type: string
        timestamp:
          type: string
        path:
          type: string
        details: {}
      required:
        - message
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        The `data.access_token` value from [Get access
        token](/api-reference/authentication/get-access-token).
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key issued by Kira.

````