Skip to main content
GET
List product bills
This endpoint requires an Admin Key with the billing:read scope.
Readiness and amount semantics: billing data for day T becomes available at 07:00 (UTC+8) on day T+1; earlier returns 400 data_not_ready. Amounts are split into cash (recharge_fee) and voucher (voucher_fee) parts summing to total_fee (actual amount charged). The time window is left-closed, right-open, aligned to CST day boundaries.

Fields and reconciliation

  • product: product identifier (model/product name, e.g. kimi-k2.5, moonshot-v1-8k); product_type: product type; business_type: business type (e.g. chat, batch). The enums grow with the product line — clients should keep raw strings and ignore unknown values.
  • Reconciling with daily_bills model_details: product bills aggregate by product (not by key); total_fee in daily bills minus the sum of model_details rows equals non-token charges (cache-call, tool_call, cache storage, BatchAPI, etc.), which are only included in the outer totals.

Authorizations

Authorization
string
header
required

Send the Admin API secret as a Bearer token in the Authorization header (Bearer sk-admin-***). Create Admin Keys under Console → Organization → Admin API Keys.

Query Parameters

start
integer<int64>
required

Start time in milliseconds, inclusive, e.g. 1790784000000 (2026-10-01 00:00 CST).

Required range: x >= 0
end
integer<int64>
required

End time in milliseconds, exclusive, e.g. 1792598400000 (2026-10-22 00:00 CST).

Required range: x >= 0
project_id
string[]

Project IDs. Every project must belong to the authenticated organization.

key
string[]

Business API key IDs. Every key must belong to the authenticated organization.

limit
integer
default:100

Page size. Defaults to 100, maximum 1000. Rows are bounded by the organization's distinct product/business-type combinations, so the default fetches everything in one page for typical organizations.

Required range: 1 <= x <= 1000
cursor
string

Cursor from the previous response next field. The cursor carries only the page position; all query parameters must be restated on every page. Keep them unchanged while paginating (except limit) — the server does not check them for consistency.

Response

Product bills.

data
object[]
required

Product bill rows (product × business type).

has_more
boolean
required

Whether there is a next page.

next
string | null
required

Cursor for the next page. Pass it back verbatim as the cursor query parameter.