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

# Query API Key Billing

## Request Headers

<ParamField header="Content-Type" type="string" required={true}>
  Enum: `application/json`
</ParamField>

<ParamField header="Authorization" type="string" required={true}>
  Bearer authentication format, for example: Bearer \{\{API Key}}.
</ParamField>

## Query Parameters

<ParamField query="cycleType" type="string" required={true}>
  Billing granularity. The maximum query range depends on the granularity you pick:

  * `Hour` (up to 7 days per request)
  * `Day` (up to 31 days per request)
  * `Week` (up to 31 days per request)
  * `Month` (up to 31 days per request)
</ParamField>

<ParamField query="category" type="string" required={false}>
  Product type or business category. Common values: `llm`, `gen_api`, `web_search`.
</ParamField>

<ParamField query="productName" type="string" required={false}>
  Product name. Supports fuzzy matching.
</ParamField>

<ParamField query="startTime" type="integer" required={true}>
  Query start time, Unix timestamp in seconds (int64). Must be greater than or equal to `2026-01-01 00:00:00`.
</ParamField>

<ParamField query="endTime" type="integer" required={true}>
  Query end time, Unix timestamp in seconds (int64). Must be greater than `startTime`.
</ParamField>

<Info>
  This endpoint only supports data after `2026-01-01 00:00:00`. It does not support pagination. The range between `startTime` and `endTime` must stay within the limit for the `cycleType` you request: 7 days for `Hour`, 31 days for `Day`, `Week`, and `Month`. To cover a longer period, split it into several requests.
</Info>

<Warning>
  **The query range limit is now enforced by the API.** It used to be applied only in the Novita console, so requests sent directly to this endpoint were never rejected for being too long. If your integration queries more than 31 days at once (or more than 7 days with `cycleType=Hour`), it now fails with HTTP `400` and a message in the form:

  ```text theme={"system"}
  time range must not exceed 31 days for cycleType "Month"
  ```

  The message always names the limit and the granularity that was rejected, so you can split the range and retry.
</Warning>

<Note>
  The API Key billing page in the Novita console offers only hourly and daily granularity. This endpoint still accepts all four values, so `Week` and `Month` remain available to API callers even though they are no longer offered in the console.
</Note>

## Response Parameters

<ResponseField name="bills" type="object[]" required={true}>
  API Key bill list.

  <Expandable title="properties" defaultOpen={true}>
    <ResponseField name="userId" type="string" required={true}>
      User account ID.
    </ResponseField>

    <ResponseField name="startTime" type="string" required={true}>
      Bill start time, Unix timestamp in seconds. It marks the first second of the billing period. With `cycleType=Hour`, it is the top of that hour, for example `10:00:00`.
    </ResponseField>

    <ResponseField name="endTime" type="string" required={true}>
      Bill end time, Unix timestamp in seconds. It marks the last second of the billing period. With `cycleType=Hour`, it is minute `59` and second `59` of the same hour, for example `10:59:59`.
    </ResponseField>

    <ResponseField name="billingMethod" type="int32" required={true}>
      Billing method: `1` (pay-as-you-go), `2` (subscription).
    </ResponseField>

    <ResponseField name="productName" type="string" required={true}>
      Product name.
    </ResponseField>

    <ResponseField name="category" type="string" required={true}>
      Product type or subcategory.
    </ResponseField>

    <ResponseField name="ownerID" type="string" required={true}>
      API Key ID.
    </ResponseField>

    <ResponseField name="apikeyName" type="string" required={true}>
      API Key name.
    </ResponseField>

    <ResponseField name="apikeyMask" type="string" required={true}>
      Masked API Key.
    </ResponseField>

    <ResponseField name="productId" type="string" required={true}>
      Product ID.
    </ResponseField>

    <ResponseField name="billNum0" type="string" required={true}>
      Usage field 0. For `llm`, this usually means input price per 1M tokens; GPU: price per card per hour; storage: price per GB per day.
    </ResponseField>

    <ResponseField name="billNum1" type="string" required={true}>
      Usage field 1. For `llm`, this usually means output tokens.
    </ResponseField>

    <ResponseField name="billNum2" type="string" required={true}>
      Usage field 2. For `llm`, this usually means read cache price per 1M tokens.
    </ResponseField>

    <ResponseField name="billNum3" type="string" required={true}>
      Usage field 3. For `llm`, this usually means write 5-minute cache price per 1M tokens.
    </ResponseField>

    <ResponseField name="billNum4" type="string" required={true}>
      Usage field 4. For `llm`, this usually means reasoning token price per 1M tokens.
    </ResponseField>

    <ResponseField name="billNum5" type="string" required={true}>
      Usage field 5. For `llm`, this usually means write 1-hour cache price per 1M tokens.
    </ResponseField>

    <ResponseField name="billNum6" type="string" required={false}>
      Usage field 6.
    </ResponseField>

    <ResponseField name="billNum7" type="string" required={false}>
      Usage field 7.
    </ResponseField>

    <ResponseField name="billNum8" type="string" required={false}>
      Usage field 8.
    </ResponseField>

    <ResponseField name="billNum9" type="string" required={false}>
      Usage field 9.
    </ResponseField>

    <ResponseField name="billNum10" type="string" required={false}>
      Usage field 10.
    </ResponseField>

    <ResponseField name="billNum11" type="string" required={false}>
      Usage field 11.
    </ResponseField>

    <ResponseField name="billNum12" type="string" required={false}>
      Usage field 12.
    </ResponseField>

    <ResponseField name="billNum13" type="string" required={false}>
      Usage field 13.
    </ResponseField>

    <ResponseField name="billNum14" type="string" required={false}>
      Usage field 14.
    </ResponseField>

    <ResponseField name="billNum15" type="string" required={false}>
      Usage field 15.
    </ResponseField>

    <ResponseField name="basePrice0" type="string" required={true}>
      Original price field 0. For `llm`: input price per 1M tokens; GPU: price per card per hour; storage: price per GB per day.
    </ResponseField>

    <ResponseField name="basePrice1" type="string" required={true}>
      Original price field 1. For `llm`, output price per 1M tokens.
    </ResponseField>

    <ResponseField name="basePrice2" type="string" required={true}>
      Original price field 2. For `llm`, read cache price per 1M tokens.
    </ResponseField>

    <ResponseField name="basePrice3" type="string" required={true}>
      Original price field 3. For `llm`, write 5-minute cache price per 1M tokens.
    </ResponseField>

    <ResponseField name="basePrice4" type="string" required={true}>
      Original price field 4. For `llm`, reasoning token price per 1M tokens.
    </ResponseField>

    <ResponseField name="basePrice5" type="string" required={true}>
      Original price field 5. For `llm`, write 1-hour cache price per 1M tokens.
    </ResponseField>

    <ResponseField name="discountPrice0" type="string" required={true}>
      Discounted price field 0. For `llm`, discounted input token price.
    </ResponseField>

    <ResponseField name="discountPrice1" type="string" required={true}>
      Discounted price field 1. For `llm`, discounted output token price.
    </ResponseField>

    <ResponseField name="discountPrice2" type="string" required={true}>
      Discounted price field 2. For `llm`, discounted read cache price per 1M tokens.
    </ResponseField>

    <ResponseField name="discountPrice3" type="string" required={true}>
      Discounted price field 3. For `llm`, discounted write 5-minute cache price per 1M tokens.
    </ResponseField>

    <ResponseField name="discountPrice4" type="string" required={true}>
      Discounted price field 4. For `llm`, discounted reasoning token price per 1M tokens.
    </ResponseField>

    <ResponseField name="discountPrice5" type="string" required={true}>
      Discounted price field 5. For `llm`, discounted write 1-hour cache price per 1M tokens.
    </ResponseField>

    <ResponseField name="amount" type="string" required={true}>
      Total amount, unit is 1/10000 USD.
    </ResponseField>

    <ResponseField name="voucherAmount" type="string" required={true}>
      Amount deducted by vouchers, unit is 1/10000 USD.
    </ResponseField>

    <ResponseField name="payAmount" type="string" required={true}>
      Cash payment amount, unit is 1/10000 USD.
    </ResponseField>

    <ResponseField name="payAmountDisplay" type="float" required={true}>
      Display value of cash payment amount, in USD.
    </ResponseField>

    <ResponseField name="pricePrecision" type="int32" required={true}>
      Price precision. Unit price (USD) = unit price / 10000 / `pricePrecision`.
    </ResponseField>

    <ResponseField name="llmSeries" type="string" required={false}>
      LLM series.
    </ResponseField>

    <ResponseField name="requestCount" type="string" required={false}>
      Request count.
    </ResponseField>

    <ResponseField name="multimodalPricing" type="object" required={false}>
      Multimodal model billing details.
    </ResponseField>

    <ResponseField name="tieredConfig" type="object" required={false}>
      Tiered billing configuration.
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash Daily granularity theme={"system"}
  curl --request GET \
    --url 'https://api.novita.ai/openapi/v1/billing/apikey/bill/list?cycleType=Day&category=llm&startTime=1767225600&endTime=1769817599' \
    --header 'Authorization: Bearer <API_KEY>'
  ```

  ```bash Hourly granularity theme={"system"}
  curl --request GET \
    --url 'https://api.novita.ai/openapi/v1/billing/apikey/bill/list?cycleType=Hour&category=llm&startTime=1767225600&endTime=1767830399' \
    --header 'Authorization: Bearer <API_KEY>'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={"system"}
  {
    "bills": [
      {
        "userId": "<string>",
        "startTime": "1767225600",
        "endTime": "1767311999",
        "billingMethod": 1,
        "productName": "<string>",
        "category": "llm",
        "ownerID": "<api_key_id>",
        "billNum0": "1000",
        "billNum1": "500",
        "basePrice0": "0",
        "basePrice1": "0",
        "discountPrice0": "0",
        "discountPrice1": "0",
        "amount": "10000",
        "voucherAmount": "0",
        "payAmount": "10000",
        "payAmountDisplay": 1,
        "pricePrecision": 1,
        "productId": "<string>",
        "apikeyName": "<string>",
        "apikeyMask": "sk-****"
      }
    ]
  }
  ```
</ResponseExample>
