> ## 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 control changes for an account

> Returns what changed for a trading account's controls, newest first, covering the account's own manual, risk and time controls and the symbol controls beneath it. Each entry says whether an API key, a person, or Anthid made the change, and when. Identifiers behind those actors are not returned: an internal key or user id is not readable by the organization and would say less than the class does.



## OpenAPI

````yaml /api-reference/controls.openapi.json get /v1/controls/accounts/{account_id}/history
openapi: 3.1.0
info:
  title: controls
  description: ''
  license:
    name: ''
  version: 0.1.0
servers:
  - url: https://api.anthid.com
    description: Production
security: []
tags:
  - name: Organization Controls
    description: Organization-level control configuration
  - name: Account Manual Controls
    description: Account-level manual control configuration
  - name: Account Risk Controls
    description: Account-level risk-limit control configuration
  - name: Account Time Controls
    description: Account-level time-window control configuration
  - name: Symbol Manual Controls
    description: Symbol-level manual control configuration
  - name: Symbol Risk Controls
    description: Symbol-level risk-limit control configuration
  - name: Symbol Time Controls
    description: Symbol-level time-window control configuration
  - name: Effective Controls
    description: Read combined controls after scope inheritance
  - name: Control Evaluation
    description: Effective control-state evaluation
paths:
  /v1/controls/accounts/{account_id}/history:
    get:
      tags:
        - Account Manual Controls
      summary: List control changes for an account
      description: >-
        Returns what changed for a trading account's controls, newest first,
        covering the account's own manual, risk and time controls and the symbol
        controls beneath it. Each entry says whether an API key, a person, or
        Anthid made the change, and when. Identifiers behind those actors are
        not returned: an internal key or user id is not readable by the
        organization and would say less than the class does.
      operationId: listAccountControlChanges
      parameters:
        - name: account_id
          in: path
          description: Trading account ID
          required: true
          schema:
            type: string
            format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
        - name: cursor
          in: query
          description: Opaque cursor from a previous page's `next_cursor`.
          required: false
          schema:
            type:
              - string
              - 'null'
        - name: limit
          in: query
          description: Page size, clamped to 100.
          required: false
          schema:
            type:
              - integer
              - 'null'
            format: int64
      responses:
        '200':
          description: Control changes, newest first
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListControlChangesResponse'
              example:
                data:
                  - changed_at: '2026-08-12T16:20:00Z'
                    changed_by: USER
                    cleared_fields: []
                    control_kind: RISK
                    event_type: SET
                    scope: ACCOUNT
                    set_fields:
                      max_order_size: '100'
                    symbol: null
                next_cursor: null
        '400':
          description: The cursor is malformed
          content:
            text/plain:
              schema:
                type: string
        '401':
          description: >-
            Missing or invalid authentication credentials, or the credential
            carries no active organization
          content:
            text/plain:
              schema:
                type: string
        '403':
          description: >-
            Caller lacks read access to the trading account. A trading account
            that does not exist is refused the same way as one owned by another
            organization, so a caller cannot confirm an id exists elsewhere
          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 reading control history
          content:
            text/plain:
              schema:
                type: string
      security:
        - bearerAuth: []
        - apiKeyAuth: []
components:
  schemas:
    ListControlChangesResponse:
      type: object
      required:
        - data
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ControlChange'
        next_cursor:
          type:
            - string
            - 'null'
    ControlChange:
      type: object
      description: >-
        One recorded change to a control.


        Deliberately omits `principal_id`, `request_id`, `source_ip` and the

        idempotency key. They exist on the record and matter to an
        investigation,

        but none of them is readable by the tenant and two of them are internal

        correlation values. This is the supervisory view, not the audit export.
      required:
        - control_kind
        - scope
        - event_type
        - set_fields
        - cleared_fields
        - changed_by
        - changed_at
      properties:
        changed_at:
          type: string
          format: date-time
        changed_by:
          $ref: '#/components/schemas/ControlChangedBy'
        cleared_fields:
          type: array
          items:
            type: string
          description: Fields this change removed.
        control_kind:
          type: string
          description: 'Which family of control changed: manual, risk, or time.'
        event_type:
          type: string
          description: Whether the change set fields or removed the control outright.
        scope:
          type: string
          description: 'Which level it sits at: organization, account, or symbol.'
        set_fields:
          description: Fields this change set, as supplied.
        symbol:
          type:
            - string
            - 'null'
          description: Present only for a symbol-scoped control.
    ControlChangedBy:
      type: string
      description: >-
        Who changed a control, as much as is useful to say.


        The class of credential only -- never the identifier behind it. An

        `api_key_id` or an external user id means nothing to the tenant reading
        it,

        looks like a leak, and would be worse than showing nothing at all. What
        a

        supervising tenant actually needs first is whether one of their people
        did

        this or one of their automated keys did, and that is answerable without

        naming anyone.


        A resolved display name belongs here later, once identities can be
        turned

        into labels. Until then this stays deliberately coarse rather than

        deliberately opaque.
      enum:
        - API_KEY
        - USER
        - SERVICE
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

````