Інтеграція Custom API

Підключіть будь-який сайт до Seonix

Реалізуйте один REST-ендпоінт у своєму сайті — Seonix публікуватиме згенеровані статті напряму на нього з оновленнями та опційним видаленням з коробки. Працює з будь-яким стеком: Node, Python, PHP, Go, Rails, WordPress чи генератор статичних сайтів.

Як це працює

Seonix — клієнт. Ваш сайт надає ендпоінт. Ви генеруєте, редагуєте й оцінюєте статті в Seonix, тиснете Publish — Seonix надсилає статтю на ваш ендпоінт із Bearer-токеном. Повторні публікації використовують той самий external_id, тому дублікатів не буде.

1. Реалізуйте ендпоінт

Приймайте JSON POST, перевіряйте Bearer-токен проти власного секрету та робіть upsert за external_id. Достатньо кількох рядків у будь-якому фреймворку — див. приклади клієнта нижче.

2. Підключіть канал у Seonix

У Channels проєкту додайте Custom API канал із URL ендпоінта і токеном. Verify та Publish — Seonix надсилає кожну статтю, зберігає id, який ви повернули, і робить оновлення ідемпотентними.

3. Оновлення та видалення використовують той же id

Наступні правки потрапляють у той самий ендпоінт із тим же external_id — upsert на вашому боці. Якщо ви налаштуєте delete URL template, видалення статті в Seonix викличе DELETE на вашому ендпоінті.

Налаштування підключення

Три поля обовʼязкові, два — опційні. Вставити й зберегти їх можна у вкладці Channels всередині Seonix, не виходячи з додатку.

  1. 1

    Оберіть спільний секрет

    Згенеруйте довгий випадковий рядок (32+ символи). Це Bearer-токен, який Seonix надсилає в кожному запиті. Тримайте його на сервері; не зашивайте у клієнтський код.

  2. 2

    Реалізуйте POST /your-endpoint

    Перевіряйте заголовок Authorization проти вашого секрету, робіть upsert статті за external_id та повертайте { "id": "…", "url": "…" }. 4xx — постійно, 5xx — повтор.

  3. 3

    (Опційно) Реалізуйте DELETE /your-endpoint/:id

    Якщо хочете, щоб статті зникали з сайту при видаленні в Seonix, обробляйте DELETE з тим самим Bearer-токеном. Повертайте 200 у разі успіху; 404 ми трактуємо як вже видалений запис.

  4. 4

    Додайте канал у Seonix

    Відкрийте Channels у проєкті → Custom Webhook → Connect. Вставте URL ендпоінта, токен і (опційно) delete URL template, локаль та автора. Seonix перевіряє зʼєднання одразу після збереження.

  5. 5

    Публікуйте з редактора

    Відкрийте статтю, натисніть Publish, оберіть свій Custom API канал у списку — і тисніть Publish now. Seonix збереже повернутий id, щоб усі подальші оновлення йшли в той самий запис.

Конфіг каналу

Канал Custom API зберігає URL ендпоінта, bearer-токен, опційний delete URL template і додаткові заголовки, якщо потрібно. Секрети залишаються всередині проєкту Seonix — їх читають лише для побудови вихідних запитів.

json
{
  "api_url":             "https://your-site.example/api/articles",
  "api_token":           "YOUR_SHARED_SECRET",
  "delete_url_template": "https://your-site.example/api/articles/{id}",
  "headers":             { "X-Custom": "optional" },
  "lang":                "en",
  "author":              "Your team"
}

Усі поля конфіга зберігаються всередині проєкту Seonix, доступні лише для серверної частини Seonix і ніколи не залишають движок. Redo конфіг у будь-який момент через ту саму модалку Channels → Custom Webhook → Manage.

Автентифікація

Оберіть будь-який bearer-токен — це спільний секрет між вашим сайтом і Seonix. Seonix надсилає його в заголовку Authorization кожного запиту. Ротація — просто оновіть конфіг каналу, без рестарту сервера.

  • Authorization:Bearer <API token>

Токен показується лише в момент створення. Скопіюйте його одразу; у базі зберігається лише хеш. Втратили токен — створіть новий і відкличте старий у тій же адмінці.

Публікація статті

Seonix надсилає JSON POST на ваш налаштований URL і для створення, і для оновлення — ендпоінт має робити upsert за external_id, щоб повторне надсилання того ж id оновлювало існуючий запис замість створення дубліката.

POST/ваш-ендпоінт

Створення або оновлення (upsert).

http
POST https://your-site.example/api/articles
Authorization: Bearer YOUR_SHARED_SECRET
Content-Type: application/json

{
  "external_id":     "ext_article_170b63f6",
  "slug":            "how-to-automate-seo-content",
  "lang":            "en",
  "title":           "How to automate SEO content in 2026",
  "excerpt":         "Short summary shown on list pages and meta tags.",
  "content_html":    "<h2 id=\"intro\">Intro</h2><p>Body copy…</p>",
  "category":        "automation",
  "tags":            ["seo", "ai"],
  "cover_url":       "https://cdn.example/covers/abc.jpg",
  "author":          "Your team",
  "seo_title":       "Automate SEO content in 2026 — a field guide",
  "seo_description": "Short meta description.",
  "og_image":        "https://cdn.example/og/abc.jpg",
  "published_at":    "2026-04-16T09:00:00.000Z"
}
http
HTTP/1.1 200 OK
Content-Type: application/json

{
  "id":  "42",
  "url": "https://your-site.example/blog/how-to-automate-seo-content"
}

Оновлення — це той самий POST з тим же external_id. Поля, які не надіслали, зберігають попереднє значення.

http
# Updates reuse the same POST.
# Send the same external_id — your endpoint should upsert on it.
# Omit a field to keep the stored value.

POST https://your-site.example/api/articles
Authorization: Bearer YOUR_SHARED_SECRET

{
  "external_id":  "ext_article_170b63f6",
  "slug":         "how-to-automate-seo-content",
  "lang":         "en",
  "title":        "How to automate SEO content in 2026 (refined)",
  "excerpt":      "Updated summary.",
  "content_html": "<p>Updated body…</p>"
}

Видалення статті

Налаштуйте delete_url_template у каналі — Seonix підставить {id} з external_id і зробить DELETE із тим же Bearer-токеном. Пропустіть template, щоб ігнорувати видалення; 404 трактується як вже видалений запис.

DELETE/ваш-ендпоінт/:id

Видалення статті. Використовується той самий Bearer-токен.

http
# {id} in delete_url_template is substituted with external_id
DELETE https://your-site.example/api/articles/ext_article_170b63f6
Authorization: Bearer YOUR_SHARED_SECRET

Поля payload

Саме таку форму надсилає Seonix. Мапте поля на свою схему на сервері. Ігноруйте, що не потрібно — Seonix байдуже, які саме поля зберігає ваш CMS.

ПолеТипОпис
external_idstring?Ваш стабільний id. Якщо переданий, використовується як ключ upsert; зберігайте його при оновленнях і видаленнях.
translation_keystring?Спільний ключ, що зв'язує EN та UA версії однієї статті. Необов'язковий — той самий slug також їх зв'язує.
slugstringМалими літерами, через дефіс. Однаковий slug у різних локалях вирівнює URL-адреси.
lang"en" | "ua"Локаль цієї версії.
titlestringЗаголовок статті. Значення за замовчуванням для <h1> та <title>.
excerptstringКороткий опис для сторінок списків і запасний варіант meta description.
content_htmlstringОчищений HTML-вміст. Потрібен або він, або content_markdown.
content_markdownstringВміст у Markdown, що рендериться в HTML під час збереження через remark + GFM + підсвічування синтаксису.
category"seo" | "ai" | "automation" | "content-strategy" | "case-studies" | "product"Категорія, що відображається на сторінках списків. Має збігатися з одним із фіксованих значень.
tagsstring[]Довільні теги тем, до 20.
key_takeawaysstring[]Маркований список, що відображається вгорі сторінки статті.
cover_urlstringАбсолютний URL обкладинки у форматі 16/9.
authorstringАвтор. За замовчуванням 'Seonix'.
seo_titlestring?Перевизначає <title> для пошукових систем.
seo_descriptionstring?Перевизначає meta description.
og_imagestring?Перевизначає зображення Open Graph.
published_atISO stringДата публікації. Використовуйте як канонічну позначку часу.

Очікувана відповідь

У відповіді поверніть JSON із id запису та публічним URL сторінки. Seonix зберігає id як external_id і використовує його для наступного оновлення чи видалення. Все інше у відповіді ігнорується.

json
HTTP/1.1 200 OK
Content-Type: application/json

{
  "id":  "42",
  "url": "https://your-site.example/blog/how-to-automate-seo-content"
}

Помилки й повтори

Повертайте 4xx для постійних помилок (вони показуються оператору як є) і 5xx для тимчасових збоїв — Seonix повторює з експоненційною паузою. Коротке повідомлення у тілі допоможе з дебагом.

КодЗначення
200Успіх. У відповіді id, url, updated_at.
400 VALIDATIONПоле відсутнє або має недопустиме значення. Повідомлення каже, яке саме.
401 UNAUTHORIZEDBearer відсутній або токен відкликано.
429 RATE_LIMITEDЗанадто багато запитів з одного IP. Читайте Retry-After у заголовку.
5xx WRITE_FAILEDТимчасова помилка на стороні блогу. Двигун повторює з експоненційною паузою.

Приклади клієнта

Мінімальні приймачі, які можна вставити в будь-який бекенд. Вони валідують bearer-токен, роблять upsert статті та повертають відповідь, яку очікує Seonix.

bash
# Minimal receiver test — simulate what Seonix sends you
curl -X POST "$YOUR_ENDPOINT" \
  -H "Authorization: Bearer $YOUR_SHARED_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "external_id":  "ext_abc123",
    "slug":         "how-to-automate-seo-content",
    "lang":         "en",
    "title":        "How to automate SEO content in 2026",
    "excerpt":      "Short summary.",
    "content_html": "<p>Body…</p>",
    "category":     "automation",
    "tags":         ["seo", "ai"],
    "published_at": "2026-04-16T09:00:00.000Z"
  }'

Готові підключитися?

Створіть проєкт у Seonix, додайте канал блогу й опублікуйте першу статтю за десять хвилин. Один токен відкриває і write, і delete.

Почати безкоштовно