SeonixSeonix
Інтеграція 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.

FieldTypeDescription
external_idstring?Your stable id. When present, used as the upsert key; preserve it across updates and deletes.
translation_keystring?Shared key that links EN and UA versions of the same article. Optional — same slug also links them.
slugstringLowercase, hyphen-separated. Same slug across locales keeps URLs aligned.
lang"en" | "ua"Locale of this version.
titlestringArticle title. Default value for <h1> and <title>.
excerptstringShort summary for list pages and the meta description fallback.
content_htmlstringSanitized HTML body. Either this or content_markdown is required.
content_markdownstringMarkdown body, rendered to HTML on save via remark + GFM + syntax highlighting.
category"seo" | "ai" | "automation" | "content-strategy" | "case-studies" | "product"Taxonomy bucket shown on list pages. Must match one of the fixed values.
tagsstring[]Freeform topic tags, up to 20.
key_takeawaysstring[]Bullet list rendered at the top of the article page.
cover_urlstringAbsolute URL of the 16/9 cover image.
authorstringByline. Defaults to “Seonix”.
seo_titlestring?Overrides <title> for search engines.
seo_descriptionstring?Overrides the meta description.
og_imagestring?Overrides the Open Graph image.
published_atISO stringPublish date. Use it as the canonical timestamp.

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

У відповіді поверніть 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 повторює з експоненційною паузою. Коротке повідомлення у тілі допоможе з дебагом.

CodeMeaning
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.

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