Увійти Почати безплатний пробний період

Забирайте Ваші статті.
Публікуйте їх по-своєму.

Кожну статтю, яку ми для Вас пишемо, можна прочитати через HTTP: заголовок, метадані, Markdown, HTML, головне зображення та FAQ. Забирайте їх у Ваш сайт на Next.js, Astro або власний сайт під час збірки, публікуйте й повідомляйте нам адресу, за якою врешті опинилася кожна з них.

Один bearer token. JSON на вході, JSON на виході. Немає SDK для встановлення й нічого не треба налаштовувати, окрім ключа.

Webhook надсилає. API дає Вам змогу отримувати.

Вони передають ту саму статтю в тому самому форматі, тож парсер, написаний для одного, читає й інше без змін. Різниця в тому, хто починає обмін.

Webhook, коли Ваш сайт може приймати публікацію будь-коли

Ми викликаємо Ваш endpoint у момент, коли стаття готова, і ще раз, коли вона змінюється. Нічого не треба опитувати, нічого не треба планувати. WordPress, Shopify, Ghost, тригер Zapier або маршрут, який Ви написали самі.

API, коли Ваш сайт збирається й розгортається як єдине ціле

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

Обидва, якщо хочете

Це окремі підключення, і жодне не виключає інше. Webhook, який наповнює розсилку, і API, який наповнює сайт, - це звичайна схема.

Один ключ, переданий як bearer token.

Створіть ключ у панелі керування в розділі Settings, потім Connections. Він показується один раз, під час створення, бо зберігається лише його хеш: якщо Ви його втратите, відкличте його й створіть інший. Ключ читає всі сайти в обліковому записі й відкликається на тому самому екрані.

Кожен запит

Authorization: Bearer sns_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Accept: application/json

Перевірте, що це працює

curl https://seonis.ai/api/v1/me \
  -H "Authorization: Bearer $SEONIS_API_KEY"
{
  "organisation": { "id": 12, "name": "Peppervale", "country": "GB" },
  "key": {
    "name": "Production build",
    "prefix": "sns_live_ab",
    "created_at": "2026-09-06T09:12:44+00:00",
    "last_used_at": "2026-09-06T09:31:02+00:00"
  },
  "sites": 2
}

Ліміт запитів

120 запитів за хвилину, рахуються за ключем, а не за адресою, з якої вони надходять, бо збирачі збірок використовують спільні адреси. Понад це Ви отримаєте 429 зі стандартними заголовками Retry-After і X-RateLimit. Отримання статей для збірки - це лише кілька запитів, тож випадково впертися в цей ліміт Ви не повинні.

Не зберігайте ключ у Вашому репозиторії

Він читає все, що ми написали для Вашого облікового запису, зокрема статті, які ще не опубліковані. Зберігайте його у Вашому середовищі збірки, а не у вихідному коді. Відкличте його тут одразу, щойно він опиниться там, де не повинен бути, і все, що його використовує, відразу отримає 401.

Їх п’ять, і чотири лише для читання.

Усе розміщено під /api/v1/. Версія є в шляху з першого дня, тож одного дня може з’явитися v2, не ламаючи те, що Ви пишете сьогодні.

GET /api/v1/me

Обліковий запис, якому належить ключ, а також назва й префікс самого ключа. Найбільше це корисно для одного: щоб показати Вам, що ключ у цьому середовищі - саме той ключ, який Ви маєте на увазі.

Приклад

curl https://seonis.ai/api/v1/me \
  -H "Authorization: Bearer $SEONIS_API_KEY"
GET /api/v1/sites

Кожен сайт в обліковому записі. id - це те, за чим фільтрується список статей, а domain тут для того, щоб скрипт збірки міг звірятися з тим, що вже знає, а не передавати id.

Приклад

curl https://seonis.ai/api/v1/sites \
  -H "Authorization: Bearer $SEONIS_API_KEY"
{
  "sites": [
    {
      "id": 5,
      "name": "Peppervale",
      "domain": "peppervale.co.uk",
      "url": "https://peppervale.co.uk",
      "language": "en",
      "country": "GB",
      "market": "en-GB",
      "status": "active",
      "articles_published": 34,
      "created_at": "2026-06-02T11:04:19+00:00"
    }
  ]
}
GET /api/v1/articles

Сторінка статей, спочатку найновіші зміни, без тексту. Упорядковано за часом останньої зміни кожної статті, а не за часом написання, саме тому updated_since корисний: статтю, яка вже опублікована, можна відредагувати пізніше, коли в неї додають посилання або знову прибирають його.

Параметри запиту

Назва Що це робить
site_id Один сайт, із /sites. id, якого немає у Вашому обліковому записі, повертає 404.
status Одне зі значень: draft, qa, needs_repair, review, ready, published, failed. Будь-що інше дає 422, а не порожню сторінку. "ready" - це те, що потрібно збірці: написано, перевірено й ще ніде не опубліковано.
updated_since ISO 8601, наприклад 2026-09-06T00:00:00Z. Запам’ятайте часову позначку Вашого останнього запуску й передайте її знову в наступному.
per_page До 100. Типове значення - 25.
page Від 1. meta.has_more показує, чи потрібно запитувати наступну.

Приклад

curl -G https://seonis.ai/api/v1/articles \
  -H "Authorization: Bearer $SEONIS_API_KEY" \
  -d site_id=5 \
  -d status=ready \
  -d updated_since=2026-09-01T00:00:00Z \
  -d per_page=50
{
  "articles": [
    {
      "id": 918,
      "site_id": 5,
      "language": "en",
      "status": "ready",
      "title": "How to choose a pepper grinder",
      "slug": "how-to-choose-a-pepper-grinder",
      "meta_title": "How to choose a pepper grinder | Peppervale",
      "meta_description": "Burr or blade, ceramic or steel: what matters in a grinder.",
      "meta_keywords": ["pepper grinder", "burr grinder"],
      "tags": ["Kitchen"],
      "excerpt": "A burr grinder gives an even grind; a blade one does not.",
      "key_takeaways": ["A burr grinder gives an even grind; a blade one does not."],
      "faq": [{ "question": "Ceramic or steel?", "answer": "Steel for pepper, ceramic for salt." }],
      "hero_image": { "url": "https://seonis.ai/storage/images/5/918.jpg", "alt": "A pepper grinder" },
      "infographic_url": null,
      "word_count": 1812,
      "published_url": null,
      "published_at": null,
      "updated_at": "2026-09-06T06:31:12+00:00",
      "created_at": "2026-09-05T02:14:55+00:00",
      "quality": { "seo_score": 88, "language_score": 96, "language_findings": [] }
    }
  ],
  "meta": { "page": 1, "per_page": 50, "total": 1, "last_page": 1, "has_more": false }
}
GET /api/v1/articles/{id}

Одна стаття, з усім, що список не показує: content_markdown, content_html, FAQ як schema.org JSON-LD, готовий до вставлення на сторінку, і всі exchange links, які містить стаття.

Назви полів - саме ті, які надсилає наш webhook, і це навмисно. Якщо у Вас уже є приймач webhook, той самий парсер прочитає і це.

Приклад

curl https://seonis.ai/api/v1/articles/918 \
  -H "Authorization: Bearer $SEONIS_API_KEY"
{
  "article": {
    "id": 918,
    "site_id": 5,
    "language": "en",
    "status": "ready",
    "title": "How to choose a pepper grinder",
    "slug": "how-to-choose-a-pepper-grinder",
    "meta_description": "Burr or blade, ceramic or steel: what matters in a grinder.",
    "content_markdown": "Grinders differ.\n\n## Burr or blade\n\nA **burr** grinder ...",
    "content_html": "<p>Grinders differ.</p>\n<h2>Burr or blade</h2> ...",
    "faq_schema": { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [] },
    "hero_image": { "url": "https://seonis.ai/storage/images/5/918.jpg", "alt": "A pepper grinder" },
    "word_count": 1812,
    "published_url": null,
    "updated_at": "2026-09-06T06:31:12+00:00",
    "quality": { "seo_score": 88, "language_score": 96, "language_findings": [] },
    "exchange_links": []
  }
}
POST /api/v1/articles/{id}/published

Ви публікуєте статтю; тут Ви повідомляєте нам її адресу. Це єдиний endpoint, який щось змінює.

Це робить рівно те саме, що й доставка, яку ми виконали самі: стаття позначається як опублікована, зараховується до Вашого місячного ліміту, пункт плану закривається, усі exchange links у ній отримують адресу, на яку чекав перевіряльник, а Вашу Facebook Page буде сповіщено, якщо Ви її підключили. Без цього виклику стаття назавжди залишиться готовою, і нічого з цього не станеться.

Приклад

curl -X POST https://seonis.ai/api/v1/articles/918/published \
  -H "Authorization: Bearer $SEONIS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://peppervale.co.uk/blog/how-to-choose-a-pepper-grinder"}'

Відповіді

200 Записано. Стаття повертається з новим статусом, published_at і published_url.
422 URL відсутній або не є повною адресою http:// чи https://.
409 Стаття не готова до публікації або вже позначена як опублікована. Стаття повертається разом із відмовою, щоб Ви могли побачити, який саме випадок.

Підключіть "REST API" як Ваш механізм публікації.

У Settings, потім у Publishing, є механізм під назвою "REST API: you fetch and publish". Він нічого не запитує, бо нам нічого надсилати. Він змінює те, що відбувається щоранку: готова стаття лишається готовою без адреси, а екран публікації показує, що вона чекає, поки Ви її заберете, замість того щоб показувати невдалу доставку.

Ви можете користуватися API, не підключаючи його: endpoint працюють для будь-якого облікового запису з ключем. Підключення потрібне, щоб решта продукту знала, що більше не треба очікувати власну адресу, і саме воно не дає зараховувати статтю, яку Ви опублікували самі, як помилку.

Кожна помилка - це JSON з повідомленням.

Одна форма всюди, незалежно від того, чи відмову повернула перевірка ключа, чи валідатор, тож нічому не доведеться розбирати дві.

{ "message": "That API key is not valid, or it has been revoked." }
Статус Що це означає
401 Немає ключа, ключ не наш або ключ було відкликано.
404 У цьому обліковому записі немає такої статті або сайту. Стаття іншого облікового запису повертає 404, а не 403: API, яке каже "це не Ваше", підтверджує, що така річ існує.
409 Запит був коректний, але стан статті цього не дозволяє.
422 Параметр відсутній або неправильний. Відповідь містить об’єкт errors з назвою поля, а також повідомленням.
429 Перевищено ліміт запитів. Retry-After показує, скільки чекати.

Що насправді робить крок збірки.

#!/usr/bin/env bash
set -euo pipefail

# 1. What is finished and not yet on the site?
ready=$(curl -sG https://seonis.ai/api/v1/articles \
  -H "Authorization: Bearer $SEONIS_API_KEY" \
  -d site_id=5 -d status=ready -d per_page=100)

for id in $(echo "$ready" | jq -r '.articles[].id'); do
  # 2. Take the article, body and all.
  curl -s https://seonis.ai/api/v1/articles/$id \
    -H "Authorization: Bearer $SEONIS_API_KEY" \
    | jq -r '.article.content_markdown' > "content/posts/$id.md"

  # 3. Your build puts it live, and you know where it landed.
  slug=$(echo "$ready" | jq -r ".articles[] | select(.id==$id) | .slug")

  curl -s -X POST https://seonis.ai/api/v1/articles/$id/published \
    -H "Authorization: Bearer $SEONIS_API_KEY" \
    -H "Content-Type: application/json" \
    -d "{\"url\": \"https://peppervale.co.uk/blog/$slug\"}"
done

Створіть ключ і спробуйте.

Пробного періоду достатньо, щоб читати API: статті, написані під час нього, є справжніми статтями й повертаються через ці endpoint так само, як і будь-які інші.

Почати безплатний пробний період