REST API v1: ключи API, аутентификация и эндпоинты
Как создать ключ API, передавать заголовок Authorization, лимиты запросов и полный список эндпоинтов v1 с параметрами, форматом ответа и кодами ошибок.
Открыть этот экран в панелиREST API v1 позволяет выполнять из кода практически все действия, доступные в панели: получать список сайтов, запускать сканирование, выгружать проблемы, открывать AI-исправления и управлять правилами Pixel, ключевыми словами, контентом, обратными ссылками, аутричем, конкурентами и публикациями в соцсетях. Ключи привязаны к организации; ключ имеет доступ только к данным своей организации. MCP-сервер вызывает те же эндпоинты.
Предварительные требования
- Создавать и отзывать ключи может только владелец или администратор организации. Другим ролям вкладка "Ключи API" недоступна.
- Доступ к API включен в тарифные планы Pro и Agency. Если ваш тарифный план его не включает, на вкладке отображается уведомление со ссылкой "Посмотреть тарифы"; вы всё еще можете создать ключ, но запросы будут возвращать ошибку 403
plan_required.
Создание ключа API
- Перейдите в Настройки → Профиль → Ключи API.
- В поле "Название ключа" укажите, где будет использоваться ключ (минимум 2 символа, например, "CI").
- Если ключу необходимо запускать сканирование или создавать исправления, правила, ключевые слова или контент, отметьте "право на запись" (write scope). Оставьте галочку снятой для ключа только на чтение.
- Нажмите "Создать ключ".
- Сразу скопируйте ключ, начинающийся с
sa_live_, с помощью кнопки "Скопировать ключ". Он больше никогда не будет показан; в списке сохраняется только его Префикс.
Организация может иметь не более 20 активных ключей. Если ключ скомпрометирован, немедленно отозвите его с помощью иконки корзины ("Отозвать") в списке. Запросы с использованием отозванного ключа сразу получают ошибку 401.
Подключения, настроенные AI-приложениями через OAuth, не отображаются в этом списке; они находятся в списке "Подключенные ассистенты" на странице Подключите вашего AI-ассистента.
Аутентификация и базовый URL
- Базовый URL:
https://seoasist.com/api/v1 - Заголовок:
Authorization: Bearer sa_live_… - Также принимается параметр запроса
?api_key=sa_live_…. Ключи в URL обычно попадают в логи, поэтому используйте этот способ только для тестирования.
Права доступа (Scopes): ключ с правом read может вызывать любой эндпоинт GET. Право write разблокирует запросы POST, PATCH и DELETE. Запрос на запись с ключом только для чтения возвращает 403.
Лимиты: не более 240 запросов в минуту на организацию и не более 30 AI-исправлений в час (POST /sites/{id}/fixes). При превышении вы получите ошибку 429 rate_limited.
curl -H "Authorization: Bearer sa_live_..." \
https://seoasist.com/api/v1/sites
Формат ответа (Response envelope)
Каждый успешный ответ JSON выглядит следующим образом:
{ "ok": true, "data": {}, "ms": 42 }
data содержит результат работы эндпоинта, а ms — время выполнения запроса в миллисекундах. Единственное исключение — llms.txt, который возвращает простой текст (text/plain). Ошибки возвращают { "ok": false, "error": "<code>", "message": "…" }.
Эндпоинты
Все пути указаны относительно базового URL. {id} — это ID сайта, который можно получить из GET /sites.
Аккаунт и сайты
| Метод | Путь | Права | Что делает |
|---|---|---|---|
| GET | /me | read | Организация и права ключа: orgId, scopes |
| GET | /sites | read | Список сайтов: id, name, domain, url, healthScore, lastCrawlAt, gscProperty, ga4PropertyId, repo, pixelKey … и динамика позиций в Search Console (movement) |
| GET | /sites/{id} | read | Поля сайта + lastCrawl (id, pages, finishedAt), issueTotals, группы проблем (code, severity, title, count), репозитории кода (repos), каналы исправлений (fixChannels) и растущие / падающие запросы |
| GET | /sites/{id}/data-sources | read | Активный источник данных и его состояние для каждого типа данных |
| POST | /sites/{id}/crawl | write | Запускает сканирование; возвращает { crawlId, status: "queued" }. 402 limit_reached, если ежемесячная квота страниц исчерпана |
Проблемы, исправления и правила
| Метод | Путь | Права | Что делает |
|---|---|---|---|
| GET | /sites/{id}/issues | read | Сгруппированные проблемы (totals, groups). С ?code= вы получаете эту группу и примеры urls; ?limit= по умолчанию 200, макс. 1000 |
| POST | /sites/{id}/issues/{code}/rule-fix | write | Устраняет один код проблемы на каждом затронутом URL с помощью правил (требуется Site API, плагин WordPress или Pixel) |
| POST | /sites/{id}/fixes | write | Открывает AI-исправление (задача PR / MR). Тело: issueCode или instructions (одно из них обязательно), опционально repo и model. Возвращает { jobId, status: "queued" } |
| GET | /sites/{id}/fixes | read | Последние 50 задач по исправлению: status, model, repo, prUrl, summary, error … |
| GET | /sites/{id}/pixel/rules | read | Правила |
| POST | /sites/{id}/pixel/rules | write | Добавляет правило. Тело: kind, matchType (по умолчанию exact), matchPath (по умолчанию /), payload, опционально note |
| DELETE | /sites/{id}/pixel/rules/{ruleId} | write | Удаляет правило; { deleted: true } |
Ключевые слова и контент
| Метод | Путь | Права | Что делает |
|---|---|---|---|
| GET | /sites/{id}/keywords | read | avgPosition, buckets и ключевые слова (position, prevPosition, change, best, url, volume, kd, intent, aiOverview, aiCited …) плюс movers из Search Console |
| POST | /sites/{id}/keywords | write | Тело: { keywords: string[] } (макс. 200 за запрос). Возвращает { added }; ключевые слова, которые уже отслеживаются, пропускаются |
| GET | /sites/{id}/keywords/opportunities | read | Пул ключевых слов с оценкой потенциала (0–100) и действием (new / strengthen); ?limit= по умолчанию 50, макс. 300 |
| POST | /sites/{id}/keywords/ideas | write | Тело: { keywords: string[], note? } (2–60 ключевых слов). Кластеризует ключевые слова и создает идеи для блога со статусом idea |
| GET | /sites/{id}/content | read | Последние 100 элементов контента; фильтрация с помощью ?status= |
| POST | /sites/{id}/content | write | Создает идею для блога. Тело: title (обязательно), targetKeywords?, angle?, generate? (true ставит написание в очередь) |
| GET | /sites/{id}/content/{itemId} | read | Один элемент контента со всеми его полями (включая HTML) |
| PATCH | /sites/{id}/content/{itemId} | write | Редактирует статью блога, которая еще не опубликована: title, html, faq, metaTitle, metaDescription, excerpt, slug, targetKeywords. Утвержденная или запланированная статья возвращается на проверку. Переписанные страницы и опубликованные статьи возвращают 422 / 409 not_editable |
| POST | /sites/{id}/content/{itemId}/approve | write | Утверждает элемент. При передаче scheduledFor (ГГГГ-ММ-ДД) статус меняется на scheduled; планирование должно пройти проверки автопубликации |
| POST | /sites/{id}/content/{itemId}/publish | write | Ставит задачу публикации в очередь. Тело: channel (wordpress, github, siteapi, manual), live?. Прямая публикация должна пройти проверки автопубликации; переписанные страницы нельзя публиковать напрямую |
| GET / POST | /sites/{id}/content/{itemId}/brief | read / write | Сохраненный исследовательский бриф / новый бриф (keyword, urls?); расходует ежемесячную квоту брифов |
| POST | /sites/{id}/score | read | Оценивает HTML статьи от 0 до 100 (html, itemId?, keyword?, title?, metaDescription?) |
| POST | /sites/{id}/articles | write | Отправляет статью, написанную вашим собственным AI, на проверку (HTML очищается, макс. 300 КБ, не учитывается в ежемесячной квоте контента) |
| GET | /sites/{id}/brand | read | Профиль бренда: тональность, аудитория, запрещенные слова, автор |
Обратные ссылки, аутрич и конкуренты
| Метод | Путь | Права | Что делает |
|---|---|---|---|
| GET | /sites/{id}/backlinks | read | Профиль обратных ссылок: сводка, тренд, топ доменов и анкоров |
| GET | /sites/{id}/backlinks/links | read | Отдельные обратные ссылки; ?status= (active, new, lost, toxic, broken), ?limit= по умолчанию 200, макс. 1000 |
| POST | /sites/{id}/backlinks/opportunities | write | Домены, ссылающиеся на конкурентов, но не на ваш сайт; расходует кредиты DataForSEO |
| GET / POST | /sites/{id}/outreach | read / write | Записи аутрича / новый потенциальный контакт (domain, url?, contactName?, contactEmail?, notes?, rank?) |
| PATCH | /sites/{id}/outreach/{outreachId} | write | Статус (idea, contacted, replied, won, lost), контактные данные или заметки |
| GET / POST | /sites/{id}/competitors | read / write | Конкуренты / новый домен конкурента (макс. 20 на сайт) |
| GET | /sites/{id}/competitors/gap | read | Упущенный контент (gap); ?competitorId=, ?minVolume=, ?maxKd=, ?limit= |
| GET | /sites/{id}/competitors/{competitorId}/keywords | read | Ключевые слова, по которым ранжируются и сайт, и конкурент |
Мониторинг и AI
| Метод | Путь | Права | Что делает |
|---|---|---|---|
| GET | /sites/{id}/geo | read | Сводка AI-видимости; ?days= по умолчанию 90 |
| GET | /sites/{id}/monitors | read | uptime (30 дней), количество index и changes30d |
| GET | /sites/{id}/ai-access | read | Последняя проверка доступа AI-ботов: checkedAt, result, policy |
| GET | /sites/{id}/llms.txt | read | Сгенерированный файл llms.txt в виде обычного текста |
Организация
| Метод | Путь | Права | Что делает |
|---|---|---|---|
| GET | /notifications | read | { unread, items }; ?unread=1 возвращает только непрочитанные, ?limit= по умолчанию 50, макс. 200 |
| POST | /notifications/read | write | Тело: { ids?: string[] }; без ids все уведомления отмечаются как прочитанные |
| GET | /todo | read | Что требует участия человека и что сделано автоматикой; ?siteId=, ?days= (по умолчанию 7) |
| GET | /agent/tasks | read | Задачи вручную из планов с истекающим сроком; ?siteId= |
| POST | /agent/tasks/{taskId}/complete | write | Закрывает ручную задачу с заметкой (note, минимум 10 символов) |
| POST | /agent/activity | write | Записывает строку в ленту активности (message, siteId?) |
| GET | /reports | read | Последние 50 отчетов и их публичные url; фильтрация с помощью ?siteId= |
| GET | /social/accounts, /social/posts, /social/insights | read | Социальные аккаунты, публикации и аналитика аккаунтов (из общего модуля социальных сетей) |
| POST | /social/posts, /social/posts/{postId}/schedule, /social/campaign | write | Создание публикаций, установка дат и серий кампаний; публикации попадают на проверку |
Статусы контента: idea, planned, generating, draft, review, approved, scheduled, published, failed, archived. Значения kind для правил: title, meta_description, canonical, robots, h1, img_alt, og, json_ld, hreflang, redirect, lang, attr, link, meta. Значения matchType: exact, prefix, regex, all.
В организациях с оплатой через CoSuite сайты сверх лимита доступных сайтов находятся в режиме только для чтения. Каждый запрос на запись в них возвращает 403 site_read_only; запросы на чтение продолжают работать.
Примеры
Запуск AI-исправления:
curl -X POST https://seoasist.com/api/v1/sites/SITE_ID/fixes \
-H "Authorization: Bearer sa_live_..." \
-H "Content-Type: application/json" \
-d '{"issueCode":"missing_meta_description"}'
Добавление ключевых слов для отслеживания:
curl -X POST https://seoasist.com/api/v1/sites/SITE_ID/keywords \
-H "Authorization: Bearer sa_live_..." \
-H "Content-Type: application/json" \
-d '{"keywords":["seo tool","site audit"]}'
Такие задачи, как сканирование и исправления, помещаются в очередь. Отслеживайте результат с помощью соответствующего эндпоинта GET (/sites/{id}, /sites/{id}/fixes).
Коды ошибок
| HTTP | error | Когда возникает |
|---|---|---|
| 400 | bad_request | Поле в теле запроса отсутствует или недействительно (например, title, kind, keywords[]) |
| 401 | unauthorized | Ключ отсутствует, недействителен или отозван |
| 402 | limit_reached | Исчерпана квота тарифного плана (например, ежемесячный лимит сканирования страниц, отслеживаемых ключевых слов, исследовательских брифов) |
| 403 | plan_required | Тарифный план не включает доступ к API (требуется Pro или Agency) |
| 403 | forbidden | Запрос на запись с использованием ключа только для чтения |
| 403 | site_read_only | Сайт находится сверх лимита сайтов в CoSuite; запись отключена |
| 404 | not_found | Сайт или запись не принадлежат этой организации, не существуют, или эндпоинт неизвестен |
| 409 | conflict | Например, у сайта нет репозитория кода, хостинг кода не подключен, недоступна модель AI, утверждения с AI-метками еще не проверены, или переписанная страница отправлена на прямую публикацию |
| 409 | publish_gate | Публикация не прошла проверки автопубликации; она была возвращена на проверку, а владелец получил уведомление |
| 409 / 422 | not_editable | Контент, который нельзя редактировать (опубликованная статья или переписанная страница) |
| 413 | too_large | Тело запроса слишком велико (например, HTML статьи превышает 300 КБ) |
| 422 | no_ai | Для выполнения действия недоступен AI |
| 429 | rate_limited | Превышен лимит в 240 запросов в минуту или 30 исправлений в час |
| 500 | internal | Непредвиденная ошибка. В целях безопасности подробности не возвращаются |
Часто задаваемые вопросы
Я потерял свой ключ. Могу ли я посмотреть его снова?
Нет. Ключи хранятся только в виде хэша. Отозовите старый ключ и создайте новый.
Могу ли я использовать один и тот же ключ в MCP-клиенте?
Да. Существует два способа:
- Удаленный MCP (без установки, рекомендуется):
https://seoasist.com/api/mcp. Добавьте этот URL в качестве коннектора в claude.ai, Claude Desktop, ChatGPT, Cursor или VS Code; откроется окно входа в SEOAsist, где вы выберете организацию и права доступа, не копируя ключ. Пошаговые инструкции и ссылки для установки в один клик находятся в панели в разделе Настройки → Интеграции → Подключите вашего AI-ассистента. В Claude Code выполнитеclaude mcp add --transport http seoasist https://seoasist.com/api/mcpи войдите в систему с помощью/mcpпри первом использовании. Если окно входа не может открыться (серверы, CI), передайте ключ API с помощью--header "Authorization: Bearer sa_live_...". - Локальный (stdio): вкладка "Ключи API" в разделе "MCP-сервер" предоставляет готовый конфиг для Claude Desktop, Claude Code и Cursor; вы подставляете ключ в переменную
SEOASIST_API_KEY.
После подключения в меню команд AI-приложения появятся готовые команды seo_round, content_from_gap, backlink_outreach, agent_tasks и weekly_report. Инструменты MCP вызывают те же эндпоинты; для инструментов записи требуется ключ с правом на запись (write scope). Переписанные страницы (page_update) нельзя публиковать в прямом эфире через API; публикуются только статьи блога. Все инструменты, права доступа и коды ошибок описаны в справочнике по MCP; настройки для каждого приложения см. в разделе Подключение вашего AI.
Могу ли я вызывать API прямо из браузера?
API возвращает заголовок Access-Control-Allow-Origin: *. Тем не менее, никогда не встраивайте ключ в публичную страницу; любой, кто увидит ключ, сможет получить доступ к данным вашей организации.
Похожие статьи
- Принятие ошибок аудита как намеренных и их автоматическое исправлениеКак пометить намеренно оставленные ошибки как «Намеренные», отменить это действие и исправить проблемы автоматически с помощью правил или pull request в GitHub.
- Тарифы, ежемесячная квота страниц и включенные вызовы ИИ SEOAsistЛимиты тарифов Free, Starter, Pro и Agency, учет ежемесячной квоты сканирования, включенных вызовов ИИ SEOAsist и запросов данных платформы, порядок оплаты и отслеживание использования.
- Справочник Site API (seoasist-site-api/1)Полная спецификация SEOAsist Site API: аутентификация и HMAC-подпись, четыре эндпоинта, типы правил и обзор готовых примеров для Next.js и PHP.
- MCP-сервер: эндпоинт, аутентификация, инструменты и готовые командыURL удаленного MCP-сервера SEOAsist, аутентификация через OAuth 2.1 или API-ключ, области доступа, полный список инструментов, 5 готовых команд, правила, локальный пакет stdio и коды ошибок.
- Студия контента: посты, улучшение страниц, E-E-A-T и публикацияПревращайте ключевые слова в идеи для постов, создавайте контент по календарному расписанию, проверяйте оценки E-E-A-T и метки фактологии в редакторе, расширяйте существующие страницы с опорой на первоисточник и публикуйте их в WordPress, Site API, GitHub или Shopify.