{"apiVersion":"v1","baseUrl":"https://api.seonorita.ru/api/v1","conventions":{"authorization":"Authorization: Bearer seo_pat_<secret>","contentType":"application/json","dates":"ISO 8601 UTC","pagination":{"request":"limit + opaque cursor","response":"page.hasNext + page.nextCursor"},"commands":{"idempotency":"Idempotency-Key for create/run commands","concurrency":"If-Match: \"v<version>\" for versioned changes"},"envelope":{"success":"{ data, meta: { requestId, version? }, page? }","error":"{ error: { code, message, details? }, meta: { requestId } }"}},"sections":[{"slug":"quick-start","title":"Быстрый старт","description":"Первый запрос, базовый URL и формат ответа.","group":"Начало","endpoints":[{"id":"access-discovery","method":"GET","path":"/access","scope":"token:discover","description":"Рабочая область, проекты и права текущего API-ключа","section":"quick-start","requestFormat":"JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."}]},{"slug":"authentication","title":"Авторизация и права","description":"Bearer-токен, scopes, заголовки и ограничения проектов.","group":"Начало","endpoints":[]},{"slug":"projects","title":"Проекты","description":"Получение списка, чтение и изменение проекта.","group":"Основное API","endpoints":[{"id":"projects-list","method":"GET","path":"/workspaces/{workspaceId}/projects","scope":"projects:read","description":"Список доступных ключу проектов","section":"projects","requestFormat":"Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"projects-capabilities","method":"GET","path":"/workspaces/{workspaceId}/project-capabilities","scope":"projects:read","description":"Доступность создания и общего порядка проектов","section":"projects","requestFormat":"Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"projects-create","method":"POST","path":"/workspaces/{workspaceId}/projects","scope":"projects:write","description":"Создать проект в рабочей области","section":"projects","requestFormat":"Path: workspaceId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"projects-order","method":"PUT","path":"/workspaces/{workspaceId}/projects/order","scope":"projects:write","description":"Сохранить общий порядок проектов","section":"projects","requestFormat":"Path: workspaceId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"project-get","method":"GET","path":"/projects/{projectId}","scope":"projects:read","description":"Карточка проекта","section":"projects","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"project-update","method":"PATCH","path":"/projects/{projectId}","scope":"projects:write","description":"Изменить настройки проекта","section":"projects","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"project-archive","method":"POST","path":"/projects/{projectId}/archive","scope":"projects:write","description":"Архивировать проект","section":"projects","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"project-restore","method":"POST","path":"/projects/{projectId}/restore","scope":"projects:write","description":"Восстановить проект","section":"projects","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"project-delete","method":"DELETE","path":"/projects/{projectId}","scope":"projects:write","description":"Запустить безопасное удаление проекта","section":"projects","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."}]},{"slug":"semantics","title":"Семантика","description":"Ключи, папки, массовые команды, импорт и экспорт.","group":"Основное API","endpoints":[{"id":"groups-list","method":"GET","path":"/projects/{projectId}/keyword-groups","scope":"semantics:read","description":"Дерево папок семантики с цветами","section":"semantics","requestFormat":"Path: projectId (UUID). Тело и query отсутствуют.","responseFormat":"200 · data: [{ id, parentId?, name, path, color?, position, keywordCount, systemKind?, version, createdAt, updatedAt }]."},{"id":"groups-create","method":"POST","path":"/projects/{projectId}/keyword-groups","scope":"semantics:write","description":"Создать папку","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"groups-bulk","method":"POST","path":"/projects/{projectId}/keyword-groups/bulk","scope":"semantics:write","description":"Создать несколько папок","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"group-delete","method":"DELETE","path":"/projects/{projectId}/keyword-groups/{groupId}","scope":"semantics:write","description":"Удалить папку с выбранной стратегией для дочерних папок и запросов","section":"semantics","requestFormat":"Headers: If-Match. Optional JSON: { deleteKeywords?: boolean, promoteChildren?: boolean }.","responseFormat":"204 No Content."},{"id":"keywords-list","method":"GET","path":"/projects/{projectId}/keywords","scope":"semantics:read","description":"Ключевые слова с фильтрами, примечаниями и курсором","section":"semantics","requestFormat":"Query: limit, cursor?, search?, groupId/groupIds?, filters?, sort?, includeNotes=true|false. Полный note возвращается только при includeNotes=true; в этом режиме limit <= 200.","responseFormat":"200 · data: SemanticKeywordListItem[] с groupPath, optional groupMembershipCount для нескольких папок, targetUrl, tags, frequencies, positions, aiAnswers, hasNote и optional note; page: { hasNext, nextCursor?, totalApprox? }."},{"id":"keywords-operation-scope","method":"POST","path":"/projects/{projectId}/keywords/operation-scope","scope":"semantics:read","description":"Облегчённая выборка запросов для большой операции","section":"semantics","requestFormat":"JSON: { groupIds?: UUID[], cursor?: UUID }. Без groupIds выбираются все активные запросы проекта; до 20 000 уникальных папок образуют один union.","responseFormat":"200 · до 10 000 строк { id, version, isTracked }; первая страница содержит totalApprox, следующая — UUID cursor. Табличные метрики, теги и custom values не загружаются."},{"id":"keywords-create","method":"POST","path":"/projects/{projectId}/keywords","scope":"semantics:write","description":"Создать ключевое слово","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"keywords-bulk","method":"POST","path":"/projects/{projectId}/keywords/bulk","scope":"semantics:write","description":"Пакетное создание ключей","section":"semantics","requestFormat":"JSON: { duplicatePolicy, items[] }; row-level ADD_TO_GROUP добавляет существующую canonical keyword identity в duplicateGroupId (либо groupId), сохраняя прежние папки. groupId по-прежнему задаёт папку для новой строки.","responseFormat":"200 · data содержит indexed outcomes CREATED, LINKED_EXISTING, RESTORED, SKIPPED_EXISTING, REJECTED_EXISTING или FAILED."},{"id":"keyword-update","method":"PATCH","path":"/projects/{projectId}/keywords/{keywordId}","scope":"semantics:write","description":"Изменить ключевое слово","section":"semantics","requestFormat":"Path: projectId: UUID, keywordId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"keyword-merge","method":"POST","path":"/projects/{projectId}/keywords/merge","scope":"semantics:write","description":"Объединить запросы с сохранением истории у выбранного основного запроса","section":"semantics","requestFormat":"JSON: { keeper: { id, version }, sources: [{ id, version }] }. Все запросы должны принадлежать одному проекту и иметь один язык.","responseFormat":"200 · data: { keeperKeywordId, keeperVersion, mergedKeywordIds, mergedAt }. Immutable history остаётся доступной через keeper."},{"id":"keyword-merge-suggestions","method":"GET","path":"/projects/{projectId}/keywords/merge-suggestions","scope":"semantics:read","description":"Найти повреждённые названия и ближайшие варианты для ручного объединения","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"keyword-delete","method":"DELETE","path":"/projects/{projectId}/keywords/{keywordId}","scope":"semantics:write","description":"Переместить запрос в корзину или окончательно очистить его данные","section":"semantics","requestFormat":"Headers: If-Match. Optional JSON: { permanent?: boolean }; permanent=true допустим только для ключа в корзине.","responseFormat":"204 No Content."},{"id":"bulk-command","method":"POST","path":"/projects/{projectId}/bulk-commands","scope":"semantics:write","description":"Массовое изменение выбранных ключей","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"import-get","method":"GET","path":"/projects/{projectId}/imports/{importId}","scope":"semantics:read","description":"Состояние импорта","section":"semantics","requestFormat":"Path: projectId: UUID, importId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"import-preview-rows","method":"GET","path":"/projects/{projectId}/imports/{importId}/preview-rows","scope":"semantics:read","description":"Строки предпросмотра импорта","section":"semantics","requestFormat":"Path: projectId: UUID, importId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"imports-create","method":"POST","path":"/projects/{projectId}/imports","scope":"semantics:write","description":"Создать импорт","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"exports","method":"GET","path":"/projects/{projectId}/exports","scope":"semantics:read","description":"История экспортов","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"exports-create","method":"POST","path":"/projects/{projectId}/exports","scope":"semantics:write","description":"Создать экспорт","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clustering","method":"POST","path":"/projects/{projectId}/clustering-runs","scope":"semantics:write","description":"Запустить кластеризацию","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"group-duplicate","method":"POST","path":"/projects/{projectId}/keyword-groups/{groupId}/duplicate","scope":"semantics:write","description":"Дублировать папку и выбранное содержимое","section":"semantics","requestFormat":"Path: projectId: UUID, groupId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"group-update","method":"PATCH","path":"/projects/{projectId}/keyword-groups/{groupId}","scope":"semantics:write","description":"Изменить название, родителя, цвет или позицию папки","section":"semantics","requestFormat":"Headers: If-Match. JSON: { name?: string, parentId?: UUID | null, color?: paletteColor | null, position?: integer }.","responseFormat":"200 · data: SemanticKeywordGroup с id, parentId, name, path, color, position, keywordCount и version."},{"id":"keywords-search","method":"POST","path":"/projects/{projectId}/keywords/search","scope":"semantics:read","description":"Найти ключи по большому списку фраз без query-string","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"keywords-body-list","method":"POST","path":"/projects/{projectId}/keywords/list","scope":"semantics:read","description":"Получить страницу ключей со сложным фильтром в JSON body","section":"semantics","requestFormat":"JSON: { query: { limit, cursor?, search?, sort?, groupIds?, includeNotes?, filters? } }; точные поля проверяются по allowlist.","responseFormat":"200 · data: SemanticKeywordListItem[]; page: { hasNext, nextCursor?, totalApprox? }."},{"id":"keyword-tag-options","method":"GET","path":"/projects/{projectId}/keywords/tag-options","scope":"semantics:read","description":"Получить доступные теги проекта","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"keyword-tags","method":"GET","path":"/projects/{projectId}/keywords/tags","scope":"semantics:read","description":"Получить теги проекта с количеством связанных запросов","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"keyword-tag-delete","method":"DELETE","path":"/projects/{projectId}/keywords/tags/{tagId}","scope":"semantics:write","description":"Удалить тег и снять его со всех запросов проекта","section":"semantics","requestFormat":"Path: projectId: UUID, tagId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"keywords-bulk-preview","method":"POST","path":"/projects/{projectId}/keywords/bulk-preview","scope":"semantics:write","description":"Проверить пакет ключей перед созданием","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"keyword-insights","method":"GET","path":"/projects/{projectId}/keywords/{keywordId}/insights","scope":"semantics:read","description":"Карточка ключа: текущие папки с цветами, позиции, частотность, SERP, URL и заметка","section":"semantics","requestFormat":"Path: projectId, keywordId (UUID). Query: dimensionKey? — точный срез поисковика, региона и устройства; snapshotId? — точный immutable снимок для списка найденных URL.","responseFormat":"200 · data: SemanticKeywordInsights с последними частотностями, позициями, SERP-результатами, target URL и note."},{"id":"keyword-ai-answers","method":"GET","path":"/projects/{projectId}/keywords/{keywordId}/ai-answers","scope":"semantics:read","description":"Последние ИИ-ответы ключа по выбранному срезу","section":"semantics","requestFormat":"Path: projectId: UUID, keywordId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"keyword-ai-answer-history","method":"GET","path":"/projects/{projectId}/keywords/{keywordId}/ai-answers/history","scope":"semantics:read","description":"История ИИ-ответов ключа с курсором","section":"semantics","requestFormat":"Path: projectId: UUID, keywordId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"keyword-frequency-delete","method":"DELETE","path":"/projects/{projectId}/keywords/{keywordId}/frequencies/{type}/{device}","scope":"semantics:write","description":"Удалить выбранный контекст частотности ключа","section":"semantics","requestFormat":"Path: projectId: UUID, keywordId: UUID, type: string, device: string. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"bulk-clean-preview","method":"POST","path":"/projects/{projectId}/bulk-commands/clean-preview","scope":"semantics:write","description":"Предпросмотр очистки выбранных ключей","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"bulk-clean","method":"POST","path":"/projects/{projectId}/bulk-commands/clean","scope":"semantics:write","description":"Применить очистку выбранных ключей","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"import-mapping","method":"POST","path":"/projects/{projectId}/imports/{importId}/mapping","scope":"semantics:write","description":"Сохранить сопоставление колонок импорта","section":"semantics","requestFormat":"Path: projectId: UUID, importId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"import-publish","method":"POST","path":"/projects/{projectId}/imports/{importId}/publish","scope":"semantics:write","description":"Опубликовать проверенный импорт","section":"semantics","requestFormat":"Path: projectId: UUID, importId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"import-cancel","method":"POST","path":"/projects/{projectId}/imports/{importId}/cancel","scope":"semantics:write","description":"Отменить импорт","section":"semantics","requestFormat":"Path: projectId: UUID, importId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"upload-create","method":"POST","path":"/projects/{projectId}/uploads","scope":"semantics:write","description":"Создать multipart-загрузку файла импорта","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"upload-parts","method":"POST","path":"/projects/{projectId}/uploads/{uploadId}/parts","scope":"semantics:write","description":"Получить подписанные URL частей загрузки","section":"semantics","requestFormat":"Path: projectId: UUID, uploadId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"upload-complete","method":"POST","path":"/projects/{projectId}/uploads/{uploadId}/complete","scope":"semantics:write","description":"Завершить multipart-загрузку","section":"semantics","requestFormat":"Path: projectId: UUID, uploadId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"upload-get","method":"GET","path":"/projects/{projectId}/uploads/{uploadId}","scope":"semantics:read","description":"Получить состояние загрузки","section":"semantics","requestFormat":"Path: projectId: UUID, uploadId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"upload-delete","method":"DELETE","path":"/projects/{projectId}/uploads/{uploadId}","scope":"semantics:write","description":"Отменить незавершённую загрузку","section":"semantics","requestFormat":"Path: projectId: UUID, uploadId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"export-get","method":"GET","path":"/projects/{projectId}/exports/{exportId}","scope":"semantics:read","description":"Получить состояние экспорта","section":"semantics","requestFormat":"Path: projectId: UUID, exportId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"export-download","method":"GET","path":"/projects/{projectId}/exports/{exportId}/download","scope":"semantics:read","description":"Скачать готовый экспорт через браузерный маршрут","section":"semantics","requestFormat":"Path: projectId: UUID, exportId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"export-file","method":"GET","path":"/projects/{projectId}/exports/{exportId}/file","scope":"semantics:read","description":"Скачать готовый экспорт по Bearer API","section":"semantics","requestFormat":"Path: projectId: UUID, exportId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"export-cancel","method":"POST","path":"/projects/{projectId}/exports/{exportId}/cancel","scope":"semantics:write","description":"Отменить активный экспорт","section":"semantics","requestFormat":"Path: projectId: UUID, exportId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clustering-list","method":"GET","path":"/projects/{projectId}/clustering-runs","scope":"semantics:read","description":"История кластеризаций","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clustering-section","method":"GET","path":"/projects/{projectId}/clustering-runs/{jobId}/result/sections/{sectionId}","scope":"semantics:read","description":"Страница секции результата кластеризации","section":"semantics","requestFormat":"Path: projectId: UUID, jobId: UUID, sectionId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clustering-result","method":"GET","path":"/projects/{projectId}/clustering-runs/{jobId}/result","scope":"semantics:read","description":"Сводный результат кластеризации","section":"semantics","requestFormat":"Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clustering-get","method":"GET","path":"/projects/{projectId}/clustering-runs/{jobId}","scope":"semantics:read","description":"Состояние кластеризации","section":"semantics","requestFormat":"Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clustering-cancel","method":"POST","path":"/projects/{projectId}/clustering-runs/{jobId}/cancel","scope":"semantics:write","description":"Отменить кластеризацию","section":"semantics","requestFormat":"Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clustering-apply","method":"POST","path":"/projects/{projectId}/clustering-runs/{jobId}/apply","scope":"semantics:write","description":"Применить proposal кластеризации","section":"semantics","requestFormat":"Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clustering-reject","method":"POST","path":"/projects/{projectId}/clustering-runs/{jobId}/reject","scope":"semantics:write","description":"Отклонить proposal кластеризации","section":"semantics","requestFormat":"Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clusters-list","method":"GET","path":"/projects/{projectId}/clusters","scope":"semantics:read","description":"Список кластеров проекта","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clusters-create","method":"POST","path":"/projects/{projectId}/clusters","scope":"semantics:write","description":"Создать кластер","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clusters-page-mapping-preview","method":"POST","path":"/projects/{projectId}/clusters/page-mapping-preview","scope":"semantics:write","description":"Предпросмотр назначения страниц кластерам","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clusters-page-mapping-bulk","method":"POST","path":"/projects/{projectId}/clusters/page-mapping-bulk","scope":"semantics:write","description":"Массово назначить страницы кластерам","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clusters-merge-preview","method":"POST","path":"/projects/{projectId}/clusters/merge-preview","scope":"semantics:write","description":"Предпросмотр объединения кластеров","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clusters-merge","method":"POST","path":"/projects/{projectId}/clusters/merge","scope":"semantics:write","description":"Объединить кластеры","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clusters-split-preview","method":"POST","path":"/projects/{projectId}/clusters/split-preview","scope":"semantics:write","description":"Предпросмотр разделения кластера","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"clusters-split","method":"POST","path":"/projects/{projectId}/clusters/split","scope":"semantics:write","description":"Разделить кластер","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"cluster-update","method":"PATCH","path":"/projects/{projectId}/clusters/{clusterId}","scope":"semantics:write","description":"Изменить кластер","section":"semantics","requestFormat":"Path: projectId: UUID, clusterId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"cluster-delete","method":"DELETE","path":"/projects/{projectId}/clusters/{clusterId}","scope":"semantics:write","description":"Удалить кластер и снять его со всех запросов проекта","section":"semantics","requestFormat":"Path: projectId: UUID, clusterId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"custom-columns","method":"GET","path":"/projects/{projectId}/semantic-custom-columns","scope":"semantics:read","description":"Пользовательские колонки семантики","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"custom-column-create","method":"POST","path":"/projects/{projectId}/semantic-custom-columns","scope":"semantics:write","description":"Создать пользовательскую колонку","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"custom-column-update","method":"PATCH","path":"/projects/{projectId}/semantic-custom-columns/{columnId}","scope":"semantics:write","description":"Изменить пользовательскую колонку","section":"semantics","requestFormat":"Path: projectId: UUID, columnId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"custom-column-delete","method":"DELETE","path":"/projects/{projectId}/semantic-custom-columns/{columnId}","scope":"semantics:write","description":"Удалить пользовательскую колонку","section":"semantics","requestFormat":"Path: projectId: UUID, columnId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"custom-value-set","method":"PUT","path":"/projects/{projectId}/keywords/{keywordId}/custom-values/{columnId}","scope":"semantics:write","description":"Записать пользовательское значение ключа","section":"semantics","requestFormat":"Path: projectId: UUID, keywordId: UUID, columnId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"custom-value-delete","method":"DELETE","path":"/projects/{projectId}/keywords/{keywordId}/custom-values/{columnId}","scope":"semantics:write","description":"Удалить пользовательское значение ключа","section":"semantics","requestFormat":"Path: projectId: UUID, keywordId: UUID, columnId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"duplicates-preview","method":"POST","path":"/projects/{projectId}/semantic-duplicates/preview","scope":"semantics:read","description":"Получить группы дублей без изменений","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"duplicates-apply","method":"POST","path":"/projects/{projectId}/semantic-duplicates/apply","scope":"semantics:write","description":"Применить выбранные решения по дублям","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"negative-presets","method":"GET","path":"/projects/{projectId}/negative-keyword-presets","scope":"semantics:read","description":"Список наборов минус-слов","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"negative-preset-create","method":"POST","path":"/projects/{projectId}/negative-keyword-presets","scope":"semantics:write","description":"Создать набор минус-слов","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"negative-preset-update","method":"PATCH","path":"/projects/{projectId}/negative-keyword-presets/{presetId}","scope":"semantics:write","description":"Изменить набор минус-слов","section":"semantics","requestFormat":"Path: projectId: UUID, presetId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"negative-preset-delete","method":"DELETE","path":"/projects/{projectId}/negative-keyword-presets/{presetId}","scope":"semantics:write","description":"Удалить набор минус-слов","section":"semantics","requestFormat":"Path: projectId: UUID, presetId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"negative-preview","method":"POST","path":"/projects/{projectId}/negative-keywords/preview","scope":"semantics:read","description":"Предпросмотр совпадений минус-слов","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"negative-apply","method":"POST","path":"/projects/{projectId}/negative-keywords/apply","scope":"semantics:write","description":"Применить минус-слова к выборке","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"saved-views","method":"GET","path":"/projects/{projectId}/semantic-saved-views","scope":"semantics:read","description":"Представления таблицы семантики","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"saved-view-create","method":"POST","path":"/projects/{projectId}/semantic-saved-views","scope":"semantics:write","description":"Создать представление","section":"semantics","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"saved-view-update","method":"PATCH","path":"/projects/{projectId}/semantic-saved-views/{viewId}","scope":"semantics:write","description":"Изменить представление","section":"semantics","requestFormat":"Path: projectId: UUID, viewId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"saved-view-delete","method":"DELETE","path":"/projects/{projectId}/semantic-saved-views/{viewId}","scope":"semantics:write","description":"Удалить представление","section":"semantics","requestFormat":"Path: projectId: UUID, viewId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"semantic-versions","method":"GET","path":"/projects/{projectId}/semantic-versions","scope":"semantics:read","description":"История версий семантики","section":"semantics","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"semantic-version-get","method":"GET","path":"/projects/{projectId}/semantic-versions/{versionId}","scope":"semantics:read","description":"Детали версии семантики","section":"semantics","requestFormat":"Path: projectId: UUID, versionId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"semantic-version-undo-preview","method":"GET","path":"/projects/{projectId}/semantic-versions/{versionId}/undo-preview","scope":"semantics:read","description":"Предпросмотр отката версии","section":"semantics","requestFormat":"Path: projectId: UUID, versionId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"semantic-version-undo","method":"POST","path":"/projects/{projectId}/semantic-versions/{versionId}/undo","scope":"semantics:write","description":"Откатить версию семантики","section":"semantics","requestFormat":"Path: projectId: UUID, versionId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."}]},{"slug":"project-data","title":"Страницы и заметки","description":"Страницы, Markdown-примечания, папки и цветовая легенда проекта.","group":"Основное API","endpoints":[{"id":"pages","method":"GET","path":"/projects/{projectId}/pages","scope":"pages:read","description":"Страницы проекта","section":"project-data","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"pages-create","method":"POST","path":"/projects/{projectId}/pages","scope":"pages:write","description":"Создать страницу","section":"project-data","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"notes","method":"GET","path":"/projects/{projectId}/notes","scope":"notes:read","description":"Заметки проекта с полным Markdown","section":"project-data","requestFormat":"Path: projectId (UUID). Тело и query отсутствуют.","responseFormat":"200 · data: { notes: ProjectNote[] }; ProjectNote содержит id, title, markdown, visibility, version, createdAt и updatedAt."},{"id":"notes-create","method":"POST","path":"/projects/{projectId}/notes","scope":"notes:write","description":"Создать заметку","section":"project-data","requestFormat":"JSON: { title: string, markdown: string, visibility: PROJECT_MEMBERS | PUBLIC }.","responseFormat":"201 · data: ProjectNote; заголовок ETag содержит актуальную version."},{"id":"group-color-legend","method":"GET","path":"/projects/{projectId}/semantic-group-color-legend","scope":"semantics:read","description":"Примечания к цветам папок","section":"project-data","requestFormat":"Path: projectId (UUID). Тело и query отсутствуют.","responseFormat":"200 · data: { entries: [{ color, note }], version, unread, updatedAt?, updatedByUserId?, access: { canManage } }."},{"id":"group-color-legend-update","method":"PATCH","path":"/projects/{projectId}/semantic-group-color-legend","scope":"semantics:write","description":"Заменить примечания цветовой легенды","section":"project-data","requestFormat":"Headers: If-Match. JSON: { entries: [{ color: paletteColor, note: string(1..240) }] }.","responseFormat":"200 · data: SemanticGroupColorLegend; ETag содержит новую version."},{"id":"group-color-legend-seen","method":"POST","path":"/projects/{projectId}/semantic-group-color-legend/seen","scope":"semantics:read","description":"Отметить текущую версию цветовой легенды просмотренной","section":"project-data","requestFormat":"JSON: { version: non-negative integer }.","responseFormat":"200 · data: SemanticGroupColorLegend с unread=false для текущего пользователя."},{"id":"page-get","method":"GET","path":"/projects/{projectId}/pages/{pageId}","scope":"pages:read","description":"Получить страницу проекта","section":"project-data","requestFormat":"Path: projectId: UUID, pageId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"page-update","method":"PATCH","path":"/projects/{projectId}/pages/{pageId}","scope":"pages:write","description":"Изменить страницу проекта","section":"project-data","requestFormat":"Path: projectId: UUID, pageId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"page-archive","method":"POST","path":"/projects/{projectId}/pages/{pageId}/archive","scope":"pages:write","description":"Архивировать страницу","section":"project-data","requestFormat":"Path: projectId: UUID, pageId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"page-restore","method":"POST","path":"/projects/{projectId}/pages/{pageId}/restore","scope":"pages:write","description":"Восстановить страницу","section":"project-data","requestFormat":"Path: projectId: UUID, pageId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"note-get","method":"GET","path":"/projects/{projectId}/notes/{noteId}","scope":"notes:read","description":"Получить полную Markdown-заметку","section":"project-data","requestFormat":"Path: projectId, noteId (UUID). Тело и query отсутствуют.","responseFormat":"200 · data: ProjectNote; ETag содержит version для последующего PATCH или DELETE."},{"id":"note-update","method":"PATCH","path":"/projects/{projectId}/notes/{noteId}","scope":"notes:write","description":"Изменить заметку","section":"project-data","requestFormat":"Headers: If-Match. JSON: любое непустое подмножество { title, markdown, visibility }.","responseFormat":"200 · data: обновлённый ProjectNote; ETag содержит новую version."},{"id":"note-delete","method":"DELETE","path":"/projects/{projectId}/notes/{noteId}","scope":"notes:write","description":"Удалить заметку","section":"project-data","requestFormat":"Headers: If-Match. Path: projectId, noteId (UUID). Тело отсутствует.","responseFormat":"204 No Content."}]},{"slug":"positions","title":"Позиции и конкуренты","description":"Контекст, оценка, запуск позиций и сбор обычной выдачи.","group":"Сбор данных","endpoints":[{"id":"position-summary","method":"GET","path":"/projects/{projectId}/keywords/position-summary","scope":"semantics:read","description":"Текущая средняя позиция и число запросов в Топ-3/5/10/30/50","section":"positions","requestFormat":"Query: rankDimensionKey? — точный поисковик, город и устройство; includeUntracked? — учитывать неотслеживаемые запросы.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"position-history","method":"GET","path":"/projects/{projectId}/keywords/position-history","scope":"semantics:read","description":"До 100 последних проектных срезов; includeUntracked=true включает активные неотслеживаемые запросы","section":"positions","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"contexts-list","method":"GET","path":"/projects/{projectId}/tracking-contexts","scope":"positions:read","description":"Контексты съёма позиций","section":"positions","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"contexts-create","method":"POST","path":"/projects/{projectId}/tracking-contexts","scope":"positions:run","description":"Создать контекст съёма","section":"positions","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"context-update","method":"PATCH","path":"/projects/{projectId}/tracking-contexts/{contextId}","scope":"positions:run","description":"Изменить контекст","section":"positions","requestFormat":"Path: projectId: UUID, contextId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"context-materialize","method":"POST","path":"/projects/{projectId}/tracking-contexts/{contextId}/materialize","scope":"positions:run","description":"Пересчитать актуальные запросы сохранённого контекста","section":"positions","requestFormat":"Пустой JSON: {}. Сервер использует сохранённый scope и не принимает keyword IDs от клиента.","responseFormat":"200 · data: { contextId, assignedKeywordCount, addedKeywordCount, removedKeywordCount, unchangedKeywordCount, keywordSetHash, version, changedAt }."},{"id":"context-keywords","method":"PUT","path":"/projects/{projectId}/tracking-contexts/{contextId}/keywords","scope":"positions:run","description":"Заменить точный набор ключей контекста","section":"positions","requestFormat":"Path: projectId: UUID, contextId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-estimate","method":"POST","path":"/projects/{projectId}/rank-estimates","scope":"positions:run","description":"Рассчитать неизменяемую оценку позиций или выдачи конкурентов","section":"positions","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-runs-list","method":"GET","path":"/projects/{projectId}/rank-runs","scope":"positions:read","description":"История запусков позиций и выдачи конкурентов","section":"positions","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-run","method":"POST","path":"/projects/{projectId}/rank-runs","scope":"positions:run","description":"Подтвердить оценку и создать задание","section":"positions","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-job","method":"GET","path":"/projects/{projectId}/jobs/{jobId}","scope":"positions:read","description":"Текущее состояние задания","section":"positions","requestFormat":"Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-result","method":"GET","path":"/projects/{projectId}/jobs/{jobId}/result","scope":"positions:read","description":"Постраничный результат позиций","section":"positions","requestFormat":"Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-cancel","method":"POST","path":"/projects/{projectId}/jobs/{jobId}/cancel","scope":"positions:run","description":"Запросить отмену задания","section":"positions","requestFormat":"Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-runtime-diagnostics","method":"GET","path":"/projects/{projectId}/jobs/{jobId}/runtime-diagnostics","scope":"positions:read","description":"Безопасная диагностика активного съёма","section":"positions","requestFormat":"Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-retry-missing","method":"POST","path":"/projects/{projectId}/jobs/{jobId}/retry-missing","scope":"positions:run","description":"Повторить только отсутствующие результаты","section":"positions","requestFormat":"Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-history","method":"GET","path":"/projects/{projectId}/rank-history","scope":"positions:read","description":"История позиций и сохранённой SERP конкретного ключа","section":"positions","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-dimension-merges","method":"GET","path":"/projects/{projectId}/rank-workbench/dimension-merges","scope":"positions:read","description":"Настройки объединения импортированных срезов","section":"positions","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-dimension-merge-create","method":"POST","path":"/projects/{projectId}/rank-workbench/dimension-merges","scope":"positions:run","description":"Объединить совместимые срезы в представлении","section":"positions","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-dimension-merge-remove","method":"POST","path":"/projects/{projectId}/rank-workbench/dimension-merges/{mergeId}/remove","scope":"positions:run","description":"Удалить правило объединения срезов","section":"positions","requestFormat":"Path: projectId: UUID, mergeId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-workbench-positions","method":"POST","path":"/projects/{projectId}/rank-workbench/positions","scope":"positions:read","description":"Матрица позиций, URL, частотности и ИИ-позиций","section":"positions","requestFormat":"JSON: { mode?: SEO|AI, dimensionKey, observedFrom, observedBefore, dateLimit: 2..31, groupIds?, search?, limit: 50|100|200, cursor?, sort }. Без mode используется SEO.","responseFormat":"200 · data: { dimension, dates, summary, trend, rows, page }; dates, summary, trend и cells с position/rankingUrl относятся только к выбранному mode."},{"id":"rank-workbench-serp","method":"POST","path":"/projects/{projectId}/rank-workbench/serp","scope":"positions:read","description":"Сравнить обычную и ИИ-выдачу до пяти срезов","section":"positions","requestFormat":"JSON: { dimensionKeys: string[1..5], groupIds?, search?, limit: 50|100|200, cursor? }.","responseFormat":"200 · data: { dimensions, rows, page }; каждая строка содержит snapshots и aiSnapshots с position, URL, title, snippet и faviconUrl. Обычный snapshot имеет canonical provider ARSENKIN | XMLSTOCK | KEY_COLLECTOR."},{"id":"rank-dimension-history-delete","method":"POST","path":"/projects/{projectId}/rank-workbench/delete-dimension-history","scope":"positions:run","description":"Исключить старую историю выбранного среза","section":"positions","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"rank-dimensions","method":"GET","path":"/projects/{projectId}/keyword-ranks/dimensions","scope":"positions:read","description":"Каталог поисковиков, городов и устройств","section":"positions","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"200 · data: { dimensions, aiDimensions?, truncated }; dimensions содержит SEO-срезы, aiDimensions — срезы с сохранёнными ИИ-позициями."},{"id":"rank-comparison","method":"POST","path":"/projects/{projectId}/keyword-ranks/comparison","scope":"positions:read","description":"Сравнить позиции ключей по нескольким срезам","section":"positions","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"context-get","method":"GET","path":"/projects/{projectId}/tracking-contexts/{contextId}","scope":"positions:read","description":"Получить контекст съёма","section":"positions","requestFormat":"Path: projectId: UUID, contextId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"context-archive","method":"POST","path":"/projects/{projectId}/tracking-contexts/{contextId}/archive","scope":"positions:run","description":"Архивировать контекст","section":"positions","requestFormat":"Path: projectId: UUID, contextId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"context-restore","method":"POST","path":"/projects/{projectId}/tracking-contexts/{contextId}/restore","scope":"positions:run","description":"Восстановить контекст","section":"positions","requestFormat":"Path: projectId: UUID, contextId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"context-keywords-get","method":"GET","path":"/projects/{projectId}/tracking-contexts/{contextId}/keywords","scope":"positions:read","description":"Получить ключи контекста","section":"positions","requestFormat":"Path: projectId: UUID, contextId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"context-keyword-set","method":"PUT","path":"/projects/{projectId}/tracking-contexts/{contextId}/keywords/{keywordId}","scope":"positions:run","description":"Добавить или обновить ключ в контексте","section":"positions","requestFormat":"Path: projectId: UUID, contextId: UUID, keywordId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"context-keyword-delete","method":"DELETE","path":"/projects/{projectId}/tracking-contexts/{contextId}/keywords/{keywordId}","scope":"positions:run","description":"Удалить ключ из контекста","section":"positions","requestFormat":"Path: projectId: UUID, contextId: UUID, keywordId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."}]},{"slug":"ai-answers","title":"ИИ-ответы и ИИ-выдача","description":"Сбор ответов, источников и конкурентов в ИИ-выдаче Arsenkin.","group":"Сбор данных","endpoints":[{"id":"ai-answers","method":"GET","path":"/projects/{projectId}/ai-answer-collections","scope":"ai:read","description":"История съёмов ответов и выдачи ИИ","section":"ai-answers","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"ai-answers-create","method":"POST","path":"/projects/{projectId}/ai-answer-collections","scope":"ai:run","description":"Создать съём ответов или конкурентов ИИ","section":"ai-answers","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"ai-answers-get","method":"GET","path":"/projects/{projectId}/ai-answer-collections/{jobId}","scope":"ai:read","description":"Состояние съёма ИИ","section":"ai-answers","requestFormat":"Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"ai-answers-result","method":"GET","path":"/projects/{projectId}/ai-answer-collections/{jobId}/result","scope":"ai:read","description":"Постраничный результат съёма ИИ","section":"ai-answers","requestFormat":"Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"ai-answers-cancel","method":"POST","path":"/projects/{projectId}/ai-answer-collections/{jobId}/cancel","scope":"ai:run","description":"Отменить съём ИИ","section":"ai-answers","requestFormat":"Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."}]},{"slug":"frequency","title":"Частотность","description":"Запуск Wordstat, состояние и постраничный результат.","group":"Сбор данных","endpoints":[{"id":"frequency-list","method":"GET","path":"/projects/{projectId}/frequency-collections","scope":"frequency:read","description":"История съёмов частотности","section":"frequency","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"frequency-create","method":"POST","path":"/projects/{projectId}/frequency-collections","scope":"frequency:run","description":"Создать съём частотности","section":"frequency","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"frequency-get","method":"GET","path":"/projects/{projectId}/frequency-collections/{jobId}","scope":"frequency:read","description":"Состояние съёма частотности","section":"frequency","requestFormat":"Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"frequency-result","method":"GET","path":"/projects/{projectId}/frequency-collections/{jobId}/result","scope":"frequency:read","description":"Постраничный результат частотности","section":"frequency","requestFormat":"Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"frequency-cancel","method":"POST","path":"/projects/{projectId}/frequency-collections/{jobId}/cancel","scope":"frequency:run","description":"Отменить съём частотности","section":"frequency","requestFormat":"Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"frequency-retry","method":"POST","path":"/projects/{projectId}/frequency-collections/{jobId}/retry-failed","scope":"frequency:run","description":"Повторить только неуспешные элементы","section":"frequency","requestFormat":"Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."}]},{"slug":"research","title":"Подбор ключей","description":"Расширение Wordstat, строки результата и импорт выбранных фраз.","group":"Сбор данных","endpoints":[{"id":"research","method":"GET","path":"/projects/{projectId}/keyword-research-runs","scope":"research:read","description":"История подбора ключей","section":"research","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"research-create","method":"POST","path":"/projects/{projectId}/keyword-research-runs","scope":"research:run","description":"Создать подбор ключей","section":"research","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"research-get","method":"GET","path":"/projects/{projectId}/keyword-research-runs/{runId}","scope":"research:read","description":"Состояние подбора ключей","section":"research","requestFormat":"Path: projectId: UUID, runId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"research-rows","method":"GET","path":"/projects/{projectId}/keyword-research-runs/{runId}/rows","scope":"research:read","description":"Строки подбора с курсором","section":"research","requestFormat":"Path: projectId: UUID, runId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"research-confirm","method":"POST","path":"/projects/{projectId}/keyword-research-runs/{runId}/confirm","scope":"research:run","description":"Подтвердить выбранные строки и импорт","section":"research","requestFormat":"Path: projectId: UUID, runId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"research-cancel","method":"POST","path":"/projects/{projectId}/keyword-research-runs/{runId}/cancel","scope":"research:run","description":"Отменить подбор ключей","section":"research","requestFormat":"Path: projectId: UUID, runId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"research-retry-import","method":"POST","path":"/projects/{projectId}/keyword-research-runs/{runId}/retry-import","scope":"research:run","description":"Повторить импорт готового результата","section":"research","requestFormat":"Path: projectId: UUID, runId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."}]},{"slug":"audits","title":"Технический аудит","description":"Запуски обхода, проблемы, изменения, дубли и отсутствующие страницы.","group":"Сбор данных","endpoints":[{"id":"crawls","method":"GET","path":"/projects/{projectId}/crawls","scope":"audits:read","description":"История технических аудитов","section":"audits","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawls-create","method":"POST","path":"/projects/{projectId}/crawls","scope":"audits:run","description":"Запустить технический аудит","section":"audits","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-issues","method":"GET","path":"/projects/{projectId}/crawl-issues","scope":"audits:read","description":"Агрегированные проблемы технического аудита","section":"audits","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-changes","method":"GET","path":"/projects/{projectId}/crawl-changes","scope":"audits:read","description":"Изменения между обходами","section":"audits","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-duplicate-groups","method":"GET","path":"/projects/{projectId}/crawls/{crawlId}/duplicate-groups","scope":"audits:read","description":"Группы дублей конкретного обхода","section":"audits","requestFormat":"Path: projectId: UUID, crawlId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-absent-pages","method":"GET","path":"/projects/{projectId}/crawls/{crawlId}/absent-pages","scope":"audits:read","description":"Страницы карты, отсутствующие в обходе","section":"audits","requestFormat":"Path: projectId: UUID, crawlId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-get","method":"GET","path":"/projects/{projectId}/crawls/{crawlId}","scope":"audits:read","description":"Состояние обхода","section":"audits","requestFormat":"Path: projectId: UUID, crawlId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-result","method":"GET","path":"/projects/{projectId}/crawls/{crawlId}/result","scope":"audits:read","description":"Постраничный результат обхода","section":"audits","requestFormat":"Path: projectId: UUID, crawlId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-cancel","method":"POST","path":"/projects/{projectId}/crawls/{crawlId}/cancel","scope":"audits:run","description":"Отменить технический аудит","section":"audits","requestFormat":"Path: projectId: UUID, crawlId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."}]},{"slug":"automations","title":"Расписания","description":"Регулярные и отложенные запуски позиций.","group":"Сбор данных","endpoints":[{"id":"automations-list","method":"GET","path":"/projects/{projectId}/automations","scope":"automations:read","description":"Список расписаний позиций","section":"automations","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"automations-create","method":"POST","path":"/projects/{projectId}/automations","scope":"automations:manage","description":"Создать расписание","section":"automations","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"automation-update","method":"PATCH","path":"/projects/{projectId}/automations/{automationId}","scope":"automations:manage","description":"Изменить расписание","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"automation-runs","method":"GET","path":"/projects/{projectId}/automations/{automationId}/runs","scope":"automations:read","description":"История запусков расписания","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"automation-run","method":"POST","path":"/projects/{projectId}/automations/{automationId}/runs","scope":"automations:manage","description":"Запустить расписание сейчас","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"automation-pause","method":"POST","path":"/projects/{projectId}/automations/{automationId}/pause","scope":"automations:manage","description":"Поставить расписание на паузу","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"automation-resume","method":"POST","path":"/projects/{projectId}/automations/{automationId}/resume","scope":"automations:manage","description":"Возобновить расписание","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"automation-delete","method":"DELETE","path":"/projects/{projectId}/automations/{automationId}","scope":"automations:manage","description":"Удалить расписание","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"crawl-automations","method":"GET","path":"/projects/{projectId}/crawl-automations","scope":"automations:read","description":"Расписания аудитов","section":"automations","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-automations-create","method":"POST","path":"/projects/{projectId}/crawl-automations","scope":"automations:manage","description":"Создать расписание аудита","section":"automations","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-automation-runs","method":"GET","path":"/projects/{projectId}/crawl-automations/{automationId}/runs","scope":"automations:read","description":"История запусков расписания аудита","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-automation-update","method":"PATCH","path":"/projects/{projectId}/crawl-automations/{automationId}","scope":"automations:manage","description":"Изменить расписание аудита","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-automation-pause","method":"POST","path":"/projects/{projectId}/crawl-automations/{automationId}/pause","scope":"automations:manage","description":"Поставить аудит на паузу","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-automation-resume","method":"POST","path":"/projects/{projectId}/crawl-automations/{automationId}/resume","scope":"automations:manage","description":"Возобновить аудит","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"crawl-automation-run","method":"POST","path":"/projects/{projectId}/crawl-automations/{automationId}/runs","scope":"automations:manage","description":"Запустить аудит по расписанию сейчас","section":"automations","requestFormat":"Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."}]},{"slug":"integrations","title":"Интеграции","description":"Безопасные метаданные подключений и маршруты провайдеров.","group":"Настройки","endpoints":[{"id":"integration-settings","method":"GET","path":"/projects/{projectId}/integration-settings","scope":"integrations:read","description":"Маршрутизация интеграций проекта","section":"integrations","requestFormat":"Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"integration-settings-update","method":"PATCH","path":"/projects/{projectId}/integration-settings/{bindingId}","scope":"integrations:write","description":"Изменить привязку интеграции","section":"integrations","requestFormat":"Path: projectId: UUID, bindingId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-integration-catalog","method":"GET","path":"/workspaces/{workspaceId}/integrations/catalog","scope":"integrations:read","description":"Каталог провайдеров и возможностей","section":"integrations","requestFormat":"Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-integration-credentials","method":"GET","path":"/workspaces/{workspaceId}/integrations/credentials","scope":"integrations:read","description":"Безопасные метаданные подключений без секретов","section":"integrations","requestFormat":"Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-integration-routing","method":"GET","path":"/workspaces/{workspaceId}/integrations/routing","scope":"integrations:read","description":"Маршруты провайдеров рабочей области","section":"integrations","requestFormat":"Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-integration-routing-update","method":"PUT","path":"/workspaces/{workspaceId}/integrations/routing/{capability}","scope":"integrations:write","description":"Заменить маршрут выбранной возможности","section":"integrations","requestFormat":"Path: workspaceId: UUID, capability: string. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-credential-create","method":"POST","path":"/workspaces/{workspaceId}/integrations/credentials","scope":"integrations:write","description":"Добавить BYOK credential","section":"integrations","requestFormat":"Path: workspaceId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-platform-credential-create","method":"POST","path":"/workspaces/{workspaceId}/integrations/platform-credentials","scope":"integrations:write","description":"Подключить системный credential","section":"integrations","requestFormat":"Path: workspaceId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-credential-update","method":"PATCH","path":"/workspaces/{workspaceId}/integrations/credentials/{credentialId}","scope":"integrations:write","description":"Переименовать или заменить credential","section":"integrations","requestFormat":"Path: workspaceId: UUID, credentialId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-credential-validate","method":"POST","path":"/workspaces/{workspaceId}/integrations/credentials/{credentialId}/validations","scope":"integrations:write","description":"Запустить безопасную проверку credential","section":"integrations","requestFormat":"Path: workspaceId: UUID, credentialId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-credential-validation","method":"GET","path":"/workspaces/{workspaceId}/integrations/credentials/{credentialId}/validations/{validationId}","scope":"integrations:read","description":"Получить состояние проверки credential","section":"integrations","requestFormat":"Path: workspaceId: UUID, credentialId: UUID, validationId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"workspace-credential-delete","method":"DELETE","path":"/workspaces/{workspaceId}/integrations/credentials/{credentialId}","scope":"integrations:write","description":"Отозвать credential и стереть его secret material","section":"integrations","requestFormat":"Path: workspaceId: UUID, credentialId: UUID. JSON body отсутствует, если для метода явно не указано обратное.","responseFormat":"204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс."},{"id":"integration-settings-create","method":"POST","path":"/projects/{projectId}/integration-settings","scope":"integrations:write","description":"Создать project override маршрута","section":"integrations","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"integration-settings-prepare","method":"POST","path":"/projects/{projectId}/integration-settings/prepare-system","scope":"integrations:write","description":"Подготовить доступные системные маршруты","section":"integrations","requestFormat":"Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."},{"id":"integration-settings-inherit","method":"POST","path":"/projects/{projectId}/integration-settings/{bindingId}/inherit","scope":"integrations:write","description":"Вернуть маршрут к настройкам workspace","section":"integrations","requestFormat":"Path: projectId: UUID, bindingId: UUID. Content-Type: application/json; неизвестные поля отклоняются.","responseFormat":"JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }."}]},{"slug":"jobs","title":"Задания и пагинация","description":"Жизненный цикл, polling, курсоры, отмена и повторы.","group":"Справочник","endpoints":[{"id":"operation-dismiss","method":"DELETE","path":"/projects/{projectId}/operations/{operationId}","scope":"projects:write","description":"Убрать завершившуюся с ошибкой или истёкшую операцию из пользовательского журнала","section":"jobs","requestFormat":"Path: projectId, operationId (UUID). Тело отсутствует. Допустимы только terminal statuses FAILED_FINAL, ACTION_REQUIRED и EXPIRED.","responseFormat":"200 · data: { operationId, dismissedAt }. Результаты, биллинг и audit history не удаляются."},{"id":"operation-estimate","method":"POST","path":"/projects/{projectId}/operation-estimates","scope":"frequency:run | ai:run | semantics:write | research:run","description":"Рассчитать стоимость платной операции по её kind","section":"jobs","requestFormat":"Headers: Idempotency-Key. JSON: { kind: FREQUENCY_COLLECTION | AI_ANSWER_COLLECTION | CLUSTERING_RUN | KEYWORD_RESEARCH, command: <тело соответствующего запуска> }.","responseFormat":"200 · data: { workspaceId, projectId, id, kind, provider, credentialMode, currency, maximumChargeMinor, quantity, affordable, expiresAt, priceBookVersion }; для PLATFORM_PAID передайте id в X-Operation-Estimate-Id при запуске."}]},{"slug":"errors","title":"Ошибки","description":"Единый error envelope и правила повторов.","group":"Справочник","endpoints":[]},{"slug":"reference","title":"Маршруты API","description":"Полный каталог методов, путей и требуемых прав.","group":"Справочник","endpoints":[]}]}