提交文字商标做近似检索,返回 taskID;用检测详情轮询结果。
文字检索与图形检索是两条独立通道:文字看”读起来像不像”,图形看”看起来像不像”。
提交一次检测
POST /ip/trademark/text请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
productTitle | string | ✅ | 商品标题 |
title | string | ❌ | 本次检测的名称,用于历史列表与结果页标题 |
shortDesc | string | ❌ | 五点描述(整段文本,不按行拆分) |
desc | string | ❌ | — |
images | array<TextCheckImageData> | ❌ | 商品图片(base64);图片中的文字在提交时识别,结果参与本次检测 |
images[].imageID | string | ❌ | 图片 ID;与结果里的 imageOCR[].imageID、input.images[].imageID 对应 |
images[].base64 | string | ❌ | 图片内容的 base64(不带 data: 前缀) |
images[].image | string | ❌ | 图片地址,仅支持本接口返回过的地址(用于复用已提交的图片);外部图片请改用 base64 |
classCodes | array<string> | ❌ | 尼斯分类号。为空表示不限类别。 |
markTypes | array<string> | ❌ | 商标形态:text / design / graphic;三种同时传入表示不限 |
lang | string | ❌ | 语言,zh / en;为空时按 zh 处理 |
skipStopWords | boolean | ❌ | 是否跳过内置的英文停用词,默认为 true |
skipNumbers | boolean | ❌ | 是否跳过纯数字,默认为 true |
customStopWords | array<string> | ❌ | — |
clientRequestId | string | ❌ | 幂等键(可选):同账号同值只创建一次。 |
taskID | string | ❌ | 已废弃,改用 clientRequestId(传入时按 clientRequestId 处理)。检测 ID 由接口在提交时生成。 |
请求示例
{
"productTitle": "Wireless Earbuds Pro - 无线蓝牙耳机",
"title": "2026 秋季批次 A",
"shortDesc": "string",
"desc": "string",
"images": [
{
"imageID": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
"base64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8AAAwAB/wFh1t0AAAAASUVORK5CYII=",
"image": "https://example.com/images/logo.png"
}
],
"classCodes": [
"string"
],
"markTypes": [
"string"
],
"lang": "zh",
"skipStopWords": false,
"skipNumbers": false,
"customStopWords": [
"string"
]
} cURLPython
curl -X POST "https://api.trohub.com/v2/ip/trademark/text" -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" -d '{"productTitle":"Wireless Earbuds Pro - 无线蓝牙耳机","title":"2026 秋季批次 A","shortDesc":"string","desc":"string","images":[{"imageID":"3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6","base64":"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8AAAwAB/wFh1t0AAAAASUVORK5CYII=","image":"https://example.com/images/logo.png"}],"classCodes":["string"],"markTypes":["string"],"lang":"zh","skipStopWords":false,"skipNumbers":false,"customStopWords":["string"]}'import requests
url = "https://api.trohub.com/v2/ip/trademark/text"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
payload = {
"productTitle": "Wireless Earbuds Pro - 无线蓝牙耳机",
"title": "2026 秋季批次 A",
"shortDesc": "string",
"desc": "string",
"images": [
{
"imageID": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
"base64": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8AAAwAB/wFh1t0AAAAASUVORK5CYII=",
"image": "https://example.com/images/logo.png"
}
],
"classCodes": [
"string"
],
"markTypes": [
"string"
],
"lang": "zh",
"skipStopWords": false,
"skipNumbers": false,
"customStopWords": [
"string"
]
}
r = requests.post(url, headers={**headers, "Content-Type": "application/json"}, json=payload)
print(r.json()) 响应示例
{
"ok": true,
"message": "成功",
"data": {
"taskID": "3f2b1c4d5e6f47a8b9c0d1e2f3a4b5c6",
"status": "completed",
"pendingCount": 1
}
}响应字段
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
taskID | string | ❌ | 本次检测的记录 ID,用于轮询、修改名称及删除 |
status | string | ❌ | queued / processing / completed / failed。 |
pendingCount | integer | ❌ | 大于 0 表示该检测已受理但尚未开始处理;继续按 taskID 轮询即可 |
可能的错误
| HTTP | 错误码 | 说明 |
|---|---|---|
| 400 | VALIDATION_*(见 message) | 请求数据无效(HTTP 400) |
| 401 | UNAUTHORIZED_AUTH_REQUIRED | 缺少 API Key、Key 无效或被封禁(HTTP 401),错误码 UNAUTHORIZED_AUTH_REQUIRED。 |
| 403 | BUSINESS_INSUFFICIENT_QUOTA | 积分不足(HTTP 403),错误码 BUSINESS_INSUFFICIENT_QUOTA。 提交类接口在扣减积分前校验余额。 |
| 429 | BUSINESS_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 不会获得额外配额。接口桶是分开计数的(例如「提交检测」与 「轮询结果」是两个桶),所以轮询不会吃掉提交的额度。 |
| 500 | INTERNAL_ERROR_UNKNOWN | 服务器内部错误(HTTP 500),错误码 INTERNAL_ERROR_UNKNOWN |