Семантика
Работайте с папками и ключами через cursor-pagination; большие изменения отправляйте пакетными командами.
/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Получить ключевые слова
/projects/{projectId}/keywordssemantics:readcurl "https://api.seonorita.ru/api/v1/projects/<projectId>/keywords?limit=100&search=холодильник" \
-H "Authorization: Bearer $SEO_API_TOKEN"{
"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..." }
}Пакетное создание
/projects/{projectId}/keywords/bulksemantics:write{
"items": [
{
"text": "купить холодильник",
"language": "ru",
"priority": 0,
"isFavorite": false,
"isTracked": true,
"tagNames": [],
"groupId": "019...",
"duplicatePolicy": "ADD_TO_GROUP",
"duplicateGroupId": "019..."
}
],
"duplicatePolicy": "SKIP_EXISTING"
}{
"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..." }
}Удалить запрос
/projects/{projectId}/keywords/{keywordId}semantics:writeПередайте актуальную версию запроса в If-Match. Без тела запроса ключ перемещается в системную папку «Корзина», а API возвращает 204 No Content без JSON.
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. Исторические замеры остаются неизменяемыми, а пользовательские значения запроса очищаются.
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}'Удалить папку
/projects/{projectId}/keyword-groups/{groupId}semantics:writeКоманда требует актуальный If-Match и возвращает204 No Content. Системные папки «Без группы» и «Корзина» удалить нельзя. Если тело отсутствует, удаляется всё поддерево, запросы сохраняются, а оставшиеся без папки запросы переходят в «Без группы».
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 | Сохранить запросы и перенести оставшиеся без папки в «Без группы» | Переместить затронутые удалением запросы в «Корзину» |