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

# Get payment account balances

> Reads the balances of one of the organization's wallets: every supported Etherfuse asset it holds, with the value of each in the asset's own fiat currency and in USD.

We read the address the wallet was registered with, on the chain it was registered on. Send `chain` to read an EVM wallet on another EVM chain. A bank account has no address and returns `422` `unsupported`. An address that is not valid on `chain` returns `400` `invalid-request`.

Assets with a zero balance are left out, so an empty `balances` is a successful read of a wallet holding nothing. `currency` is per balance, because one wallet can hold CETES in MXN and TESOURO in BRL at once. `balance` carries the asset's own decimal precision; the two value fields carry six decimal places. Interest-bearing assets accrue all the time, so two reads seconds apart can differ for an unchanged balance.

Balance reads are rate limited per organization. Only calls that reach the chain count, so a `400`, `404` or `422` does not use the limit. Over the limit, the call returns `429` `rate-limit-exceeded` with a `Retry-After` header.



## OpenAPI

````yaml openapi-v2.json GET /organization/{organizationId}/payment_account/{id}/balances
openapi: 3.1.0
info:
  title: Etherfuse FX API
  description: >-
    Partner-facing ramp API, version 2: payment accounts, quotes, orders and
    webhooks.
  license:
    name: Proprietary
  version: 2.0.0
servers:
  - url: https://api.sand.etherfuse.com
    description: Sandbox
security:
  - ApiKeyAuth: []
tags:
  - name: Payment Accounts
    description: >-
      Register the bank accounts and wallets that money moves from and to, and
      read their readiness per rail.
  - name: Quotes
    description: Price a transfer between two registered payment accounts.
  - name: Orders
    description: Create orders from quotes and track them.
  - name: Webhook Subscriptions
    description: Subscribe to webhook events.
  - name: Webhook Events
    description: Payloads Etherfuse sends to your webhook subscriptions.
  - name: Sandbox
    description: Endpoints that work only in sandbox, for testing.
  - name: Assets
    description: The markets and tokens a quote can use, and the balances of a wallet.
  - name: Authentication
    description: >-
      Partner JWT authentication: exchange a JWT for an access token, or launch
      a user into the app.
  - name: KYC
    description: >-
      Submit a customer's verification data, documents and questionnaire
      answers, import a verification they already passed elsewhere, and check
      where their KYC stands.
  - name: KYB
    description: Check where a business organization's KYB stands.
  - name: Lookup
    description: >-
      Public reference data: exchange rates, stablebonds, bond costs, country
      codes.
  - name: Organizations
    description: >-
      Your organization, your default partner fee, and the customer
      organizations you create.
  - name: Members
    description: >-
      The people who belong to a customer business organization and complete its
      KYB.
  - name: Statements
    description: >-
      Monthly revenue share statements for closed months, as a list or as a CSV
      or PDF download.
paths:
  /organization/{organizationId}/payment_account/{id}/balances:
    get:
      tags:
        - Assets
      summary: Get payment account balances
      description: >-
        Reads the balances of one of the organization's wallets: every supported
        Etherfuse asset it holds, with the value of each in the asset's own fiat
        currency and in USD.


        We read the address the wallet was registered with, on the chain it was
        registered on. Send `chain` to read an EVM wallet on another EVM chain.
        A bank account has no address and returns `422` `unsupported`. An
        address that is not valid on `chain` returns `400` `invalid-request`.


        Assets with a zero balance are left out, so an empty `balances` is a
        successful read of a wallet holding nothing. `currency` is per balance,
        because one wallet can hold CETES in MXN and TESOURO in BRL at once.
        `balance` carries the asset's own decimal precision; the two value
        fields carry six decimal places. Interest-bearing assets accrue all the
        time, so two reads seconds apart can differ for an unchanged balance.


        Balance reads are rate limited per organization. Only calls that reach
        the chain count, so a `400`, `404` or `422` does not use the limit. Over
        the limit, the call returns `429` `rate-limit-exceeded` with a
        `Retry-After` header.
      operationId: v2GetPaymentAccountBalances
      parameters:
        - $ref: '#/components/parameters/OrganizationId'
        - $ref: '#/components/parameters/PaymentAccountId'
        - name: chain
          in: query
          required: false
          description: >-
            The chain to read the wallet on. Defaults to the chain it was
            registered on.
          schema:
            $ref: '#/components/schemas/Chain'
      responses:
        '200':
          description: The wallet's balances.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentAccountBalances'
        '400':
          $ref: '#/components/responses/InvalidRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          description: >-
            `unsupported`: the payment account is not a wallet with an address,
            for example a bank account.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/Problem'
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  parameters:
    OrganizationId:
      name: organizationId
      in: path
      required: true
      description: >-
        The organization this call acts for: your API key's organization or one
        of its customer organizations. Any other id returns `404` `not-found`.
      schema:
        type: string
        format: uuid
    PaymentAccountId:
      name: id
      in: path
      required: true
      description: The payment account `id`.
      schema:
        type: string
        format: uuid
  schemas:
    Chain:
      type: string
      enum:
        - stellar
        - solana
        - base
        - polygon
        - monad
        - avalanche
      description: The chain a wallet is on.
    PaymentAccountBalances:
      type: object
      required:
        - paymentAccountId
        - chain
        - address
        - observedAt
        - balances
      properties:
        paymentAccountId:
          type: string
          format: uuid
        chain:
          $ref: '#/components/schemas/Chain'
        address:
          type: string
          description: The address we read.
        observedAt:
          type: string
          format: date-time
          description: When we read the balances.
        balances:
          type: array
          description: One entry per held asset. Empty when the wallet holds none.
          items:
            $ref: '#/components/schemas/WalletBalance'
      example:
        paymentAccountId: c3d4e5f6-a7b8-9012-cdef-123456789012
        chain: solana
        address: 3XnhVzKqNTz2wpNjyhbCsSFvz4Y6VNSVaVNhFTNGmqxr
        observedAt: '2026-10-07T12:00:00Z'
        balances:
          - symbol: cetes
            identifier: CETES7CKqqKQizuSN6iWQwmTeFRjbJR6Vw2XRKfEDR8f
            balance: '1500.123456'
            currency: mxn
            amountInFiat: '1932.551274'
            amountInUsd: '105.214877'
    Problem:
      type: object
      description: >-
        RFC 9457 problem details. Every v2 error uses this body with content
        type `application/problem+json`. `errors` is present only on
        `validation-error`. `required` and `missing` are present only on
        `registration-info-required`.
      required:
        - type
        - title
        - status
        - detail
        - instance
      properties:
        type:
          type: string
          format: uri
          description: >-
            `https://docs.etherfuse.com/ramp/v2/errors/` followed by the problem
            slug, for example
            `https://docs.etherfuse.com/ramp/v2/errors/quote-expired`. Switch on
            this value.
          example: https://docs.etherfuse.com/ramp/v2/errors/quote-expired
        title:
          type: string
          description: Short summary of the problem type.
          example: Quote expired
        status:
          type: integer
          description: The HTTP status code.
          example: 400
        detail:
          type: string
          description: Human-readable explanation of this occurrence. Do not parse it.
          example: >-
            quote 5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b has expired or does not
            exist
        instance:
          type: string
          description: Unique identifier for this occurrence. Quote it to support.
          example: >-
            tag:etherfuse.com,2026-08-28:R2-10120/0b1c2d3e-4f50-4a6b-8c7d-9e0f1a2b3c4d
        errors:
          type: array
          description: Present on `validation-error`. One entry per invalid field.
          items:
            $ref: '#/components/schemas/FieldViolation'
        required:
          type: array
          description: >-
            Present on `registration-info-required`. Every registration field
            the route requires, as JSON Pointers into the request, for example
            `#/registrationInfo/taxId`.
          items:
            type: string
        missing:
          type: array
          description: >-
            Present on `registration-info-required`. The required fields you
            must still send, as JSON Pointers into the request.
          items:
            type: string
    WalletBalance:
      type: object
      required:
        - symbol
        - identifier
        - balance
        - currency
        - amountInFiat
        - amountInUsd
      properties:
        symbol:
          type: string
          description: Asset symbol (e.g. "cetes")
        identifier:
          type: string
          description: >-
            Chain-specific asset identifier: the mint on Solana, the contract on
            EVM chains, "CODE:ISSUER" on Stellar
        balance:
          type: string
          description: Held amount, at the asset's own decimal precision
        currency:
          type: string
          description: >-
            The fiat currency this asset is denominated in (e.g. "mxn" for
            CETES, "brl" for TESOURO)
        amountInFiat:
          type: string
          description: >-
            Value of the held amount in `currency`, to six decimal places.
            Stablebond valuations use the price from BondPrice.
        amountInUsd:
          type: string
          description: >-
            Value of the held amount in USD, to six decimal places, using the
            same asset price as amountInFiat and the current FX rate.
    FieldViolation:
      type: object
      required:
        - pointer
        - detail
      properties:
        pointer:
          type: string
          description: >-
            JSON Pointer to the field in the request, for example
            `#/accountDetails/clabe`.
          example: '#/accountDetails/clabe'
        detail:
          type: string
          description: What is wrong with the field.
          example: This field is required.
  responses:
    InvalidRequest:
      description: >-
        `invalid-request`: a path, query or body value is malformed, or
        `pageSize` is 0 or over 100.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    Unauthorized:
      description: >-
        `unauthorized`: the `Authorization` header is missing, not ASCII, or
        does not hold a valid API key.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    NotFound:
      description: >-
        `not-found`: your API key cannot act for this organization, or no such
        resource belongs to it.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    RateLimitExceeded:
      description: >-
        `rate-limit-exceeded`: too many requests. Wait the number of seconds in
        `Retry-After` and try again.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    InternalError:
      description: >-
        `internal-error`: an unexpected error on our side. Retry with backoff,
        and quote `instance` to support if it persists.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
    ServiceUnavailable:
      description: >-
        `service-unavailable`: a provider or chain we depend on did not answer
        in time. Retry with backoff.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: API key sent in the Authorization header, with no `Bearer` prefix.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.