Перейти к содержимому

INITE для агентов

Портал, анализатор и Атлас - это инструменты, которые AI-агент вызывает без аккаунта. Для действий, где нужны вы (добавить инструмент в Атлас, посмотреть свои аудиты, оплатить), у каждого есть отдельная рельса с входом, и при подключении она попросит войти.

INITE / АГЕНТЫ

Адрес MCP

https://inite.ai/api/mcp

Streamable HTTP, без сессий. У каждой рельсы есть свой адрес, если нужен короткий список инструментов.

Рельсы

  • Порталhttps://inite.ai/api/mcp/portal

    Сама INITE: что мы продаём и сколько это стоит в вашей валюте, свободное время для звонка, запись на звонок для конкретного человека, письмо команде, гиды.

    • inite_servicesоткрыто
    • inite_slotsоткрыто
    • inite_book_callоткрыто
    • inite_contactоткрыто
    • inite_guidesоткрыто
    • inite_connectоткрыто
  • INITE с входомhttps://inite.ai/api/mcp/portal-me

    Ваш аккаунт: тариф, лицензии и остаток аудитов (my_account), и покупка Local Start (inite_buy): с кошелька INITE, картой, через PIX или по x402.

    • my_accountаккаунт
    • inite_buyаккаунт
  • Анализаторhttps://inite.ai/api/mcp/analyzer

    Как AI-системы читают сайт. check_identity бесплатно и сразу проверяет доступ роботов, файлы о компании и разметку. visibility_fixes даёт план исправлений по важности, с готовыми файлами; compare_sites так же читает сайт конкурента; visibility_history показывает, как менялись показатели. analyze_site запускает аудит, get_analysis возвращает результат.

    • check_identityоткрыто
    • analyze_siteоткрыто
    • get_analysisоткрыто
    • visibility_fixesоткрыто
    • compare_sitesоткрыто
    • visibility_historyоткрыто
  • Анализатор с входомhttps://inite.ai/api/mcp/analyzer-me

    Аудит на тарифе вашего аккаунта (analyze_site, get_analysis), watch_site, который проверяет сайт каждую неделю, ваши аудиты (my_reports) и покупка лицензии на 12 месяцев (visibility_buy_licence).

    • watch_siteаккаунт
    • my_reportsаккаунт
    • visibility_buy_licenceаккаунт
  • Атласhttps://inite.ai/api/mcp/atlas

    Больше 25 000 AI-инструментов, которые мы перечитываем каждую неделю. Подбор под задачу, описанную словами; датированная карточка инструмента: цена и как она менялась, API, MCP-сервер, статус, что он заявляет о ваших данных; поиск по фильтрам; что изменилось на рынке.

    • match_toolsоткрыто
    • match_mcpоткрыто
    • atlas_lookupоткрыто
    • atlas_searchоткрыто
    • atlas_changesоткрыто
    • get_project_timelineоткрыто
    • atlas_couponsоткрыто
    • atlas_compareоткрыто
    • atlas_dataset_getоткрыто
    • atlas_dataset_changesоткрыто
  • Владельцам в Атласеhttps://inite.ai/api/mcp/atlas-owners

    atlas_submit добавляет ваш инструмент по адресу сайта и начинает подтверждение; инструменты atlas_owner_* подтверждают домен, ведут карточку и её скидки; atlas_owner_premium оплачивает премиум; atlas_dataset_* публикуют сравнения Live Data.

    • atlas_my_listingsаккаунт
    • atlas_submitаккаунт
    • atlas_owner_claimаккаунт
    • atlas_owner_verifyаккаунт
    • atlas_owner_cardаккаунт
    • atlas_owner_set_read_pagesаккаунт
    • atlas_owner_remeasureаккаунт
    • atlas_owner_statsаккаунт
    • atlas_owner_propose_editаккаунт
    • atlas_owner_couponsаккаунт
    • atlas_owner_coupon_addаккаунт
    • atlas_owner_coupon_setаккаунт
    • atlas_owner_premiumаккаунт
    • atlas_owner_releaseаккаунт
    • atlas_dataset_createаккаунт
    • atlas_dataset_updateаккаунт
    • atlas_dataset_publishаккаунт
    • atlas_dataset_archiveаккаунт
    • atlas_dataset_placementаккаунт
  • Справочник компанийhttps://inite.ai/api/mcp/directory

    Компании, которые сами подтвердили свои факты в INITE и доказали владение доменом. find_business ищет по тому, чем компания занимается и где она находится, на русском, английском, португальском или испанском; business открывает одну компанию по slug или домену. У каждой свой сервер фактов (MCP и A2A). Порядок задают совпадение и полнота фактов, место не продаётся. AI-инструменты, которые мы замеряем сами, лежат в Атласе, а не здесь.

    • find_businessоткрыто
    • businessоткрыто

Открыто и с входом

Вызов без токена считается гостевым. Гость получает открытые инструменты портала, анализатора и Атласа с лимитом на адрес, а аудит идёт в режиме опроса: всё, кроме двух платных шагов, как на сайте у посетителя без аккаунта. Рельсы с входом без токена не отвечают. Их 401 с WWW-Authenticate указывает на auth.inite.ai, а он поддерживает динамическую регистрацию клиента и PKCE, поэтому клиент сам просит войти (passkey, ссылка на почту или пароль), когда вы его добавляете. Claude и ChatGPT решают, нужен ли коннектору вход, в момент добавления, поэтому у каждого продукта своя рельса с входом.

Подключение

Клиент с удалённым MCP: добавьте адрес. Ключ для начала не нужен.

{
  "mcpServers": {
    "inite": {
      "type": "http",
      "url": "https://inite.ai/api/mcp"
    }
  }
}

Клиент, который запускает локальные серверы: npm-пакет добавляет три проверки на вашей машине, а остальное передаёт на адрес.

{
  "mcpServers": {
    "inite": {
      "command": "npx",
      "args": [
        "-y",
        "@inite/visibility"
      ]
    }
  }
}

Владельцам инструментов

Ваш агент может добавить инструмент в Атлас и вести его карточку: внести по адресу сайта, подтвердить домен, подсказать Атласу, где у вас страницы цен, вакансий и релизов, опубликовать скидки, попросить перечитать сайт и оплатить премиум.

  1. 01Подключите рельсу владельцев Атласа, https://inite.ai/api/mcp/atlas-owners, и войдите, когда клиент попросит.
  2. 02atlas_submit с адресом сайта читает главную, подаёт заявку и начинает подтверждение. В ответ приходят три способа подтвердить домен: ссылка-бейдж, meta-тег или DNS-запись. Поставьте один на сайт и вызовите atlas_owner_verify. Если инструмент уже есть в Атласе, заявите права на него через atlas_owner_claim.
  3. 03atlas_owner_card показывает, что мы прочитали для карточки и чего прочитать не смогли: цену, вакансии, релизы, компанию.
  4. 04atlas_owner_set_read_pages передаёт адреса ваших страниц цен, вакансий и changelog. Мы читаем их с теми же проверками, что и любые другие: цена должна быть напечатана на странице, доска вакансий должна быть вашей, у записей должны стоять даты.
  5. 05atlas_owner_coupon_add публикует скидку с пометкой «со слов подтверждённого владельца». atlas_owner_remeasure перечитывает сайт, atlas_owner_stats показывает просмотры и переходы.
  6. 06atlas_owner_premium открывает премиум. Если вы разрешили списания с кошелька INITE, оплата пройдёт сразу; если нет, придут страница с passkey, страница оплаты картой или PIX и x402 для агента со своим кошельком. После оплаты вызовите его ещё раз, и премиум включится.

Промпт для вашего агента

Через MCP-сервер INITE Atlas Owners добавь your-tool.com в Атлас как мой инструмент, поставь на главную meta-тег для подтверждения и проверь его. Потом покажи, чего Атлас не смог прочитать для карточки, и укажи наши страницы цен, вакансий и changelog.

Слова владельца не меняют замеренных фактов. Названные вами страницы мы читаем, а не принимаем на веру; правки уходят на проверку человеку.

A2A

Аудит доступен и как агент A2A v1.0: отправьте домен и получите задачу, которая завершится примерно за минуту, с баллом в артефакте. Правило то же: без токена открыто, с токеном работает тариф аккаунта.

https://inite.ai/api/a2a

Для машин

Всё перечисленное, в файлах, которые агент читает первыми.

.well-known

Разработчикам сайта

Компания, которая подтвердила факты в INITE, может отдавать их со своего домена и публиковать на своём сайте статьи, которые одобрила. Выберите коннектор под платформу сайта. Сайт на другой платформе обращается к тем же адресам API и принимает события вебхука, описанные ниже.

Компания включает INITE Agents в своём кабинете, подтверждает там факты и получает ключ сайта, который нужен коннекторам ниже. Открыть INITE Agents

Какой коннектор для какой платформы

  • Плагин INITE Agents. Установите zip через «Плагины», «Добавить новый плагин», «Загрузить плагин» и вставьте ключ сайта в «Настройки», INITE Agents. Плагин отдаёт файлы, теги для head и строку в robots.txt, а одобренные статьи превращает в записи. Новые версии приходят на экран «Плагины».

  • Next.js · на GitHubnpm install @inite/site-agents

    Пакет @inite/site-agents: два файла маршрутов и один компонент для head отдают файлы и теги, а createContentQueue получает одобренные статьи и сообщает, где их опубликовали.

  • Любой сайт с полем для кода в head: Tilda, Squarespace, Wix, Webflow, Framer, Ghost, Shopify, Битрикс, Joomla · на GitHub

    Сниппет: один тег script в head страницы. Его выдаёт кабинет, в нём публичный slug и нет ключа. Тег загружает инструменты WebMCP, добавляет ссылки на файлы на <slug>.inite.ai и JSON-LD подтверждённых фактов. Это видят агенты в браузере и роботы, которые выполняют JavaScript. Многие ИИ-роботы читают HTML как есть, и для них кабинет даёт ещё статичный блок с теми же тегами для одной версии, который нужно копировать заново после каждого подтверждения. Раз в день мы читаем главную страницу и смотрим, что на ней стоит.

  • Ghost · на GitHub

    Ставить ничего не нужно: вставьте в кабинет адрес Admin API и ключ собственной интеграции Ghost, и INITE сам опубликует одобренные статьи. За head отвечает сниппет в Settings, Code injection.

  • Любой другой стек · на GitHub

    Адреса API и вебхук, описанные ниже, с ключом сайта, созданным в кабинете для платформы Webhook.

  • Shopify, Wix, Webflow, HubSpot

    Отдельные приложения для этих платформ готовятся. Пока любой такой сайт подключается сниппетом, а разработчик может использовать API и вебхук.

Инструкции для каждой платформы и приёмники вебхуков на Node.js, PHP и Python с проверкой подписи собраны в одном открытом репозитории, и туда же пишут об ошибках в любом коннекторе. Исходный код плагина и пакета лежит в соседних зеркалах только для чтения, с релизом на каждую версию. inite-ai/inite-agents на GitHub

Ключ и лимиты

В каждом запросе с пометкой «ключ сайта» передавайте ключ из вкладки «Для агентов» в кабинете: Authorization: Bearer isk_…. Ключ показывается один раз, когда его создают. Один ключ относится к одному сайту и одной платформе; отправляйте его только на https://inite.ai.

Адреса с ключом принимают 60 запросов в минуту с одного IP-адреса, и сайты на одном общем сервере делят этот лимит между собой. Для публичных фактов и сниппета лимит 30 запросов в минуту с одного адреса. Сверх лимита приходит ответ 429 с заголовком Retry-After в секундах, а если сервис перегружен, 503 с тем же заголовком. Причину указывает тело: {"ok": false, "busy": "rate"}. У скрипта WebMCP лимита нет, он кешируется на сутки. Загрузки в records принимаются не чаще 30 раз в минуту.

Адреса API

  • GET /api/site/v1/manifestключ сайта

    Какие файлы отдавать и по каким путям, теги для head, адрес MCP, версия фактов и включены ли статьи. Передайте в If-None-Match последний полученный ETag: ответ 304 значит, что ничего не изменилось. Запрашивать манифест достаточно раз в пять минут.

  • GET /api/site/v1/files/{name}ключ сайта

    Один файл подтверждённой версии, байт в байт, со своим Content-Type: llms.txt, llms-full.txt, agent-card.json, mcp.json, api-catalog, robots-signal или jsonld. У каждого файла свой ETag. На любое другое имя придёт 404. robots-signal - строка Content-Signal для вашего robots.txt (search=yes, ai-input=yes, ai-train=no): пожелание для тех, кто его соблюдает. Ни одного робота она не закрывает.

  • POST /api/site/v1/pingключ сайта

    Необязательно, примерно раз в сутки: ваша платформа, версия коннектора, до 20 путей, которые он отдаёт, и сколько раз за день их прочитали известные ИИ-агенты за последние семь дней (до 60 строк). Каждое число означает итог дня на момент отправки, поэтому повторный пинг запишет то же значение. IP-адреса и user agent посетителей не передаются. Может нести и необязательное поле site: что платформа знает о сайте (название, подзаголовок, язык, адрес) и woocommerce.products с числом опубликованных товаров. Название и подзаголовок INITE предлагает владельцу подсказкой, сам по себе из этого поля ничего не публикуется. Пинг с site, но без paths, не меняет список отдаваемых путей. Если на сайте стоят плагины записи или адресов, в site можно передать services, locations и hours в формате фактов, а в from назвать плагины. Владелец увидит их подсказками. Необязательное поле referrals считает посетителей, пришедших из ИИ-ассистента (chatgpt.com, perplexity.ai, gemini.google.com, copilot.microsoft.com, claude.ai и ещё несколько): день, путь, источник и число, до 60 строк, по тому же правилу итога дня. Только числа, без адреса, cookie и сведений о человеке.

  • POST /api/site/v1/recordsключ сайта

    Собственное содержимое сайта, по одной группе за раз и только пока владелец включил её в коннекторе: content (опубликованные страницы и записи: id, type, title, url, excerpt, modified, language), products (id, name, url, price, regularPrice, salePrice, currency, stock, sku, excerpt, categories, image) или events (id, title, url, excerpt, starts, ends, venue). В одной загрузке до 100 позиций, только изменённые. В removed перечисляются исчезнувшие id, в present все оставшиеся (прочие удаляются), а clear: true удаляет группу целиком. Адреса должны быть на собственном домене сайта. INITE хранит до 2000 страниц и записей, 2000 товаров и 200 событий, а ответ сообщает, сколько хранится сейчас. В течение пяти минут из них собираются llms.txt, llms-full.txt и товары для MCP. Товары публикуются, только пока владелец включил «Публиковать мой каталог».

  • GET /api/site/v1/summaryключ сайта

    Только чтение, для панели самого коннектора: оценка видимости в ИИ и непройденные проверки последнего анализа, чтения агентов, вызовы MCP и посетители из ИИ-ассистентов за тридцать дней, а также сколько подсказок и статей ждут владельца. INITE пересчитывает сводку раз в три часа, запрашивать её достаточно раз в несколько часов. Разбивка по агентам, страницам и ассистентам входит в INITE Agents Premium, без него в ответе только итоги.

  • GET /api/site/v1/content/queueключ сайта

    Статьи, которые владелец одобрил, а этот сайт ещё не опубликовал, начиная с самых давних, не больше десяти за ответ. Пока владелец не включил статьи, очередь пуста и приходит enabled: false.

  • POST /api/site/v1/content/{id}/publishedключ сайта

    Сообщает, что статья опубликована, и передаёт её адрес. Повторная отправка того же адреса безопасна.

  • POST /api/site/v1/content/{id}/failedключ сайта

    Сообщает, что статью опубликовать не удалось, и передаёт причину. Статья уходит из очереди, пока владелец не отправит её снова.

  • GET /api/site/v1/public/{slug}?d={domain}публично, без ключа

    Подтверждённые факты в JSON. Запрос разрешён с любого origin: эти факты читает скрипт WebMCP в браузере. Ответ кешируется на пять минут и приходит с ETag.

  • GET /api/site/v1/webmcp.js?s={slug}&d={domain}&v={version}публично, без ключа

    Скрипт для head страницы; его адрес с нужной версией лежит в манифесте, в head.script.src. Скрипт даёт ИИ-агенту в браузере инструменты для чтения подтверждённых фактов. В браузере без WebMCP он ничего не делает и не ставит cookie.

  • GET /api/site/v1/snippet.js?s={slug}&d={domain}публично, без ключа

    Скрипт, который загружает тег сниппета. Отдаётся, пока факты опубликованы и сниппет включён в кабинете, иначе приходит комментарий, который ничего не делает. Скрипт регистрирует инструменты WebMCP и добавляет ссылки и JSON-LD текущей версии; если на странице статичный блок той же версии, его JSON-LD остаётся как есть. Ответ кешируется на пять минут и приходит с ETag. Загрузка отмечает в кабинете, что сниппет видели, и сохраняется только время, о посетителе ничего.

  • GET /api/site/v1/public/{slug}/prices.yml?d={domain}публично, без ключа

    Прайс-лист в формате YML: Яндекс Бизнес загружает его по ссылке. В нём только услуги с одной ценой в рублях, тенге или белорусских рублях. Файл создаётся при подтверждении фактов. Пока факты сняты с публикации, адрес отвечает 404. Кешируется на пять минут, отдаётся с ETag.

  • POST /api/site/v1/public/{slug}/requests?d={domain}публично, без ключа

    Сюда отправляют заявки инструменты request_contact и request_booking скрипта WebMCP, адрес открыт для любого источника: {"tool", "arguments"} с теми же аргументами, что у инструментов MCP. В ответе номер заявки и критерии, по которым видно, что всё сделано правильно. 422 называет поле, которое надо исправить, 409 значит, что владелец выключил заявки, 429 означает превышенный лимит или повтор. С одного адреса три заявки сразу, дальше шесть в час.

  • GET /api/site/v1/requests?status={status}&page={page}ключ сайта

    Заявки от агентов для сайта, новые сверху, по 25 на странице, с количеством по статусам. Пусто и enabled: false, если владелец не отправляет заявки в этот коннектор.

  • POST /api/site/v1/requests/{id}ключ сайта

    Отметить заявку как новую, отвеченную или спам: {"status": "answered"}. Из-за отметки никому ничего не отправляется.

Адреса с ключом отказывают JSON-телом {"ok": false, "error", "message"}, и message можно показать пользователю как есть. 401: no_key, unknown_key или revoked. 403: disabled, ключ выключен. 409: unproved (домен ещё не подтверждён), unconfirmed (публиковать пока нечего), unpublished (владелец снял факты с публикации в кабинете) или company_inactive. В любом из этих случаев перестаньте отдавать файлы. При таймауте или ответе 5xx оставьте в работе последнюю сохранённую копию.

Запрос манифеста

curl -i https://inite.ai/api/site/v1/manifest \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'If-None-Match: "m4-Qx…"'
{
  "ok": true,
  "site": {
    "slug": "acme",
    "domain": "acme.com",
    "version": 4,
    "confirmedAt": "2026-10-22T10:00:00.000Z"
  },
  "connector": {
    "id": "cm2x8k1qz0001",
    "platform": "next",
    "enabled": true
  },
  "mcp": {
    "url": "https://acme.inite.ai/mcp"
  },
  "files": [
    {
      "name": "llms.txt",
      "path": "/llms.txt",
      "placement": "path",
      "contentType": "text/plain; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/llms.txt",
      "available": true,
      "etag": "\"f4-llms.txt\""
    },
    {
      "name": "agent-card.json",
      "path": "/.well-known/agent-card.json",
      "placement": "path",
      "contentType": "application/json; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/agent-card.json",
      "available": true,
      "etag": "\"f4-agent-card.json\""
    },
    {
      "name": "mcp.json",
      "path": "/.well-known/mcp.json",
      "placement": "path",
      "contentType": "application/json; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/mcp.json",
      "available": true,
      "etag": "\"f4-mcp.json\""
    },
    {
      "name": "api-catalog",
      "path": "/.well-known/api-catalog",
      "placement": "path",
      "contentType": "application/linkset+json; profile=\"https://www.rfc-editor.org/info/rfc9727\"",
      "url": "https://inite.ai/api/site/v1/files/api-catalog",
      "available": true,
      "etag": "\"f4-api-catalog\""
    },
    {
      "name": "robots-signal",
      "path": null,
      "placement": "robots",
      "contentType": "text/plain; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/robots-signal",
      "available": true,
      "etag": "\"f4-robots-signal\""
    },
    {
      "name": "jsonld",
      "path": null,
      "placement": "head",
      "contentType": "application/json; charset=utf-8",
      "url": "https://inite.ai/api/site/v1/files/jsonld",
      "available": true,
      "etag": "\"f4-jsonld\""
    }
  ],
  "head": {
    "html": "<script src=\"https://inite.ai/api/site/v1/webmcp.js?s=acme&amp;d=acme.com&amp;v=4&amp;r=cb\" async crossorigin=\"anonymous\"></script>\n<link rel=\"mcp\" href=\"https://acme.inite.ai/mcp\">\n<link rel=\"service-doc\" href=\"https://acme.inite.ai/llms.txt\" type=\"text/plain\">\n<link rel=\"describedby\" href=\"https://acme.inite.ai/.well-known/agent-card.json\" type=\"application/json\">\n<link rel=\"api-catalog\" href=\"https://acme.inite.ai/.well-known/api-catalog\" type=\"application/linkset+json\">\n<script type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"Dentist\",\"name\":\"Acme Dental\",\"url\":\"https://acme.com\"}</script>",
    "script": {
      "src": "https://inite.ai/api/site/v1/webmcp.js?s=acme&d=acme.com&v=4&r=cb",
      "async": true
    },
    "links": [
      {
        "rel": "mcp",
        "href": "https://acme.inite.ai/mcp"
      },
      {
        "rel": "service-doc",
        "href": "https://acme.inite.ai/llms.txt",
        "type": "text/plain"
      },
      {
        "rel": "describedby",
        "href": "https://acme.inite.ai/.well-known/agent-card.json",
        "type": "application/json"
      },
      {
        "rel": "api-catalog",
        "href": "https://acme.inite.ai/.well-known/api-catalog",
        "type": "application/linkset+json"
      }
    ],
    "jsonLd": {
      "@context": "https://schema.org",
      "@type": "Dentist",
      "name": "Acme Dental",
      "url": "https://acme.com"
    }
  },
  "features": {
    "files": true,
    "head": true,
    "webmcp": true,
    "menu": false,
    "content": {
      "enabled": true,
      "queueUrl": "https://inite.ai/api/site/v1/content/queue"
    },
    "requests": {
      "enabled": true,
      "booking": true,
      "url": "https://inite.ai/api/site/v1/public/acme/requests?d=acme.com",
      "listUrl": "https://inite.ai/api/site/v1/requests",
      "toPlugin": true
    }
  },
  "poll": {
    "afterSeconds": 300
  }
}

Пинг

curl https://inite.ai/api/site/v1/ping \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'Content-Type: application/json' \
  -d '{ "platform": "next", "pluginVersion": "0.2.0", "paths": [ "/llms.txt", "/.well-known/agent-card.json", "/robots.txt" ], "visits": [ { "day": "2026-10-22", "path": "/llms.txt", "agent": "ClaudeBot", "hits": 12 } ], "site": { "title": "Sorriso", "tagline": "Dental clinic in Pinheiros", "language": "pt-BR", "url": "https://sorriso.example/", "woocommerce": { "products": 12 } }, "referrals": [ { "day": "2026-10-22", "path": "/prices/", "source": "chatgpt.com", "hits": 3 } ] }'
{
  "ok": true,
  "visits": 1,
  "referrals": 1,
  "paths": 3,
  "platformMatches": true
}

Как передать содержимое сайта

curl https://inite.ai/api/site/v1/records \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'Content-Type: application/json' \
  -d @products-page.json
{
  "group": "products",
  "items": [
    {
      "id": "412",
      "name": "Whitening kit",
      "url": "https://sorriso.example/loja/whitening-kit/",
      "price": "149.90",
      "regularPrice": "189.90",
      "salePrice": "149.90",
      "currency": "BRL",
      "stock": "instock",
      "sku": "WK-01",
      "excerpt": "Trays and gel for two weeks at home.",
      "categories": [
        "Care at home"
      ],
      "image": "https://sorriso.example/wp-content/uploads/wk.jpg",
      "modified": "2026-10-22T14:05:00+00:00"
    }
  ],
  "removed": [
    "388"
  ]
}
{
  "ok": true,
  "group": "products",
  "accepted": 1,
  "capped": 0,
  "removed": 1,
  "held": 12,
  "cap": 2000,
  "dropped": 0
}

Статьи

INITE пишет статьи для сайта компании по тому, что люди действительно ищут, а владелец одобряет каждую в кабинете. Коннектор получает одобренные статьи и сообщает, где опубликовал каждую. Он получает текст в том виде, в каком его одобрили: заголовок, slug, meta description, тело в Markdown, то же тело в HTML и источники, на которые статья ссылается.

Очередь

curl https://inite.ai/api/site/v1/content/queue \
  -H "Authorization: Bearer $INITE_SITE_KEY"
{
  "ok": true,
  "enabled": true,
  "items": [
    {
      "id": "cm2y0v7ka0004",
      "lang": "en",
      "title": "How much does a dental cleaning cost in Austin?",
      "slug": "dental-cleaning-cost-austin",
      "metaDescription": "What a cleaning costs at Acme Dental, what it includes, and when insurance covers it.",
      "body": "## What a cleaning includes\n\nA cleaning at Acme Dental takes about 45 minutes…",
      "html": "<h2>What a cleaning includes</h2>\n<p>A cleaning at Acme Dental takes about 45 minutes…</p>\n",
      "sources": [
        {
          "url": "https://www.ada.org/resources/research/health-policy-institute",
          "title": "ADA Health Policy Institute"
        }
      ],
      "approvedAt": "2026-10-22T09:30:00.000Z",
      "report": {
        "published": "https://inite.ai/api/site/v1/content/cm2y0v7ka0004/published",
        "failed": "https://inite.ai/api/site/v1/content/cm2y0v7ka0004/failed"
      }
    }
  ]
}

Запрашивайте очередь по своему расписанию, например раз в час, или когда приходит событие content.approved. Адреса из поля report в каждой статье находятся на inite.ai и принимают тот же ключ сайта.

Отчёт о результате

curl https://inite.ai/api/site/v1/content/cm2y0v7ka0004/published \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'Content-Type: application/json' \
  -d '{ "url": "https://acme.com/blog/dental-cleaning-cost-austin/" }'
{
  "ok": true,
  "status": "published",
  "url": "https://acme.com/blog/dental-cleaning-cost-austin/",
  "already": false
}

Адрес должен начинаться с http или https и вести на домен самого сайта или его поддомен. На повтор того же адреса придёт already: true, поэтому повторить запрос после потерянного ответа безопасно. Другой адрес для уже опубликованной статьи сервис отклонит с 409 published_elsewhere.

curl https://inite.ai/api/site/v1/content/cm2y0v7ka0004/failed \
  -H "Authorization: Bearer $INITE_SITE_KEY" \
  -H 'Content-Type: application/json' \
  -d '{ "reason": "the blog category is missing" }'
{
  "ok": true,
  "status": "failed",
  "already": false
}

Причина сохраняется до 300 символов и видна владельцу. На второй отчёт о неудаче по той же статье придёт already: true.

Другие ответы: 404 not_found (это не статья этого сайта), 409 not_approved (статья не ждёт публикации), 422 invalid_url, 400 bad_json, 413 too_large (тело до 8 КБ).

Вебхук

Добавьте адрес с https:// во вкладке «Для агентов», до трёх на сайт. Мы отправляем на него подписанный POST по трём событиям: facts.confirmed, когда компания подтверждает факты, content.approved, когда владелец одобряет статью, и lead.created на каждую заявку от агента, если владелец отправляет заявки на вебхук. Какое это событие, видно по заголовку INITE-Event и полю event. Секрет для подписи показывается один раз, при добавлении адреса.

facts.confirmed

POST /your/endpoint
Content-Type: application/json
User-Agent: INITE-Webhooks/1.0 (+https://inite.ai/en/mcp#site-api)
INITE-Event: facts.confirmed
INITE-Webhook-Id: evt_3hGkV0bq9rS1xYw2LmN4pQ7z
INITE-Signature: t=1792663200,v1=5f2b…

{
  "id": "evt_3hGkV0bq9rS1xYw2LmN4pQ7z",
  "event": "facts.confirmed",
  "site": "acme.com",
  "slug": "acme",
  "version": 4,
  "confirmedAt": "2026-10-22T10:00:00.000Z",
  "manifestUrl": "https://inite.ai/api/site/v1/manifest",
  "factsUrl": "https://inite.ai/api/site/v1/public/acme?d=acme.com"
}

content.approved

POST /your/endpoint
Content-Type: application/json
User-Agent: INITE-Webhooks/1.0 (+https://inite.ai/en/mcp#site-api)
INITE-Event: content.approved
INITE-Webhook-Id: evt_Vb1mR8sQx2LkT0wYh7nP4cZd
INITE-Signature: t=1792663200,v1=5f2b…

{
  "id": "evt_Vb1mR8sQx2LkT0wYh7nP4cZd",
  "event": "content.approved",
  "site": "acme.com",
  "slug": "acme",
  "article": {
    "id": "cm2y0v7ka0004",
    "lang": "en",
    "title": "How much does a dental cleaning cost in Austin?",
    "slug": "dental-cleaning-cost-austin",
    "metaDescription": "What a cleaning costs at Acme Dental, what it includes, and when insurance covers it.",
    "body": "## What a cleaning includes\n\nA cleaning at Acme Dental takes about 45 minutes…",
    "html": "<h2>What a cleaning includes</h2>\n<p>A cleaning at Acme Dental takes about 45 minutes…</p>\n",
    "sources": [
      {
        "url": "https://www.ada.org/resources/research/health-policy-institute",
        "title": "ADA Health Policy Institute"
      }
    ],
    "approvedAt": "2026-10-22T09:30:00.000Z"
  },
  "report": {
    "published": "https://inite.ai/api/site/v1/content/cm2y0v7ka0004/published",
    "failed": "https://inite.ai/api/site/v1/content/cm2y0v7ka0004/failed"
  }
}

В content.approved приходит та же статья, что и в очереди, так что получатель может опубликовать её без лишнего запроса. Результат отправьте на адреса из report с ключом сайта, как это делает коннектор; до тех пор статья остаётся и в очереди.

lead.created

POST /your/endpoint
Content-Type: application/json
User-Agent: INITE-Webhooks/1.0 (+https://inite.ai/en/mcp#site-api)
INITE-Event: lead.created
INITE-Webhook-Id: evt_Qe5nB2vXk8LmR1tYz0cH7dWs
INITE-Signature: t=1792663200,v1=5f2b…

{
  "id": "evt_Qe5nB2vXk8LmR1tYz0cH7dWs",
  "event": "lead.created",
  "site": "acme.com",
  "slug": "acme",
  "lead": {
    "id": "cm2z4r9tb0007",
    "kind": "booking",
    "name": "Ana Costa",
    "email": "[email protected]",
    "phone": null,
    "message": "A cleaning, and my gums bleed a little.",
    "service": "Dental cleaning",
    "preferredTime": null,
    "windows": [
      {
        "date": "2026-10-30",
        "from": "10:00",
        "to": "12:00"
      }
    ],
    "partySize": null,
    "via": "mcp",
    "client": "claude-code",
    "factsVersion": 4,
    "createdAt": "2026-10-23T14:02:00.000Z"
  },
  "cabinetUrl": "https://inite.ai/en/acme/profile?tab=agents"
}

lead.created приходит, только если владелец выбрал «На мой вебхук» в разделе «Заявки от агентов». В событии имя, контакты и сообщение человека, чтобы компания могла ответить, поэтому обращайтесь с ними как с персональными данными. Ниже та же заявка в том виде, в каком её отправляет скрипт WebMCP.

{
  "tool": "request_booking",
  "arguments": {
    "service": "Dental cleaning",
    "preferred_windows": [
      {
        "date": "2026-10-30",
        "from": "10:00",
        "to": "12:00"
      }
    ],
    "name": "Ana Costa",
    "contact": {
      "email": "[email protected]"
    },
    "user_confirmed": true
  }
}

Подпись

Прежде чем верить телу, проверьте INITE-Signature. t: время подписи в секундах Unix. v1: HMAC-SHA256 строки, склеенной из t, точки и сырого тела; ключом служит ваш секрет. Отклоняйте запрос, если t отличается от текущего времени больше чем на пять минут. INITE-Webhook-Id одинаков у всех повторов одного события, по нему повтор можно отбросить.

Проверка подписи в Node.js

import { createHmac, timingSafeEqual } from 'node:crypto'

// rawBody: the request body as received, before JSON.parse.
export function verify(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')))
  const t = Number(parts.t)
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false
  const want = createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex')
  const got = String(parts.v1 ?? '')
  return got.length === want.length && timingSafeEqual(Buffer.from(got), Buffer.from(want))
}

Ответьте любым кодом 2xx в течение десяти секунд. Иначе мы повторим отправку с паузами 1, 5, 30, 120 и 360 минут; после шестой попытки доставка считается неудачной. По редиректам мы не переходим. В кабинете видны последние десять попыток для каждого адреса.