Статьи на вашем сайте
Подключение Blog API сохраняет дизайн и домен сайта. Один раз добавьте чтение статей на сервере сайта. После подключения вы сможете публиковать и обновлять материалы в Polosa.
SDK для Node.js
Пакет работает с Next.js, Express и другими серверными приложениями. Адрес API и siteKey храните в настройках окружения сайта.
npm install https://duohuman.ai/polosa/integrations/content-factory-blog-sdk-0.2.1.tgz
import { createCachedBlogClient } from "@content-factory/blog-sdk";
const blog = createCachedBlogClient({
apiBaseUrl: process.env.POLOSA_BLOG_API_URL,
siteKey: process.env.POLOSA_BLOG_SITE_KEY,
});
const articles = await blog.listPosts({ locale: "ru", page: 1 });SDK кеширует публичные ответы на 30 секунд и сохраняет последнюю успешную версию ещё на пять минут при временном сбое API. Предпросмотр не кешируется.
Несколько языков
Выберите языки в подключении сайта. Polosa подготовит версии одной статьи вместе. Читайте нужную версию через параметр locale. Поле translations в ответе статьи содержит адреса опубликованных переводов для переключателя языка и hreflang.
Для сайта с английской версией без префикса используйте общий путь /{locale}/blog/{slug} и отдельный путь для en: /blog/{slug}. Настройка доступна в «Адреса языковых версий».
Если API вернул другой slug, перенаправьте старый адрес на canonicalUrl с кодом 308: Polosa сохраняет прежние адреса после переименования статьи.
Скачать OpenAPI 3.1. Поля и поведение v1 сохраняются при обновлениях сервиса. Новые необязательные поля можно игнорировать.
- В разделе «Каналы» создайте Blog подключение. Укажите домен, язык и путь статьи, например
/blog/{slug}. - Скопируйте API URL.
GET /public/v1/sites/{siteKey}/posts?locale=ru&page=1&limit=20возвращает список и pagination. По/posts/{slug}?locale=ruдоступна статья с bodyMarkdown, canonicalUrl, id и revision. - Передайте разработчику адрес сервиса
https://duohuman.ai/polosa,siteKeyи язык. Доступ к нашему коду и секретный ключ не нужны: сайт получает опубликованные статьи обычными HTTP-запросами. - Создайте список и страницу статьи через серверный рендеринг или статическую сборку. Безопасно преобразуйте Markdown без исполнения HTML/JavaScript, добавьте SEO metadata, canonical и страницу 404.
- В HTML head страницы добавьте meta
content-factory-postсо значением id статьи иcontent-factory-revisionсо значением revision. Текст статьи должен находиться в серверномarticleилиmain. - Опубликуйте утвержденную статью в API. Обновите кеш сайта или запустите новую сборку. Нажмите «Проверить последнюю статью» в подключении.
Что возвращает статья
{
"id": "UUID статьи",
"siteKey": "my-blog",
"locale": "ru",
"revision": 1,
"slug": "pervaya-statya",
"title": "Название статьи",
"excerpt": "Краткое описание",
"bodyMarkdown": "## Заголовок\n\nТекст статьи.",
"seoTitle": "Название для поиска",
"seoDescription": "Описание для поиска",
"canonicalUrl": "https://site.example/blog/pervaya-statya",
"callToAction": { "label": "Подробнее", "url": null },
"publishedAt": "2026-10-09T10:00:00.000Z",
"updatedAt": "2026-10-09T10:00:00.000Z"
}Если callToAction.url равен null, кнопку со ссылкой выводить не нужно. Обложка приходит в необязательном поле cover с url, alt, width и height. Если cover отсутствует, выводите статью без изображения.
Подпись кнопки приходит в callToAction.label. Кнопка и ссылки внутри Markdown могут вести через наш адрес перехода: выводите полученные href целиком. Не открывайте их заранее на сервере и не отправляйте отдельное событие того же клика.
Формат текста: CommonMark с GFM (таблицы, списки задач, зачёркивание и автоматические ссылки). Отключите исполнение HTML. Смена slug пока не создаёт перенаправление старого адреса; обычное обновление текста сохраняет ID статьи.
Список возвращает items с теми же полями, кроме bodyMarkdown и callToAction, а также siteKey, locale и pagination с полями page, limit, total, totalPages. Статьи отсортированы от новых к старым. Размер страницы: от 1 до 50, по умолчанию 20.
Пустой блог возвращает HTTP 200 и пустой items. Несуществующая статья или подключение возвращают HTTP 404. При HTTP 400 проверьте параметры, при HTTP 500 покажите ошибку загрузки с повтором. Ошибки содержат поле error.
Публичное чтение не требует ключа: опубликованные статьи доступны посетителям сайта. Черновики туда не попадают.
Для закрытого preview участник с правом редактирования проекта получает краткоживущий token через POST /api/projects/{id}/connections/{connectionId}/preview с contentItemVersionId. Сервер сайта отправляет token в Authorization: Bearer при GET /public/v1/sites/{siteKey}/preview. Token действует 15 минут; сохраняйте его на сервере. Preview не кешируется и не должен индексироваться.
Статус «доставлено в Blog API» означает, что API отдает статью. Статус проверки подтверждает доступность конкретной версии на сайте в момент проверки. Он не подтверждает индексацию в поиске, посещения или продажи.
Публичный API кеширует успешные ответы на 60 секунд и допускает устаревший ответ еще до 300 секунд при обновлении. Для сайтов со статической сборкой настройте регулярную сборку. Push-коннекторы WordPress/Ghost и webhooks пока не подключены.
Просмотры и переходы
Переходы по готовым ссылкам считаются на стороне Polosa. Для этого сервису нужен публичный адрес; локальная разработка сохраняет исходные ссылки без счётчика переходов.
- В подключении Blog откройте «Аналитика сайта», включите сбор и сохраните настройки.
- Скопируйте код счётчика в шаблон сайта. В нём уже указаны адрес сервиса и ваш siteKey.
- Сохраните canonical и meta статьи из инструкции выше. При переходах в SPA обновляйте их вместе с содержимым страницы.
<script defer
src="https://duohuman.ai/polosa/public/v1/analytics.js"
data-site="YOUR_SITE_KEY"></script>Скрипт считает видимые страницы статей, передаёт только домен источника и не создаёт идентификатор посетителя. Учитывает Do Not Track и Global Privacy Control. Для вашего окна согласия добавьте data-consent="required", затем после согласия вызовите window.PolosaAnalytics?.consent(true). CSP сайта должна разрешать домен сервиса в script-src и connect-src.
Просмотр API и проверка страницы не считаются просмотрами читателей. Пока события не поступают, отчёт показывает «Нет данных». Блокировщик или потеря сети могут помешать отправке события, но не чтению статьи.
Регистрации и заявки
В «Сайты для конверсий» добавьте адрес сайта, на котором происходит действие, и включите связь с переходами. На этот сайт будет передаваться pl_click, идентификатор конкретного перехода. У существующих параметров ссылки сохраняются значения.
Установите счётчик с тем же siteKey на целевом сайте. После успешного действия вызовите:
window.PolosaAnalytics?.conversion("signup", {
eventId: crypto.randomUUID()
});Один eventId относится к одному действию. Для повторной отправки сохраните и используйте тот же ID. Скрипт хранит переход в sessionStorage текущей вкладки, не дольше 30 дней. Другой сайт может отправить конверсию только с подходящим pl_click.
Отправка с сервера сайта
Создайте ключ в разделе «События с backend». Ключ показывается один раз и хранится только на вашем сервере. Передайте полученный pl_click из формы или сессии:
POST /public/v1/sites/YOUR_SITE_KEY/conversions
Authorization: Bearer YOUR_SERVER_KEY
Content-Type: application/json
{
"type": "conversion",
"eventId": "70215239-a2e8-4ab2-aee4-9b4e03e89c02",
"name": "signup",
"clickId": "6c62904a-c302-4448-99de-56615f201d78"
}Можно передать известный postId вместо clickId: тогда сервер сам указывает статью, которой относится событие. HTTP 202 означает, что событие принято или уже записано. Повторы с тем же eventId не увеличивают счётчик. При 429 и 503 повторите позже с тем же ID; для 429 учитывайте Retry-After.
Названия событий: signup, lead, purchase или другое имя из строчных латинских букв, цифр и подчёркиваний, начиная с буквы. Не передавайте email, имена и содержимое заявок. Выберите один источник отправки события или используйте общий eventId для браузера и сервера.
Отчёт отдельно показывает события браузера и сервера. Они не равны числу уникальных покупателей или подтверждённой выручке. История переходов и событий статьи объединяет все её опубликованные версии.