INITE для агентов
Портал, анализатор и Атлас - это инструменты, которые AI-агент вызывает без аккаунта. Для действий, где нужны вы (добавить инструмент в Атлас, посмотреть свои аудиты, оплатить), у каждого есть отдельная рельса с входом, и при подключении она попросит войти.
Адрес MCP
https://inite.ai/api/mcpStreamable 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-ownersatlas_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"
]
}
}
}Владельцам инструментов
Ваш агент может добавить инструмент в Атлас и вести его карточку: внести по адресу сайта, подтвердить домен, подсказать Атласу, где у вас страницы цен, вакансий и релизов, опубликовать скидки, попросить перечитать сайт и оплатить премиум.
- 01Подключите рельсу владельцев Атласа, https://inite.ai/api/mcp/atlas-owners, и войдите, когда клиент попросит.
- 02atlas_submit с адресом сайта читает главную, подаёт заявку и начинает подтверждение. В ответ приходят три способа подтвердить домен: ссылка-бейдж, meta-тег или DNS-запись. Поставьте один на сайт и вызовите atlas_owner_verify. Если инструмент уже есть в Атласе, заявите права на него через atlas_owner_claim.
- 03atlas_owner_card показывает, что мы прочитали для карточки и чего прочитать не смогли: цену, вакансии, релизы, компанию.
- 04atlas_owner_set_read_pages передаёт адреса ваших страниц цен, вакансий и changelog. Мы читаем их с теми же проверками, что и любые другие: цена должна быть напечатана на странице, доска вакансий должна быть вашей, у записей должны стоять даты.
- 05atlas_owner_coupon_add публикует скидку с пометкой «со слов подтверждённого владельца». atlas_owner_remeasure перечитывает сайт, atlas_owner_stats показывает просмотры и переходы.
- 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- Карточка MCP-сервера/.well-known/mcp.json
- Карточка A2A-агента/.well-known/agent-card.json
- OpenAPI/.well-known/openapi.json
- Ресурс под OAuth/.well-known/oauth-protected-resource/api/mcp
- Навыки для агентов/.well-known/agent-skills/index.json
- Действия для агентов/.well-known/agent-actions
Разработчикам сайта
Компания, которая подтвердила факты в INITE, может отдавать их со своего домена и публиковать на своём сайте статьи, которые одобрила. Выберите коннектор под платформу сайта. Сайт на другой платформе обращается к тем же адресам API и принимает события вебхука, описанные ниже.
Компания включает INITE Agents в своём кабинете, подтверждает там факты и получает ключ сайта, который нужен коннекторам ниже. Открыть INITE Agents
Какой коннектор для какой платформы
- WordPress · скачать плагин · на GitHub
Плагин INITE Agents. Установите zip через «Плагины», «Добавить новый плагин», «Загрузить плагин» и вставьте ключ сайта в «Настройки», INITE Agents. Плагин отдаёт файлы, теги для head и строку в robots.txt, а одобренные статьи превращает в записи. Новые версии приходят на экран «Плагины».
- Next.js · на GitHub
npm 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&d=acme.com&v=4&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 минут; после шестой попытки доставка считается неудачной. По редиректам мы не переходим. В кабинете видны последние десять попыток для каждого адреса.
Cookie
Прежде чем засчитать визит
Аналитика и измерение рекламы показывают, какие страницы работают и какая наша реклама приносит результат: Google Analytics и Google Ads, пиксель Meta, Яндекс Метрика и один наш собственный идентификатор. До вашего ответа ничего не сохраняется, а после отказа сайт работает так же.