---
title: CMS Сайт
description: Блог, база знаний, загрузки и журнал изменений для лендинга через SDK.
---

# CMS Сайт

**CMS-сайт** — контент для лендинга (блог, база знаний, загрузки, changelog). Редактирование в админке Platform (**CMS Сайт**). На лендинге гости (без JWT) читают только **опубликованные** материалы.

Приложение **не обязательно**: при создании сайта автоматически появляются `site_code` и ключ `rb_cms_…` (показывается один раз). При необходимости сайт можно привязать к приложению в обзоре сайта.

## Идентификация (лендинг без приложения)

| Параметр | Значение |
| --- | --- |
| `YOUR_SITE_CODE` | код сайта из админки (создаётся автоматически) |
| `YOUR_CMS_SITE_KEY` | ключ сайта `rb_cms_…` (`X-Public-Key`) |

```http
X-Public-Key: YOUR_CMS_SITE_KEY
```

## Идентификация (сайт привязан к приложению)

| Параметр | Значение |
| --- | --- |
| `YOUR_APP_CODE` | код приложения |
| `YOUR_SITE_CODE` | код сайта |
| `YOUR_PUBLIC_KEY` | public key приложения `rb_pub_…` (`X-Public-Key`) |

```http
X-Public-Key: YOUR_PUBLIC_KEY
X-Application-Code: YOUR_APP_CODE
```

JWT пользователя **не нужен** для чтения CMS на лендинге.

## Разделы

- **Блог** — статьи (markdown), обложка (`cover_url`), **категории**; статусы **черновик / в очереди / опубликована / архив**; при «В очереди» — дата/время (`scheduled_at`), календарь в админке; worker `POST /v1/internal/social/tick` публикует due-посты
- **База знаний** — справочник / help на лендинге: дерево **разделов (папок)** до 5 уровней + **страницы (статьи)**. Это не журнал версий
- **Здоровье / SEO** — кабинет проекта (KPI, план, кластеры, конкуренты) + аудит живого `website_url`; см. [Здоровье / SEO сайта](/guides/cms-seo-health)
- **РКН / 152‑ФЗ** — проверка документов и лендинга на типичные требования ПДн / Роскомнадзора; см. [РКН / 152‑ФЗ](/guides/cms-rkn-compliance)
- **Документы** — произвольные файлы / URL / markdown для лендинга (без юр. шаблонов)
- **Юридические документы** — слоты политики, согласий, оферты; см. [Согласия и юр. документы](/guides/consents-legal)
- **Баннеры** — HTML modal / fullscreen; см. [Баннеры](/guides/banners)
- **Брендинг** — иконка и ссылка на сайт в Обзоре; см. [Иконки и сайты](/guides/branding)
- **Загрузки** — каналы по платформе (Android, Windows, …), версии, файл или внешняя ссылка
- **Журнал изменений** — релизные заметки («что нового в версии 1.2») для блока версий на сайте

В API отдаётся только `status = published`. Черновики и очередь для гостей выглядят как `404`.

## HTTP (публичное чтение)

**Без приложения** — база `YOUR_API_URL`:

```http
GET /v1/sites/YOUR_SITE_CODE
GET /v1/sites/YOUR_SITE_CODE/blog/categories
GET /v1/sites/YOUR_SITE_CODE/blog/posts?locale=ru
GET /v1/sites/YOUR_SITE_CODE/blog/posts?locale=ru&category=news
GET /v1/sites/YOUR_SITE_CODE/blog/posts/{slug}
GET /v1/sites/YOUR_SITE_CODE/kb/tree
GET /v1/sites/YOUR_SITE_CODE/kb/articles/{slug}
GET /v1/sites/YOUR_SITE_CODE/kb/popular?limit=10
GET /v1/sites/YOUR_SITE_CODE/downloads
GET /v1/sites/YOUR_SITE_CODE/downloads/android/latest
GET /v1/sites/YOUR_SITE_CODE/downloads/android/history
GET /v1/sites/YOUR_SITE_CODE/downloads/android/1.0.0/file
GET /v1/sites/YOUR_SITE_CODE/changelog
GET /v1/sites/YOUR_SITE_CODE/changelog/{slug}
GET /v1/sites/YOUR_SITE_CODE/documents
GET /v1/sites/YOUR_SITE_CODE/documents/{slug}
GET /v1/sites/YOUR_SITE_CODE/legal
GET /v1/sites/YOUR_SITE_CODE/legal/{doc_kind}
```

Произвольные файлы лендинга — `documents`. Политика / согласия / оферта — только **`/legal`** (раздел «Юридические документы» в админке). Старый `documents/by-kind` для юр. текстов **не используй**.

Список документов (нужен ключ сайта) отдаёт `public_url` — прямая ссылка для браузера без заголовков:

```http
GET /v1/cms-documents/{access_token}
```

PDF и изображения открываются inline; текстовые документы (`source_type: text`) — HTML-страница с markdown; остальные файлы — скачивание.
В списке и карточке поста поле `category`: `{ "slug", "name" }` (или `null`). Фильтр `category` — slug категории.

**С приложением** — те же разделы под префиксом:

```http
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE
```

Блог:

```http
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/blog/posts?locale=ru
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/blog/posts/{slug}
```

База знаний:

```http
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/kb/tree
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/kb/articles/{slug}
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/kb/popular?limit=10
```

Загрузки:

```http
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/downloads
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/downloads/android/latest
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/downloads/android/history
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/downloads/android/1.0.0/file
```

Журнал:

```http
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/changelog
GET /v1/applications/YOUR_APP_CODE/sites/YOUR_SITE_CODE/changelog/{slug}
```

## SDK (TypeScript)

```ts
const cats = await platform.listCmsBlogCategories("YOUR_SITE_CODE");
const posts = await platform.listCmsBlogPosts("YOUR_SITE_CODE", {
  locale: "ru",
  category: "news",
});
const tree = await platform.getCmsKbTree("YOUR_SITE_CODE");
const dl = await platform.getCmsDownloadLatest("YOUR_SITE_CODE", "android");
const log = await platform.listCmsChangelog("YOUR_SITE_CODE");
const docs = await platform.listCmsDocuments("YOUR_SITE_CODE");
const legal = await platform.listSiteLegalDocuments("YOUR_SITE_CODE");
const privacy = await platform.getSiteLegalDocument(
  "YOUR_SITE_CODE",
  "privacy_policy",
);
```

Методы: `getCmsSite`, `listCmsBlogCategories`, `listCmsBlogPosts`, `getCmsBlogPost`, `getCmsKbTree`, `getCmsKbArticle`, `listCmsPopularKbArticles`, `listCmsDocuments`, `getCmsDocument`, `listSiteLegalDocuments`, `getSiteLegalDocument`, `listSiteBanners`, `getSiteBanner`, `getCmsDownloads`, `getCmsDownloadLatest`, `listCmsChangelog`, `getCmsChangelogEntry`. Flutter — те же имена.

Для юр. документов **не** используй `getCmsDocumentByKind` — только `listSiteLegalDocuments` / `getSiteLegalDocument`.

## Безопасность и кеш

- Храните `YOUR_CMS_SITE_KEY` или `YOUR_PUBLIC_KEY` только на сервере лендинга (SSR/BFF) или в build-time env, если ключ уже публичный для клиента — осознанно.
- Тело статей — markdown: рендерите через безопасный парсер (без произвольного HTML).
- Рекомендуется кешировать GET на лендинге 60–300 секунд.

## Админка

**CMS Сайт** → карточки сайтов → Блог / База знаний / **Юридические документы** / Документы / Загрузки / Журнал. Юр. тексты — раздел «Юридические документы» и API `/legal` (`listSiteLegalDocuments`). Раздел «Документы» — произвольные файлы лендинга (`listCmsDocuments`), не политика/согласия.
