REST API
Внешний read-only API v1 передаёт сохранённые SEO-данные внешним конвейерам. Расширение analysis:run безопасно обновляет только разрешённые источники, не запускает AI-функции и не изменяет клиентские сайты.
Текущий статус
/api/v1/external и схему ответа версии 1.0. Выпуск токенов доступен только администратору платформы. Refresh-расширение требует отдельного scope analysis:run.Swagger / OpenAPI
Все доступные сейчас эндпоинты задокументированы автоматически через декораторы NestJS. UI смотрите по адресу:
Аутентификация
Защищённые эндпоинты ждут access-токен в заголовке Authorization: Bearer <jwt>. Токен выдаётся через POST /api/auth/login (email + пароль) или через Яндекс OAuth.
ssx_..., а не JWT кабинета. Полный секрет показывается один раз, в базе хранится только криптографический хэш. Выпуск и отзыв доступны только администратору платформы в разделе Админ → Внешний API.External SEO API v1
API возвращает сохранённые данные Метрики, Вебмастера, семантики, технических аудитов, запусков и рекомендаций. Read-endpoints ничего не запускают. Отдельный refresh запускает только фиксированные read-only сборщики Метрики, Вебмастера, Wordstat и технического аудита.
GET /summaryGET /search-performanceGET /keywordsGET /technical-findingsGET /recommendationsGET /runs/:runIdPOST /refreshGET /refresh/:refreshId202, UUID idempotencyKey, polling
Токен ограничивается организацией, явным списком проектов и scopes: projects:read, metrics:read, webmaster:read, keywords:read, recommendations:read, analysis:run. Максимальный период — 366 дней, лимит страницы — 500 записей, курсор непрозрачный.
metrika, webmaster, wordstat и technical_audit. Нельзя передать agentCode, URL, команду, промт или payload очереди. По умолчанию один source запускается раз в час, не более 10 refresh в сутки на проект. При ограничении API отвечает 429 и Retry-After.Публичные эндпоинты
Несколько эндпоинтов специально доступны без токена — на них опираются лендинг и публичные страницы. Они стабильны и ими можно пользоваться:
basePriceRub, effectivePriceRub, promo.endsAtIso и время сервера. На него же опирается реальный расчёт суммы платежа в ЮKassa — цена в баннере и цена в чеке не разойдутся.Позиции сайта
Ручной съём позиций использует JWT кабинета и доступ пользователя к проекту. Внешние токены ssx_... не дают права запуска. Маршруты пока подготовлены локально и не включены в production.
GET /api/projects/:projectId/rank-tracking/options для разрешённых регионов Google, затем POST /api/projects/:projectId/rank-tracking/quote с количеством и массивом ключей для расчёта максимума страниц и оставшихся слотов Pro. Отдельный POST /api/projects/:projectId/rank-tracking/runs требует UUID idempotencyKey, manualApproval=true и точное совпадение approvedMaximumUnits с серверным расчётом. Запуск доступен только при действующей квоте и включённом вручную worker; автоматических проверок нет.Историю и результат возвращают GET /api/projects/:projectId/rank-tracking/runs и GET /api/projects/:projectId/rank-tracking/runs/:runId. При неясном расходе запуск требует ручной сверки; сервис не повторяет платный запрос.
Что планируем
Production beta
Перед выпуском refresh-расширения отдельно утвердить production-деплой, сделать свежий backup, применить миграцию и провести smoke-тест tenant/project-изоляции.
SDK
Тонкие клиенты для Node.js и Python поверх уже зафиксированного JSON-контракта v1.
Webhooks
Отдельная будущая версия для подписки на завершение аудита. В v1 внешних write-операций нет.
examples/external-api-refresh.mjs. Он ждёт завершения и затем только читает данные.