Статьи на вашем сайте

Подключение 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 сохраняются при обновлениях сервиса. Новые необязательные поля можно игнорировать.

  1. В разделе «Каналы» создайте Blog подключение. Укажите домен, язык и путь статьи, например /blog/{slug}.
  2. Скопируйте API URL. GET /public/v1/sites/{siteKey}/posts?locale=ru&page=1&limit=20 возвращает список и pagination. По /posts/{slug}?locale=ru доступна статья с bodyMarkdown, canonicalUrl, id и revision.
  3. Передайте разработчику адрес сервиса https://duohuman.ai/polosa, siteKey и язык. Доступ к нашему коду и секретный ключ не нужны: сайт получает опубликованные статьи обычными HTTP-запросами.
  4. Создайте список и страницу статьи через серверный рендеринг или статическую сборку. Безопасно преобразуйте Markdown без исполнения HTML/JavaScript, добавьте SEO metadata, canonical и страницу 404.
  5. В HTML head страницы добавьте meta content-factory-post со значением id статьи и content-factory-revision со значением revision. Текст статьи должен находиться в серверном article или main.
  6. Опубликуйте утвержденную статью в 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. Для этого сервису нужен публичный адрес; локальная разработка сохраняет исходные ссылки без счётчика переходов.

  1. В подключении Blog откройте «Аналитика сайта», включите сбор и сохраните настройки.
  2. Скопируйте код счётчика в шаблон сайта. В нём уже указаны адрес сервиса и ваш siteKey.
  3. Сохраните 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 для браузера и сервера.

Отчёт отдельно показывает события браузера и сервера. Они не равны числу уникальных покупателей или подтверждённой выручке. История переходов и событий статьи объединяет все её опубликованные версии.