---
title: CMS Site
description: Blog, knowledge base, documents, downloads, and changelog for your landing via SDK.
---

# CMS Site

**CMS site** — landing content (blog, KB, documents, downloads, changelog). Edit in Platform admin (**CMS Site**). Guests (no JWT) only see **published** items.

An application is **optional**: on create you get `site_code` and a one-time `rb_cms_…` key. You can link an application later (site Overview → **Application**).

## Identity (standalone landing)

| Parameter | Value |
| --- | --- |
| `YOUR_SITE_CODE` | auto-generated site code |
| `YOUR_CMS_SITE_KEY` | site key `rb_cms_…` (`X-Public-Key`) |

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

## Identity (linked to an application)

| Parameter | Value |
| --- | --- |
| `YOUR_APP_CODE` | application code |
| `YOUR_SITE_CODE` | site code |
| `YOUR_PUBLIC_KEY` | application public key `rb_pub_…` |

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

End-user JWT is **not** required for CMS reads on the landing.

## Sections

- **Blog** — markdown posts, cover (`cover_url`), **categories**; statuses **draft / scheduled / published / archived**; scheduled posts use `scheduled_at` + admin calendar; worker `POST /v1/internal/social/tick` publishes due posts
- **Knowledge base** — help / docs tree: **folders** (up to 5 levels) + **pages**. Not release notes
- **Health / SEO** — project cabinet (KPIs, plan, clusters, competitors) + live `website_url` audit; see [Site Health / SEO](/en/guides/cms-seo-health)
- **RKN / 152-FZ** — legal slots + landing checks for personal-data / Roskomnadzor expectations; see [RKN / 152-FZ](/en/guides/cms-rkn-compliance)
- **Documents** — arbitrary files / URLs / markdown for the landing (no legal templates)
- **Legal documents** — privacy, consents, offers; see [Consents & legal docs](/en/guides/consents-legal)
- **Banners** — HTML modal / fullscreen; see [Banners](/en/guides/banners)
- **Branding** — icon and website URL on Overview; see [Icons & websites](/en/guides/branding)
- **Downloads** — per-platform channels, versions, file or external URL
- **Changelog** — release notes (“what’s new in 1.2”) for the versions block on the site

Only `status = published` is returned. Drafts and scheduled posts appear as `404` to guests.

## Public HTTP

Standalone (no app):

```http
GET /v1/sites/YOUR_SITE_CODE
GET /v1/sites/YOUR_SITE_CODE/blog/categories
GET /v1/sites/YOUR_SITE_CODE/blog/posts?locale=en
GET /v1/sites/YOUR_SITE_CODE/blog/posts?locale=en&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/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}
```

Landing files/links use `documents`. Privacy / consents / offers use **`/legal`** only (admin **Legal documents**). Do **not** use legacy `documents/by-kind` for legal texts.

Document list (site key required) includes `public_url` — open in the browser without headers:

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

PDFs and images open inline; text documents (`source_type: text`) render as an HTML page from markdown; other files download.

With application — same paths under:

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

## SDK (TypeScript)

```ts
const cats = await platform.listCmsBlogCategories("YOUR_SITE_CODE");
const posts = await platform.listCmsBlogPosts("YOUR_SITE_CODE", {
  locale: "en",
  category: "news",
});
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",
);
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");
```

Methods: `getCmsSite`, `listCmsBlogCategories`, `listCmsBlogPosts`, `getCmsBlogPost`, `getCmsKbTree`, `getCmsKbArticle`, `listCmsPopularKbArticles`, `listCmsDocuments`, `getCmsDocument`, `listSiteLegalDocuments`, `getSiteLegalDocument`, `listSiteBanners`, `getSiteBanner`, `getCmsDownloads`, `getCmsDownloadLatest`, `listCmsChangelog`, `getCmsChangelogEntry`. Flutter mirrors the same names.

For legal texts do **not** use `getCmsDocumentByKind` — only `listSiteLegalDocuments` / `getSiteLegalDocument`.

## Security & cache

- Prefer fetching CMS from your landing’s server (SSR/BFF) when possible.
- Document `public_url` is safe to put in an `<a href>` on the landing (unguessable token).
- Render markdown safely (no raw HTML injection).
- Cache GET responses on the landing for 60–300 seconds.

## Admin

**CMS Site** → site cards → Blog / Knowledge base / **Legal documents** / Documents / Downloads / Changelog. Legal texts: **Legal documents** + `/legal` (`listSiteLegalDocuments`). **Documents** is for arbitrary landing files (`listCmsDocuments`), not privacy/consent.
