Namesight
免费试用

REST API

在你自己的代码中发起扫描。该 API 面向 Pro 及以上套餐开放,使用 bearer 密钥认证,并以积分计费。

最后更新:2026 年 9 月 6 日

认证

在「设置 → API 密钥」中创建密钥。明文密钥只显示一次,之后无法找回;系统仅以可读形式保存它的前缀。每次请求都需将它作为 bearer 令牌发送。

curl https://api.namesight.app/v1/usage \
  -H "Authorization: Bearer ns_live_..."

每个密钥都带有一组作用域。若请求需要该密钥不具备的作用域,会被拒绝并返回 403,因此你交给只读集成使用的密钥无法发起付费扫描。

作用域授予的权限
scans:writePOST /v1/scans —— 发起扫描,会消耗积分
scans:readGET /v1/scans、GET /v1/scans/{id}、GET /v1/usage
reference:read/v1/ref/* 查询端点
reports:writePOST /v1/scans/{id}/shares — 生成公开分享链接
ideas:writePOST /v1/ideas — 名称生成器
projects:readGET /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域名后缀,不含前面的点
modulestrademark、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}/rescanscans:write以相同名称和设置发起新检测。按新检测计费;原检测保留。
POST /v1/scans/{id}/retry-unknownsscans:write仅将结果为 unknown 或出错的检查重新入队,绕过缓存。免费。
DELETE /v1/scans/{id}scans:write删除检测及其检查项和分享链接。积分不退。
POST /v1/scans/{id}/sharesreports:write返回报告的公开 URL。持有链接者均可阅读;有效期由套餐限制。
GET /v1/projectsprojects:read工作区的项目,含默认类别、局和 TLD。
POST /v1/ideasideas:write根据简介、种子名称或主题运行名称生成器。免费。
GET /v1/usage/eventsscans: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 或 failedscanId, 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 提供。它无需认证,因此你在拿到密钥之前就可以据此生成客户端。