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

# Get user fee tier

> Read active root-account fee-tier rates, or exchange defaults when missing or inactive.

Returns rates from the latest indexed `AccountFeeTierUpdated` assignment when
active, otherwise exchange defaults. Subaccounts inherit the root account's tier. No query parameters or request
body are accepted.

<ParamField path="userId" type="string" required>
  Unsigned 64-bit Kuru account ID as a decimal string.
</ParamField>

<ResponseField name="feedEpoch" type="string | null" required>
  Materialization feed epoch, or `null` before initialization. `"0"` is a valid
  initial epoch, not a missing-data sentinel. This is not a replay sequence.
</ResponseField>

<ResponseField name="data.userId" type="string" required>
  Requested account ID.
</ResponseField>

<ResponseField name="data.rootUserId" type="string | null" required>
  Registered root account ID. Null for an unknown or incompletely registered account.
</ResponseField>

<ResponseField name="data.accountFeeTier" type="object" required>
  Latest indexed assignment's rates when active. When absent or inactive, returns
  exchange defaults: maker 1 BPS (`"1000"` PPS), taker 2 BPS (`"2000"` PPS).
  A later inactive assignment supersedes any earlier active assignment.
</ResponseField>

<ResponseField name="data.accountFeeTier.makerFeePps" type="string" required>
  Assigned integer maker rate in protocol PPS units, with denominator
  `10,000,000`. For example, `"4000"` represents 0.04%. Not a token or x18 amount.
</ResponseField>

<ResponseField name="data.accountFeeTier.takerFeePps" type="string" required>
  Assigned integer taker rate in the same PPS units. `"7000"` represents 0.07%.
</ResponseField>

These are **assigned account rates, not effective trading fees**. The endpoint
does not calculate market caps, referral discounts, or builder fees. Fixed exchange
defaults apply when the latest assignment is missing or inactive. The `active`
boolean is no longer returned. Active assignments with zero rates retain those zero rates.

Illustrative response (not a claim that this account has these rates):

<ResponseExample>
  ```json 200 theme={null}
  {
    "feedEpoch": "0",
    "data": {
      "userId": "4",
      "rootUserId": "2",
      "accountFeeTier": {
        "makerFeePps": "4000",
        "takerFeePps": "7000"
      }
    }
  }
  ```
</ResponseExample>

An unknown user returns HTTP 200 with `rootUserId` set to `null` and the default
`accountFeeTier`. Invalid IDs or unknown query parameters return 400. Unsupported
methods, including POST, return 405.


## OpenAPI

````yaml api/data-source/openapi.yaml GET /api/v1/users/{userId}/fee-tier
openapi: 3.1.0
info:
  title: Kuru Data Source API
  version: 1.0.0
servers:
  - url: https://api.mainnet.kuru.io
    description: Monad mainnet (default)
  - url: https://api.testnet.kuru.io
    description: Monad testnet
security: []
paths:
  /api/v1/users/{userId}/fee-tier:
    get:
      summary: Get user fee tier
      operationId: getUserFeeTier
      parameters:
        - name: userId
          in: path
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: Fee tier

````

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