Сайт делаете вы. Тексты, картинки и цены меняет команда заказчика. Content API Diil стоит посередине и отдаёт вашему коду аккуратный JSON — и больше никто не заводит задачу ради опечатки в заголовке главной.
Что такое Content API Diil
Diil — визуальный редактор сайтов, к которому прилагается CRM. Редакторы меняют контент в двух местах: в самой CRM или прямо на живом сайте в режиме Live — кликнули по заголовку, написали, сохранили. Content API — дверь только на чтение, через которую этот контент забирает ваш сайт.
Проще говоря, это headless CMS API: хранение и выдачу контента берём на себя мы, а фронтенд целиком ваш — стек, дизайн, хостинг, сборка. Мы не лезем в вашу вёрстку, вам не нужно писать админку.
Как это устроено
Вся архитектура помещается в одну картинку:
Редакторы Diil Ваш сайт
───────── ──── ────────
CRM ────────┐
├──► страницы → секции → блоки ──► Content API ──► fetch() ──► ваши шаблоны
Режим Live ─┘ (каждая правка поднимает только чтение x-crm-key React, Vue, HTML…
(на вашем сайте) версию контента сайта) JSON по HTTPS- Редакторы пишут. Контент разложен по страницам, секциям и блокам, у каждого есть короткий маркер:
home,hero,hero_title. По маркерам ваш код и находит нужное. Подробнее — в разделе «Как устроен контент». - Ваш сайт читает. Один
GET-запрос с ключом сайта возвращает страницу целиком — все секции, все блоки и все нужные вам переводы. - Правки доезжают сами. Любое изменение в CRM поднимает версию контента сайта, и следующий же запрос получает свежие данные. Посетитель может увидеть их с задержкой примерно в минуту из-за кэша браузера и CDN — об этом в разделе «Кэш и ETag».
Хотите, чтобы редакторы правили прямо на страницах сайта, а не в формах? Добавьте один тег <script> и несколько атрибутов data-crm-* — это и есть правка на сайте, и работает она поверх того же API.
Что можно на этом сделать
Всё, что умеет отправить HTTP-запрос и разобрать JSON, умеет работать с Diil. Никаких SDK, никакой привязки к фреймворку.
- Next.js, Nuxt, Astro, SvelteKit — забираете контент на сервере, кэшируете с ревалидацией и получаете быстрые страницы, которые при этом можно править.
- Обычный HTML + JavaScript — лендинг на любом хостинге: один
fetch(), и готово. - SPA на React или Vue — ключ сайта публичный по задумке, так что ходить в API прямо из браузера нормально.
- Мобильные приложения — тексты онбординга, промо-баннеры и FAQ, которые меняются без релиза в сторе.
- Многоязычные сайты — каждый текстовый блок приходит картой переводов; один язык или несколько — в одном запросе.
- Блоги — статьи с обложками, авторами, отложенной публикацией и постраничной выдачей через /v1/blog.
Попробовать за 10 секунд
Вот один блок — заголовок главной страницы — по его маркеру. Подставьте свой ключ, и всё заработает как есть:
curl "https://back.sitecog.com/content/v1/blocks/hero_title?section=hero&lang=en" \
-H "x-crm-key: pk_3f9c2a7e1b4d4c0e8a6f5b2d9c1e7a40"const res = await fetch('https://back.sitecog.com/content/v1/blocks/hero_title?section=hero&lang=en', {
headers: { 'x-crm-key': 'pk_3f9c2a7e1b4d4c0e8a6f5b2d9c1e7a40' },
});
const block = await res.json();
console.log(block.content.en); // "Earbuds that mute the city"{
"id": 95,
"marker": "hero_title",
"name": "Hero title",
"type": "text",
"multilang": true,
"updatedAt": "2026-09-20T16:33:23.000Z",
"content": { "en": "Earbuds that mute the city" }
}Вот и всё. Текст приходит картой переводов, картинка — как { "file": "https://…" }, ссылка — как { url, target, title }. Все форматы собраны на странице «Типы блоков».
API одним взглядом
Все адреса начинаются с https://back.sitecog.com/content, все запросы — GET (и HEAD), все ответы — JSON.
| Адрес | Что вернётся |
|---|---|
/v1/langs | Активные языки сайта в том порядке, что задан в CRM. Готовый материал для переключателя языка. |
/v1/pages | Все страницы без содержимого — для меню и карты сайта. |
/v1/pages/:marker | Одна страница со всеми секциями и блоками. Ваш основной рабочий запрос. |
/v1/sections/:marker | Одна секция с её блоками. |
/v1/blocks/:marker | Ровно один блок: телефон, баннер, цена. |
/v1/blog | Опубликованные статьи блога с постраничной выдачей. |
/v1/blog/:slug | Одна статья с текстом в HTML. |
Что мы уже продумали за вас
- Один запрос на страницу. Никакого водопада запросов — страница приходит сразу со всем содержимым.
- Поиск по маркеру, а не по id. Ответы — объекты с маркерами в ключах, поэтому
page.content.heroпросто работает. - Публичные ключи только на чтение. Ключ сайта читает лишь опубликованный контент одного сайта, так что в браузерном коде он никому не навредит. Подробнее — «Ключ сайта».
- Честные языки. Просите нужные языки через
?lang=en,de. Если перевода нет, его просто нет в ответе — запасной язык выбираете вы (вот как). - HTTP-кэш из коробки. У каждого успешного ответа есть ETag, и запрос с
If-None-Matchобходится дёшево —304 Not Modified. - Щедрые лимиты. 300 запросов в минуту с одного IP и 600 на ключ — с небольшим кэшем вы до них не дойдёте. Подробности — в разделе «Лимиты».