Підключіть будь-який сайт до 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
Оберіть спільний секрет
Згенеруйте довгий випадковий рядок (32+ символи). Це Bearer-токен, який Seonix надсилає в кожному запиті. Тримайте його на сервері; не зашивайте у клієнтський код.
- 2
Реалізуйте POST /your-endpoint
Перевіряйте заголовок Authorization проти вашого секрету, робіть upsert статті за external_id та повертайте { "id": "…", "url": "…" }. 4xx — постійно, 5xx — повтор.
- 3
(Опційно) Реалізуйте DELETE /your-endpoint/:id
Якщо хочете, щоб статті зникали з сайту при видаленні в Seonix, обробляйте DELETE з тим самим Bearer-токеном. Повертайте 200 у разі успіху; 404 ми трактуємо як вже видалений запис.
- 4
Додайте канал у Seonix
Відкрийте Channels у проєкті → Custom Webhook → Connect. Вставте URL ендпоінта, токен і (опційно) delete URL template, локаль та автора. Seonix перевіряє зʼєднання одразу після збереження.
- 5
Публікуйте з редактора
Відкрийте статтю, натисніть Publish, оберіть свій Custom API канал у списку — і тисніть Publish now. Seonix збереже повернутий id, щоб усі подальші оновлення йшли в той самий запис.
Конфіг каналу
Канал Custom API зберігає URL ендпоінта, bearer-токен, опційний delete URL template і додаткові заголовки, якщо потрібно. Секрети залишаються всередині проєкту Seonix — їх читають лише для побудови вихідних запитів.
{
"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 оновлювало існуючий запис замість створення дубліката.
/ваш-ендпоінтСтворення або оновлення (upsert).
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/1.1 200 OK
Content-Type: application/json
{
"id": "42",
"url": "https://your-site.example/blog/how-to-automate-seo-content"
}Оновлення — це той самий POST з тим же external_id. Поля, які не надіслали, зберігають попереднє значення.
# 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 трактується як вже видалений запис.
/ваш-ендпоінт/:idВидалення статті. Використовується той самий Bearer-токен.
# {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.
| Field | Type | Description |
|---|---|---|
| external_id | string? | Your stable id. When present, used as the upsert key; preserve it across updates and deletes. |
| translation_key | string? | Shared key that links EN and UA versions of the same article. Optional — same slug also links them. |
| slug | string | Lowercase, hyphen-separated. Same slug across locales keeps URLs aligned. |
| lang | "en" | "ua" | Locale of this version. |
| title | string | Article title. Default value for <h1> and <title>. |
| excerpt | string | Short summary for list pages and the meta description fallback. |
| content_html | string | Sanitized HTML body. Either this or content_markdown is required. |
| content_markdown | string | Markdown 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. |
| tags | string[] | Freeform topic tags, up to 20. |
| key_takeaways | string[] | Bullet list rendered at the top of the article page. |
| cover_url | string | Absolute URL of the 16/9 cover image. |
| author | string | Byline. Defaults to “Seonix”. |
| seo_title | string? | Overrides <title> for search engines. |
| seo_description | string? | Overrides the meta description. |
| og_image | string? | Overrides the Open Graph image. |
| published_at | ISO string | Publish date. Use it as the canonical timestamp. |
Очікувана відповідь
У відповіді поверніть JSON із id запису та публічним URL сторінки. Seonix зберігає id як external_id і використовує його для наступного оновлення чи видалення. Все інше у відповіді ігнорується.
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 повторює з експоненційною паузою. Коротке повідомлення у тілі допоможе з дебагом.
| Code | Meaning |
|---|---|
| 200 | Успіх. У відповіді id, url, updated_at. |
| 400 VALIDATION | Поле відсутнє або має недопустиме значення. Повідомлення каже, яке саме. |
| 401 UNAUTHORIZED | Bearer відсутній або токен відкликано. |
| 429 RATE_LIMITED | Занадто багато запитів з одного IP. Читайте Retry-After у заголовку. |
| 5xx WRITE_FAILED | Тимчасова помилка на стороні блогу. Двигун повторює з експоненційною паузою. |
Приклади клієнта
Мінімальні приймачі, які можна вставити в будь-який бекенд. Вони валідують bearer-токен, роблять upsert статті та повертають відповідь, яку очікує Seonix.
# 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.
Почати безкоштовно →