查一次检测的整体状态与结论,以及每张图各自的命中商标。结果是一棵树:一次检测 → 每张图 → 每张图的命中,不靠下标和另一份数组对齐。

提交后建议每 2–3 秒轮询一次,status 变为 completed / failed 即可停止。

查询检测详情

GET /ip/trademark/design/{taskID}

查询参数

参数类型必填说明
taskIDstring✅检测 ID。提交时若传了 clientRequestId,这里也可以填该值,两者指向同一条检测。
cURLPython
curl -X GET "https://api.trohub.com/v2/ip/trademark/design/TASK_ID" -H "Authorization: Bearer YOUR_API_KEY"
import requests

url = "https://api.trohub.com/v2/ip/trademark/design/TASK_ID"
headers = {"Authorization": "Bearer YOUR_API_KEY"}

r = requests.get(url, headers=headers)
print(r.json())

响应示例

{
  "ok": true,
  "message": "成功",
  "data": {
    "taskID": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
    "title": "2026 秋季批次 A",
    "submittedVia": "api",
    "status": "completed",
    "error": "string",
    "warnings": [
      "string"
    ],
    "createdAt": "2026-10-19T12:00:00+08:00",
    "updatedAt": "2026-10-19T12:00:00+08:00",
    "riskSummary": {
      "riskLevel": "low",
      "riskDrivers": [
        "string"
      ],
      "aiReranked": false,
      "riskCounts": {
        "high": 0,
        "medium": 0,
        "low": 0,
        "tro": 0,
        "expired": 0
      },
      "riskCountsUnit": "mark",
      "review": {
        "total": 1,
        "reviewed": 0,
        "decisions": "string"
      }
    },
    "images": [
      {
        "id": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
        "status": "completed",
        "error": "string",
        "warnings": [
          "string"
        ],
        "isStale": false,
        "updatedAt": "2026-10-19T12:00:00+08:00",
        "image": "https://example.com/images/logo.png",
        "result": {
          "riskLevel": "low",
          "riskDrivers": [],
          "matches": null,
          "aiAnalysis": null,
          "countries": []
        }
      }
    ]
  }
}

响应字段

参数类型必填说明
taskIDstring❌—
titlestring❌—
submittedViastring❌web | api
statusstring❌聚合状态:queued | processing | completed | failed
errorstring❌无失败时不出现。
warningsarray<string>❌无告警时不出现。
createdAtstring❌—
updatedAtstring❌—
riskSummaryRiskSummary❌—
riskSummary.riskLevelstring❌low | medium | high;unscored = 未定档(仅外观专利关闭 AI 比对时出现)。
riskSummary.riskDriversarray<string>❌定档依据:tro | knownIp | matches | score
riskSummary.aiRerankedboolean❌图形商标、版权恒 true;外观专利关闭 AI 比对时为 false。
riskSummary.riskCountsRiskCounts❌各档位数量。模块未使用的档位恒为 0。
riskSummary.riskCounts.highinteger❌—
riskSummary.riskCounts.mediuminteger❌—
riskSummary.riskCounts.lowinteger❌外观专利恒为 0。
riskSummary.riskCounts.trointeger❌TRO 高风险图数(high 的子集)。
riskSummary.riskCounts.expiredinteger❌已失效权利数,不计入结论。
riskSummary.riskCountsUnitstring❌image | mark | patent
riskSummary.reviewReview❌—
riskSummary.review.totalinteger❌需表态条目数(按件)。
riskSummary.review.reviewedinteger❌—
riskSummary.review.decisionsobject❌{ 命中项ID: "flag" | "dismiss" }
imagesarray<object>❌本次检测提交的图片列表;每张图的状态与结果都在自己这一项里
images[].idstring❌—
images[].statusstring❌pending | queued | observing | thinking | recalling | discerning | recording | completed | failed。 终态为 completed / failed。
images[].errorstring❌致命失败原因;无失败时不出现。
images[].warningsarray<string>❌非致命告警;无告警时不出现。
images[].isStaleboolean❌超时未更新,按 failed 处理。
images[].updatedAtstring❌—
images[].imageImageUrl❌图片地址。带签名的临时链接,有效期 30 分钟,可直接用于 <img src>。 过期后重新调用本接口获取。
images[].resultTrademarkCheck❌图形商标检测的结果(每张图片对应一项)
images[].result.riskLevelstring❌该图片的风险等级:low / medium / high;结果尚未生成时为空字符串
images[].result.riskDriversarray<string>❌该风险等级的成因:matches / score
images[].result.matchesTrademarkMatchPage❌—
images[].result.aiAnalysisAiAnalysis❌—
images[].result.countriesarray<string>❌—

可能的错误

HTTP错误码说明
400VALIDATION_*(见 message)请求数据无效(HTTP 400)
401UNAUTHORIZED_AUTH_REQUIRED缺少 API Key、Key 无效或被封禁(HTTP 401),错误码 UNAUTHORIZED_AUTH_REQUIRED。
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

翻页取某张图的命中

GET /ip/trademark/design/{taskID}/matches

请求参数

参数类型必填说明
taskIDstring✅检测 ID。提交时若传了 clientRequestId,这里也可以填该值,两者指向同一条检测。
imageIdstring✅取哪张图的命中清单。取值为详情响应中的 images[].id(即提交时的 imageID)。
offsetinteger✅起始位置,从 0 开始;续取时传已获取的条数(已取 100 条则传 offset=100)。
limitinteger✅本页最多返回条数,默认 100;为 0 或负数时不截断(响应体较大)。
cURLPython
curl -X GET "https://api.trohub.com/v2/ip/trademark/design/TASK_ID/matches?imageId=3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6&offset=0&limit=0" -H "Authorization: Bearer YOUR_API_KEY"
import requests

url = "https://api.trohub.com/v2/ip/trademark/design/TASK_ID/matches?imageId=3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6&offset=0&limit=0"
headers = {"Authorization": "Bearer YOUR_API_KEY"}

r = requests.get(url, headers=headers)
print(r.json())

响应示例

{
  "ok": true,
  "message": "成功",
  "data": {
    "total": 1,
    "hasNextPage": false,
    "items": [
      {
        "id": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
        "markText": "string",
        "image": "https://example.com/images/logo.png",
        "score": 0,
        "reason": "string",
        "status": "completed",
        "legalStatus": "string",
        "serialNumber": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
        "regNumber": "string",
        "filingDate": "2026-10-19T12:00:00+08:00",
        "regDate": "2026-10-19T12:00:00+08:00",
        "owners": [
          {
            "name": "string",
            "country": "string"
          }
        ],
        "classes": [
          {
            "code": "string",
            "description": "string"
          }
        ],
        "attorney": "string",
        "drawingCode": "string"
      }
    ]
  }
}

响应字段

参数类型必填说明
totalinteger❌—
hasNextPageboolean❌—
itemsarray<TrademarkHit>❌—
items[].idstring❌—
items[].markTextstring❌商标文字(图形商标可能为空)
items[].imageImageUrl❌图片地址。带签名的临时链接,有效期 30 分钟,可直接用于 <img src>。 过期后重新调用本接口获取。
items[].scorenumber❌—
items[].reasonstring❌—
items[].statusstring❌商标法律状态,与 legalStatus 口径不同,两者均原样返回、不做合并。
items[].legalStatusstring❌商标法律状态,与 status 口径不同,两者均原样返回、不做合并。
items[].serialNumberstring❌—
items[].regNumberstring❌—
items[].filingDatestring❌—
items[].regDatestring❌—
items[].ownersarray<TrademarkOwner>❌—
items[].owners[].namestring❌—
items[].owners[].countrystring❌—
items[].classesarray<TrademarkClass>❌—
items[].classes[].codestring❌—
items[].classes[].descriptionstring❌—
items[].attorneystring❌—
items[].drawingCodestring❌—