提交产品图做外观专利检索,返回 taskID;用检测详情轮询结果。

一次检测可以放多个不同商品(一张图一个商品):产品名、洛迦诺分类号、是否做 AI 比对都按图设。

提交一次检测

POST /ip/patent/design

请求参数

参数类型必填说明
titlestring❌本次检测的名称,用于历史列表与报告标题
langstring❌语言,zh 或 en;为空时按中文处理
imagesarray<EnhanceDesignPatentImage>✅—
images[].imageIDstring❌图片标识,由调用方自行指定,用于将检测结果对应到所提交的图片
images[].imagestring✅支持 http(s) 图片链接或 base64(data URI / 裸串);最长边 ≥200px,单张 ≤10MB。
images[].countriesarray<string>❌检索国家(图片级),默认为 ["US"]
images[].removeBgboolean❌先去背景再比对(可选)
images[].productNamestring❌这一张图的产品名称,供检索做交叉验证;与任务名 title 无关,不给就不带这段上下文
images[].locsarray<string>❌洛迦诺分类号(完整小类号,如 "09-03");不传 = 不过滤
images[].rerankboolean❌这张图是否做 AI 比对;不传时跟随顶层 rerank。
clientRequestIdstring❌幂等键(可选):同账号同值只创建一次。
taskIDstring❌已废弃,改用 clientRequestId(传入该字段时按 clientRequestId 处理)。检测 ID 由接口生成,不由调用方指定。

请求示例

{
  "title": "2026 秋季批次 A",
  "lang": "zh",
  "images": [
    {
      "imageID": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
      "image": "https://example.com/images/logo.png",
      "countries": [
        "US"
      ],
      "removeBg": false,
      "productName": "带手柄玻璃水瓶",
      "locs": [
        "09-03"
      ],
      "rerank": false
    }
  ]
}
cURLPython
curl -X POST "https://api.trohub.com/v2/ip/patent/design" -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" -d '{"title":"2026 秋季批次 A","lang":"zh","images":[{"imageID":"3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6","image":"https://example.com/images/logo.png","countries":["US"],"removeBg":false,"productName":"带手柄玻璃水瓶","locs":["09-03"],"rerank":false}]}'
import requests

url = "https://api.trohub.com/v2/ip/patent/design"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
payload = {
  "title": "2026 秋季批次 A",
  "lang": "zh",
  "images": [
      {
          "imageID": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
          "image": "https://example.com/images/logo.png",
          "countries": [
              "US"
          ],
          "removeBg": false,
          "productName": "带手柄玻璃水瓶",
          "locs": [
              "09-03"
          ],
          "rerank": false
      }
  ]
}

r = requests.post(url, headers={**headers, "Content-Type": "application/json"}, json=payload)
print(r.json())

响应示例

{
  "ok": true,
  "message": "成功",
  "data": {
    "taskID": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
    "pendingCount": 1,
    "status": "completed"
  }
}

响应字段

参数类型必填说明
taskIDstring❌仅包含已受理的任务 ID
pendingCountinteger❌已受理但尚未开始处理的任务数;大于 0 表示尚有任务待处理
statusstring❌本次检测的聚合状态;提交刚成功时为 queued

可能的错误

HTTP错误码说明
400VALIDATION_*(见 message)请求数据无效(HTTP 400)
401UNAUTHORIZED_AUTH_REQUIRED缺少 API Key、Key 无效或被封禁(HTTP 401),错误码 UNAUTHORIZED_AUTH_REQUIRED。
403BUSINESS_INSUFFICIENT_QUOTA积分不足(HTTP 403),错误码 BUSINESS_INSUFFICIENT_QUOTA。 提交类接口在扣减积分前校验余额。
429BUSINESS_RATE_LIMIT_EXCEEDED / RATE_LIMITER_UNAVAILABLE请求频率或并发数超限(HTTP 429),错误码 BUSINESS_RATE_LIMIT_EXCEEDED。 限流校验不可用时返回 503(RATE_LIMITER_UNAVAILABLE)。 限流是动态的:额度由「你的 API 档位 × 接口所属的桶」决定, 所以同一个接口对不同调用者可能是不同的数值,这里不给出固定数字。 两处可以看到实际生效值: 1. 每次响应的 X-RateLimit-* 响应头(当次生效的次数、窗口、命中哪一档额度); 2. GET /v2/quota/mine(带 API Key,返回你每个额度的生效值); 另有 GET /v2/quota/config(公开)给出未分档的基线额度。 计数口径:按账号计 —— 同一账号下的所有 API Key 共享同一份额度, 多开一个 Key 不会获得额外配额。接口桶是分开计数的(例如「提交检测」与 「轮询结果」是两个桶),所以轮询不会吃掉提交的额度。
500INTERNAL_ERROR_UNKNOWN服务器内部错误(HTTP 500),错误码 INTERNAL_ERROR_UNKNOWN