• Docs
        • Документация OnPress v2
            • Документация OnPress v2
              • Как устроена платформа
              • Быстрый старт
              • Доступ, роли и выбор сайта
                • Страницы
                  • Frontmatter: все поля
                  • Синтаксис markdown
                  • Языки и переводы страниц
                • Фреймы
                  • Вставки onpress/
                  • Бинды data-op-bind
                  • Сборка страницы и статическая копия
                • Готовые фреймы
                  • Фрейм assistant: страница с чатом ассистента
                  • Фрейм outline: оглавление в тексте
                  • Фрейм faq: вопросы из текста страницы
                  • Фрейм article: статья
                  • Фрейм docs: документация
                  • Фрейм site__header: шапка сайта
                  • Фрейм site__footer: подвал сайта
                  • Фрейм article__faq: вопросы из набора
                  • Фрейм landing: лендинг ассистента
                  • Фрейм assistant__chat: чат обычной разметкой
                  • Фрейм site__404: страница «не найдено»
                  • Фрейм news: лента новостей
                  • Фрейм news__category: рубрика новостей
                  • Фрейм news__post: новость
                  • Фрейм news__more: читайте ещё
                  • Фрейм news__share: поделиться
                  • Фрейм author__page: страница автора
                  • Фрейм author__byline: подпись автора
                  • Фрейм author__card: карточка автора
                  • Фрейм author__avatar: аватар автора
                  • Фрейм author__socials: соцсети автора
                  • Фрейм author__head: объявление набора автора
                  • Фрейм home: главная-документ
                  • Фрейм pricing: тарифы
                • Наборы данных и системные источники
                  • Повторитель onpress/repeat
              • Стили и оформление
              • Меню
              • Сайдбар документации
              • Языки сайта
              • Настройки, главная и кэш
              • SEO
              • Медиа
              • Сайты и домены
              • Пользователи и профиль
              • Дашборд и вход
                • Рецепты
                  • Сайт с нуля
                  • Раздел документации
                  • Лендинг из конструктора
                  • FAQ на странице
                  • Свой фрейм из готового
                  • Многоязычный сайт
                  • Поменять меню
                  • Перенести страницу
                  • Картинки в статье
                  • Список из данных
                  • Сменить оформление
                • Справочник API
                  • Справочник: страницы
                  • Справочник: переводы
                  • Справочник: фреймы
                  • Справочник: данные
                  • Справочник: меню
                  • Справочник: сайдбар документации
                  • Справочник: стили
                  • Справочник: настройки, главная, кэш
                  • Справочник: языки
                  • Справочник: SEO
                  • Справочник: медиа
                  • Справочник: сайты
                  • Справочник: пользователи и профиль
                  • Справочник: вход и служебное
                • Ошибки и частые проблемы
                  • Коды ошибок
        • Старая документация v1
            • Старая документация v1
              • Начало
              • Привязка домена
              • Виджеты
              • Структура ссылок
              • Connector.js
              • Шапка
              • Подвал
              • Мультиязычность
              • Меню
              • Как настроить стили сайта через Design
              • Schema разметка
              • Open Graph
              • Аналитика
              • FAQ
              • Robots.txt
              • Sitemap
OnPress OnPress
  • Документация
  • Контакты
Войти
    • Docs
        • Документация OnPress v2
            • Документация OnPress v2
              • Как устроена платформа
              • Быстрый старт
              • Доступ, роли и выбор сайта
                • Страницы
                  • Frontmatter: все поля
                  • Синтаксис markdown
                  • Языки и переводы страниц
                • Фреймы
                  • Вставки onpress/
                  • Бинды data-op-bind
                  • Сборка страницы и статическая копия
                • Готовые фреймы
                  • Фрейм assistant: страница с чатом ассистента
                  • Фрейм outline: оглавление в тексте
                  • Фрейм faq: вопросы из текста страницы
                  • Фрейм article: статья
                  • Фрейм docs: документация
                  • Фрейм site__header: шапка сайта
                  • Фрейм site__footer: подвал сайта
                  • Фрейм article__faq: вопросы из набора
                  • Фрейм landing: лендинг ассистента
                  • Фрейм assistant__chat: чат обычной разметкой
                  • Фрейм site__404: страница «не найдено»
                  • Фрейм news: лента новостей
                  • Фрейм news__category: рубрика новостей
                  • Фрейм news__post: новость
                  • Фрейм news__more: читайте ещё
                  • Фрейм news__share: поделиться
                  • Фрейм author__page: страница автора
                  • Фрейм author__byline: подпись автора
                  • Фрейм author__card: карточка автора
                  • Фрейм author__avatar: аватар автора
                  • Фрейм author__socials: соцсети автора
                  • Фрейм author__head: объявление набора автора
                  • Фрейм home: главная-документ
                  • Фрейм pricing: тарифы
                • Наборы данных и системные источники
                  • Повторитель onpress/repeat
              • Стили и оформление
              • Меню
              • Сайдбар документации
              • Языки сайта
              • Настройки, главная и кэш
              • SEO
              • Медиа
              • Сайты и домены
              • Пользователи и профиль
              • Дашборд и вход
                • Рецепты
                  • Сайт с нуля
                  • Раздел документации
                  • Лендинг из конструктора
                  • FAQ на странице
                  • Свой фрейм из готового
                  • Многоязычный сайт
                  • Поменять меню
                  • Перенести страницу
                  • Картинки в статье
                  • Список из данных
                  • Сменить оформление
                • Справочник API
                  • Справочник: страницы
                  • Справочник: переводы
                  • Справочник: фреймы
                  • Справочник: данные
                  • Справочник: меню
                  • Справочник: сайдбар документации
                  • Справочник: стили
                  • Справочник: настройки, главная, кэш
                  • Справочник: языки
                  • Справочник: SEO
                  • Справочник: медиа
                  • Справочник: сайты
                  • Справочник: пользователи и профиль
                  • Справочник: вход и служебное
                • Ошибки и частые проблемы
                  • Коды ошибок
        • Старая документация v1
            • Старая документация v1
              • Начало
              • Привязка домена
              • Виджеты
              • Структура ссылок
              • Connector.js
              • Шапка
              • Подвал
              • Мультиязычность
              • Меню
              • Как настроить стили сайта через Design
              • Schema разметка
              • Open Graph
              • Аналитика
              • FAQ
              • Robots.txt
              • Sitemap
Документация OnPress v2
Markdown
Открыть в ИИ
  • Открыть в ChatGPT
  • Открыть в Claude
  • Открыть в Gemini
  • Открыть в Perplexity
  • Открыть в Grok
  • Открыть в DeepSeek

Наборы данных и системные источники

Всё повторяющееся на странице — пункты меню, вопросы FAQ, карточки тарифов, дочерние страницы, хлебные крошки — выводит повторитель onpress/repeat из списка по имени. Список берётся из одного из трёх мест, всегда в одном порядке:

  1. Системный источник — состояние сайта, которое платформа знает сама: меню, настройки, языки, главная, страницы, хлебные крошки. Имена зарезервированы.
  2. Набор сайта — ваш JSON-список с произвольным именем (faq, tariffs, team).
  3. Список в атрибуте — {"items":[…]} прямо во вставке, когда список нужен в одном месте.

Как выводить списки во фрейме — на странице повторитель onpress/repeat. Здесь — сами данные.

Набор сайта

Набор — всегда список (массив) объектов с любыми полями. Схемы нет: какие поля положили, такие и доступны в шаблоне как item.<поле>.

[
  { "id": 1, "q": "Сколько стоит?", "a": "Бесплатно на старте", "page": "tarify" },
  { "id": 2, "q": "Нужна ли карта?", "a": "Нет", "page": "tarify" }
]
  • Имя: латиница в нижнем регистре, цифры, - и _, до 64 символов, первый символ — буква или цифра ([a-z0-9][a-z0-9_-]{0,63}). Заглавные приводятся к строчным.
  • Заняты: menu.*, site.*, pages.*, breadcrumbs и слова sources, resolve — 409 reserved_dataset_name.
  • Предел — 512 КБ на набор (413 dataset_too_large). Это список для повторителя, а не хранилище контента.
  • Одиночный объект вместо массива оборачивается в список из одного элемента, ответ предупреждает.

Положить набор

curl -s -X PUT "$API/site/$SITE/data/faq" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"items": [
        {"id": 1, "q": "Сколько стоит?", "a": "Бесплатно на старте", "page": "tarify"},
        {"id": 2, "q": "Нужна ли карта?", "a": "Нет", "page": "tarify"}
      ]}' | jq '{applied, updated, dataset: .dataset | {name, lang, items, fields}, rebaked: .rebaked.status}'
{
  "applied": true,
  "updated": false,
  "dataset": {
    "name": "faq",
    "lang": null,
    "items": 2,
    "fields": [
      { "field": "id", "types": ["number"], "in_items": 2 },
      { "field": "q", "types": ["string"], "in_items": 2 },
      { "field": "a", "types": ["string"], "in_items": 2 },
      { "field": "page", "types": ["string"], "in_items": 2 }
    ]
  },
  "rebaked": "nothing"
}

PUT заменяет набор целиком. dry_run: true — проверить и показать итог без записи. fields — какие поля реально есть в элементах и сколько элементов их содержат: удобно, когда пишете разметку под чужой набор. После записи пересобираются фреймы, которые читают набор, и сбрасывается кэш их страниц — ответ в rebaked.

Вариант на язык

curl -s -X PUT "$API/site/$SITE/data/faq" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"lang": "en", "items": [{"id": 1, "q": "How much is it?", "a": "Free to start", "page": "tarify"}]}' \
  | jq '.dataset | {name, lang, option}'
{ "name": "faq", "lang": "en", "option": "onpress_dataset_faq__en" }

Вариант лежит рядом с общим набором, а не вместо него: в реестре это faq@en. Какой вариант отдаётся при чтении и при сборке страницы:

  1. вариант языка из lang запроса или атрибута повторителя, иначе языка страницы, иначе языка сборки;
  2. нет варианта — общий набор (lang_fallback в ответе поясняет);
  3. нет общего — вариант языка сайта по умолчанию;
  4. ничего нет — 404 source_not_found.

Так сайт с одним общим списком работает без изменений, а переведённый список подхватывается там, где он есть. PATCH и DELETE с lang адресуют ровно один вариант; без lang — общий набор. Запись любого варианта пересобирает всех, кто читает набор по базовому имени.

Прочитать

# все наборы сайта (без системных источников)
curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/site/$SITE/data" | jq '.datasets[] | {name, lang, items, bytes}'

# один набор
curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/site/$SITE/data/faq?lang=en" | jq '{name, lang, lang_fallback, total, items}'

GET /data/{name} принимает те же параметры, что повторитель: lang, page (для page.* в match и для языка), match (JSON), limit, offset, paged, statuses. Поэтому ответ показывает ровно то, что получит страница.

Если набор меняли мимо API и реестр отстал от содержимого, ответ несёт registry_stale с цифрами реестра и настоящими; отдаются настоящие элементы, а любой PUT или PATCH приводит реестр в порядок.

Поправить точечно

curl -s -X PATCH "$API/site/$SITE/data/faq" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"ops": [
        {"op": "merge",  "match": {"id": 2}, "fields": {"a": "Нет, карта не нужна"}},
        {"op": "append", "item": {"id": 3, "q": "Есть API?", "a": "Да", "page": "tarify"}},
        {"op": "move",   "match": {"id": 3}, "to": 0},
        {"op": "remove", "index": 2}
      ]}' | jq '{applied, total}'
{
  "applied": [
    { "op": "merge", "index": 1, "fields": ["a"] },
    { "op": "append", "added": 1, "total": 3 },
    { "op": "move", "from": 2, "to": 0 },
    { "op": "remove", "index": 2, "total": 2 }
  ],
  "total": 2
}
opАдресДанныеЧто делает
setindex или matchitemзаменяет элемент
mergeindex или matchfieldsдописывает и перезаписывает поля элемента
append, prepend—item или itemsдобавляет в конец или в начало
removeindex или match—удаляет элемент
moveindex или matchtoпереносит на позицию to

match — объект, сравниваемый с полями элемента, берётся первое совпадение. Операции применяются по порядку в одной транзакции: если одна не удалась (404 item_not_found, 400 bad_patch_op), набор остаётся нетронутым. Одну операцию можно прислать без обёртки ops: {"op": "append", "item": {…}}.

Удалить

curl -s -X DELETE "$API/site/$SITE/data/faq?lang=en" -H "Authorization: Bearer $OP_TOKEN" | jq .deleted
curl -s -X DELETE "$API/site/$SITE/data/faq"         -H "Authorization: Bearer $OP_TOKEN" | jq .deleted

Первый вызов удаляет только вариант en, второй — общий набор. Несуществующий — 404 dataset_not_found. Повторители, которые читали набор, после удаления выводят пустой список.

Системные источники

curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/site/$SITE/data/sources" | jq '.sources[] | {name, contextual, writable}'
ИсточникКонтекстныйЗаписьЧто отдаёт
menu.headerнетPUT → пункты меню в области headerдерево пунктов меню, стоящего в области: id, title, url, type, object, object_id, target, classes, description, parent, order, children. С lang — меню этого языка
menu.footer_1, menu.footer_2, menu.footer_3нетPUT → пункты меню областито же для областей подвала
site.settingsнетPATCH → настройки сайтаодин элемент: name, description, home_url, site_url, admin_email, timezone, date_format, time_format, locale, charset, posts_per_page, show_on_front, front_page_id, posts_page_id, theme
site.languagesнетPATCH → один язык или язык по умолчаниюязыки сайта: слаг, имя, локаль, флаг, направление, основной ли, адрес главной языка
site.front_pageнетPUT → главная сайтаодин элемент: id, заголовок, слаг, статус и адрес главной
pages.allнет—все опубликованные страницы плоским списком: id, title, slug, url (с префиксом языка), lang, parent, menu_order, status, frame ({id, slug} или null). По языку запроса не фильтруется — для этого match
pages.treeнет—те же страницы деревом по родителям, children у каждой
pages.topнет—страницы верхнего уровня
pages.childrenда—дочерние страницы текущей
pages.siblingsда—соседи текущей страницы, включая её саму, только её языка
pages.adjacentда—один элемент с prev и next — предыдущая и следующая страница уровня
breadcrumbsда—цепочка от главной до текущей: id, title, slug, url, current

Контекстный источник зависит от того, какая страница собирается. Без страницы он отдаёт пустой список и needs_page: true — при чтении через API передайте page (id, слаг или путь):

curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/site/$SITE/data/breadcrumbs?page=/docs/vvedenie/" | jq '.items[] | {title, url, current}'
curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/site/$SITE/data/pages.children?page=docs" | jq '[.items[] | {title, url}]'

Параметр page здесь — id, слаг или путь со слешами (/docs/vvedenie/); форма с тильдой, как в адресах ручек /pages/{ref}, в параметре не понимается. Повторитель по контекстному источнику делает фрейм зависимым от страницы.

Адреса в menu.*, pages.* и breadcrumbs — настоящие, с префиксом языка: русская страница — /ru/o-nas/. Первое звено breadcrumbs — главная языка страницы. Источник меню несёт meta с id меню и числом отброшенных пунктов: пункт, ведущий на удалённую или неопубликованную страницу, посетитель не видит, и "invalid_items": 4 при пустом меню значит, что сломано меню, а не источник.

Запись в системный источник

Меню, настройки, языки и главная — состояние, которое меняется, и меняется оно через то же имя. Запись уходит туда, где эти данные живут на самом деле, второй копии не появляется, и после неё пересобираются зависимые фреймы:

# пункты меню, стоящего в области header (язык — ru)
curl -s -X PUT "$API/site/$SITE/data/menu.header" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"lang": "ru", "items": [{"page": "/docs/"}, {"url": "https://t.me/onpress", "title": "Telegram", "target": "_blank"}]}'

# название и описание сайта
curl -s -X PATCH "$API/site/$SITE/data/site.settings" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"name": "Мой сайт", "description": "Описание сайта"}'

# имя языка или язык по умолчанию
curl -s -X PATCH "$API/site/$SITE/data/site.languages" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"lang": "ru", "name": "Русский"}'

# главная сайта
curl -s -X PUT "$API/site/$SITE/data/site.front_page" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"page": "/home/"}'
ИсточникМетодКуда уходитЧто принимает
menu.{область}PUTPUT /menus/@{область}/itemsitems — дерево пунктов ({page} или {url}, title, target, classes, children), lang, allow_invalid
site.settingsPATCHPATCH /site/settingsname, description (или blogname, blogdescription), blog_public, site_icon, analytics — только публичные ключи, секрет даёт 400 secret_field и в ответ не попадает
site.languagesPATCHPATCH /site/languages/{slug} или PUT /site/languages/defaultlang и поля языка (slug, locale, name, rtl, flag, order); {"default": "ru"} — сменить основной
site.front_pagePUTPUT /site/front-pagepage — id или путь; lang

Ответ — ответ той ручки, куда ушла запись, плюс source, wrote и rebaked. Чего нельзя и почему:

ЗапросОтказВместо этого
PUT /data/menu.header, а в области нет меню404 menu_not_assignedсоздать меню POST /menus и поставить в область PUT /menus/{ref}/location
PATCH /data/site.settings с locale, front_page_id, home_url, theme400 field_belongs_elsewhereязык — site.languages, главная — site.front_page, адрес — смена домена, тему API не меняет
PATCH /data/site.languages со списком items400 whole_list_not_acceptedпо одному языку; добавить — POST /site/languages, удалить — DELETE /site/languages/{slug}
не тот метод (PUT вместо PATCH)405 wrong_method_for_source с правильным writeметод из write.method
запись в pages.* или breadcrumbs409 computed_source с readonly_becauseменять сами страницы — список считается из них
DELETE системного источника409 system_source_not_deletableопустошить меню — PUT с "items": []

Каждый источник в GET /data/sources и в GET /data/{name} сам говорит, пишется ли он: у записываемого есть write (метод, адрес, куда уходит, что принимает), у вычисляемого — readonly_because.

Одно короткое имя — две разные вещи. Если шапка сайта собрана из набора header, источник menu.header пуст просто потому, что в области нет меню ядра. Такой ответ несёт same_name_dataset с подсказкой, что шапку этого сайта меняет PUT /data/header.

Проверить, что получит страница

POST /data/resolve разрешает источник ровно так, как это сделает повторитель при сборке, — проверка до загрузки фрейма:

curl -s -X POST "$API/site/$SITE/data/resolve" \
  -H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
  -d '{"source": "faq", "page": "tarify", "match": {"page": "page.slug"}}' \
  | jq '{origin, contextual, lang, lang_fallback, match, match_total, total, items}'
{
  "origin": "site",
  "contextual": true,
  "lang": null,
  "lang_fallback": "there is no dataset \"faq\" for language \"en\", the shared one was returned",
  "match": { "page": "tarify" },
  "match_total": 3,
  "total": 2,
  "items": [ { "id": 1, "q": "Сколько стоит?", "…": "…" }, { "id": 2, "…": "…" } ]
}
Поле телаСмысл
sourceимя источника или набора; без него — проверяется items
itemsсписок, как в атрибуте повторителя
pageстраница: даёт значения page.* и язык набора
langязык варианта набора
matchфильтр — объект или его JSON-строка
limit, offset, pagedокно, как у повторителя; paged — значение page.paged
statusesстатусы для pages.*

origin — откуда взят список: system, site или inline. С match ответ показывает, во что разрешился каждый токен (match), сколько было до фильтра (match_total) и после (total). Токен page.* без page — пустой список, needs_page: true и подсказка match_note. Сервис вычисляет в фильтре page.id, page.slug, page.title, page.status, page.type, page.parent_id, page.paged, site.lang, site.blog_id и raw:; другой токен — 400 match_token_unsupported (при сборке страницы он всё равно сработает — проверяйте такой фильтр сборкой).

Где лежат данные

Набор — в опциях своего сайта: реестр onpress_datasets и сам список в onpress_dataset_<имя> (вариант — onpress_dataset_<имя>__<язык>). Наборы до 32 КБ загружаются вместе с остальными опциями, большие — отдельным запросом. Сетевых наборов нет: данные одного сайта другим не видны.

arrow_backНазад
Фрейм pricing: тарифы
Далееarrow_forward
Повторитель onpress/repeat
На этой странице
  • Набор сайта
    • Положить набор
      • Вариант на язык
        • Прочитать
          • Поправить точечно
            • Удалить
          • Системные источники
            • Запись в системный источник
          • Проверить, что получит страница
            • Где лежат данные
            OnPress
            OnPress
            ИП Зуев И.В. ИНН: 360408359441
            © 2026
            политика конфиденциальности публичная оферта
            • visa
            • mastercard
            • sber
            • tpay