Сторінки — робоча конячка API. Один запит дає вам цілу сторінку — кожну секцію, кожен блок, кожен переклад — готову до того, щоб вилити її у ваші шаблони. Ні N+1, ні водоспаду запитів, ні «чому hero вантажиться після підвалу».
Є два варіанти:
GET /v1/pages— зміст: усі сторінки сайту без контенту. Чудово для меню та sitemap.GET /v1/pages/:marker— одна сторінка з усім вмістом. Саме його ви викликатимете в 95% випадків.
Список усіх сторінок
GET
/v1/pageshttps://back.sitecog.com/content/v1/pages
Повертає всі сторінки сайту як об’єкт із ключами-маркерами сторінок. Секцій і блоків тут немає — це як табличка з переліком офісів у холі, а не сама будівля.
Параметри запиту
langquerystringнеобовʼязковоЗа замовчуванням: усі активні мовиЯкі переклади включити в параметри сторінки (title, description, keywords). Один код, список через кому (
ru,en) або повторений параметр. Див. Мови.Приклад
curl https://back.sitecog.com/content/v1/pages \
-H "x-crm-key: pk_3f9c2a7e1b4d4c0e8a6f5b2d9c1e7a40"const res = await fetch('https://back.sitecog.com/content/v1/pages', {
headers: { 'x-crm-key': 'pk_3f9c2a7e1b4d4c0e8a6f5b2d9c1e7a40' },
});
const pages = await res.json();
Object.values(pages).forEach((page) => console.log(page.href, page.name));{
"home": {
"id": 26,
"marker": "home",
"name": "Home",
"href": "/",
"index": 0,
"params": {
"title": { "en": "VERTEX Air 3 — wireless earbuds" },
"description": { "en": "Hybrid noise cancelling, 42 hours of battery." }
}
},
"contacts": {
"id": 29,
"marker": "contacts",
"name": "Contacts",
"href": "/contacts",
"index": 3,
"params": {}
}
}Отримати одну сторінку з контентом
GET
/v1/pages/:markerhttps://back.sitecog.com/content/v1/pages/:marker
Уся сторінка за раз: сама сторінка, її секції в
content і блоки кожної секції у власному content секції.Параметри
markerpathstringобовʼязковоМаркер сторінки, заданий у CRM, наприклад
home чи pricing. Латинські літери, цифри та підкреслення, 2–40 символів. Регістр важливий: Home — це не home.langquerystringнеобовʼязковоЗа замовчуванням: усі активні мовиОбмежити переклади цими мовами.
?lang=en, ?lang=en,de або ?lang=en&lang=de. Кожен код має бути активною мовою сайту, інакше отримаєте 400 unknown_lang.emptyqueryflagнеобовʼязковоЗа замовчуванням: вимкненоПовернути сторінку без її
content. Є параметр — увімкнено: ?empty, ?empty=1, ?empty=true. Вимкнути можна через 0 чи false. Зручно для SEO-метаданих, коли основний вміст береться деінде.x-crm-keyheaderstringобовʼязковоКлюч вашого сайту. Можна передати і як
?key=, якщо заголовки недоступні. Див. Ключі сайту.Приклад запиту
curl "https://back.sitecog.com/content/v1/pages/home?lang=en" \
-H "x-crm-key: pk_3f9c2a7e1b4d4c0e8a6f5b2d9c1e7a40"const res = await fetch('https://back.sitecog.com/content/v1/pages/home?lang=en', {
headers: { 'x-crm-key': 'pk_3f9c2a7e1b4d4c0e8a6f5b2d9c1e7a40' },
});
if (!res.ok) throw new Error(`Content API: ${res.status}`);
const page = await res.json();
const hero = page.content.hero.content;
console.log(hero.hero_title.content.en); // "Earbuds that mute the city"// app/page.tsx — серверний компонент, ключ ніколи не потрапляє в браузер
export default async function Home() {
const res = await fetch('https://back.sitecog.com/content/v1/pages/home?lang=en', {
headers: { 'x-crm-key': process.env.CRM_KEY! },
next: { revalidate: 60 },
});
const page = await res.json();
const hero = page.content.hero.content;
return <h1>{hero.hero_title.content.en}</h1>;
}Приклад відповіді
{
"id": 26,
"marker": "home",
"name": "Home",
"href": "/",
"index": 0,
"params": {
"title": { "en": "VERTEX Air 3 — wireless earbuds" }
},
"content": {
"hero": {
"id": 41,
"marker": "hero",
"name": "Hero",
"index": 0,
"show": true,
"content": {
"hero_title": {
"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" }
},
"hero_image": {
"id": 96,
"marker": "hero_image",
"name": "Hero image",
"type": "image",
"multilang": false,
"updatedAt": "2026-09-18T09:12:40.000Z",
"content": { "file": "https://cdn.example.com/storage/your-site/hero.jpg" }
}
}
},
"faq": {
"id": 44,
"marker": "faq",
"name": "FAQ",
"index": 5,
"show": false,
"content": { "…": "…" }
}
}
}Поля відповіді
Три рівні, одна форма на рівень. Бачили одну сторінку — бачили всі.
idnumberВнутрішній id сторінки. Стабільний, але в коді краще користуватися маркером — id різняться між середовищами.
markerstringМаркер сторінки — той самий, що ви підставили в URL.
namestringЛюдська назва з CRM («Home»). Вона для редакторів, а не для відвідувачів — не виводьте її на сторінці.
hrefstring | nullШлях, за яким сторінка живе на вашому сайті, якщо редактор його заповнив.
null для службових сторінок на кшталт common (шапка й підвал).indexnumberПозиція в меню CRM, починаючи з 0. Сортуйте за нею, щоб відтворити порядок, який бачать редактори.
paramsobjectНалаштування сторінки.
title, description і keywords — мовні мапи, вони враховують lang; усе інше (теги Open Graph, скрипти) приходить точно так, як збережено.params →
title{ [lang]: string }<title> сторінки.description{ [lang]: string }Meta description.
keywords{ [lang]: string }Meta keywords, якщо ними ще хтось користується. Ми не засуджуємо.
content{ [sectionMarker]: Section }Секції сторінки з ключами-маркерами. Відсутні, якщо передати
?empty.content →
idnumberId секції.
markerstringМаркер секції, наприклад
hero.namestringНазва для редакторів.
indexnumberПорядок на сторінці. Ключі об’єкта зберігають порядок додавання, але сортування за index — чесніший спосіб.
showbooleanЧи хоче редактор, щоб секцію було видно. Приховані секції все одно повертаються — ховати їх має ваш шаблон (
{section.show && <Faq />}).content{ [blockMarker]: Block }Блоки секції з ключами-маркерами.
content →
idnumberId блока.
markerstringМаркер блока, наприклад
hero_title.namestringНазва для редакторів.
typestringОдин із
text, html, image, video, link, number, color, date, date_range, boolean, object, array. Від нього залежить форма content.multilangbooleanДля зображень і відео: true, якщо для кожної мови свій файл.
updatedAtstring (ISO 8601)Коли блок востаннє редагували. Згодиться для позначок «оновлено 2 години тому» і ключів кешу.
contentdepends on typeСаме значення. Мовна мапа для тексту,
{ file } для одного зображення і так далі — усі форми на сторінці Типи блоків.Помилки
| Статус | Тіло | Що сталося |
|---|---|---|
| 400 | {"message":"invalid_marker"} | У маркері є символи поза A–Z a–z 0–9 _ або в нього неправильна довжина. |
| 400 | {"message":"unknown_lang", …} | Мова з lang не активна на сайті. У тілі є список доступних. |
| 401 | {"message":"invalid_key"} | Ключа немає, він некоректний або відкликаний. |
| 404 | {"message":"page_not_found"} | Сторінки з таким маркером немає. Одруківка? Інший ключ сайту? |
| 429 | {"message":"rate_limit_exceeded"} | Забагато запитів за цю хвилину. Див. Ліміти запитів. |
Повний список із рішеннями — на сторінці Помилки.