Налаштування Content Delivery API Umbraco
Проблема: при спробі використовувати Umbraco як headless CMS розробники стикаються з відсутністю вбудованого REST API до версії 12. Content Delivery API вирішує це завдання — він повертає контент у форматі JSON зі швидкістю 50ms (у 2.4 раза швидше за GraphQL). Ми налаштовуємо його під ключ: від конфігурації до інтеграції з React, Next.js або Vue. За 1–2 дні отримуєте готовий headless-бекенд, який віддає опублікований контент через REST API лише для читання. Наш досвід — 5+ років і 15+ проєктів на Umbraco, включаючи великі новинні портали та інтернет-магазини. Економія трудовитрат: інтеграція CDA займає в 3 рази менше часу, ніж розробка власного REST API, а витрати на інфраструктуру знижуються до 30%. Зв'яжіться з нами для консультації — оцінимо ваш проєкт за один день.
Як налаштувати Content Delivery API в Umbraco?
Увімкнення CDA — це зміна одного файлу конфігурації. Потрібно додати блок Umbraco.CMS.DeliveryApi в appsettings.json:
{
"Umbraco": {
"CMS": {
"DeliveryApi": {
"Enabled": true,
"PublicAccess": true,
"ApiKey": "your-api-key-for-preview",
"DisallowedContentTypeAliases": [],
"RichTextOutputAsJson": false,
"Media": {
"Enabled": true
}
}
}
}
}
Після ввімкнення стануть доступні базові endpoint'и:
-
GET /umbraco/delivery/api/v2/content— список контенту -
GET /umbraco/delivery/api/v2/content/item/{id}— за ID -
GET /umbraco/delivery/api/v2/content/item/{path}— за шляхом -
GET /umbraco/delivery/api/v2/content?filter=contentType:blogPost— з фільтром -
GET /umbraco/delivery/api/v2/media— медіафайли
Покрокове налаштування CDA
- Увімкніть CDA в конфігурації як показано вище.
- Налаштуйте PublicAccess — для зовнішнього доступу встановіть
true. - Встановіть ApiKey (обов'язково для Preview API).
- Обмежте типи контенту через
DisallowedContentTypeAliases(при необхідності). - Перевірте індексацію — виконайте тестовий GET-запит до ендпоінту.
- Налаштуйте фільтри для часто використовуваних вибірок.
Гнучка фільтрація контенту
CDA підтримує гнучку фільтрацію. Наприклад: contentType:blogPost,createDate>2023-01-01 поверне пости блогу після зазначеної дати. Фільтр properties.tags:javascript відфільтрує за тегом. Також доступне сортування: sort: 'createDate:desc' або sort: 'properties.sortOrder:asc'. Параметр expand дозволяє підвантажити пов'язані елементи: expand: 'properties[heroImage,author]'. Fields обмежує повернуті поля: fields: 'properties[title,slug]'. Усі параметри комбінуються в рядку запиту.
| Тип фільтра | Приклад | Опис |
|---|---|---|
| За типом контенту | contentType:blogPost |
Вибірка певних типів |
| За датою | createDate>2023-01-01 |
Фільтр за датою створення |
| За властивостями | properties.tags:javascript |
Фільтр за значенням властивості |
| За культурою | culture=en-US |
Для багатомовних сайтів |
Обсяг робіт з налаштування Headless-рішення
Ми надаємо готовий набір робіт, який покриває повний цикл:
- Діагностика поточної конфігурації Umbraco
- Увімкнення та налаштування CDA (включаючи Preview API)
- Розробка TypeScript-клієнта для фронтенду
- Інтеграція з обраним фреймворком (Next.js, Vue, React)
- Налаштування фільтрів, сортування та expand для пов'язаних елементів
- Створення кастомних селекторів для індексації (якщо потрібно)
- Документація по всіх endpoint'ах і фільтрах
- Підтримка протягом місяця після запуску
Типовий TypeScript-клієнт
const UMBRACO_URL = process.env.UMBRACO_URL!;
async function getContent(params: {
filter?: string;
sort?: string;
take?: number;
skip?: number;
expand?: string;
fields?: string;
}) {
const query = new URLSearchParams();
if (params.filter) query.set('filter', params.filter);
if (params.sort) query.set('sort', params.sort);
if (params.take) query.set('take', String(params.take));
if (params.skip) query.set('skip', String(params.skip));
if (params.expand) query.set('expand', params.expand);
if (params.fields) query.set('fields', params.fields);
const res = await fetch(
`${UMBRACO_URL}/umbraco/delivery/api/v2/content?${query}`,
{ next: { revalidate: 3600 } }
);
return res.json();
}
// Отримання постів блогу
const { items, total } = await getContent({
filter: 'contentType:blogPost',
sort: 'createDate:desc',
take: 12,
expand: 'properties[author,categories]',
});
Фільтри комбінуються через кому. Приклади:
-
contentType:blogPost,createDate>2023-01-01 -
contentType:blogPost,properties.tags:javascript - Сортування:
sort: 'createDate:desc'абоsort: 'properties.sortOrder:asc' - Expand:
expand: 'all'абоexpand: 'properties[heroImage,author]' - Fields:
fields: 'properties[title,slug,excerpt,heroImage]'
Як працює Preview API для редакторів?
Для перегляду чернеток використовується Preview API. У заголовки запиту додаються:
-
Api-Key— ключ з конфігурації -
Preview: true
Це дозволяє редакторам бачити неопубліковані зміни до публікації. Без ключа Preview API недоступний.
Створення кастомних селекторів
Якщо стандартної фільтрації недостатньо, можна розширити API через C#. Наприклад, додати поле publishedDate для сортування:
using Umbraco.Cms.Core.DeliveryApi;
public class PublishedDateSelector : IContentIndexHandler
{
public IEnumerable<IndexFieldValue> GetFieldValues(IContent content, string? culture)
{
yield return new IndexFieldValue
{
FieldName = "publishedDate",
Values = new object[] { content.GetValue<DateTime>("publishedDate") },
};
}
public IEnumerable<IndexField> GetFields()
{
yield return new IndexField
{
FieldName = "publishedDate",
FieldType = FieldType.Date,
VariesByCulture = false,
};
}
}
Після реєстрації селектора в DI поле publishedDate стане доступним для сортування та фільтрації через API.
Інтеграція з Next.js (App Router)
// app/blog/page.tsx
export const revalidate = 3600;
export default async function BlogPage() {
const { items, total } = await getContent({
filter: 'contentType:blogPost',
sort: 'createDate:desc',
take: 12,
expand: 'properties[heroImage]',
});
return <BlogGrid posts={items} total={total} />;
}
Для статичної генерації (SSG) використовуйте generateStaticParams з async запитом до CDA для отримання списку маршрутів.
Порівняння CDA з іншими підходами
| Критерій | Content Delivery API | GraphQL (через Content Service) | Кастомний REST |
|---|---|---|---|
| Швидкість (TTFB) | ~50ms (індекс Examine) | ~120ms (парсинг запиту) | ~80ms (прямі запити) |
| Підтримка | Вбудована, оновлюється з CMS | Через пакети Umbraco | Ручна реалізація |
| Гнучкість фільтрації | Стандартні фільтри + кастомні селектори | Повний GraphQL-запит | Будь-яка логіка |
| Простота налаштування | Мінімальна (конфіг) | Середня (схема, хуки) | Висока (написання контролерів) |
CDA виграє у швидкості та простоті — ідеально для типових Headless-проєктів. Content Delivery API швидший за GraphQL в 2.4 раза по TTFB (50ms vs 120ms).
Деталі налаштування для багатомовності
Якщо сайт багатомовний, в CDA потрібно враховувати культуру. Для цього в запит додається query-параметр culture (наприклад, ?culture=en-US). За замовчуванням API повертає контент для культури за замовчуванням. Також можна використовувати VariesByCulture в кастомних селекторах.
Типові помилки при налаштуванні CDA
- Відсутність ApiKey для Preview — без ключа Preview не працює.
- Неправильний формат фільтра — пробіли або зайві коми призводять до помилки 400.
- Забули ввімкнути PublicAccess — тоді API доступний лише локально.
- Не налаштували expand для пов'язаних медіа — замість URL прийдуть лише ID.
Наша команда гарантує, що всі ці нюанси будуть враховані. Замовте консультацію — ми допоможемо налаштувати CDA під ваш проєкт.
Джерело: Документація Umbraco CDA







