接口
任务接口
提交任务、查询任务、列出任务、下载结果,以及防止重复提交。
所有生成都是异步任务:先提交,马上拿到任务 ID,再查询结果或等待回调。
提交任务
POST /v1/tasks
请求体字段:
model(必填):模型 ID,见 模型列表 或GET /v1/models。input(必填):生成参数,随模型类型不同,见 模型与参数。route(可选):这次只用哪些线路、按什么顺序,见 线路与路由。callback_url(可选):https 地址,任务结束后把结果推送过去,见 回调通知。
curl https://janvia.io/v1/tasks \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-123" \
-d '{
"model": "gpt-image-2",
"input": { "prompt": "a red fox in the snow", "resolution": "2K" },
"route": ["fast", "cheap"]
}'成功返回 HTTP 202 和任务对象,Location Header 是任务的地址。提交时就出错(参数不对、余额不足等)会直接返回 4xx,不会创建任务,也不扣费。
任务对象
{
"id": "task_9f2c...",
"object": "task",
"model": "gpt-image-2",
"media_type": "image",
"status": "completed",
"progress": 100,
"input": { "prompt": "a red fox in the snow", "resolution": "2K" },
"route": "fast",
"route_name": "Fast",
"routing": {
"routes": [
{ "id": "fast", "name": "Fast", "price_usd": 0.06 },
{ "id": "cheap", "name": "Cheap", "price_usd": 0.04 }
],
"source": "request",
"rule": null
},
"output": {
"files": [
{
"type": "image",
"url": "https://...",
"mime_type": "image/png",
"width": 2048,
"height": 2048
}
]
},
"error": null,
"cost_usd": 0.06,
"callback": null,
"created_at": "2026-10-21T08:00:00.000Z",
"finished_at": "2026-10-21T08:00:12.000Z"
}status:queued排队中,in_progress生成中,completed已完成,failed失败。progress:0–100,上游提供进度时才会变化。route/route_name:正在或最终服务这个任务的线路。routing.routes:这个任务可以使用的线路,按尝试顺序排列,带各自的价格。source说明这个列表从哪来:request(请求里的route)、rule(密钥的例外规则,rule是规则序号,从 0 开始)、key(密钥的排序设置)或default(平台推荐顺序)。output.files:生成的文件。type为image、video或audio;图片有width、height,视频和音频可能有duration(秒)。error:失败时的code和message,见 错误码。cost_usd:这个任务的费用,失败时为 0(已退款)。callback:传了callback_url时是回调的送达情况,否则为null,见 回调通知。input里的 base64 图片会被截短显示。
查询任务
curl https://janvia.io/v1/tasks/TASK_ID \ -H "Authorization: Bearer $API_KEY"
建议每 3–5 秒查一次,视频可以更久。只能查自己账户的任务,查不到返回 404 task_not_found。
列出任务
GET /v1/tasks?page=1&limit=20 按创建时间倒序返回你的任务,limit 最大 100:
{ "object": "list", "data": [ ... ], "page": 1, "limit": 20, "total": 132 }下载结果
output.files[].url 可能是 CDN 地址,也可能是本站的 /v1/tasks/TASK_ID/content/N。两种地址都可以直接下载,不用带密钥:任务 ID 是随机生成、猜不到的,请不要公开分享这些地址。生成的文件建议拿到后保存到你自己的存储。
防止重复提交
网络超时后重试,可能造成同一个任务提交两次、扣两次钱。在 Header 里带上 Idempotency-Key(1–128 个字母、数字或 _ . : -)可以避免:
- 24 小时内,同一个 key 加同样的请求体,返回同一个任务(HTTP 200,Header
Idempotency-Replayed: true),不会再扣费。 - 同一个 key 换了请求体,返回 409
idempotency_conflict。