每一次调用都有一个请求 ID,和一个最终实扣金额。LLM 请求把 ID 放在响应头 x-apimodels-request-id 里,非流式请求还直接带 x-apimodels-cost;图片、视频、音频任务的 ID 就是创建时返回的 task_id。拿任何一个 ID 调 GET /v1/records/{id},拿到的就是这笔请求从余额里扣掉的准确金额 —— 转售我们、或者要给自己的用户逐笔对账时用它。
LLM 端点(/v1/chat/completions、/v1/messages、Gemini 原生 /v1beta、/v1/responses、/v1/completions)的每个成功响应都带 x-apimodels-request-id 响应头,值就是这笔请求的 task_id。非流式响应另带 x-apimodels-cost:单位 USD、已含你账户的全部折扣,是扣费完成后才写进去的实扣额。流式响应只带 ID —— 金额要等最后一个 chunk 结算后才有,拿 ID 去查记录即可。
HTTP/2 200
content-type: application/json
x-apimodels-request-id: cmumilhfd0013mg012q3qobr9
x-apimodels-cost: 0.0001
access-control-expose-headers: x-apimodels-request-id, x-apimodels-cost一个例外:非流式 LLM 请求跑超过约 95 秒时,网关会先发响应头保活,这时两个头已经发出去、带不上值,于是同样的两个值补进响应正文的 apimodels 字段。OpenAI / Anthropic 的 SDK 会忽略这个未知字段,不影响解析。
{
"id": "chatcmpl-…",
"choices": [ … ],
"usage": { … },
"apimodels": { "request_id": "cmumilhfd0013mg012q3qobr9", "cost": 0.0001 }
}图片、视频、音频任务的 ID 就是创建时返回的 data.taskId。任务完成后的回调(callback_url)在 data 里也带 credits,和记录查询的值一致。
{
"code": 200,
"msg": "success",
"data": {
"taskId": "cmum4dq3z00dwlm01wugboo5z",
"state": "completed",
"credits": 0.338,
"resultUrls": ["https://r2.apimodels.app/videos/cmum4dq3z00dwlm01wugboo5z.mp4"]
}
}浏览器里直接调用时,这两个响应头已通过 Access-Control-Expose-Headers 暴露,fetch 的 response.headers.get() 能读到。
GET /api/v1/records/{task_id}
Authorization: Bearer <API_KEY>cURL
curl https://api.apimodels.app/v1/records/cmumilhfd0013mg012q3qobr9 \
-H "Authorization: Bearer $API_KEY"Python
import requests, os
# 1) make the call and keep the request id from the response headers
r = requests.post(
"https://api.apimodels.app/v1/chat/completions",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
json={"model": "space-bunny-alpha", "messages": [{"role": "user", "content": "Hi"}]},
)
request_id = r.headers["x-apimodels-request-id"]
print("charged now:", r.headers.get("x-apimodels-cost")) # non-streaming only
# 2) any time later: the authoritative billed amount for that one request
rec = requests.get(
f"https://api.apimodels.app/v1/records/{request_id}",
headers={"Authorization": f"Bearer {os.environ['API_KEY']}"},
).json()["data"]
print(rec["settled"], rec["credits"], rec["currency"])Node.js
const headers = { Authorization: "Bearer " + process.env.API_KEY };
// 1) make the call and keep the request id from the response headers
const r = await fetch("https://api.apimodels.app/v1/chat/completions", {
method: "POST",
headers: { ...headers, "Content-Type": "application/json" },
body: JSON.stringify({ model: "space-bunny-alpha", messages: [{ role: "user", content: "Hi" }] }),
});
const requestId = r.headers.get("x-apimodels-request-id");
console.log("charged now:", r.headers.get("x-apimodels-cost")); // non-streaming only
// 2) any time later: the authoritative billed amount for that one request
const rec = await fetch("https://api.apimodels.app/v1/records/" + requestId, { headers });
const { data } = await rec.json();
console.log(data.settled, data.credits, data.currency);{
"code": 200,
"msg": "success",
"data": {
"task_id": "cmumilhfd0013mg012q3qobr9",
"model": "space-bunny-alpha",
"type": "LANGUAGE_MODEL",
"state": "completed",
"settled": true,
"credits": 0.0001,
"currency": "USD",
"usage": {
"input_tokens": 165,
"output_tokens": 6,
"cached_input_tokens": 149,
"cache_creation_tokens": 0
},
"created_at": 1790676571513,
"completed_at": 1790676572799
}
}| 字段 | 必填 | 类型 | 说明 |
|---|---|---|---|
| data.task_id | — | string | 请求 ID,与响应头 / 创建时返回的 taskId 相同 |
| data.model | — | string | 公开模型名,如 space-bunny-alpha |
| data.type | — | string | LANGUAGE_MODEL / TEXT_TO_IMAGE / IMAGE_TO_VIDEO / … 与调用记录一致 |
| data.state | — | string | pending(还在跑)/ completed / failed |
| data.settled | — | boolean | true 表示金额已是最终值;false 时 credits 为 null,稍后再查 |
| data.credits | — | number | null | 从余额里实际扣掉的美元,已含账户折扣与按模型定价;失败的请求为 0 |
| data.currency | — | string | 固定为 "USD" |
| data.usage | — | object | 仅 LLM:input_tokens、output_tokens、cached_input_tokens、cache_creation_tokens;推理 token 计入 output_tokens |
| data.created_at | — | number | 创建时间,毫秒时间戳 |
| data.completed_at | — | number | null | 完成时间,毫秒时间戳;未完成为 null |
从响应头读 x-apimodels-request-id(LLM),或记下创建时返回的 task_id(图片、视频、音频),然后带 API key 调 GET https://api.apimodels.app/v1/records/{id}。data.credits 就是折扣后实际从余额扣掉的美元数,失败的请求为 0。非流式 LLM 响应还直接在 x-apimodels-cost 头里给出金额。
这笔请求还没结算完。流式 LLM 在最后一个 chunk 结算,部分视频模型按实际成片时长结算。完成后再查一次;settled 变成 true 后金额就是最终值,不会再变。
不带。流式只带 x-apimodels-request-id,因为金额要到流结束才知道,最后一个 chunk 之后去查 GET /v1/records/{id}。非流式两个头都带;跑超过约 95 秒的非流式 LLM 请求会改为在响应正文的 apimodels 字段里给出同样两个值,因为那时响应头已经为保活先发出去了。
不能。属于别的账户的请求 ID 返回 404,和不存在的 ID 一样;接口不会确认这样的 ID 是否存在。查询本身免费,不计为调用。