# schema-org

## Что такое Schema.org JSON-LD?

**Schema.org JSON-LD** — машиночитаемые метаданные, встраиваемые в страницу блоком `<script type="application/ld+json">`. Schema.org — совместный словарь типов данных от Google, Microsoft, Yahoo и Yandex. JSON-LD — синтаксис для записи этих данных.

Пример JSON-LD на главной странице:

```html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "name": "Agent Ready Scanner",
  "applicationCategory": "DeveloperApplication",
  "url": "https://agentsready.io",
  "description": "Бесплатный сканер AI-готовности сайтов"
}
</script>
```

Разметка встраивается в `<head>` или `<body>` и не влияет на визуальное отображение — она видна только поисковикам и AI-агентам.

## Зачем сайту Schema.org JSON-LD?

Schema.org решает фундаментальную проблему: HTML содержит контент, но не говорит, **что** он значит. Параграф текста — это отзыв? Расписание? Инструкция? Без разметки AI угадывает. С разметкой — знает точно.

**Для [GEO](/glossary/geo) и [AEO](/glossary/aeo):**

AI-помощники (ChatGPT, Perplexity, Google AI Overview) используют структурированные данные при формировании ответов. Страница с `FAQPage` цитируется как готовый ответ — это основной инструмент [AEO](/glossary/aeo). Страница с `Product` и `aggregateRating` попадает в rich snippets.

**Для AI-агентов:**

Агент извлекает данные из разметки быстрее и точнее, чем из свободного HTML.

**Практические эффекты:**
- `FAQPage` → rich snippet «Вопрос-ответ», цитирование в AI-ответах
- Рецепт/статья → rich snippet с изображением
- `Organization` → Knowledge Panel
- `SoftwareApplication` → оценка в поиске по приложениям

## Как реализовать Schema.org JSON-LD?

**Минимальный набор для большинства сайтов:**

```html
<!-- Главная страница: WebSite -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Название сайта",
  "url": "https://example.com"
}
</script>

<!-- О нас: Organization -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "Компания",
  "url": "https://example.com",
  "logo": "https://example.com/logo.png",
  "contactPoint": {
    "@type": "ContactPoint",
    "email": "hello@example.com"
  }
}
</script>
```

**FAQ страница:**

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Что такое agent-readiness?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Agent-readiness — это степень готовности сайта..."
      }
    }
  ]
}
```

**Приоритетные типы для agent-readiness:**

| Тип | Когда использовать |
|---|---|
| `WebSite` | Главная страница |
| `Organization` | Страница «О нас» |
| `SoftwareApplication` | Главная для SaaS/приложений |
| `FAQPage` | Страница FAQ |
| `Article` / `TechArticle` | Статьи, документация |
| `DefinedTerm` | Страницы глоссария |
| `Service` | Страница услуг/тарифов |

**Для Astro (наш подход):**

```astro
---
const schema = {
  '@context': 'https://schema.org',
  '@type': 'SoftwareApplication',
  name: 'Agent Ready Scanner',
  url: 'https://agentsready.io',
};
---
<script type="application/ld+json" set:html={JSON.stringify(schema)}></script>
```

**Валидация:** перед деплоем проверьте на [validator.schema.org](https://validator.schema.org/) — должно быть 0 errors, желательно 0 warnings.

## Как мы проверяем Schema.org?

Наш сканер делает `GET /` (главную страницу) и проверяет:

1. **Наличие блоков JSON-LD** — ищем все `<script type="application/ld+json">` в HTML
2. **Валидный JSON** — каждый блок парсится без ошибок
3. **`@type` из приоритетного списка** — `Organization`, `Product`, `SoftwareApplication`, `Article`, `FAQPage`, `BreadcrumbList`, `WebSite`
4. **Обязательные поля по типу** — для каждого типа проверяем наличие обязательных полей (например, `WebSite` требует `name` и `url`)

Статус **pass** — если хотя бы один блок валиден и содержит приоритетный тип с нужными полями. Статус **fail** — нет ни одного JSON-LD блока или все блоки невалидны. Статус **neutral** — найдены другие форматы разметки (Microdata, RDFa), но не JSON-LD.

[← Все термины глоссария](/glossary)
