请求
一次请求就是对一个模型的一次调用。它包含一个 id(req_…)、状态、API 积分费用(1000 = 1 USD),以及在成功时生成的文件。以下每个端点对每个模型返回的都是同一个对象。
查找模型
包含全部 1,496 个模型的目录是公开 JSON(无需密钥):
curl "https://api.doitong.ru/v1/models?category=text-to-video&lab=Google&limit=20"
| 查询参数 | 含义 |
|---|---|
q |
必须全部出现在名称、id、制造商或标签中的词,例如 kling 3。 |
category |
一个类别 id,例如 text-to-video 或 upscale。GET https://api.doitong.ru/v1/categories 列出全部 21 个类别及其数量。 |
lab |
模型的制造商,可按名称或 id 查询,例如 Google 或 black-forest-labs。 |
family |
上一行中的 family id:同一模型的每个变体(pro、fast、image-to-video、…)。 |
mode |
exact(根据输入计算价格)、measured(根据输入文件的长度或大小计算)、estimate(每次运行的预估价格)或 metered(按实际用量计费,每次运行不超过最大值)。 |
limit、cursor |
页面大小(1 到 100,默认 50)以及上一页的 next_cursor。 |
每行包含 id、name、lab、category、family、summary、tags、output_kind、docs_url 和一个 price 对象(参见 定价)。GET https://api.doitong.ru/v1/models/{model_id} 还会返回完整的输入和输出 JSON Schema、规范参数名称、价格规则和示例输入。未知的 category 或 mode 会返回 400 invalid_parameter。
运行模型
curl -X POST "https://api.doitong.ru/v1/run/{model_id}?wait=20" \
-H "Authorization: Bearer $DOITONG_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1842-cover" \
-d '{"prompt": "..."}'
- 请求体是模型输入,即一个 JSON 对象。每个模型页面都会列出其参数。
- 输入会在收费前进行检查。无效输入会返回
422 invalid_input,并指出有问题的param,且不会产生费用。 ?wait=N(最多 20 秒)会保持调用,直到请求完成或超时。?webhook_url=https://…会在请求完成时向该 URL 发送带签名的 POST(参见 Webhook)。?storage=permanent或?storage=temporary用于选择输出文件的保留时长;未指定时使用账户设置(参见文件存储位置)。
请求仍在处理时,响应为 202 Accepted;在等待时间内完成(或重放时,见下文)则为 200 OK。Location 和 Doitong-Request-Id 标头包含请求 URL 和 id。
状态
-
queued已接受并扣费,正在等待工作进程 -
running模型正在生成 -
最终状态:
succeeded已扣除报价金额;outputs[] 中包含我们存储空间的 URLfailed已自动退款;错误信息说明了原因canceled在生成结果前停止;已退款
| 状态 | 含义 | 最终状态 |
|---|---|---|
queued |
已接受并扣费,正在等待工作进程。queue_position 可能会显示队列中的位置。 |
否 |
running |
模型正在生成。 | 否 |
succeeded |
已完成。outputs 列出文件。 |
是 |
failed |
模型或限制导致请求停止。error 说明原因。API 积分会退款。 |
是 |
canceled |
在生成结果前取消。API 积分会退款。 | 是 |
运行时间超过时限的请求会失败并返回代码 timeout,同时退款:图像为 15 分钟,视频为 60 分钟,音频及其他内容为 30 分钟。
请求对象
{
"id": "req_8k2m4q7x1z9c3v5b6n0p2r4t",
"object": "request",
"model": "flux/schnell",
"status": "succeeded",
"created_at": "2026-10-20T12:00:00Z",
"started_at": "2026-10-20T12:00:01Z",
"completed_at": "2026-10-20T12:00:02Z",
"queue_position": null,
"cost": { "credits": 3, "usd": "0.003", "charged": 3, "refunded": 0 },
"input": { "prompt": "..." },
"output": { "images": [ { "url": "https://content.doitong.com/dev-api/…/0-output.jpeg", "width": 1024, "height": 768 } ] },
"outputs": [
{ "type": "image", "url": "https://content.doitong.com/dev-api/…/0-output.jpeg", "content_type": "image/jpeg",
"width": 1024, "height": 768, "file_size": 183920, "stored": true }
],
"error": null,
"metrics": { "inference_seconds": 1.2 },
"storage": { "mode": "permanent", "bytes": 183920, "expires_at": null, "expired": false },
"urls": {
"self": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t",
"cancel": "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel"
}
}
- 对所有模型而言,
outputs的结构相同:每个生成文件对应一个条目,包含type(image、video、audio、file或3d)、我们存储中的url、content_type,以及已知时的file_size、width、height、duration。 output是模型自己的结果对象(其字段列在各模型页面上),其中包含相同的 URL。storage说明文件的保留方式:mode(permanent或temporary)、已存储的bytes、expires_at(临时文件删除的时间,永久文件为null)以及expired(文件删除后为true)。cost.credits是调用的 API 积分价格(cost.usd以 USD 表示),cost.charged是从 API 余额中扣除的金额,cost.refunded是退回的金额。对于metered模型,cost.credits是开始时预留的最大值(cost.held);运行成功后,cost.settled表示实际用量,其余最大值计入cost.refunded(参见按用量计费)。- 请求失败时,
error为{ "type": …, "code": …, "message": … }。
读取请求
curl "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t?wait=20" \
-H "Authorization: Bearer $DOITONG_API_KEY"
?wait=N(最多 20 秒)会进行长轮询:请求最终完成时立即返回,或在 N 秒后返回当前状态。这是等待结果最简单的方式。?logs=1会将模型的进度日志行(最近 50 行)作为logs添加。
你只能读取自己账户的请求;其他 id 会返回 404 request_not_found。
列出请求
curl "https://api.doitong.ru/v1/requests?limit=20&status=succeeded&model=flux/schnell" \
-H "Authorization: Bearer $DOITONG_API_KEY"
按最新优先。limit 为 1 到 100(默认 20),status 和 model 用于筛选。响应为 { "object": "list", "data": [ … ], "has_more": true, "next_cursor": "req_…" };传递 cursor=<next_cursor> 获取下一页。
取消请求
curl -X POST "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/cancel" \
-H "Authorization: Bearer $DOITONG_API_KEY"
- 在模型启动前取消:状态变为
canceled,API 积分退款,并返回200。 - 已在生成:取消请求会继续传递,并返回
202以及"cancel_requested": true。如果模型最终仍完成,请求会正常成功并收费。 - 已处于最终状态:返回
409 not_cancelable(已处于canceled状态的请求直接返回200)。
删除请求的文件
curl -X DELETE "https://api.doitong.ru/v1/requests/req_8k2m4q7x1z9c3v5b6n0p2r4t/files" \
-H "Authorization: Bearer $DOITONG_API_KEY"
立即删除我们保存的请求输出文件,并停止其存储费用。响应是 storage.expired: true 的请求对象;其 URL 仍保留在记录中,但不再可用。再次调用不会产生变化(200)。仍处于 queued 或 running 状态的请求尚无文件:409 request_active。需要 models:run。
幂等性:重试且不会重复付费
网络可能会失败。要安全地重试运行,请发送 Idempotency-Key 标头(任意不超过 255 个字符的字符串,每个操作唯一,例如你自己的订单 id):
- 与之前相同的密钥和请求体:返回原始请求(
200,标头Idempotent-Replayed: true),不会再次收费。 - 在运行于模型执行前失败(提交时出现
upstream_error或internal_error、insufficient_credits、budget_exceeded、too_many_inflight)后,使用相同的密钥和请求体:不会生成任何内容,也不会收费,因此重试会再次运行模型,而不是返回失败。 - 相同密钥但请求体不同:
409 idempotency_mismatch。 - 密钥的作用域限定为发送它的 API 密钥。
文件存储位置
每个输出文件都会在请求标记为 succeeded 前复制到我们的存储中,因此 outputs 中的 URL 位于我们自己的主机上,你可以直接链接到这些 URL。文件保留多久由你决定:
| 模式 | 保留时长 | 价格 |
|---|---|---|
permanent(默认) |
直到你删除它们 | 每 GB 每月 100 API 积分($0.10),每天从 API 余额中扣费 |
temporary |
7 天,之后删除 | 免费 |
- 账户设置决定新请求的默认值: 控制面板中的“永久保留文件”开关,或使用
PATCH https://api.doitong.ru/v1/account/storage并传入{"mode": "temporary"}。GET https://api.doitong.ru/v1/account会在storage下显示该设置、已保留的字节数和每月预估费用。 - 运行时的
?storage=permanent|temporary(MCPrun工具的storage参数)会覆盖该运行的设置。 - 更改设置不会影响已有文件;请使用
DELETE /requests/{id}/files删除这些文件。 - API 余额无法支付存储费用时,不会扣费,你会收到电子邮件:请在 30 天内充值,否则保留的文件会变为临时文件,并在之后 7 天删除。
极少数情况下,如果我们的副本创建失败,条目会包含 "stored": false,URL 则是原始的短期 URL:请尽快下载。