Маршруты API
Пути указаны после /api/v1. Используйте поиск в левом сайдбаре, чтобы найти маршрут по методу, пути, scope или назначению.
Быстрый старт
Первый запрос, базовый URL и формат ответа.
GET/accessРабочая область, проекты и права текущего API-ключаtoken:discover
Формат запроса
JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.Проекты
Получение списка, чтение и изменение проекта.
GET/workspaces/{workspaceId}/projectsСписок доступных ключу проектовprojects:read
Формат запроса
Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/workspaces/{workspaceId}/project-capabilitiesДоступность создания и общего порядка проектовprojects:read
Формат запроса
Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/workspaces/{workspaceId}/projectsСоздать проект в рабочей областиprojects:write
Формат запроса
Path: workspaceId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PUT/workspaces/{workspaceId}/projects/orderСохранить общий порядок проектовprojects:write
Формат запроса
Path: workspaceId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}Карточка проектаprojects:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/presentationИзменить отображение доменов проектаprojects:write
Формат запроса
If-Match: presentationVersion. JSON: { displayUnicodeDomains: boolean }. По умолчанию true; техническая version проекта не меняется.Формат ответа
200 · data: ProjectSummary с displayUnicodeDomains и presentationVersion.PATCH/projects/{projectId}Изменить настройки проектаprojects:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/archiveАрхивировать проектprojects:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/restoreВосстановить проектprojects:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}Запустить безопасное удаление проектаprojects:write
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.Семантика
Ключи, папки, массовые команды, импорт и экспорт.
GET/projects/{projectId}/keyword-groupsДерево папок семантики с цветамиsemantics:read
Формат запроса
Path: projectId (UUID). Тело и query отсутствуют.Формат ответа
200 · data: [{ id, parentId?, name, path, color?, position, keywordCount, systemKind?, version, createdAt, updatedAt }].POST/projects/{projectId}/keyword-groupsСоздать папкуsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keyword-groups/bulkСоздать несколько папокsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/keyword-groups/{groupId}Удалить папку с выбранной стратегией для дочерних папок и запросовsemantics:write
Формат запроса
Headers: If-Match. Optional JSON: { deleteKeywords?: boolean, promoteChildren?: boolean }.Формат ответа
204 No Content.GET/projects/{projectId}/keywordsКлючевые слова с фильтрами, примечаниями и курсоромsemantics:read
Формат запроса
Query: limit, cursor?, search?, groupId/groupIds?, priorityLevel?: LOWEST | LOW | MEDIUM | HIGH | HIGHEST, sort?, includeNotes=true|false. PRIORITY_ASC/DESC сортирует по пяти уровням; 0 означает MEDIUM. Полный note возвращается только при includeNotes=true; в этом режиме limit <= 200.Формат ответа
200 · data: SemanticKeywordListItem[] с groupPath, optional groupMembershipCount для нескольких папок, targetUrl, tags, frequencies, positions, aiAnswers, hasNote и optional note; page: { hasNext, nextCursor?, totalApprox? }.POST/projects/{projectId}/keywords/operation-scopeОблегчённая выборка запросов для большой операцииsemantics:read
Формат запроса
JSON: { groupIds?: UUID[], cursor?: UUID, countOnly?: boolean, isTracked?: boolean }. Без groupIds — все активные запросы проекта; до 20 000 уникальных папок образуют один union. countOnly несовместим с cursor.Формат ответа
200 · до 10 000 строк { id, version, isTracked }; первая страница содержит totalApprox, следующая — UUID cursor. При countOnly=true: data: [], page: { hasNext: false, totalApprox } с точным числом, без загрузки ID.POST/projects/{projectId}/keywordsСоздать ключевое словоsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keywords/bulkПакетное создание ключейsemantics:write
Формат запроса
JSON: { duplicatePolicy, items[] }; row-level ADD_TO_GROUP добавляет существующую canonical keyword identity в duplicateGroupId (либо groupId), сохраняя прежние папки. groupId по-прежнему задаёт папку для новой строки.Формат ответа
200 · data содержит indexed outcomes CREATED, LINKED_EXISTING, RESTORED, SKIPPED_EXISTING, REJECTED_EXISTING или FAILED.PATCH/projects/{projectId}/keywords/{keywordId}Изменить ключевое словоsemantics:write
Формат запроса
Path: projectId: UUID, keywordId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keywords/mergeОбъединить запросы с сохранением истории у выбранного основного запросаsemantics:write
Формат запроса
JSON: { keeper: { id, version }, sources: [{ id, version }] }. Все запросы должны принадлежать одному проекту и иметь один язык.Формат ответа
200 · data: { keeperKeywordId, keeperVersion, mergedKeywordIds, mergedAt }. Immutable history остаётся доступной через keeper.GET/projects/{projectId}/keywords/merge-suggestionsНайти повреждённые названия и ближайшие варианты для ручного объединенияsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/keywords/{keywordId}Переместить запрос в корзину или окончательно очистить его данныеsemantics:write
Формат запроса
Headers: If-Match. Optional JSON: { permanent?: boolean }; permanent=true допустим только для ключа в корзине.Формат ответа
204 No Content.POST/projects/{projectId}/bulk-commandsМассовое изменение выбранных ключейsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/imports/{importId}Состояние импортаsemantics:read
Формат запроса
Path: projectId: UUID, importId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/imports/{importId}/preview-rowsСтроки предпросмотра импортаsemantics:read
Формат запроса
Path: projectId: UUID, importId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/importsСоздать импортsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/exportsИстория экспортовsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/exportsСоздать экспортsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clustering-runsЗапустить кластеризациюsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keyword-groups/{groupId}/duplicateДублировать папку и выбранное содержимоеsemantics:write
Формат запроса
Path: projectId: UUID, groupId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/keyword-groups/{groupId}Изменить название, родителя, цвет или позицию папкиsemantics:write
Формат запроса
Headers: If-Match. JSON: { name?: string, parentId?: UUID | null, color?: paletteColor | null, position?: integer }.Формат ответа
200 · data: SemanticKeywordGroup с id, parentId, name, path, color, position, keywordCount и version.POST/projects/{projectId}/keywords/searchСинхронный поиск до 500 фраз; для больших списков используйте keywords/searchessemantics:read
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keywords/searchesПодготовить поиск по списку до 10 000 фраз в фонеsemantics:read
Формат запроса
JSON: { mode: EXACT | CONTAINS | ALL_WORDS, terms: string[1..10000] }; до 400 символов на фразу.Формат ответа
200 · data: KeywordSearchState. Дождитесь READY через GET, затем передайте id как query.searchId в keywords/list. Результат хранится 10 минут.GET/projects/{projectId}/keywords/searches/{searchId}Получить прогресс поиска по спискуsemantics:read
Формат запроса
Path: projectId: UUID, searchId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keywords/tagsСоздать тег с автоматическим или заданным цветомsemantics:write
Формат запроса
JSON: { name, color?: #RRGGBB }.Формат ответа
200 · data: SemanticKeywordTagOption.PATCH/projects/{projectId}/keywords/tags/{tagId}Изменить цвет тега во всём проектеsemantics:write
Формат запроса
JSON: { color: #RRGGBB }.Формат ответа
200 · data: SemanticKeywordTagOption.POST/projects/{projectId}/keywords/listПолучить страницу ключей со сложным фильтром в JSON bodysemantics:read
Формат запроса
JSON: { query: { limit, cursor?, search?, searchId?, sort?, groupIds?, includeNotes?, filters? } }; точные поля проверяются по allowlist.Формат ответа
200 · data: SemanticKeywordListItem[]; page: { hasNext, nextCursor?, totalApprox? }.GET/projects/{projectId}/keywords/tag-optionsПолучить доступные теги проектаsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/keywords/tagsПолучить теги проекта с количеством связанных запросовsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/keywords/tags/{tagId}Удалить тег и снять его со всех запросов проектаsemantics:write
Формат запроса
Path: projectId: UUID, tagId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.POST/projects/{projectId}/keywords/bulk-previewПроверить пакет ключей перед созданиемsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/keywords/{keywordId}/insightsКарточка ключа: текущие папки с цветами, позиции, частотность, SERP, URL и заметкаsemantics:read
Формат запроса
Path: projectId, keywordId (UUID). Query: dimensionKey? — точный срез поисковика, региона и устройства; snapshotId? — точный immutable снимок для списка найденных URL.Формат ответа
200 · data: SemanticKeywordInsights с последними частотностями, позициями, SERP-результатами, target URL и note.GET/projects/{projectId}/keywords/{keywordId}/ai-answersПоследние ИИ-ответы ключа по выбранному срезуsemantics:read
Формат запроса
Path: projectId: UUID, keywordId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/keywords/{keywordId}/ai-answers/historyИстория ИИ-ответов ключа с курсоромsemantics:read
Формат запроса
Path: projectId: UUID, keywordId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/keywords/{keywordId}/frequencies/{type}/{device}Удалить выбранный контекст частотности ключаsemantics:write
Формат запроса
Path: projectId: UUID, keywordId: UUID, type: string, device: string. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.POST/projects/{projectId}/bulk-commands/clean-previewПредпросмотр очистки выбранных ключейsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/bulk-commands/cleanПрименить очистку выбранных ключейsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/imports/{importId}/mappingСохранить сопоставление колонок импортаsemantics:write
Формат запроса
Path: projectId: UUID, importId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/imports/{importId}/publishОпубликовать проверенный импортsemantics:write
Формат запроса
Path: projectId: UUID, importId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/imports/{importId}/cancelОтменить импортsemantics:write
Формат запроса
Path: projectId: UUID, importId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/uploadsСоздать multipart-загрузку файла импортаsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/uploads/{uploadId}/partsПолучить подписанные URL частей загрузкиsemantics:write
Формат запроса
Path: projectId: UUID, uploadId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/uploads/{uploadId}/completeЗавершить multipart-загрузкуsemantics:write
Формат запроса
Path: projectId: UUID, uploadId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/uploads/{uploadId}Получить состояние загрузкиsemantics:read
Формат запроса
Path: projectId: UUID, uploadId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/uploads/{uploadId}Отменить незавершённую загрузкуsemantics:write
Формат запроса
Path: projectId: UUID, uploadId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.GET/projects/{projectId}/exports/{exportId}Получить состояние экспортаsemantics:read
Формат запроса
Path: projectId: UUID, exportId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/exports/{exportId}/downloadСкачать готовый экспорт через браузерный маршрутsemantics:read
Формат запроса
Path: projectId: UUID, exportId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/exports/{exportId}/fileСкачать готовый экспорт по Bearer APIsemantics:read
Формат запроса
Path: projectId: UUID, exportId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/exports/{exportId}/cancelОтменить активный экспортsemantics:write
Формат запроса
Path: projectId: UUID, exportId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/clustering-runsИстория кластеризацийsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/clustering-runs/{jobId}/result/sections/{sectionId}Страница секции результата кластеризацииsemantics:read
Формат запроса
Path: projectId: UUID, jobId: UUID, sectionId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/clustering-runs/{jobId}/resultСводный результат кластеризацииsemantics:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/clustering-runs/{jobId}Состояние кластеризацииsemantics:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clustering-runs/{jobId}/cancelОтменить кластеризациюsemantics:write
Формат запроса
Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clustering-runs/{jobId}/applyПрименить proposal кластеризацииsemantics:write
Формат запроса
Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clustering-runs/{jobId}/rejectОтклонить proposal кластеризацииsemantics:write
Формат запроса
Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/clustersСписок кластеров проектаsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clustersСоздать кластерsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clusters/page-mapping-previewПредпросмотр назначения страниц кластерамsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clusters/page-mapping-bulkМассово назначить страницы кластерамsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clusters/merge-previewПредпросмотр объединения кластеровsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clusters/mergeОбъединить кластерыsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clusters/split-previewПредпросмотр разделения кластераsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/clusters/splitРазделить кластерsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/clusters/{clusterId}Изменить кластерsemantics:write
Формат запроса
Path: projectId: UUID, clusterId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/clusters/{clusterId}Удалить кластер и снять его со всех запросов проектаsemantics:write
Формат запроса
Path: projectId: UUID, clusterId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.GET/projects/{projectId}/semantic-custom-columnsПользовательские колонки семантикиsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/semantic-custom-columnsСоздать пользовательскую колонкуsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/semantic-custom-columns/{columnId}Изменить пользовательскую колонкуsemantics:write
Формат запроса
Path: projectId: UUID, columnId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/semantic-custom-columns/{columnId}Удалить пользовательскую колонкуsemantics:write
Формат запроса
Path: projectId: UUID, columnId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.PUT/projects/{projectId}/keywords/{keywordId}/custom-values/{columnId}Записать пользовательское значение ключаsemantics:write
Формат запроса
Path: projectId: UUID, keywordId: UUID, columnId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/keywords/{keywordId}/custom-values/{columnId}Удалить пользовательское значение ключаsemantics:write
Формат запроса
Path: projectId: UUID, keywordId: UUID, columnId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.POST/projects/{projectId}/semantic-duplicates/previewПолучить группы дублей без измененийsemantics:read
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/semantic-duplicates/applyПрименить выбранные решения по дублямsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/negative-keyword-presetsСписок наборов минус-словsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/negative-keyword-presetsСоздать набор минус-словsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/negative-keyword-presets/{presetId}Изменить набор минус-словsemantics:write
Формат запроса
Path: projectId: UUID, presetId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/negative-keyword-presets/{presetId}Удалить набор минус-словsemantics:write
Формат запроса
Path: projectId: UUID, presetId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.POST/projects/{projectId}/negative-keywords/previewПредпросмотр совпадений минус-словsemantics:read
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/negative-keywords/applyПрименить минус-слова к выборкеsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/semantic-saved-viewsПредставления таблицы семантикиsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/semantic-saved-viewsСоздать представлениеsemantics:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/semantic-saved-views/{viewId}Изменить представлениеsemantics:write
Формат запроса
Path: projectId: UUID, viewId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/semantic-saved-views/{viewId}Удалить представлениеsemantics:write
Формат запроса
Path: projectId: UUID, viewId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.GET/projects/{projectId}/semantic-versionsИстория версий семантикиsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/semantic-versions/{versionId}Детали версии семантикиsemantics:read
Формат запроса
Path: projectId: UUID, versionId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/semantic-versions/{versionId}/undo-previewПредпросмотр отката версииsemantics:read
Формат запроса
Path: projectId: UUID, versionId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/semantic-versions/{versionId}/undoОткатить версию семантикиsemantics:write
Формат запроса
Path: projectId: UUID, versionId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.Страницы и заметки
Страницы, файлы заметок, папки и цветовая легенда проекта.
GET/projects/{projectId}/pagesСтраницы проектаpages:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/pagesСоздать страницуpages:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/notesФайлы заметок проекта с содержимымnotes:read
Формат запроса
Path: projectId (UUID). Тело и query отсутствуют.Формат ответа
200 · data: { notes: ProjectNote[] }; ProjectNote содержит id, title, format, markdown, visibility, version, createdAt и updatedAt. Поле markdown хранит текст выбранного формата.POST/projects/{projectId}/notesСоздать заметкуnotes:write
Формат запроса
JSON: { title: string, markdown: string, visibility: PROJECT_MEMBERS | PUBLIC, format?: MARKDOWN | TEXT | CSV | TSV | JSON }. По умолчанию MARKDOWN.Формат ответа
201 · data: ProjectNote; заголовок ETag содержит актуальную version.GET/projects/{projectId}/semantic-group-color-legendПримечания к цветам папокsemantics:read
Формат запроса
Path: projectId (UUID). Тело и query отсутствуют.Формат ответа
200 · data: { entries: [{ color, note }], version, unread, updatedAt?, updatedByUserId?, access: { canManage } }.PATCH/projects/{projectId}/semantic-group-color-legendЗаменить примечания цветовой легендыsemantics:write
Формат запроса
Headers: If-Match. JSON: { entries: [{ color: paletteColor, note: string(1..240) }] }.Формат ответа
200 · data: SemanticGroupColorLegend; ETag содержит новую version.POST/projects/{projectId}/semantic-group-color-legend/seenОтметить текущую версию цветовой легенды просмотреннойsemantics:read
Формат запроса
JSON: { version: non-negative integer }.Формат ответа
200 · data: SemanticGroupColorLegend с unread=false для текущего пользователя.POST/projects/{projectId}/pages/status-jobsФоновое архивирование или восстановление страницpages:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/pages/status-jobs/{jobId}Прогресс операции со страницамиpages:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/pages/{pageId}Получить страницу проектаpages:read
Формат запроса
Path: projectId: UUID, pageId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/pages/rank-statisticsПакетная статистика страниц; также нужен positions:readpages:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/pages/by-keyword/{keywordId}Целевая страница запроса; также нужен semantics:readpages:read
Формат запроса
Path: projectId: UUID, keywordId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/pages/{pageId}/panelСсылки, история или семантика страницы; для ключей нужен semantics:readpages:read
Формат запроса
Path: projectId: UUID, pageId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/pages/{pageId}Изменить страницу проектаpages:write
Формат запроса
Path: projectId: UUID, pageId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/pages/{pageId}/archiveАрхивировать страницуpages:write
Формат запроса
Path: projectId: UUID, pageId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/pages/{pageId}/restoreВосстановить страницуpages:write
Формат запроса
Path: projectId: UUID, pageId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/notes/{noteId}Получить файл заметки с содержимымnotes:read
Формат запроса
Path: projectId, noteId (UUID). Тело и query отсутствуют.Формат ответа
200 · data: ProjectNote; ETag содержит version для последующего PATCH или DELETE.PATCH/projects/{projectId}/notes/{noteId}Изменить заметкуnotes:write
Формат запроса
Headers: If-Match. JSON: любое непустое подмножество { title, markdown, visibility, format }.Формат ответа
200 · data: обновлённый ProjectNote; ETag содержит новую version.DELETE/projects/{projectId}/notes/{noteId}Удалить заметкуnotes:write
Формат запроса
Headers: If-Match. Path: projectId, noteId (UUID). Тело отсутствует.Формат ответа
204 No Content.Позиции и конкуренты
Контекст, оценка, запуск позиций и сбор обычной выдачи.
GET/projects/{projectId}/keywords/metrics-summaryОбщая сводка проекта: ключи, отслеживание, ТОПы и средняя позицияsemantics:read
Формат запроса
Query: rankDimensionKey? — поисковик, город, язык и устройство; includeUntracked? — включить активные неотслеживаемые запросы в позиционные показатели.Формат ответа
200 · data: { projectId, keywordCount, trackedKeywordCount, measuredKeywordCount, checkedDepth: number|null, observedAt: string|null, positionSummary: { positionedKeywordCount, top1KeywordCount, top3KeywordCount, top5KeywordCount, top10KeywordCount, top30KeywordCount, top50KeywordCount, top100KeywordCount, top200KeywordCount, averagePosition? } }. Число ключей относится ко всему активному ядру; позиции — к выбранному срезу. Результат сохраняется и обновляется при изменении исходных данных.GET/projects/{projectId}/keywords/position-summaryТекущая средняя позиция и число запросов в Топ-3/5/10/30/50semantics:read
Формат запроса
Query: rankDimensionKey? — точный поисковик, город и устройство; includeUntracked? — учитывать неотслеживаемые запросы.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/keywords/position-historyДо 100 последних проектных срезов с checkedDepth; includeUntracked=true включает активные неотслеживаемые запросыsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/tracking-contextsКонтексты съёма позицийpositions:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/tracking-contextsСоздать контекст съёмаpositions:run
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/tracking-contexts/{contextId}Изменить контекстpositions:run
Формат запроса
Path: projectId: UUID, contextId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/tracking-contexts/{contextId}/materializeПересчитать актуальные запросы сохранённого контекстаpositions:run
Формат запроса
Пустой JSON: {}. Сервер использует сохранённый scope и не принимает keyword IDs от клиента.Формат ответа
200 · data: { contextId, assignedKeywordCount, addedKeywordCount, removedKeywordCount, unchangedKeywordCount, keywordSetHash, version, changedAt }.PUT/projects/{projectId}/tracking-contexts/{contextId}/keywordsЗаменить точный набор ключей контекстаpositions:run
Формат запроса
Path: projectId: UUID, contextId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/rank-estimatesРассчитать оценку позиций, конкурентов или релевантных URLpositions:run
Формат запроса
JSON: { trackingContextId, provider, credentialId?, purpose?: POSITION_TRACKING | COMPETITOR_SERP | RELEVANT_URL }. RELEVANT_URL использует ТОП-10 с ограничением на домен проекта и saveProjectPosition=false. applyRelevantToEmptyTarget?: boolean заполняет только пустые целевые адреса найденными URL; требует semantic.update.Формат ответа
200 · RankEstimate. Стоимость подтверждается при POST rank-runs; результаты подбора URL не меняют историю обычных позиций.GET/projects/{projectId}/keywords/{keywordId}/relevant-urlsПоследние рекомендации URL Яндекса и Google для запросаsemantics:read
Формат запроса
Path: projectId: UUID, keywordId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
200 · data: RelevantUrlSuggestion[]. found=false означает пустую выдачу; прежний целевой URL сохраняется.POST/projects/{projectId}/relevant-url-applicationsУстановить найденные релевантные URL фоновым заданиемsemantics:write
Формат запроса
Idempotency-Key обязателен. JSON: { sourceJobId, mode: ALL | SELECTED, keywordIds?: UUID[] }. SELECTED принимает от 1 до 15000 ID; ALL использует весь сохранённый результат.Формат ответа
202 · data: RelevantUrlApplicationSummary. Очередь учитывает лимит операций. Запросы, изменённые после принятия команды, пропускаются.GET/projects/{projectId}/relevant-url-applicationsПоследняя установка URL из заданной операцииsemantics:read
Формат запроса
Query: sourceJobId=UUID. Возвращается последняя команда применения этого результата.Формат ответа
200 · data: RelevantUrlApplicationSummary | null.GET/projects/{projectId}/relevant-url-applications/{id}Состояние установки целевых URLsemantics:read
Формат запроса
Path: projectId: UUID, id: string. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/relevant-url-applications/recentПоследние 25 операций установки целевых URLsemantics:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/relevant-url-applications/{id}/cancelОстановить установку URL с сохранением выполненных измененийsemantics:write
Формат запроса
Path: projectId: UUID, id: string. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/rank-runsИстория позиций, выдачи конкурентов и подбора релевантных URLpositions:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/rank-runsПодтвердить оценку и создать заданиеpositions:run
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/jobs/{jobId}Текущее состояние заданияpositions:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/jobs/{jobId}/resultПостраничный результат позицийpositions:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/jobs/{jobId}/cancelЗапросить отмену заданияpositions:run
Формат запроса
Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/jobs/{jobId}/runtime-diagnosticsБезопасная диагностика активного съёмаpositions:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/jobs/{jobId}/retry-missingПовторить только отсутствующие результатыpositions:run
Формат запроса
Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/rank-historyИстория позиций и сохранённой SERP конкретного ключаpositions:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/rank-workbench/dimension-mergesНастройки объединения импортированных срезовpositions:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/rank-workbench/dimension-mergesОбъединить совместимые срезы в представленииpositions:run
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/rank-workbench/dimension-merges/{mergeId}/removeУдалить правило объединения срезовpositions:run
Формат запроса
Path: projectId: UUID, mergeId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/rank-workbench/positionsМатрица позиций, URL, частотности и ИИ-позицийpositions:read
Формат запроса
JSON: { mode?: SEO|AI, dimensionKey, observedFrom, observedBefore, dateLimit: 2..31, groupIds?, search?, limit: 50|100|200, cursor?, sort }. Без mode используется SEO.Формат ответа
200 · data: { dimension, dates, summary, trend, rows, page }; dates, summary, trend и cells с position/rankingUrl относятся только к выбранному mode.POST/projects/{projectId}/rank-workbench/serpСравнить обычную и ИИ-выдачу до пяти срезовpositions:read
Формат запроса
JSON: { dimensionKeys: string[1..5], groupIds?, search?, limit: 50|100|200, cursor?, mode?: SEO|AI|ALL, depth?: 10|30|50|100 }. По умолчанию ALL и глубина 100.Формат ответа
200 · data: { dimensions, rows, page }; каждая строка содержит snapshots и aiSnapshots с position, URL, title, snippet и faviconUrl. resultCount содержит полное число результатов снимка даже при меньшей depth. Обычный snapshot имеет canonical provider ARSENKIN | XMLSTOCK | XMLRIVER | KEY_COLLECTOR.POST/projects/{projectId}/rank-workbench/competitorsКонкуренты по всему проекту или папкамpositions:read
Формат запроса
JSON: { dimensionKey, groupIds?, search?, excludeDomain?, aiOnly, depth?: 10|30|50|100, limit?: 50|100, cursor?, sort?: { field, direction: asc|desc }, refresh? }. По умолчанию полная сохранённая глубина до 100, 100 доменов и queryCount desc. refresh несовместим с cursor.Формат ответа
200 · data: { dimensionKey, keywordCount, calculatedAt, competitors, page: { hasNext, nextCursor?, totalApprox } }; метрики и сортировка считаются по всему охвату, page.totalApprox — полное число доменов. Домен проекта включён по умолчанию.POST/projects/{projectId}/rank-workbench/delete-dimension-historyИсключить старую историю выбранного срезаpositions:run
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/keyword-ranks/dimensionsКаталог поисковиков, городов и устройствpositions:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
200 · data: { dimensions, aiDimensions?, truncated }; dimensions содержит SEO-срезы, aiDimensions — срезы с сохранёнными ИИ-позициями.POST/projects/{projectId}/keyword-ranks/comparisonСравнить позиции ключей по нескольким срезамpositions:read
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/tracking-contexts/{contextId}Получить контекст съёмаpositions:read
Формат запроса
Path: projectId: UUID, contextId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/tracking-contexts/{contextId}/archiveАрхивировать контекстpositions:run
Формат запроса
Path: projectId: UUID, contextId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/tracking-contexts/{contextId}/restoreВосстановить контекстpositions:run
Формат запроса
Path: projectId: UUID, contextId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/tracking-contexts/{contextId}/keywordsПолучить ключи контекстаpositions:read
Формат запроса
Path: projectId: UUID, contextId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PUT/projects/{projectId}/tracking-contexts/{contextId}/keywords/{keywordId}Добавить или обновить ключ в контекстеpositions:run
Формат запроса
Path: projectId: UUID, contextId: UUID, keywordId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/tracking-contexts/{contextId}/keywords/{keywordId}Удалить ключ из контекстаpositions:run
Формат запроса
Path: projectId: UUID, contextId: UUID, keywordId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.ИИ-ответы и ИИ-выдача
Сбор ответов, источников и конкурентов в ИИ-выдаче Arsenkin.
GET/projects/{projectId}/ai-answer-collectionsИстория съёмов ответов и выдачи ИИai:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/ai-answer-collectionsСоздать съём ответов или конкурентов ИИai:run
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/ai-answer-collections/{jobId}Состояние съёма ИИai:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/ai-answer-collections/{jobId}/resultПостраничный результат съёма ИИai:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/ai-answer-collections/{jobId}/cancelОтменить съём ИИai:run
Формат запроса
Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.Частотность
Запуск Wordstat, состояние и постраничный результат.
GET/projects/{projectId}/frequency-collectionsИстория съёмов частотностиfrequency:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/frequency-collectionsСоздать съём частотностиfrequency:run
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/frequency-collections/{jobId}Состояние съёма частотностиfrequency:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/frequency-collections/{jobId}/resultПостраничный результат частотностиfrequency:read
Формат запроса
Path: projectId: UUID, jobId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/frequency-collections/{jobId}/cancelОтменить съём частотностиfrequency:run
Формат запроса
Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/frequency-collections/{jobId}/retry-failedПовторить только неуспешные элементыfrequency:run
Формат запроса
Path: projectId: UUID, jobId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.Подбор ключей
Расширение Wordstat, строки результата и импорт выбранных фраз.
GET/projects/{projectId}/keyword-research-runsИстория подбора ключейresearch:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keyword-research-runsСоздать подбор ключейresearch:run
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/keyword-research-runs/{runId}Состояние подбора ключейresearch:read
Формат запроса
Path: projectId: UUID, runId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/keyword-research-runs/{runId}/rowsСтроки подбора с курсоромresearch:read
Формат запроса
Path: projectId: UUID, runId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keyword-research-runs/{runId}/confirmПодтвердить выбранные строки и импортresearch:run
Формат запроса
Path: projectId: UUID, runId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keyword-research-runs/{runId}/cancelОтменить подбор ключейresearch:run
Формат запроса
Path: projectId: UUID, runId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/keyword-research-runs/{runId}/retry-importПовторить импорт готового результатаresearch:run
Формат запроса
Path: projectId: UUID, runId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.Технический аудит
Запуски обхода, проблемы, изменения, дубли и отсутствующие страницы.
GET/projects/{projectId}/crawlsИстория технических аудитовaudits:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/crawlsЗапустить технический аудитaudits:run
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/crawl-issuesАгрегированные проблемы технического аудитаaudits:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/crawl-changesИзменения между обходамиaudits:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/crawls/{crawlId}/duplicate-groupsГруппы дублей конкретного обходаaudits:read
Формат запроса
Path: projectId: UUID, crawlId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/crawls/{crawlId}/absent-pagesСтраницы карты, отсутствующие в обходеaudits:read
Формат запроса
Path: projectId: UUID, crawlId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/crawls/{crawlId}Состояние обходаaudits:read
Формат запроса
Path: projectId: UUID, crawlId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/crawls/{crawlId}/resultПостраничный результат обходаaudits:read
Формат запроса
Path: projectId: UUID, crawlId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/crawls/{crawlId}/cancelОтменить технический аудитaudits:run
Формат запроса
Path: projectId: UUID, crawlId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.Расписания
Регулярные и отложенные запуски позиций.
GET/projects/{projectId}/automationsСписок расписаний позицийautomations:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/automationsСоздать расписаниеautomations:manage
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/automations/{automationId}Изменить расписаниеautomations:manage
Формат запроса
Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/automations/{automationId}/runsИстория запусков расписанияautomations:read
Формат запроса
Path: projectId: UUID, automationId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/automations/{automationId}/runsЗапустить расписание сейчасautomations:manage
Формат запроса
Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/automations/{automationId}/pauseПоставить расписание на паузуautomations:manage
Формат запроса
Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/automations/{automationId}/resumeВозобновить расписаниеautomations:manage
Формат запроса
Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/projects/{projectId}/automations/{automationId}Удалить расписаниеautomations:manage
Формат запроса
Path: projectId: UUID, automationId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.GET/projects/{projectId}/crawl-automationsРасписания аудитовautomations:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/crawl-automationsСоздать расписание аудитаautomations:manage
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/projects/{projectId}/crawl-automations/{automationId}/runsИстория запусков расписания аудитаautomations:read
Формат запроса
Path: projectId: UUID, automationId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/crawl-automations/{automationId}Изменить расписание аудитаautomations:manage
Формат запроса
Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/crawl-automations/{automationId}/pauseПоставить аудит на паузуautomations:manage
Формат запроса
Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/crawl-automations/{automationId}/resumeВозобновить аудитautomations:manage
Формат запроса
Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/crawl-automations/{automationId}/runsЗапустить аудит по расписанию сейчасautomations:manage
Формат запроса
Path: projectId: UUID, automationId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.Интеграции
Безопасные метаданные подключений и маршруты провайдеров.
GET/projects/{projectId}/integration-settingsМаршрутизация интеграций проектаintegrations:read
Формат запроса
Path: projectId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/projects/{projectId}/integration-settings/{bindingId}Изменить привязку интеграцииintegrations:write
Формат запроса
Path: projectId: UUID, bindingId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/workspaces/{workspaceId}/integrations/catalogКаталог провайдеров и возможностейintegrations:read
Формат запроса
Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/workspaces/{workspaceId}/integrations/credentialsБезопасные метаданные подключений без секретовintegrations:read
Формат запроса
Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/workspaces/{workspaceId}/integrations/routingМаршруты провайдеров рабочей областиintegrations:read
Формат запроса
Path: workspaceId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PUT/workspaces/{workspaceId}/integrations/routing/{capability}Заменить маршрут выбранной возможностиintegrations:write
Формат запроса
Path: workspaceId: UUID, capability: string. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/workspaces/{workspaceId}/integrations/credentialsДобавить BYOK credentialintegrations:write
Формат запроса
Path: workspaceId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/workspaces/{workspaceId}/integrations/platform-credentialsПодключить системный credentialintegrations:write
Формат запроса
Path: workspaceId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.PATCH/workspaces/{workspaceId}/integrations/credentials/{credentialId}Переименовать или заменить credentialintegrations:write
Формат запроса
Path: workspaceId: UUID, credentialId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/workspaces/{workspaceId}/integrations/credentials/{credentialId}/validationsЗапустить безопасную проверку credentialintegrations:write
Формат запроса
Path: workspaceId: UUID, credentialId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.GET/workspaces/{workspaceId}/integrations/credentials/{credentialId}/validations/{validationId}Получить состояние проверки credentialintegrations:read
Формат запроса
Path: workspaceId: UUID, credentialId: UUID, validationId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.DELETE/workspaces/{workspaceId}/integrations/credentials/{credentialId}Отозвать credential и стереть его secret materialintegrations:write
Формат запроса
Path: workspaceId: UUID, credentialId: UUID. JSON body отсутствует, если для метода явно не указано обратное.Формат ответа
204 No Content либо JSON { data, meta: { requestId } }, если команда возвращает ресурс.POST/projects/{projectId}/integration-settingsСоздать project override маршрутаintegrations:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/integration-settings/prepare-systemПодготовить доступные системные маршрутыintegrations:write
Формат запроса
Path: projectId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.POST/projects/{projectId}/integration-settings/{bindingId}/inheritВернуть маршрут к настройкам workspaceintegrations:write
Формат запроса
Path: projectId: UUID, bindingId: UUID. Content-Type: application/json; неизвестные поля отклоняются.Формат ответа
JSON { data: <типизированный результат>, meta: { requestId }, page?: { hasNext, nextCursor } }.Задания и пагинация
Жизненный цикл, polling, курсоры, отмена и повторы.
DELETE/projects/{projectId}/operations/{operationId}Убрать завершившуюся с ошибкой или истёкшую операцию из пользовательского журналаprojects:write
Формат запроса
Path: projectId, operationId (UUID). Тело отсутствует. Допустимы только terminal statuses FAILED_FINAL, ACTION_REQUIRED и EXPIRED.Формат ответа
200 · data: { operationId, dismissedAt }. Результаты, биллинг и audit history не удаляются.POST/projects/{projectId}/operation-estimatesРассчитать стоимость платной операции по её kindfrequency:run | ai:run | semantics:write | research:run
Формат запроса
Headers: Idempotency-Key. JSON: { kind: FREQUENCY_COLLECTION | AI_ANSWER_COLLECTION | CLUSTERING_RUN | KEYWORD_RESEARCH, command: <тело соответствующего запуска> }.Формат ответа
200 · data: { workspaceId, projectId, id, kind, provider, credentialMode, currency, maximumChargeMinor, quantity, affordable, expiresAt, priceBookVersion }; для PLATFORM_PAID передайте id в X-Operation-Estimate-Id при запуске.