Черновик. Документация пишется вместе с платформой. Поля, шаги и названия могут измениться до запуска.

Схема контента

Сайт CMS хранится в JSON. Одни и те же данные используют редактор кабинета, сборщик и API. Схема проверяет поля и связи перед сохранением; при ошибке API возвращает путь до поля. Для готовых сайтов из архива или Git действуют отдельные настройки развёртывания.

Верхний уровень

ПолеЧто внутри
schema_versionверсия формата, сейчас 1
metaслужебные site_id и version, если заданы
businessназвание, отрасль, телефон, адрес, часовой пояс, часы работы и реквизиты
service_categories, servicesкатегории и услуги с ценами
promosакции с датами действия
reviewsотзывы и их источники
faq, staff, galleryвопросы, сотрудники и фотографии
posts, sectionsпубликации и настройки разделов акций, новостей и блога
bookingвключение страницы онлайн-записи и подписи её элементов
pagesстраницы со списками блоков
extensionsсвои коллекции, записи и компоненты
seoсуффикс заголовка, картинка для соцсетей и подтверждение поисковиков
themeтема, шаблон, цвета, шрифты и скругления
integrationsнастройки подключений, например номер счётчика Метрики

Страницы

В pages от 1 до 30 страниц, на каждой от 1 до 30 блоков. slug задаёт адрес без слешей; пустая строка обозначает главную. nav_label задаёт подпись в меню, in_nav: false скрывает страницу из навигации. Адреса системных разделов, например zapis, blog и api, занять нельзя.

Это элемент массива pages, а не полный файл сайта:

{
  "slug": "",
  "nav_label": "Главная",
  "in_nav": true,
  "seo": {
    "title": "Ремонт автомобиля и шиномонтаж на Северной, 12",
    "description": "Шиномонтаж, ремонт подвески и техническое обслуживание автомобиля. Посмотрите услуги и цены, оставьте заявку на сайте."
  },
  "blocks": [
    { "type": "hero", "title": "Ремонт автомобиля и шиномонтаж" },
    { "type": "services", "title": "Услуги и цены" },
    { "type": "cta_form", "title": "Оставьте заявку" }
  ]
}

19 типов блоков

typeСодержимое
heroпервый экран с заголовком, изображением и кнопкой
servicesвыбранные услуги или категории; необязательные service_ids и category_ids
pricesтаблица цен по категориям
promoдействующие акции из promos
aboutтекст о компании, изображение и факты
galleryфотографии из gallery
reviewsотзывы из reviews
faqвопросы и ответы из faq
staffсотрудники из staff
contactsконтакты и часы работы бизнеса
mapссылка на карту
cta_formформа заявки, текст после отправки и желаемое время звонка
quizрасчёт цены по ответам, включая условные вопросы
postsпубликации выбранного kind: news или blog
bookingвиджет онлайн-записи
packagesот 2 до 4 вариантов услуги с составом и ценой
processот 2 до 6 шагов работы
case_studyзадача, выполненная работа и результат
before_afterизображения до и после с подписями

У каждого блока можно задать anchor для ссылки внутри страницы и hidden: true, чтобы временно скрыть блок. Блоки услуг и списков ссылаются на записи по id; общую цену услуги достаточно изменить один раз. Блоки packages, process, case_study, before_after и quiz хранят свои данные внутри блока.

Для условного кейса или демонстрации до/после задайте demo: true. Квиз показывает расчёт по заданным правилам; желаемое время звонка в форме не резервирует слот записи.

Свои коллекции и компоненты

В extensions.collections описываются поля и записи: например, проекты, специалисты или объекты недвижимости. Поле имеет тип text, long_text, number, boolean, date, select, image или reference. У select нужен список options, у reference имя целевой collection. multiple: true разрешает массив значений. Ссылка указывает на id существующей записи целевой коллекции.

extensions.components связывает коллекцию с разделом сайта. Сейчас доступны отображения cards и list: компонент задаёт адрес раздела и поля заголовка, описания и изображения. Это декларативные настройки, без загрузки исполняемого кода в CMS. Для своего фронтенда используйте SDK.

Ниже значение поля extensions. После публикации компонент создаст раздел /projects/:

{
  "collections": [
    {
      "id": "projects",
      "label": "Проекты",
      "version": 1,
      "fields": [
        { "id": "title", "label": "Название", "type": "text", "required": true },
        { "id": "summary", "label": "Описание", "type": "long_text" },
        { "id": "editor_note", "label": "Заметка редактора", "type": "text", "private": true }
      ],
      "records": [
        {
          "id": "workshop",
          "values": {
            "title": "Сайт мастерской",
            "summary": "Каталог услуг и форма заявки.",
            "editor_note": "Проверить описание перед публикацией."
          }
        }
      ]
    }
  ],
  "components": [
    {
      "id": "project-list",
      "label": "Проекты",
      "slug": "projects",
      "collection": "projects",
      "renderer": "cards",
      "title_field": "title",
      "summary_field": "summary",
      "description": "Проекты мастерской: описание задач и выполненной работы."
    }
  ]
}

Лимиты: до 20 коллекций, 40 полей и 500 записей на коллекцию, до 30 компонентов. Адрес компонента не должен совпадать с адресом страницы или системного раздела. Для отображения можно привязать только публичные одиночные поля подходящего типа.

Поле с private: true исключается из опубликованных данных. Запись с hidden: true и компонент с hidden: true скрываются из публичного представления. Пользователь или агент с доступом к чтению черновика по-прежнему видит его полные данные.

Изменение через API

Все пути ниже начинаются с /api/v1:

  1. GET /sites/{site_id}/content возвращает version_id, номер версии и content.
  2. PUT /sites/{site_id}/content принимает content, expected_version_id и необязательный note. Передавайте прочитанный version_id, чтобы не затереть чужую правку.
  3. Для отдельных коллекций используйте GET /sites/{site_id}/extensions и PUT /sites/{site_id}/extensions. Тело сохранения содержит expected_version_id и extensions; ответ содержит новый version_id и extensions.
  4. Сохранение создаёт черновик. Превью и публикация выполняются отдельно, для выбранной версии.

При 409 draft_changed прочитайте текущую версию и совместите изменения. Автоматически повторять старую запись поверх нового черновика нельзя. Доступ через ключ ограничен выбранными сайтами и операциями; настройка описана в инструкции MCP.

Правила формата

  • Деньги в контенте задаются в рублях целыми числами, поля заканчиваются на _rub.
  • Даты имеют формат ГГГГ-ММ-ДД, часовой пояс бизнеса хранится в business.timezone.
  • Телефон имеет формат +7XXXXXXXXXX.
  • Картинки задаются относительным путём без ..: jpg, png, webp или avif. У каждой обязателен alt.
  • Идентификаторы записей стандартных разделов содержат строчные латинские буквы, цифры и дефис, до 48 символов.
  • В коллекциях id начинается с буквы; разрешены строчные латинские буквы, цифры, дефис и подчёркивание, до 40 символов.
  • seo.title содержит от 10 до 70 знаков, seo.description от 50 до 170.