Коротко. AI-готовность — это проверяемое состояние сайта: краулеры ИИ-сервисов получают HTML без блокировок, находят в нём текст без запуска JavaScript и извлекают из него готовый ответ. Проверяется не ощущением, а командами: код ответа на бот-User-Agent, объём текста в исходном HTML, парсится ли JSON-LD, время до первого байта. Ниже — двенадцать пунктов, и для каждого команда и критерий «пройдено».

Что такое AI-готовность и чем она отличается от SEO
Поисковая оптимизация отвечает на вопрос «на какой позиции страница». AI-готовность отвечает на другой: «сможет ли модель вообще достать отсюда факт и назвать источник». Пересечение большое — обеим нужен доступный HTML и понятная структура, — но проверки разные. В SEO вы смотрите на индекс и запросы; в AI-готовности вы смотрите на то, что физически приходит в ответ на HTTP-запрос от бота.
Практический смысл: сайт может быть в индексе Яндекса и Google, иметь трафик и при этом отдавать ИИ-краулеру 403 от CDN или пустой каркас без текста. Ни то, ни другое не видно в отчётах вебмастера — это видно только в логах и в ответе curl.
AI-готовность — не рейтинг и не оценка. Это набор бинарных условий: либо бот получил текст, либо нет. Всё, что нельзя проверить командой и получить «да/нет», в чек-лист не входит.
Как пользоваться чек-листом: что считать «пройдено»
Каждый пункт ниже устроен одинаково: что проверяем — команда — как выглядит «пройдено» — как выглядит «не пройдено». Прогоняйте по одной репрезентативной странице каждого типа: главная, страница каталога, карточка товара или услуги, статья. Ошибки почти всегда типовые, а не постраничные.
Перед началом заведите переменную с реальной строкой User-Agent — половина проверок опирается на неё. Строки берите только из документации самого оператора: она указана прямо в User-Agent после знака +.
UA_GPT='Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot'
UA_BROWSER='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
SITE='https://example.com'
Номер версии в строке меняется — если вы фильтруете логи, ищите подстроку GPTBot, а не точную версию.
Блок 1. Доступ: пускает ли сайт ИИ-краулеров
Самый частый провал — не отсутствие разметки, а обычный отказ на входе. Причём отказ бывает в трёх разных местах, и лечится он в трёх разных местах.
Пункт 1. robots.txt не запрещает нужные токены
curl -sS "$SITE/robots.txt" | grep -inE -A6 'user-agent:[[:space:]]*(\*|GPTBot|OAI-SearchBot|ClaudeBot|Claude-SearchBot|Claude-User|PerplexityBot|Google-Extended|CCBot)'
Пройдено: для каждого токена, который вы хотите пустить, в его группе нет строки Disallow: /. Не пройдено: есть группа User-agent: * с Disallow: / и нет отдельных разрешающих групп; или файл отдаёт 404 вместо 200 (тогда, по RFC 9309, обход считается разрешённым, но вы теряете контроль и строку Sitemap).
Главная ловушка — правило выбора группы. Бот применяет одну наиболее специфичную группу и полностью игнорирует остальные. Если для GPTBot есть своя группа, то Disallow из User-agent: * на него не действует — и наоборот: аккуратно написанный запрет в звёздочке ничего не запретит боту, у которого есть персональная группа с Allow: /. Разбор всех сценариев разрешений — в отдельном материале про robots.txt и ИИ-ботов.
Изменения в robots.txt не применяются мгновенно. OpenAI и Perplexity в документации указывают, что их системам нужно порядка суток, чтобы подхватить новый файл. Не делайте выводов через десять минут после правки.
Пункт 2. WAF и CDN не отдают ботам 403
robots.txt — это договорённость, а WAF — реальный барьер. Часть облачных провайдеров включает блокировку ИИ-краулеров в наборе правил по умолчанию, и владелец сайта об этом не знает. Сравните два запроса:
for ua in "$UA_GPT" "$UA_BROWSER"; do
curl -s -o /dev/null -A "$ua" \
-w 'code=%{http_code} bytes=%{size_download} ttfb=%{time_starttransfer}s\n' "$SITE/"
done
Пройдено: оба запроса дают 200 и сопоставимый размер тела. Не пройдено: на бот-строке приходит 403, 429, 503 или 200 с телом в несколько килобайт — это страница-челлендж, а не ваш контент.
Чего этот тест не показывает. Правила, привязанные к IP-адресу, он не поймает: ваш адрес не принадлежит диапазонам бота, поэтому «разрешить по IP» вы не проверите со своей машины. Обратная ситуация тоже возможна — WAF может пропустить любой запрос со строкой GPTBot с произвольного IP, и это уже дыра, а не «пройдено». Настоящая проверка того, дошёл ли бот, — только логи (см. как ИИ-краулеры читают сайт).
Пункт 3. Вы понимаете, чем платите за каждую блокировку
«Закрыть всех ИИ-ботов» — решение, у которого разная цена для разных токенов. Операторы документируют последствия явно.
| Токен | Кто | Что делает | Что теряете, запретив |
|---|---|---|---|
| GPTBot | OpenAI | Сбор данных для обучения моделей | Использование контента в обучении. На выдачу в поиске ChatGPT не влияет |
| OAI-SearchBot | OpenAI | Индексация для поиска в ChatGPT | Показ сайта в поисковых ответах ChatGPT |
| ChatGPT-User | OpenAI | Переход по ссылке в момент запроса пользователя | Инициируется человеком, поэтому правила robots.txt могут не применяться |
| ClaudeBot | Anthropic | Сбор данных для обучения | Использование материалов в обучающих наборах |
| Claude-SearchBot | Anthropic | Индексация для качества поиска | Точность и видимость сайта в поисковых ответах |
| Claude-User | Anthropic | Загрузка страницы по запросу пользователя | Показ сайта при пользовательском веб-поиске |
| PerplexityBot | Perplexity | Индексация для выдачи со ссылками | Появление сайта в результатах Perplexity |
| Perplexity-User | Perplexity | Переход по запросу пользователя | По документации обычно игнорирует robots.txt |
| Google-Extended | Только токен управления, своей строки User-Agent нет | Обучение Gemini и подгрузку контента в ответ. На включение в поиск Google и на ранжирование не влияет | |
| Applebot-Extended | Apple | Управляющий токен поверх Applebot | Использование материалов в обучении моделей Apple |
| CCBot | Common Crawl | Открытый датасет, из которого берут данные многие | Попадание в публичный корпус |
Строка Google-Extended в логах не появится никогда: у неё нет собственного User-Agent, обход выполняют обычные агенты Google. Искать её в access.log — потерянное время.

Блок 2. Извлекаемость: находит ли бот текст
Доступ получен — дальше вопрос, есть ли в ответе слова. Здесь ломается больше половины современных сайтов на клиентских фреймворках.
Пункт 4. Основной текст есть в исходном HTML
Смотреть надо именно на сырой ответ сервера, а не на панель «Элементы» в браузере: инспектор показывает DOM уже после исполнения скриптов.
curl -sL -A "$UA_GPT" "$SITE/page" \
| python3 -c "import sys,re,html
t=sys.stdin.read()
t=re.sub(r'(?is)<script.*?</script>|<style.*?</style>|<!--.*?-->',' ',t)
t=re.sub(r'(?s)<[^>]+>',' ',t)
t=re.sub(r'\s+',' ',html.unescape(t)).strip()
print('слов:',len(t.split()))
print(t[:400])"
Пройдено: число слов сопоставимо с тем, что вы видите на странице, а первые 400 символов — осмысленный текст, а не только меню. Не пройдено: 30–80 слов и в выводе одна навигация с футером — тело страницы собирается на клиенте, и бот его не увидит.
Порог удобно держать в голове такой: если на странице визуально 800 слов, а команда показывает меньше 200 — контент клиентский. Разбор конкретных приёмов, которые возвращают текст в HTML, — в материале про извлекаемость контента.
Пункт 5. Прямой ответ стоит в первом абзаце
Модель собирает ответ из фрагментов. Фрагмент, который начинается с определения или вывода, цитируется охотнее, чем абзац-разгон вида «в современном мире всё чаще возникает вопрос». Проверка простая — прочитать первые 60 слов и спросить себя: если оставить только их, ответ на заглавный вопрос получен?
curl -sL "$SITE/page" \
| python3 -c "import sys,re,html
t=sys.stdin.read()
m=re.search(r'(?is)<h1[^>]*>(.*?)</h1>(.*?)<h2', t)
if not m: print('h1 или h2 не найдены'); raise SystemExit
head=re.sub(r'<[^>]+>',' ',m.group(1))
body=re.sub(r'<[^>]+>',' ',m.group(2))
f=lambda s: re.sub(r'\s+',' ',html.unescape(s)).strip()
print('H1:',f(head))
print('ЛИД:',' '.join(f(body).split()[:60]))"
Пройдено: лид — 40–80 слов, содержит прямой ответ и ключевые сущности. Не пройдено: между h1 и первым h2 вообще нет текста (сразу картинка, форма подписки, хлебные крошки) или лид не отвечает на вопрос заголовка.
Пункт 6. Разметка семантическая, а не «стена div»
curl -sL "$SITE/page" | grep -oE '</?(h1|h2|h3|ul|ol|table|article|main|nav)\b' \
| sort | uniq -c | sort -rn
Пройдено: ровно один h1, несколько h2, есть списки и хотя бы один main или article. Не пройдено: ноль h2, два и более h1, заголовки сделаны крупным текстом внутри div.
Заголовки нужны не ради «правильной вёрстки». Они задают границы фрагментов: там, где нет h2, страница для машины — один длинный неделимый блок, из которого труднее вырезать точный ответ.
Пункт 7. Текст не спрятан в картинках
Скриншот таблицы тарифов, инфографика с цифрами, схема с подписями — для модели это пустое место. Проверяйте так: выключите загрузку изображений или прогоните команду из пункта 4 и посмотрите, остались ли в тексте те числа и термины, которые есть на картинках. Если ключевая цифра существует только внутри .png — продублируйте её текстом или таблицей рядом.
Блок 3. Разметка: что действительно читают
Пункт 8. JSON-LD есть в исходном HTML и парсится
Типичная ошибка не в том, что разметки нет, а в том, что её вставляет менеджер тегов или скрипт темы. В DevTools она видна, в ответе сервера — нет.
curl -sL -A "$UA_GPT" "$SITE/page" \
| python3 -c "import sys,re,json,html
raw=sys.stdin.read()
blocks=re.findall(r'(?is)<script[^>]*ld\+json[^>]*>(.*?)</script>', raw)
print('блоков JSON-LD в сыром HTML:', len(blocks))
for i,b in enumerate(blocks,1):
try:
d=json.loads(html.unescape(b))
d=d if isinstance(d,list) else [d]
print(i,'ok @type =', [x.get('@type') for x in d])
except Exception as e:
print(i,'НЕ ПАРСИТСЯ:', e)"
Пройдено: минимум один блок, все парсятся, @type совпадает с тем, что на странице реально есть. Не пройдено: ноль блоков в сыром HTML при видимой разметке в браузере; ошибка парсинга из-за лишней запятой; FAQPage на странице, где нет вопросов и ответов.
Какие типы имеют смысл и как их не переусложнить — разобрано отдельно в Schema.org для ИИ-поиска. Здесь важен только факт: разметка должна лежать в ответе сервера и не расходиться с видимым текстом.
Пункт 9. Мета-данные не пустые и не дублируются
curl -sL "$SITE/page" | grep -oiE '<title>[^<]*|<meta[^>]+(description|robots|canonical)[^>]*' | head
Пройдено: есть непустой title, описание, канонический адрес, а в robots нет noindex на странице, которую вы хотите показывать. Не пройдено: noindex, оставшийся с тестового контура, — самая дорогая опечатка в этом списке.
Блок 4. llms.txt: что он делает и чего не делает
Файл /llms.txt — предложенный сообществом формат: краткое описание сайта и список приоритетных материалов в Markdown. Сделать его дёшево, вреда он не наносит, и он удобен как машиночитаемое оглавление для ваших же интеграций.
# Название сайта
> Одно предложение: чем сайт полезен и кому.
## Основное
- [Чек-лист AI-готовности](/articles/ai-readiness-checklist): что проверить и какой командой
- [Как ИИ-краулеры читают сайт](/articles/how-ai-crawlers-read-sites): user-agent, JS, логи
## Справочники
- [Гайд по llms.txt](/articles/llms-txt-guide): формат и типовые ошибки
Пройдено: файл отдаётся с кодом 200 и типом text/plain, ссылки в нём живые.
curl -sI "$SITE/llms.txt" | head -n 3
curl -s "$SITE/llms.txt" | grep -oE '\]\(/[^)]+\)' | tr -d '](' | while read p; do
printf '%s %s\n' "$(curl -s -o /dev/null -w '%{http_code}' "$SITE$p")" "$p"
done
Честная оговорка. Ни один крупный оператор ИИ-поиска публично не подтверждал, что использует llms.txt при обходе. Считать его каналом попадания в ответы нельзя. Это оглавление «на всякий случай», а не замена доступному HTML и sitemap. Формат и разбор ошибок — в гайде по llms.txt, проверить свой файл можно в валидаторе llms.txt.

Блок 5. Скорость и вес ответа для краулера
Пункт 10. Время до первого байта и размер HTML в норме
Бот не ждёт бесконечно и не грузит бесконечный документ. Google документирует свои лимиты прямо: при обходе для поиска берётся первый мегабайт-другой поддерживаемого типа файла (в справке названы 2 МБ, для PDF — 64 МБ), лимит считается по несжатым данным, а каждый подключённый ресурс тянется отдельно с тем же ограничением. Остальные операторы своих чисел не публикуют — поэтому измеряйте и держите запас.
curl -sL -o /tmp/page.html -A "$UA_GPT" \
-w 'code=%{http_code}\ndns=%{time_namelookup}\nconnect=%{time_connect}\nttfb=%{time_starttransfer}\ntotal=%{time_total}\nredirects=%{num_redirects}\n' "$SITE/page"
wc -c /tmp/page.html
Пройдено: ttfb меньше примерно 0,8 с на холодном запросе, num_redirects равен 0 или 1, несжатый HTML — сотни килобайт, а не мегабайты. Не пройдено: секунды TTFB, цепочка из трёх и более редиректов, документ на несколько мегабайт из-за инлайновых данных.
| Поле curl -w | Что показывает | Ориентир «пройдено» |
|---|---|---|
%{http_code} | Итоговый код ответа | 200 |
%{time_namelookup} | Разрешение имени | < 0,1 с |
%{time_connect} | TCP-соединение | < 0,2 с |
%{time_starttransfer} | Время до первого байта | < 0,8 с |
%{num_redirects} | Число переходов | 0–1 |
%{size_download} | Размер тела | Сотни КБ, не мегабайты |
Замер удобнее делать не с ноутбука по домашнему каналу, а инструментом с внешнего узла: проверка скорости и анализ заголовков ответа дают ту же картину без влияния вашего провайдера. По сжатию есть отдельный разбор — gzip и Brotli.
Пункт 11. Сайт стабильно отвечает, а не «обычно отвечает»
Обход происходит в неизвестный вам момент. Если раз в сутки на пять минут отдаётся 502, вероятность попасть в это окно ненулевая, а повторного захода может не быть неделями. Практический критерий: за последние 30 дней доля ответов 5xx на публичных страницах близка к нулю. Это не про ИИ отдельно — это обычный мониторинг доступности.
Один 503 в момент обхода стоит дороже, чем отсутствие разметки. Разметку бот дочитает при следующем визите, а страницы, которой не было, для него просто не существует.
Блок 6. Обнаружимость: как бот вообще узнаёт о странице
Пункт 12. Sitemap и внутренние ссылки в порядке
Обход начинается со ссылок. Страница, на которую не ведёт ни один обычный <a href> и которой нет в карте сайта, обнаруживается только случайно.
curl -s "$SITE/robots.txt" | grep -i '^sitemap:'
curl -s "$SITE/sitemap.xml" | grep -c '<loc>'
Пройдено: в robots.txt есть строка Sitemap:, карта отдаёт 200 и содержит ожидаемое число адресов. Не пройдено: карта ссылается на http:// при живом HTTPS, содержит адреса с редиректами или страницы с noindex. Навигация целиком на JavaScript без настоящих ссылок — тот же случай: для бота таких переходов нет. Подробности — в гайде по sitemap.xml, битые адреса ищет проверка ссылок.
Что НЕ помогает: шесть мифов об AI-готовности
Половина работы — не делать лишнего. Ниже то, на что регулярно тратят время без результата.
- «Добавил llms.txt — попал в ответы». Нет. Ни один крупный оператор публично не подтверждал, что читает этот файл при обходе. Полезная привычка, не канал.
- «Заблокировал GPTBot — контент защищён от ИИ». GPTBot отвечает за обучение. Поиск в ChatGPT управляется другим токеном, а пользовательские загрузки (ChatGPT-User, Perplexity-User, Claude-User) инициируются человеком, и, по документации операторов, правила robots.txt к ним могут не применяться.
- «Google-Extended видно в логах». У него нет собственной строки User-Agent — это только токен управления в robots.txt. И он не влияет ни на включение в поиск Google, ни на ранжирование.
- «Чем больше разметки, тем лучше». Разметка, расходящаяся с видимым текстом, — нарушение рекомендаций и риск санкций.
FAQPageбез видимого FAQ хуже, чем отсутствиеFAQPage. - «Есть специальные мета-теги для ИИ». Придуманных директив вида
ai-contentне существует. Работают реальные механизмы: токены в robots.txt,noindex,nosnippet(Apple прямо документируетnosnippetкак отказ от использования в широких справочных ответах). - «Ключевые слова плотнее — цитируют чаще». Извлекается фрагмент, отвечающий на вопрос. Плотность слов на это не влияет, а читаемость ухудшает.

Разбор ошибок: симптом, причина, проверка, фикс
| Симптом | Вероятная причина | Чем проверить | Что сделать |
|---|---|---|---|
| На бот-строку приходит 403, на браузерную — 200 | Правило WAF или набор «AI scrapers» у CDN | curl -A с обеими строками | Разрешить нужные токены по User-Agent вместе со списком IP оператора |
| Код 200, но в теле 40 слов | Контент рендерится на клиенте | Подсчёт слов из пункта 4 | Серверный рендеринг или предрендер ключевых шаблонов |
Разметка видна в DevTools, но не в curl | JSON-LD вставляет менеджер тегов | Скрипт из пункта 8 | Отдавать JSON-LD с сервера в исходном HTML |
| Страница есть, но бот её не запрашивает | Нет входящих ссылок и записи в sitemap | grep -c <loc> по карте | Добавить в карту и связать обычными ссылками |
| В логах много запросов и мало полезного | Обходятся фильтры каталога и параметры сортировки | Разбор логов по путям | Закрыть параметрические адреса в robots.txt, оставить канонические |
| Всё «правильно», но упоминаний нет | Нет уникальных данных: страница пересказывает то же, что сотня других | Ручное сравнение с выдачей | Добавить собственные замеры, цифры, разборы случаев |
Порядок работ жёсткий: сначала доступ, потом извлекаемость, и только потом разметка и llms.txt. Разметка на странице, которую бот получает с кодом 403, не даёт ничего.
Как проверить всё сразу
Ручные команды дают точный ответ по одной странице. Чтобы получить картину по сайту, удобнее прогнать готовые проверки:
- Проверка AI-готовности — доступ для краулеров, наличие текста в HTML, разметка и llms.txt одним прогоном.
- Валидатор llms.txt — синтаксис файла и живые ли ссылки внутри.
- Проверка robots.txt — какая группа применится к конкретному боту и конкретному адресу.
- Проверка Schema.org — какие типы найдены в исходном HTML и парсятся ли они.
- Анализ заголовков и замер скорости — коды ответов, редиректы, TTFB.
- SEO-аудит — общий фундамент: заголовки, канонические адреса, дубли.
Дальше по теме: как ИИ-краулеры читают сайт — про механику обхода и чтение логов, GEO и как попадать в ответы ИИ — про содержательную сторону, AI Overviews, Perplexity, Bing Copilot и Нейро в Яндексе — про особенности конкретных площадок.
Частые вопросы
AI-готовность — это то же самое, что SEO?
Нет. SEO целится в позицию в выдаче, AI-готовность — в то, сможет ли модель достать со страницы факт и указать источник. База общая (доступный HTML, структура, скорость), но проверки разные: в SEO вы смотрите отчёты вебмастера, здесь — ответ сервера на запрос бота.
Сколько пунктов из двенадцати критичны?
Первые пять: доступ в robots.txt, отсутствие блокировки на WAF, осознанный выбор токенов, наличие текста в исходном HTML и прямой ответ в начале. Остальное усиливает результат, но само по себе не работает.
Нужен ли llms.txt, если его никто не подтверждал?
Он не обязателен. Делайте, если это пять минут работы и вам полезно машиночитаемое оглавление. Не делайте, если ради него откладываете серверный рендеринг: приоритет несопоставим.
Как часто повторять проверку?
Полный прогон — после каждого релиза, который трогает шаблоны, CDN или robots.txt. Быстрый — код ответа на бот-строку и число слов в HTML — можно поставить на регулярный мониторинг, тогда регрессия заметна в тот же день.
Можно ли открыть поиск и закрыть обучение?
Да, у OpenAI и Anthropic токены разделены: обучающий и поисковый настраиваются независимо. Но помните про пользовательские загрузки — они инициируются человеком, и правила robots.txt к ним могут не применяться.
Помогает ли отдавать ботам отдельную версию страницы?
Нет, это клоакинг: разное содержимое по User-Agent — прямое нарушение рекомендаций поисковых систем и риск санкций. Правильный путь — один HTML, одинаково полный для всех.
Что делать, если сайт на конструкторе и серверный рендеринг недоступен?
Проверьте пункт 4: многие платформы отдают текст в HTML, и проблемы нет. Если текста действительно нет, реальный рычаг один — вынести ключевые материалы (статьи, описания, ответы) на страницы, которые платформа отдаёт статически.
Чек-лист
- robots.txt отдаёт 200; нужные токены не под
Disallow: /; учтено правило одной наиболее специфичной группы. - Бот-строка User-Agent получает 200 с полным телом, а не 403 или челлендж от CDN.
- Для каждого токена осознанно решено, что теряется при запрете.
- В исходном HTML есть основной текст: число слов сопоставимо с видимым.
- Между
h1и первымh2стоит прямой ответ на 40–80 слов. - Один
h1, несколькоh2, есть списки и таблицы. - Значимые цифры продублированы текстом, а не живут только на картинках.
- JSON-LD лежит в ответе сервера, парсится и не противоречит видимому тексту.
- Нет случайного
noindex;title, описание и канонический адрес заполнены. - llms.txt (если он есть) отдаётся как
text/plain, ссылки в нём живые. - TTFB меньше примерно 0,8 с, редиректов 0–1, несжатый HTML не мегабайты.
- Страница есть в sitemap.xml и на неё ведут обычные ссылки.