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

# List portfolio assets

> Lists yield sources and Ondo stocks together, with kind, purchase availability, routes, and applicable reference prices.

Returns yield sources and Ondo stocks visible to your organization. Use `kind` to distinguish them, and check purchase availability and supported routes before allocating.


## OpenAPI

````yaml swagger/swagger-combined.yaml GET /v2/wallets/assets
openapi: 3.0.0
info:
  title: Ground API
  description: Core API for Portfolio Wallets, gtokens, MicroVaults, and webhooks.
  version: 2.0.0
servers:
  - url: https://sandbox.groundtech.co
  - url: https://production.groundtech.co
security:
  - bearerAuth: []
tags:
  - name: System
    description: System health and utility endpoints.
  - name: Sandbox Faucets
    description: Sandbox-only test token faucets.
  - name: Portfolio Wallets
    description: >-
      Portfolio wallets with strategy allocation, deposits, withdrawals, and
      yield positions.
  - name: gVaults
    description: >-
      Direct access to gtokens with deposit access controls and optional fee
      wrappers.
  - name: MicroVaults
    description: >-
      Customer-owned onchain vaults with externally held ERC-20 shares. Private
      preview in sandbox on Ethereum Sepolia.
  - name: Webhook Endpoints
    description: Webhook endpoint management for portfolio wallet notifications.
paths:
  /v2/wallets/assets:
    get:
      tags:
        - Portfolio Wallets
      summary: List portfolio assets
      description: >-
        Lists yield sources and Ondo stocks together, with kind, purchase
        availability, routes, and applicable reference prices.
      operationId: getAssetsV2
      responses:
        '200':
          description: Portfolio asset catalog
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                  - nextCursor
                properties:
                  nextCursor:
                    type: string
                    nullable: true
                    description: Always null; the catalog is unpaginated.
                  data:
                    type: array
                    items:
                      oneOf:
                        - $ref: '#/components/schemas/YieldSource'
                        - $ref: '#/components/schemas/Stock'
              examples:
                stock:
                  value:
                    data:
                      - id: qqqon
                        kind: stock
                        name: Invesco QQQ
                        mode: active
                        chain: ethereum
                        assetSymbol: QQQon
                        tokenDecimals: 18
                        priceUsd: '727.55'
                        priceAsOf: '2026-10-27T15:00:00.000Z'
                        priceFreshness: fresh
                        purchaseAvailability:
                          enabled: true
                          reason: null
                        buyAssets:
                          - kind: cash
                            chain: ethereum
                            token: usdc
                        sellAssets:
                          - kind: cash
                            chain: ethereum
                            token: usdc
                        maxAllocationUsd: '100.000000'
                    nextCursor: null
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
components:
  schemas:
    YieldSource:
      type: object
      required:
        - id
        - kind
        - name
        - description
        - mode
        - chain
        - apyBps
        - navUpdateMode
        - tvlUsd
        - utilizationPct
        - addresses
        - allocations
        - links
        - protocol
        - depositToken
        - processingPolicies
        - allocationGroup
        - maxAllocationUsd
      properties:
        id:
          type: string
          description: >-
            Unique identifier for the yield source (used in strategy
            allocations).
        kind:
          type: string
          enum:
            - yield_source
        instrumentKind:
          type: string
          enum:
            - yield
            - stock
          description: >-
            Legacy catalog classification returned by GET
            /v2/wallets/yield-sources only.
        assetSymbol:
          type: string
          description: Ondo symbol on legacy stock catalog rows.
        priceUsd: 2e97b219-a1ff-4623-bff8-2d1b989fdeef
        priceAsOf: 4ea5cb91-ce11-4494-abf3-3d9903c7d558
        priceFreshness: 84e3963b-7478-4d1a-a191-ef52f452fbd9
        name:
          type: string
          description: Human-readable display name.
        description:
          type: string
          nullable: true
        mode:
          type: string
          enum:
            - active
            - buy_only
            - sell_only
            - emergency_freeze
          description: >-
            Source operating mode. `emergency_freeze` sources remain visible but
            are unavailable for new allocations.
        chain:
          type: string
          nullable: true
          description: >-
            Canonical chain the source settles on, for the current environment.
            Production returns mainnet keys (e.g. `ethereum`, `base`, `solana`,
            and `stellar`); sandbox returns the environment's testnet key (e.g.
            `ethereum_sepolia`, `solana_devnet`, `stellar_testnet`).
        tokenDecimals:
          type: integer
          nullable: true
          minimum: 0
          description: Decimal precision of the held token, used to interpret nativeUnits.
        purchaseAvailability:
          type: object
          description: >-
            Organization-specific permission for a new purchase. A disabled
            purchase does not hide an existing holding or prevent a supported
            sale. Global source mode and route availability still apply
            independently.
          required:
            - enabled
            - reason
          properties:
            enabled:
              type: boolean
            reason:
              type: string
              nullable: true
          example:
            enabled: false
            reason: >-
              Ondo stock purchases are not enabled for your organization.
              Contact Ground to request access.
        buyAssets:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioAssetReference'
          description: >-
            Assets accepted by currently active direct purchase routes.
            Organization-specific purchase access is reported separately in
            purchaseAvailability. Reachability from another position is
            validated when you allocate.
        sellAssets:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioAssetReference'
          description: Assets returned by currently active direct redemption routes.
        apyBps:
          type: integer
          nullable: true
          description: >-
            Trailing 30-day annualized return in denominationCurrency, in basis
            points, or null when history is insufficient or stale. CETES uses
            production MXN price history in both environments. Preserve zero and
            negative values. Do not combine different currencies into a
            portfolio APY.
        denominationCurrency:
          type: string
          description: >-
            Currency in which this source's apyBps is measured. CETES uses MXN;
            existing USD sources use USD. Deposit amounts and balances remain in
            USD.
          example: MXN
        currentApy:
          type: object
          nullable: true
          description: >-
            Optional current supply APY preview for JustLend V1, excluding
            rewards. Derived from the observed per-block rate using JustLend's
            365-day annualization at three-second blocks, without additional
            compounding, truncated to whole basis points; not a historical
            return or guaranteed yield. Null when unavailable or at least two
            hours old. Clients must label it Current APY and stop displaying it
            at validUntil.
          required:
            - apyBps
            - asOf
            - validUntil
          properties:
            apyBps:
              type: integer
              minimum: 0
            asOf:
              type: string
              format: date-time
              description: Onchain market observation timestamp.
            validUntil:
              type: string
              format: date-time
              description: Expiry timestamp for this preview.
        navUpdateMode:
          type: string
          enum:
            - continuous
            - discrete
          description: >-
            Whether the source value accrues continuously between price
            snapshots or changes only when a new NAV is published.
        tvlUsd:
          type: number
          nullable: true
          description: >-
            Current source TVL in USD when provider data is available. For
            Etherfuse CETES, both environments report mainnet Stellar supply
            valued at the mainnet USD token price, not available swap liquidity.
        utilizationPct:
          type: number
          nullable: true
          description: >-
            Vault-level deployed-asset utilization percentage when provider data
            is available.
        addresses:
          type: array
          description: Protocol addresses relevant to the source.
          items:
            type: object
            properties:
              label:
                type: string
              value:
                type: string
        allocations:
          type: array
          description: >-
            Current underlying allocation rows. Percentages describe source
            asset mix, not utilization.
          items:
            type: object
            properties:
              label:
                type: string
              type:
                type: string
                nullable: true
              valueUsd:
                type: number
                nullable: true
              pct:
                type: number
                nullable: true
              address:
                type: string
                nullable: true
              description:
                type: string
                nullable: true
        links:
          type: array
          description: Provider UI links for the source.
          items:
            type: object
            properties:
              label:
                type: string
              url:
                type: string
                format: uri
        protocol:
          type: string
          nullable: true
          description: Underlying protocol identifier.
        allocationGroup:
          type: string
          nullable: true
          enum:
            - usdc
            - usdt
            - usdt:tron
            - null
        depositToken:
          type: string
          enum:
            - usdc
            - usdt
          description: >-
            Legacy default settlement stablecoin. Use buyAssets and sellAssets
            to discover direct routes; this field does not establish exclusive
            funding compatibility.
        maxAllocationUsd:
          type: string
          nullable: true
          description: >-
            Optional per-wallet allocation cap for this source, as a
            fixed-precision USD string. The cap blocks additional buys but not
            exits.
        processingPolicies:
          type: object
          description: >-
            Typical processing windows by action. Calendar and outer-bound
            details are internal.
          properties:
            deposit:
              $ref: '#/components/schemas/YieldSourceProcessingPolicy'
            redeem:
              $ref: '#/components/schemas/YieldSourceProcessingPolicy'
    Stock:
      type: object
      required:
        - id
        - kind
        - name
        - mode
        - chain
        - assetSymbol
        - tokenDecimals
        - buyAssets
        - sellAssets
      properties:
        id:
          type: string
          description: Public stock ID used as an allocation destination or source.
        kind:
          type: string
          enum:
            - stock
        name:
          type: string
        description:
          type: string
          nullable: true
        mode:
          type: string
          enum:
            - active
            - buy_only
            - sell_only
            - emergency_freeze
        chain:
          type: string
        assetSymbol:
          type: string
          description: Ondo token symbol, such as QQQon.
        tokenDecimals:
          type: integer
        priceUsd: 7546565e-5375-4723-b086-24bb9a7ed848
        priceAsOf: a4035a12-f3ba-4fe3-9a9c-baa7d63b4d05
        priceFreshness: e7fd6dec-4621-4a16-8628-d30b53bb682f
        purchaseAvailability: 6d4b157f-dfdc-401d-ae92-8bcd18b673c3
        buyAssets:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioAssetReference'
        sellAssets:
          type: array
          items:
            $ref: '#/components/schemas/PortfolioAssetReference'
        maxAllocationUsd:
          type: string
          nullable: true
        processingPolicies:
          type: object
          properties:
            deposit:
              $ref: '#/components/schemas/YieldSourceProcessingPolicy'
            redeem:
              $ref: '#/components/schemas/YieldSourceProcessingPolicy'
    PortfolioAssetReference:
      type: object
      required:
        - kind
      properties:
        kind:
          type: string
          enum:
            - cash
            - yield_source
            - stock
        chain:
          type: string
          description: Network of a cash asset.
        token:
          type: string
          enum:
            - usdc
            - usdt
        yieldSourceId:
          $ref: '#/components/schemas/PortfolioWalletYieldSourceId'
        assetId:
          type: string
          description: Public stock ID when kind is stock.
      description: >-
        A cash chain/token pair or a noncash catalog ID. These identify assets,
        independently of how they are bought or sold.
    YieldSourceProcessingPolicy:
      type: object
      required:
        - processingTimeBasis
        - typicalMinUnits
        - typicalMaxUnits
      properties:
        processingTimeBasis:
          type: string
          enum:
            - elapsed_seconds
            - banking_days
            - provider_managed
        typicalMinUnits:
          type: integer
          nullable: true
          minimum: 0
        typicalMaxUnits:
          type: integer
          nullable: true
          minimum: 0
        processingEstimate:
          allOf:
            - $ref: '#/components/schemas/ProcessingEstimate'
          description: >-
            Preliminary completion estimate calculated when the catalog response
            is generated. Omitted for atomic actions and when maintained
            calendar coverage is unavailable.
          nullable: true
        maximum:
          type: string
          nullable: true
          description: >-
            Always null for provider-managed processing because there is no
            fixed completion deadline.
        description:
          type: string
          description: >-
            Customer-facing processing and liquidity qualification when timing
            is provider-managed.
    AuthErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: string
          description: Authentication or authorization error message.
        message:
          type: string
          nullable: true
          description: Additional auth middleware detail, when present.
        code:
          type: string
          nullable: true
          enum:
            - unauthenticated
            - forbidden
          description: >-
            Some auth and scope failures include a stable code; middleware
            errors may omit it.
    ErrorResponse:
      type: object
      required:
        - error
        - code
      properties:
        error:
          type: string
          description: >-
            Human-readable error message. May change without notice; do not
            parse programmatically.
        code:
          type: string
          description: >-
            Machine-readable error code. Stable across API versions — safe to
            switch on in client code.
          enum:
            - validation_error
            - unknown_parameters
            - payload_too_large
            - unsupported_media_type
            - submission_id_conflict
            - feedback_unavailable
            - unsupported_chain
            - unsupported_token
            - invalid_destination_address
            - stellar_destination_account_not_active
            - stellar_destination_usdc_not_enabled
            - precision_overflow
            - invalid_cursor
            - unauthenticated
            - forbidden
            - wallet_not_found
            - wallet_limit_reached
            - withdrawal_not_found
            - deposit_not_found
            - yield_source_not_found
            - wallet_projection_unavailable
            - insufficient_funds
            - duplicate_request_id
            - request_id_conflict
            - invalid_position_weight
            - invalid_withdrawal_plan
            - payout_not_found
            - webhook_not_found
            - webhook_duplicate_url
            - withdrawal_not_cancellable
            - withdrawal_already_cancelled
            - withdrawal_payout_in_progress
            - withdrawal_policy_required
            - workflow_conflict
            - stale_rebalance_plan
            - stale_wallet_strategy
            - payout_already_terminal
            - payout_in_progress
            - payout_not_retryable
            - address_book_entry_not_found
            - address_book_duplicate_entry
            - address_book_whitelist_violation
            - rate_limited
            - rate_limit_exceeded
            - internal_error
            - wallet_creation_failed
            - service_temporarily_unavailable
            - operation_not_supported
            - wallet_withdrawal_active
            - stellar_customer_approval_unavailable
            - withdrawal_signing_required
            - wallet_performance_unavailable
            - tempo_beta_transfer_limit_exceeded
            - product_not_enabled
    PortfolioWalletYieldSourceId:
      type: string
      description: >-
        Stable noncash asset ID from `GET /v2/wallets/assets` (including yield
        sources and stock tokens), or the special `cash` id for cash held in the
        allocation's token lane. The live yield source catalog is
        environment-specific; fetch it before creating or updating a yield
        allocation.
    ProcessingEstimate:
      oneOf:
        - type: object
          required:
            - basis
            - typicalCompletionDate
            - typicalWindowEndDate
          properties:
            basis:
              type: string
              enum:
                - banking_days
            typicalCompletionDate:
              type: string
              format: date
            typicalWindowEndDate:
              type: string
              format: date
            phases:
              type: array
              description: >-
                Ordered asynchronous phases that make up the overall
                workflow-leg estimate.
              items:
                $ref: '#/components/schemas/ProcessingEstimatePhase'
        - type: object
          required:
            - basis
            - typicalMinDuration
            - typicalMaxDuration
          properties:
            basis:
              type: string
              enum:
                - elapsed_seconds
            typicalMinDuration:
              type: string
              description: ISO-8601 duration for the lower end of the usual window.
            typicalMaxDuration:
              type: string
              description: ISO-8601 duration for the upper end of the usual window.
    ProcessingEstimatePhase:
      type: object
      required:
        - type
        - label
        - status
        - typicalCompletionDate
        - typicalWindowEndDate
      properties:
        type:
          type: string
          enum:
            - yield_redeem
            - yield_deposit
        label:
          type: string
        status:
          type: string
          enum:
            - queued
            - processing
            - completed
            - failed
            - cancelled
        typicalCompletionDate:
          type: string
          format: date
        typicalWindowEndDate:
          type: string
          format: date
  responses:
    Unauthorized:
      description: >-
        The request is missing a valid bearer token, or the token is invalid or
        expired.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/AuthErrorResponse'
          example:
            error: Unauthenticated request
            message: Missing or invalid bearer token
    TooManyRequests:
      description: >-
        Rate limit exceeded. Limits are enforced by API key/customer identity
        and by endpoint class. Retry with backoff; rate-limit headers are not
        currently emitted.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Rate limit exceeded
            code: rate_limited
    InternalServerError:
      description: >-
        An unexpected error occurred while processing the request. The request
        can be safely retried with the same `requestId`.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error: Internal server error
            code: internal_error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````

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