SEOньоритаДокументация API
API v1Семантика
Public API v1

Семантика

Работайте с папками и ключами через cursor-pagination; большие изменения отправляйте пакетными командами.

GET/projects/{projectId}/keyword-groupssemantics:readPOST/projects/{projectId}/keyword-groupssemantics:writePOST/projects/{projectId}/keyword-groups/bulksemantics:writeDELETE/projects/{projectId}/keyword-groups/{groupId}semantics:writeGET/projects/{projectId}/keywordssemantics:readPOST/projects/{projectId}/keywords/operation-scopesemantics:readPOST/projects/{projectId}/keywordssemantics:writePOST/projects/{projectId}/keywords/bulksemantics:writePATCH/projects/{projectId}/keywords/{keywordId}semantics:writePOST/projects/{projectId}/keywords/mergesemantics:writeGET/projects/{projectId}/keywords/merge-suggestionssemantics:readDELETE/projects/{projectId}/keywords/{keywordId}semantics:writePOST/projects/{projectId}/bulk-commandssemantics:writeGET/projects/{projectId}/imports/{importId}semantics:readGET/projects/{projectId}/imports/{importId}/preview-rowssemantics:readPOST/projects/{projectId}/importssemantics:writeGET/projects/{projectId}/exportssemantics:readPOST/projects/{projectId}/exportssemantics:writePOST/projects/{projectId}/clustering-runssemantics:writePOST/projects/{projectId}/keyword-groups/{groupId}/duplicatesemantics:writePATCH/projects/{projectId}/keyword-groups/{groupId}semantics:writePOST/projects/{projectId}/keywords/searchsemantics:readPOST/projects/{projectId}/keywords/listsemantics:readGET/projects/{projectId}/keywords/tag-optionssemantics:readGET/projects/{projectId}/keywords/tagssemantics:readDELETE/projects/{projectId}/keywords/tags/{tagId}semantics:writePOST/projects/{projectId}/keywords/bulk-previewsemantics:writeGET/projects/{projectId}/keywords/{keywordId}/insightssemantics:readGET/projects/{projectId}/keywords/{keywordId}/ai-answerssemantics:readGET/projects/{projectId}/keywords/{keywordId}/ai-answers/historysemantics:readDELETE/projects/{projectId}/keywords/{keywordId}/frequencies/{type}/{device}semantics:writePOST/projects/{projectId}/bulk-commands/clean-previewsemantics:writePOST/projects/{projectId}/bulk-commands/cleansemantics:writePOST/projects/{projectId}/imports/{importId}/mappingsemantics:writePOST/projects/{projectId}/imports/{importId}/publishsemantics:writePOST/projects/{projectId}/imports/{importId}/cancelsemantics:writePOST/projects/{projectId}/uploadssemantics:writePOST/projects/{projectId}/uploads/{uploadId}/partssemantics:writePOST/projects/{projectId}/uploads/{uploadId}/completesemantics:writeGET/projects/{projectId}/uploads/{uploadId}semantics:readDELETE/projects/{projectId}/uploads/{uploadId}semantics:writeGET/projects/{projectId}/exports/{exportId}semantics:readGET/projects/{projectId}/exports/{exportId}/downloadsemantics:readGET/projects/{projectId}/exports/{exportId}/filesemantics:readPOST/projects/{projectId}/exports/{exportId}/cancelsemantics:writeGET/projects/{projectId}/clustering-runssemantics:readGET/projects/{projectId}/clustering-runs/{jobId}/result/sections/{sectionId}semantics:readGET/projects/{projectId}/clustering-runs/{jobId}/resultsemantics:readGET/projects/{projectId}/clustering-runs/{jobId}semantics:readPOST/projects/{projectId}/clustering-runs/{jobId}/cancelsemantics:writePOST/projects/{projectId}/clustering-runs/{jobId}/applysemantics:writePOST/projects/{projectId}/clustering-runs/{jobId}/rejectsemantics:writeGET/projects/{projectId}/clusterssemantics:readPOST/projects/{projectId}/clusterssemantics:writePOST/projects/{projectId}/clusters/page-mapping-previewsemantics:writePOST/projects/{projectId}/clusters/page-mapping-bulksemantics:writePOST/projects/{projectId}/clusters/merge-previewsemantics:writePOST/projects/{projectId}/clusters/mergesemantics:writePOST/projects/{projectId}/clusters/split-previewsemantics:writePOST/projects/{projectId}/clusters/splitsemantics:writePATCH/projects/{projectId}/clusters/{clusterId}semantics:writeDELETE/projects/{projectId}/clusters/{clusterId}semantics:writeGET/projects/{projectId}/semantic-custom-columnssemantics:readPOST/projects/{projectId}/semantic-custom-columnssemantics:writePATCH/projects/{projectId}/semantic-custom-columns/{columnId}semantics:writeDELETE/projects/{projectId}/semantic-custom-columns/{columnId}semantics:writePUT/projects/{projectId}/keywords/{keywordId}/custom-values/{columnId}semantics:writeDELETE/projects/{projectId}/keywords/{keywordId}/custom-values/{columnId}semantics:writePOST/projects/{projectId}/semantic-duplicates/previewsemantics:readPOST/projects/{projectId}/semantic-duplicates/applysemantics:writeGET/projects/{projectId}/negative-keyword-presetssemantics:readPOST/projects/{projectId}/negative-keyword-presetssemantics:writePATCH/projects/{projectId}/negative-keyword-presets/{presetId}semantics:writeDELETE/projects/{projectId}/negative-keyword-presets/{presetId}semantics:writePOST/projects/{projectId}/negative-keywords/previewsemantics:readPOST/projects/{projectId}/negative-keywords/applysemantics:writeGET/projects/{projectId}/semantic-saved-viewssemantics:readPOST/projects/{projectId}/semantic-saved-viewssemantics:writePATCH/projects/{projectId}/semantic-saved-views/{viewId}semantics:writeDELETE/projects/{projectId}/semantic-saved-views/{viewId}semantics:writeGET/projects/{projectId}/semantic-versionssemantics:readGET/projects/{projectId}/semantic-versions/{versionId}semantics:readGET/projects/{projectId}/semantic-versions/{versionId}/undo-previewsemantics:readPOST/projects/{projectId}/semantic-versions/{versionId}/undosemantics:write

Получить ключевые слова

GET/projects/{projectId}/keywordssemantics:read
Запросbash
curl "https://api.seonorita.ru/api/v1/projects/<projectId>/keywords?limit=100&search=холодильник" \
  -H "Authorization: Bearer $SEO_API_TOKEN"
200 · Сокращённый ответjson
{
  "data": [
    {
      "id": "019...",
      "textOriginal": "купить холодильник",
      "textNormalized": "купить холодильник",
      "language": "ru",
      "priority": 0,
      "isFavorite": false,
      "isTracked": true,
      "tags": [],
      "tagsTruncated": false,
      "sourceMode": "MANUAL",
      "version": 7,
      "createdAt": "2026-09-01T10:00:00.000Z",
      "updatedAt": "2026-09-01T10:00:00.000Z"
    }
  ],
  "page": {
    "hasNext": true,
    "nextCursor": "opaque-cursor"
  },
  "meta": { "requestId": "01J..." }
}

Пакетное создание

POST/projects/{projectId}/keywords/bulksemantics:write
JSON · Тело запросаjson
{
  "items": [
    {
      "text": "купить холодильник",
      "language": "ru",
      "priority": 0,
      "isFavorite": false,
      "isTracked": true,
      "tagNames": [],
      "groupId": "019...",
      "duplicatePolicy": "ADD_TO_GROUP",
      "duplicateGroupId": "019..."
    }
  ],
  "duplicatePolicy": "SKIP_EXISTING"
}
201 · Ответjson
{
  "data": {
    "selected": 1,
    "created": 1,
    "restored": 0,
    "linked": 0,
    "skipped": 0,
    "rejected": 0,
    "failed": 0,
    "rows": [
      { "index": 0, "outcome": "CREATED", "keywordId": "019...", "version": 1 }
    ]
  },
  "meta": { "requestId": "01J..." }
}

Удалить запрос

DELETE/projects/{projectId}/keywords/{keywordId}semantics:write

Передайте актуальную версию запроса в If-Match. Без тела запроса ключ перемещается в системную папку «Корзина», а API возвращает 204 No Content без JSON.

Запрос · Переместить в корзинуbash
curl -X DELETE "https://api.seonorita.ru/api/v1/projects/<projectId>/keywords/<keywordId>" \
  -H "Authorization: Bearer $SEO_API_TOKEN" \
  -H 'If-Match: "v7"'

Окончательная очистка допускается только для запроса, который уже находится в корзине. Получите его актуальную версию после первого удаления и явно передайте permanent: true. Исторические замеры остаются неизменяемыми, а пользовательские значения запроса очищаются.

Запрос · Окончательная очисткаbash
curl -X DELETE "https://api.seonorita.ru/api/v1/projects/<projectId>/keywords/<keywordId>" \
  -H "Authorization: Bearer $SEO_API_TOKEN" \
  -H 'If-Match: "v8"' \
  -H "Content-Type: application/json" \
  -d '{"permanent":true}'

Удалить папку

DELETE/projects/{projectId}/keyword-groups/{groupId}semantics:write

Команда требует актуальный If-Match и возвращает204 No Content. Системные папки «Без группы» и «Корзина» удалить нельзя. Если тело отсутствует, удаляется всё поддерево, запросы сохраняются, а оставшиеся без папки запросы переходят в «Без группы».

Запрос · Удалить папку и поднять дочерниеbash
curl -X DELETE "https://api.seonorita.ru/api/v1/projects/<projectId>/keyword-groups/<groupId>" \
  -H "Authorization: Bearer $SEO_API_TOKEN" \
  -H 'If-Match: "v4"' \
  -H "Content-Type: application/json" \
  -d '{
    "deleteKeywords": false,
    "promoteChildren": true
  }'
ПолеПо умолчаниюПоведение при true
promoteChildrenУдалить папку вместе с поддеревомУдалить только выбранную папку и поднять её прямых потомков на уровень выше
deleteKeywordsСохранить запросы и перенести оставшиеся без папки в «Без группы»Переместить затронутые удалением запросы в «Корзину»