REST API
在你自己的代码中发起扫描。该 API 面向 Pro 及以上套餐开放,使用 bearer 密钥认证,并以积分计费。
最后更新:2026 年 9 月 6 日
认证
在「设置 → API 密钥」中创建密钥。明文密钥只显示一次,之后无法找回;系统仅以可读形式保存它的前缀。每次请求都需将它作为 bearer 令牌发送。
curl https://api.namesight.app/v1/usage \
-H "Authorization: Bearer ns_live_..."每个密钥都带有一组作用域。若请求需要该密钥不具备的作用域,会被拒绝并返回 403,因此你交给只读集成使用的密钥无法发起付费扫描。
| 作用域 | 授予的权限 |
|---|---|
| scans:write | POST /v1/scans —— 发起扫描,会消耗积分 |
| scans:read | GET /v1/scans、GET /v1/scans/{id}、GET /v1/usage |
| reference:read | /v1/ref/* 查询端点 |
| reports:write | POST /v1/scans/{id}/shares — 生成公开分享链接 |
| ideas:write | POST /v1/ideas — 名称生成器 |
| projects:read | GET /v1/projects — 列出项目以便归档检测 |
| webhooks:manage | /v1/webhooks 各端点 |
积分与配额
每一次扫描都以积分计费,无论从这里还是网页应用发起。费用是所运行模块的总和:五个默认模块共 100 积分,少选一个即更便宜。套餐每月发放积分,未用完的可结转。
扣费发生在任何任务入队之前,因此无法付费的扫描永远不会运行,也不会留下任何记录。如果扣费后入队失败,积分会自动退回。
- 余额不足 → 429,并在 problem 响应体中说明缺口
- 套餐不含 API 访问权限 → 402,并附升级链接
- 工作区已关闭积分消费 → 403
发起扫描
POST /v1/scans 会将扫描入队并立即返回 202。扫描是异步的:响应携带的是 scanId,而不是结果。
curl -X POST https://api.namesight.app/v1/scans \
-H "Authorization: Bearer ns_live_..." \
-H "Content-Type: application/json" \
-d '{
"name": "lumina labs",
"regions": ["TR", "EM", "US"],
"niceClasses": [9, 41],
"tlds": ["com", "io"],
"modules": ["trademark", "domain", "social"]
}'{ "scanId": "scn_...", "totalJobs": 12, "creditsSpent": 100, "balance": 1900 }| 字段 | 是否必填 | 含义 |
|---|---|---|
| name | 是 | 要查询的品牌名称,2–64 个字符 |
| regions | 否 | 要检索的商标局。默认使用工作区的默认设置 |
| niceClasses | 否 | 商品/服务类别 1–45。将商标命中范围收窄到真正的冲突 |
| tlds | 否 | 域名后缀,不含前面的点 |
| modules | 否 | trademark、domain、social、dev、appstore |
| adapters | 否 | 按 id 限定为特定的来源适配器 |
| projectId | 否 | 将扫描归入某个已有项目 |
| options.similarSearch | 否 | 对近似商标进行模糊检索(Pro 及以上) |
读取结果
轮询 GET /v1/scans/{id},直到 status 变为 completed 或 completed_partial。一次典型扫描在一分钟内完成;建议每秒轮询一次,并随着等待逐步拉长间隔,以免长时间扫描耗尽你的速率限额。
curl https://api.namesight.app/v1/scans/scn_... \
-H "Authorization: Bearer ns_live_..."| status | 含义 |
|---|---|
| queued | 已受理,尚未联系任何来源 |
| running | 部分检查已完成;doneJobs / totalJobs 表示进度 |
| completed | 全部检查均已完成 |
| completed_partial | 已完成,但至少有一个来源无法核实 |
| failed | 扫描无法执行 |
checks 中的每一条都是一个来源针对一个目标给出的回答,包含各自的判定结果、读取时所用的 sourceUrl 以及 fetchedAt 时间戳。summary 对象在扫描结束后出现,携带评分、风险等级和商标统计。
| verdict | 含义 |
|---|---|
| available | 该来源显示此名称尚未被占用 |
| taken | 已被使用 —— 例如已注册的账号、可解析的域名 |
| conflict | 存在与所查类别重叠的有效商标 |
| risky | 已被使用,但是否会构成阻碍尚不确定 |
| unknown | 该来源无法核实 |
| error | 该来源请求失败;errorCode 说明原因 |
参考数据
四个查询端点说明了扫描请求可以包含哪些内容。它们需要 reference:read 作用域,且完全免费。
| 端点 | 返回内容 |
|---|---|
| GET /v1/ref/nice-classes | 尼斯分类的 45 个类别 |
| GET /v1/ref/regions | 扫描可检索的商标局 |
| GET /v1/ref/tlds | 按层级分组的域名后缀 |
| GET /v1/ref/adapters | 全部来源适配器及其所属模块 |
错误与速率限制
错误以 RFC 9457 problem 文档的形式返回,内容类型为 application/problem+json。type 字段标识失败类型,detail 进行说明,部分错误还会附带 upgradeUrl 等额外字段。
{
"type": "https://namesight.app/errors/quota-exceeded",
"title": "Quota exceeded",
"status": 429,
"detail": "Not enough credits (balance 0, need 100). Top up or switch off a module to continue."
}| 状态码 | 触发情形 |
|---|---|
| 400 | 请求体未通过校验 |
| 401 | 密钥缺失、无效、已吊销或已过期 |
| 402 | 当前套餐不包含公开 API |
| 403 | 密钥缺少作用域,或积分消费已关闭 |
| 404 | 此工作区中不存在该扫描 |
| 403 (key-cap-exceeded) | 此密钥的每月积分上限已达;在设置 → API 密钥中调高 |
| 409 | 同一个 Idempotency-Key 被用于不同的请求体 |
| 429 | 超出速率限制或积分余额 |
速率限制按密钥在一分钟的滑动窗口内计数,并在每个响应中回报,因此你可以在被拒绝之前主动降速。
x-ratelimit-limit: 60
x-ratelimit-remaining: 58
x-ratelimit-reset: 41对检测的操作及其他
除了发起和读取检测,密钥还可以重新运行检测、重试未能回答的来源、删除检测、分享报告、列出工作区的项目并生成名称创意。每项操作都需要所示的权限范围。
| 方法与路径 | 范围 | 作用 |
|---|---|---|
| POST /v1/scans/{id}/rescan | scans:write | 以相同名称和设置发起新检测。按新检测计费;原检测保留。 |
| POST /v1/scans/{id}/retry-unknowns | scans:write | 仅将结果为 unknown 或出错的检查重新入队,绕过缓存。免费。 |
| DELETE /v1/scans/{id} | scans:write | 删除检测及其检查项和分享链接。积分不退。 |
| POST /v1/scans/{id}/shares | reports:write | 返回报告的公开 URL。持有链接者均可阅读;有效期由套餐限制。 |
| GET /v1/projects | projects:read | 工作区的项目,含默认类别、局和 TLD。 |
| POST /v1/ideas | ideas:write | 根据简介、种子名称或主题运行名称生成器。免费。 |
| GET /v1/usage/events | scans:read | 工作区最近几天的每一次 API 调用,包括失败的。 |
安全重试:随 POST /v1/scans 或 rescan 发送 Idempotency-Key 头(任意唯一字符串)。24 小时内携带同一密钥的重试会重放第一次的响应(响应带 Idempotent-Replayed: true),而不是发起并扣费第二次检测。同一密钥配不同请求体会被 409 拒绝。
curl -X POST https://api.namesight.app/v1/scans \
-H "Authorization: Bearer ns_live_..." \
-H "Idempotency-Key: 4f7c2c1e-order-1187" \
-H "Content-Type: application/json" \
-d '{"name":"Lumina Labs","modules":["trademark","domain"]}'无需轮询的等待:GET /v1/scans/{id}?wait=60000 会保持请求直到检测完成或等待到期(最多 60 秒),然后返回当前状态的检测。一次请求、一个限速名额、无循环。
分页:GET /v1/scans 返回 items 与 nextCursor。把 nextCursor 作为 cursor 传回即可取下一页;null 表示最后一页。status 按一个或多个以逗号分隔的状态过滤。
Webhook
无需轮询:注册一个 https 端点,检测完成时即可收到带签名的 POST。端点在设置 → API 中管理,或通过带 webhooks:manage 范围的 /v1/webhooks 管理;每个工作区最多十个。签名密钥仅在创建和轮换时显示一次。
| 事件 | 时机 | data 内容 |
|---|---|---|
| scan.completed | 检测到达 completed、completed_partial 或 failed | scanId, status, kind, rawName, queryName, projectId, score, band, unknownCount, trademarkLiveConflicts, totalJobs, doneJobs, createdAt, completedAt, url |
每次投递携带四个头:x-namesight-event、x-namesight-delivery(每次重试都是同一 id,便于去重)、x-namesight-timestamp(unix 秒)和 x-namesight-signature。签名为 v1= 加上用你的密钥对 "<timestamp>.<原始请求体>" 计算的十六进制 HMAC-SHA256。请针对原始请求体验证,并拒绝超过五分钟的时间戳。
import { createHmac, timingSafeEqual } from "node:crypto";
// Express-style handler; keep the RAW body — a re-serialised JSON will not match.
app.post("/hooks/namesight", express.raw({ type: "*/*" }), (req, res) => {
const ts = req.header("x-namesight-timestamp");
const sig = req.header("x-namesight-signature"); // "v1=<hex>"
const body = req.body.toString("utf8");
const expected = "v1=" + createHmac("sha256", process.env.NAMESIGHT_WEBHOOK_SECRET)
.update(`${ts}.${body}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
if (!fresh || expected.length !== sig.length || !timingSafeEqual(Buffer.from(expected), Buffer.from(sig))) {
return res.status(401).end();
}
const event = JSON.parse(body); // { id, event, createdAt, test, data }
res.status(202).end(); // ack first, work later
if (!event.test) handleScanCompleted(event.data); // data.scanId, data.status, data.score, data.url
});十秒内返回任意 2xx,之后再处理。其他响应会再重试四次:30 秒、2 分钟、10 分钟和 60 分钟后。连续十次全部尝试失败的投递会停用端点;重新启用会清零计数。测试按钮会发送带 test: true 的模拟 scan.completed。
OpenAPI
完整的机器可读描述由 /v1/openapi.json 提供。它无需认证,因此你在拿到密钥之前就可以据此生成客户端。