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

# List simulated test accounts

> Lists the simulated trading accounts registered for load testing, newest first. Unpaginated: test accounts are registered by hand for a run, so there are tens of them rather than thousands. Readable by a client credential holding the credential:read scope, which may name any organization or none to read every tenant at once, and by an organization admin of a configured internal organization, who reads that organization and only that organization. Every other caller is refused. Registering, retuning, and removing test accounts remain closed to tenants entirely.



## OpenAPI

````yaml /api-reference/accounts.openapi.json get /v1/accounts/test
openapi: 3.1.0
info:
  title: accounts
  description: ''
  license:
    name: ''
  version: 0.1.0
servers:
  - url: https://api.anthid.com
    description: Production
security: []
tags:
  - name: Accounts
    description: Create, inspect, update, and disable trading accounts
  - name: Broker Credentials
    description: Inspect and manage credentials linked to trading accounts
paths:
  /v1/accounts/test:
    get:
      tags:
        - Accounts
      summary: List simulated test accounts
      description: >-
        Lists the simulated trading accounts registered for load testing, newest
        first. Unpaginated: test accounts are registered by hand for a run, so
        there are tens of them rather than thousands. Readable by a client
        credential holding the credential:read scope, which may name any
        organization or none to read every tenant at once, and by an
        organization admin of a configured internal organization, who reads that
        organization and only that organization. Every other caller is refused.
        Registering, retuning, and removing test accounts remain closed to
        tenants entirely.
      operationId: listTestAccounts
      parameters:
        - name: organization_id
          in: query
          description: >-
            Organization to list. A client credential may name any, or none to
            read every tenant at once. An internal organization admin may name
            only its own, and naming another is refused rather than narrowed.
          required: false
          schema:
            type: string
            format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
        - name: account_id
          in: query
          description: >-
            Narrows the listing to one simulated account. An account the caller
            cannot see matches nothing and returns an empty list.
          required: false
          schema:
            type: string
            format: uuid
          example: 550e8400-e29b-41d4-a716-446655440111
        - name: enabled
          in: query
          description: Filter by whether the scheduler is running the account
          required: false
          schema:
            type: boolean
          example: true
      responses:
        '200':
          description: The simulated accounts in scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListTestAccountsResponse'
              example:
                data:
                  - ack_latency_ms: 0
                    created_at: '2026-08-25T15:07:59Z'
                    created_by: an_YcKlZQeuLOoB5BcqlOrnV6a0
                    deleted_at: null
                    enabled: true
                    environment: paper
                    fill_max_ms: 100
                    fill_min_ms: 5
                    name: load-test-01
                    organization_id: 550e8400-e29b-41d4-a716-446655440000
                    trading_account_id: 550e8400-e29b-41d4-a716-446655440111
                    updated_at: '2026-08-25T15:07:59Z'
        '401':
          description: Caller has no organization context, or is an API key
          content:
            text/plain:
              schema:
                type: string
        '403':
          description: >-
            Caller's organization may not read test accounts, the caller is not
            an organization admin, the client credential is missing the
            credential:read scope, or organization_id named an organization
            other than the caller's own
          content:
            text/plain:
              schema:
                type: string
        '429':
          description: Caller exceeded the request rate limit
          content:
            text/plain:
              schema:
                type: string
        '500':
          description: Unexpected server error while listing the accounts
          content:
            text/plain:
              schema:
                type: string
      security:
        - bearerAuth: []
components:
  schemas:
    ListTestAccountsResponse:
      type: object
      description: >-
        The simulated accounts in scope, newest first.


        Carries [`TestTradingAccount`] whole rather than the `TradingAccount`

        projection [`ListTradingAccountsResponse`] uses. That projection exists
        so

        the scheduler sees one account shape whichever mode it asked for, and it

        drops exactly the fields an operator looking at a list of test accounts
        came

        for: the simulator's timings, and the credential that registered the
        row.


        No `next_cursor`. The read behind this is unpaginated by design -- see

        `list_test_accounts` -- so there is never a next page to offer, and a
        field

        that is always null is an invitation to loop on it.
      required:
        - data
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/TestTradingAccount'
    TestTradingAccount:
      type: object
      description: >-
        A simulated trading account, registered by an operator for load testing.


        Not a [`TradingAccount`] with a flag on it, and deliberately so. A
        trading

        account is a customer's broker connection: it has a broker, a
        credential, an

        append-only event stream behind it and a six year retention obligation.
        This

        has none of those. It is a row an operator adds to make the platform
        trade

        against an in-process simulator, and removes again afterwards.


        Keeping the two types apart is what lets `GET /v1/accounts` answer one

        question at a time: without `test_accounts=true` it lists real accounts
        and

        cannot accidentally include one of these, and with it, it lists only
        these.

        A shared type carrying a boolean would have made every caller
        responsible

        for checking that boolean, and the cost of one forgetting is a
        customer's

        orders going to a simulator.
      required:
        - trading_account_id
        - organization_id
        - name
        - enabled
        - environment
        - ack_latency_ms
        - fill_min_ms
        - fill_max_ms
        - created_by
        - created_at
        - updated_at
      properties:
        ack_latency_ms:
          type: integer
          format: int32
          description: >-
            Acknowledgement delay the simulator charges every command, in

            milliseconds.


            Also a per-account rate ceiling of roughly `1000 / ack_latency_ms`

            commands a second: it is paid inside the simulator's `create_order`

            before it returns, and the submitter awaits that return before
            claiming

            the account's next command. Zero means no delay.
        created_at:
          type: string
          format: date-time
        created_by:
          type: string
          description: '`service_id` of the credential that registered this account.'
        deleted_at:
          type:
            - string
            - 'null'
          format: date-time
          description: >-
            When this account was first deleted, if it has been.


            A tombstone rather than a removal, so a retried delete can be
            answered

            with the moment the first one happened. A deleted account is
            filtered

            out of every read path, which is what stops the scheduler running
            it.
        enabled:
          type: boolean
        environment:
          $ref: '#/components/schemas/BrokerEnvironment'
          description: >-
            Always [`BrokerEnvironment::Paper`], enforced by a check constraint
            on

            the table. Carried rather than assumed because the scheduler
            branches on

            it to decide whether an account needs the live-trading entitlement.
        fill_max_ms:
          type: integer
          format: int32
        fill_min_ms:
          type: integer
          format: int32
          description: >-
            Bounds on how long a resting order waits before the simulator fills
            it.
        name:
          type: string
          description: >-
            What the operator called it. Required, unlike a trading account's
            name:

            with no broker and no credential, it is the only thing identifying
            which

            test account this is.
        organization_id:
          type: string
          format: uuid
        trading_account_id:
          type: string
          format: uuid
          description: The account id the rest of the platform trades under.
        updated_at:
          type: string
          format: date-time
    BrokerEnvironment:
      type: string
      enum:
        - paper
        - live
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````