运维与计费/UniGateway 账户用量与计费 API

使用管理 API Key 查询账户 API Key 用量排名、计费明细和每日计费汇总。

UniGateway 账户用量与计费 API

本文档说明使用管理 API Key 查询同一账户下全部 API Key 的用量排名、计费明细和每日计费汇总。金额、币种、API Key 状态和实际可用数据均以接口实时返回为准。

概览

接口用途
GET /v1/account/api-keys/usage-stats按 Token 数或费用统计并排名账户下的 API Key,同时返回其 model 明细。
GET /v1/account/billing查询按账单日、API Key、model、Token 类型和币种拆分的计费明细。
GET /v1/account/billing/daily-summary查询按账单日、API Key 和币种聚合的每日计费汇总。

准备工作

本文接口需要管理 API Key,普通业务 API Key 不能调用。请前往 管理 API Key 控制台 创建或获取管理 API Key;完整 Key 仅在创建时显示一次。有关 API Key 的访问控制、轮换和安全管理,请参阅 账户与 API Key

将管理 API Key 仅保存到服务端环境变量,不要写入浏览器代码、日志、公开仓库或导出文件:

export UNIGATEWAY_MANAGEMENT_KEY="<your-management-api-key>"

Windows PowerShell:

$env:UNIGATEWAY_MANAGEMENT_KEY = "<your-management-api-key>"

管理 API Key 可以读取账户下 API Key 的统计与计费数据。发生泄露时,应立即在控制台轮换 Key,并重新加载使用该 Key 的服务端配置。

通用约定

项目
Base URLhttps://unigateway.ai
鉴权Authorization: Bearer $UNIGATEWAY_MANAGEMENT_KEY
响应格式application/json

所有接口均要求管理 API Key。普通业务 API Key 或无效的管理 API Key 会导致请求失败。响应不会包含普通 API Key 或管理 API Key 的完整值和哈希。

限流与缓存

  • 每个管理 API Key 每分钟最多可发起 60 次请求。
  • usage-stats 使用独立的限流桶;billingbilling/daily-summary 共用一个每分钟 60 次的限流桶。
  • 所有响应,包括错误响应,均包含 Cache-Control: no-store

批量导出应在服务端执行。收到 429 Too Many Requests 后,应降低并发;响应包含 Retry-After 时按其指定的时间等待,否则使用带抖动的指数退避,然后以相同的筛选条件继续查询。

数组筛选参数

apiKeyIdsapiKeyNamesmodelTypesmodelNamesapiKeyStatusestokenTypescurrencies 均支持重复参数、逗号分隔或 JSON 数组。单个数组筛选最多接受 100 个值;省略参数或传入 [] 均表示不限制该维度。

apiKeyIds=key-1,key-2
apiKeyIds=key-1&apiKeyIds=key-2
apiKeyIds=["key-1","key-2"]

modelTypes 支持 claudegeminigptqwendeepseekotherapiKeyStatuses 支持 ACTIVEINSUFFICIENT_BALANCEUSER_DISABLEDLIMIT_EXCEEDED;状态值不区分大小写,服务端会转换为大写。

API Key 用量排名

GET /v1/account/api-keys/usage-stats

该接口按 Token 数或费用对账户下的 API Key 排名,并在每个 API Key 项中返回按相同排序规则排列的 model 明细。统计仅聚合状态为 SUCCESSPARTIAL 的用量记录;已删除的 API Key 不会出现在结果中。

查询参数

参数类型必填默认值说明
datestring当前 UTC+8 日YYYY-MM-DD 或严格 UTC 秒级时间 YYYY-MM-DDTHH:mm:ssZ。统计该值所在的完整 UTC+8 日,不能与 start_dateend_date 同时使用。
start_datestring条件必填-end_date 同时提供。支持 YYYY-MM-DD 或严格 UTC 秒级时间。
end_datestring条件必填-start_date 同时提供。支持 YYYY-MM-DD 或严格 UTC 秒级时间;查询范围最长 366 天。
sort_bystringtokens排序依据:tokenscost
limitinteger50每页 API Key 数,范围为 1100
offsetinteger0偏移量,范围为 0100000
apiKeyIdsarray<string>全部API Key ID 筛选。
modelTypesarray<string>全部model 类型筛选。
modelNamesarray<string>全部model 名称精确筛选。
apiKeyStatusesarray<string>全部API Key 状态筛选。

日期边界固定按 UTC+8 解释。date=2026-07-31 表示完整的 2026-07-31 UTC+8 日;纯日期 start_date 从该日 00:00:00+08:00 开始,end_date 到该日 23:59:59.999+08:00 结束。

严格 UTC 秒级时间只接受大写 Z,不接受时区偏移或小数秒。date 的时间值会选择该瞬间所在的完整 UTC+8 日;范围参数中的时间值是精确边界,且 end_date 包含该秒内的全部毫秒。响应中的 date_range 使用 UTC Z 时间戳表示实际范围。

请求示例

以下请求按费用查询 2026 年 7 月的 API Key 用量排名:

curl -G 'https://unigateway.ai/v1/account/api-keys/usage-stats' \
  -H "Authorization: Bearer $UNIGATEWAY_MANAGEMENT_KEY" \
  --data-urlencode 'start_date=2026-07-01' \
  --data-urlencode 'end_date=2026-07-31' \
  --data-urlencode 'sort_by=cost' \
  --data-urlencode 'limit=50' \
  --data-urlencode 'offset=0'

响应示例

{
  "date_range": {
    "start_date": "2026-06-30T16:00:00Z",
    "end_date": "2026-07-31T15:59:59Z",
    "time_zone": "UTC+8"
  },
  "sort_by": "cost",
  "currency": "USD",
  "items": [
    {
      "rank": 1,
      "id": "api-key-id-1",
      "name": "Production",
      "key_prefix": "sk-prod",
      "status": "ACTIVE",
      "request_count": "42",
      "total_tokens": "125000",
      "total_cost": "3.750000000000",
      "models": [
        {
          "rank": 1,
          "model_id": "model-id-1",
          "model_type": "gpt",
          "model_name": "gpt-5",
          "request_count": "42",
          "total_tokens": "125000",
          "total_cost": "3.750000000000"
        }
      ]
    }
  ],
  "total": 1,
  "limit": 50,
  "offset": 0,
  "has_more": false
}
字段类型说明
date_range.start_date / date_range.end_datestring实际统计范围,以 UTC Z 时间戳返回;按 time_zone 解释其对应的统计日。
date_range.time_zonestring统计时区,固定为 UTC+8
sort_bystring当前排序依据。
currencystring聚合金额的币种。
items[].rankintegerAPI Key 排名,从 1 开始;分页结果会计入 offset
items[].id / items[].namestringAPI Key 的 ID 和名称。
items[].key_prefixstring / nullAPI Key 的非敏感前缀;历史 API Key 可能返回 null
items[].statusstringAPI Key 当前状态。
items[].request_count / items[].total_tokensstring聚合请求数和 Token 数,均为字符串。
items[].total_coststring聚合费用,十进制字符串。
items[].modelsarray<object>该 API Key 下按相同规则排名的 model 明细。
items[].models[].rankintegermodel 在当前 API Key 内的排名,从 1 开始。
items[].models[].model_idstring / nullmodel ID;无法关联 model 记录时为 null
items[].models[].model_type / model_namestringmodel 类型和名称。
items[].models[].request_count / total_tokens / total_coststringmodel 聚合的请求数、Token 数和费用。
total / limit / offsetinteger分页总数、当前页大小和偏移量。
has_moreboolean是否有下一页。

金额、请求数和 Token 数均以字符串返回。处理金额时应使用十进制定点类型,不要使用二进制浮点数。

账户计费明细

GET /v1/account/billing

该接口按账单日、API Key、model、Token 类型和币种返回扁平计费明细。明细按账单日降序排列,再按 model 名称、Token 类型、币种和 API Key 进行稳定排序。

查询参数

参数类型必填默认值说明
startDatestring条件必填当前账单日endDate 同时提供。支持 RFC 3339 时间或 YYYY-MM-DD
endDatestring条件必填当前账单日startDate 同时提供。显式范围最长 92 天。
pageSizeinteger100每页明细数;超过 100 时按 100 处理。
pageNuminteger11 开始的页码。
apiKeyIdstring全部单个 API Key ID 精确筛选。
apiKeyNamestring全部API Key 当前名称精确筛选。
apiKeyIdsarray<string>全部API Key ID 筛选。
apiKeyNamesarray<string>全部API Key 当前名称筛选。
modelTypesarray<string>全部model 类型筛选。
modelNamesarray<string>全部model 名称精确筛选。
tokenTypesarray<string>全部Token 类型筛选。
currenciesarray<string>全部三位 ISO 4217 币种;RMB 会规范化为 CNY
apiKeyStatusesarray<string>全部API Key 状态筛选。

start_date / end_date 可替代 startDate / endDate。未使用 pageSizepageNum 时,可使用兼容的 limitoffset 分页;未提供显式日期范围时,可使用 period=day|month|year 与对应的 date=YYYY/MM/DD|YYYY/MM|YYYY

账单日固定使用 UTC+8,不提供可配置的账单时区。startDateendDate 支持 YYYY-MM-DD,或带 Z+/-HH:MM 时区的 RFC 3339 时间;RFC 3339 时间支持 1 至 3 位小数秒。没有小数秒的 endDate 包含最后一秒的全部毫秒;纯日期的日首和日末按 UTC+8 解释。

支持的 tokenTypes 为:

textInputTokens, textOutputTokens,
imageInputTokens, imageOutputTokens,
videoInputTokens, videoOutputTokens,
audioInputTokens, audioOutputTokens,
cacheCreationTokens5m, cacheCreationTokens1h, cacheTokens
tokenType含义
cacheCreationTokens5m缓存创建或写入 Token,TTL 为 5 分钟。
cacheCreationTokens1h缓存创建或写入 Token,TTL 为 1 小时。
cacheTokens缓存命中或读取 Token。

Claude 的 1 小时缓存创建归入 cacheCreationTokens1h,不会归入表示缓存读取的 cacheTokens。没有明确 TTL 的缓存写入会归入 cacheCreationTokens5mcacheWriteTokens 是内部缓存写入汇总字段,不是公开 tokenType

请求示例

以下请求查询 UTC+8 账单日下 2026 年 7 月的计费明细:

curl -G 'https://unigateway.ai/v1/account/billing' \
  -H "Authorization: Bearer $UNIGATEWAY_MANAGEMENT_KEY" \
  --data-urlencode 'startDate=2026-07-01T00:00:00+08:00' \
  --data-urlencode 'endDate=2026-07-31T23:59:59+08:00' \
  --data-urlencode 'pageSize=100' \
  --data-urlencode 'pageNum=1'

响应示例

{
  "code": 0,
  "message": "success",
  "data": {
    "total": 1,
    "provider": "UniGateway",
    "rows": [
      {
        "billMonth": "202607",
        "billDay": "2026-07-31",
        "billingDateTimezone": "utc+8",
        "account": "account-id-1",
        "apiKeyId": "api-key-id-1",
        "apiKeyName": "Production",
        "modelType": "claude",
        "modelName": "claude-opus-4-8",
        "tokenType": "cacheCreationTokens1h",
        "tokenCount": "5841",
        "tokenUnit": "piece",
        "currency": "USD",
        "subtotalBeforeTax": "0.05841000",
        "subtotalAfterDiscount": "0.05841000",
        "totalAmountAfterTax": "0.06322883",
        "entryType": "normal",
        "price": "0.00001000"
      }
    ]
  }
}
字段类型说明
codeinteger0 表示请求成功。
messagestring响应消息。
data.totalinteger符合筛选条件的完整明细总数,不受当前页影响。
data.providerstring数据提供方标识。
data.rowsarray<object>当前页计费明细。
data.rows[].billMonth / billDaystring账单月(YYYYMM)和账单日。
data.rows[].billingDateTimezonestring账单日时区,固定为 utc+8
data.rows[].accountstringUniGateway 账户 ID。
data.rows[].apiKeyId / apiKeyNamestring内部 API Key ID 及其当前名称。
data.rows[].modelType / modelNamestringmodel 类型和名称。
data.rows[].tokenType / tokenCount / tokenUnitstringToken 类型、数量和单位。
data.rows[].currencystring金额币种。
data.rows[].subtotalBeforeTaxstring折扣前小计,8 位小数的十进制字符串。
data.rows[].subtotalAfterDiscountstring折扣后小计,8 位小数的十进制字符串。
data.rows[].totalAmountAfterTaxstring税后总额,8 位小数的十进制字符串。
data.rows[].entryTypestring记录类型:normalrefundadjustment。当前仅返回 normal
data.rows[].pricestring派生单价,8 位小数的十进制字符串。

金额和派生单价均为 8 位小数的十进制字符串。totalAmountAfterTax 使用每条 usage_recordstax_rate_snapshot 计算;该字段是百分数,例如 8.25 表示 8.25%

记录税后金额 = 记录折后金额 * (1 + tax_rate_snapshot / 100)

历史记录的快照为 null 时按 0% 处理。同一明细维度存在不同税率时,接口会先按每条记录计算税后金额,再聚合并保留 8 位小数,不会在聚合后的折后金额上套用单一税率。当前数据源只包含正常用量记录,因此每条明细固定返回 entryType: "normal";退款和调账记录尚未接入该接口。

不要根据示例中的费用或单价推导当前 model 价格。应以 UniGateway 模型库 和接口实时返回为准。

每日计费汇总

GET /v1/account/billing/daily-summary

该接口按 UTC+8 账单日、API Key 和币种汇总计费明细。筛选和日期解析规则与账户计费明细相同。

查询参数

除以下差异外,接口支持与 GET /v1/account/billing 相同的查询参数和兼容形式:

参数默认值说明
startDate / endDate当前账单日显式查询范围最长 366 天。
apiKeyId全部单个 API Key ID 精确筛选。
apiKeyName全部API Key 当前名称精确筛选。
pageSize31每页汇总行数;超过 400 时按 400 处理。
pageNum11 开始的汇总页码。

apiKeyIdapiKeyName 可分别使用;同时提供时按 AND 匹配。需要一次查询多个值时,使用 apiKeyIdsapiKeyNames,格式遵循本文的数组筛选参数约定。

请求示例

curl -G 'https://unigateway.ai/v1/account/billing/daily-summary' \
  -H "Authorization: Bearer $UNIGATEWAY_MANAGEMENT_KEY" \
  --data-urlencode 'startDate=2026-07-01' \
  --data-urlencode 'endDate=2026-07-31' \
  --data-urlencode 'apiKeyId=api-key-id-1' \
  --data-urlencode 'apiKeyName=Production' \
  --data-urlencode 'pageSize=31' \
  --data-urlencode 'pageNum=1'

响应示例

{
  "code": 0,
  "message": "success",
  "data": {
    "total": 1,
    "provider": "UniGateway",
    "rows": [
      {
        "billMonth": "202607",
        "billDay": "2026-07-31",
        "billingDateTimezone": "utc+8",
        "account": "account-id-1",
        "apiKeyId": "api-key-id-1",
        "apiKeyName": "Production",
        "currency": "USD",
        "subtotalBeforeTax": "25.68000000",
        "subtotalAfterDiscount": "20.54400000",
        "totalAmountAfterTax": "22.23888000",
        "entryCount": 3
      }
    ]
  }
}
字段类型说明
code / messageinteger / string业务响应码和消息;code0 时请求成功。
data.totalinteger汇总行总数,不是计费明细数量。
data.providerstring数据提供方标识。
data.rows[].billMonth / billDaystring账单月(YYYYMM)和账单日。
data.rows[].billingDateTimezonestring账单日时区,固定为 utc+8
data.rows[].accountstringUniGateway 账户 ID。
data.rows[].apiKeyId / apiKeyNamestring内部 API Key ID 及其当前名称。
data.rows[].currencystring汇总金额币种。
data.rows[].subtotalBeforeTaxstring折扣前小计,8 位小数的十进制字符串。
data.rows[].subtotalAfterDiscountstring折扣后小计,8 位小数的十进制字符串。
data.rows[].totalAmountAfterTaxstring税后总额,8 位小数的十进制字符串。
data.rows[].entryCountinteger该汇总行匹配的计费明细数量。

相同筛选条件下,汇总金额等于计费明细接口返回的 8 位小数金额之和,包括每条明细独立计算后的 totalAmountAfterTax。两个接口均固定使用 UTC+8 账单日;对账时应固定日期范围、API Key 和币种筛选条件,再比较两类结果。

错误处理与频率限制

GET /v1/account/api-keys/usage-stats 的错误响应格式如下:

{
  "error": {
    "code": "UnprocessableEntity",
    "message": "date must use YYYY-MM-DD or YYYY-MM-DDTHH:mm:ssZ UTC format",
    "param": null,
    "type": "BadRequest"
  }
}

该接口常见 HTTP 状态码为 400401429500。检查日期格式、参数组合和管理 API Key 后再重试。

GET /v1/account/billingGET /v1/account/billing/daily-summary 使用相同的错误结构:

{
  "code": 40003,
  "message": "The date range must not exceed 92 days",
  "data": null
}
HTTP 状态码业务 code常见原因处理方式
400 / 42240001参数格式或筛选值无效。检查日期边界、分页值和数组筛选值。
400 / 42240002只提供了起始或结束日期。同时提供 startDateendDate,或同时省略。
400 / 42240003日期顺序或范围不符合限制。确认起始时间早于结束时间,并缩小至对应接口允许的范围。
40140100管理 API Key 缺失或无效。确认服务端已加载有效的 UNIGATEWAY_MANAGEMENT_KEY,重新加载配置后再次请求。
40340300当前管理 API Key 没有访问权限。在管理 API Key 控制台核对 Key 状态与访问控制。
42942900超过限流。Retry-After: 60 等待,降低并发后重试。
50350300服务暂时不可用。使用有限次数的指数退避重试。
50050000未预期的服务端错误。记录请求时间、路径和响应信息后有限重试。

调用方应同时检查 HTTP 状态码与 JSON 中的业务 code,不要依赖错误消息文本进行程序判断。

常见问题

Q: 为什么使用普通 API Key 会返回 401

本文三个接口只接受管理 API Key。确认请求地址以 https://unigateway.ai 开头,并确认 Authorization 使用了当前有效的 mk- 前缀管理 API Key。将 UNIGATEWAY_MANAGEMENT_KEY 加载到服务端进程后,重新启动或重新加载该进程,再执行 GET /v1/account/api-keys/usage-stats?limit=1 验证。普通业务 API Key 不能调用账户级接口。

Q: 计费明细与每日汇总金额不一致,如何排查?

先将两个请求的 startDateendDateapiKeyIdapiKeyNameapiKeyIdsapiKeyNamesmodelTypesmodelNamestokenTypescurrenciesapiKeyStatuses 设为完全相同的值。两个接口均固定按 UTC+8 账单日聚合。确认明细接口使用的范围不超过 92 天、汇总接口不超过 366 天,然后重新请求。每日汇总金额对应相同筛选条件下明细金额的净合计;不要跨币种或跨筛选条件直接比较。

Q: 如何避免导出大量计费数据时遗漏或重复?

使用固定的日期范围和筛选条件,按 pageNum1 开始依次拉取,并保留每次成功处理后的页码。遇到 429 时按 Retry-After 等待后,从最后成功页继续;不要在同一导出任务中改变 pageSize、日期范围或筛选条件。导出的 API Key ID、model、时间和费用属于敏感运营数据,应仅在受控环境中保存和处理。