REST API
Запускайте проверки прямо из своего кода. API доступен на тарифе Pro и выше, авторизуется bearer-ключом и оплачивается кредитами.
Последнее обновление: 6 сентября 2026
Аутентификация
Создайте ключ в разделе Настройки → 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 | Все адаптеры источников с указанием модуля |
Ошибки и лимиты запросов
Ошибки возвращаются как problem-документы по RFC 9457 с типом содержимого 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 за последние дни, включая неудачные. |
Безопасный повтор: передайте заголовок Idempotency-Key (любую уникальную строку) вместе с POST /v1/scans или rescan. Повтор с тем же ключом в течение 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 фильтрует по одному или нескольким статусам через запятую.
Вебхуки
Вместо опроса зарегистрируйте https-адрес и получайте подписанный POST по завершении проверки. Адреса управляются в Настройки → API или через /v1/webhooks с областью webhooks:manage; рабочее пространство может держать десять. Секрет подписи показывается один раз — при создании и при смене.
| Событие | Когда | Что несёт 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= и hex HMAC-SHA256 от "<timestamp>.<сырое тело>" под вашим секретом. Проверяйте по сырому телу запроса и отклоняйте метки старше пяти минут.
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 минут. Десять доставок подряд, провалившие все попытки, выключают адрес; повторное включение сбрасывает счётчик. Кнопка теста шлёт синтетический scan.completed с test: true.
OpenAPI
Полное машиночитаемое описание доступно по адресу /v1/openapi.json. Аутентификация для него не нужна, поэтому клиент можно сгенерировать ещё до получения ключа.