Anmelden Kostenlose Testversion starten

Rufen Sie Ihre Artikel ab.
Veröffentlichen Sie sie auf Ihre Weise.

Jeder Artikel, den wir für Sie schreiben, kann über HTTP gelesen werden: der Titel, die Metadaten, das Markdown, das HTML, das Hero-Bild und die FAQ. Übernehmen Sie sie in Ihre Next.js-, Astro- oder eigene Website, wenn Ihr Build läuft, stellen Sie sie live und teilen Sie uns die Adresse mit, unter der jeder gelandet ist.

Ein Bearer-Token. JSON rein, JSON raus. Kein SDK zu installieren und nichts über einen Schlüssel hinaus zu konfigurieren.

Der Webhook sendet. Mit der API können Sie abrufen.

Sie übertragen denselben Artikel in derselben Form, sodass ein Parser, der für das eine geschrieben wurde, das andere unverändert lesen kann. Der Unterschied ist, wer die Kommunikation beginnt.

Der Webhook, wenn Ihre Website jederzeit einen Beitrag annehmen kann

Wir rufen Ihren Endpunkt in dem Moment auf, in dem ein Artikel fertig ist, und erneut, wenn er sich ändert. Nichts zum Abfragen, nichts zum Planen. WordPress, Shopify, Ghost, ein Zapier-Trigger oder eine Route, die Sie selbst geschrieben haben.

Die API, wenn Ihre Website als Einheit gebaut und bereitgestellt wird

Eine statische Website kann einen Beitrag nicht um halb sieben morgens annehmen, zuerst muss etwas neu gebaut werden. Ihr Build fragt also ab, was wartet, übernimmt es und teilt uns danach die Adresse mit. Sie wählen den Zeitpunkt.

Beides, wenn Sie möchten

Es sind getrennte Verbindungen, und keine schließt die andere aus. Ein Webhook, der einen Newsletter versorgt, und eine API, die die Website versorgt, ist eine normale Konfiguration.

Ein Schlüssel, gesendet als Bearer-Token.

Erstellen Sie im Dashboard unter Einstellungen, dann Verbindungen einen Schlüssel. Er wird einmal angezeigt, wenn er erstellt wird, weil nur sein Hash gespeichert wird: Wenn Sie ihn verlieren, widerrufen Sie ihn und erstellen Sie einen neuen. Ein Schlüssel liest jede Website im Konto und wird auf demselben Bildschirm widerrufen.

Jede Anfrage

Authorization: Bearer sns_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Accept: application/json

Prüfen Sie, dass es funktioniert

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
}

Rate-Limit

120 Anfragen pro Minute, gezählt gegen den Schlüssel statt gegen die Adresse, von der sie kommen, weil Build-Runner Adressen gemeinsam nutzen. Darüber erhalten Sie 429 mit den Standard-Headern Retry-After und X-RateLimit. Das Abrufen von Artikeln für einen Build sind nur wenige Anfragen, daher sollten Sie dieses Limit nicht versehentlich erreichen.

Halten Sie den Schlüssel aus Ihrem Repository heraus

Er liest alles, was wir für Ihr Konto geschrieben haben, einschließlich Artikeln, die noch nicht veröffentlicht sind. Legen Sie ihn in Ihre Build-Umgebung, nicht in Ihren Quellcode. Widerrufen Sie ihn hier in dem Moment, in dem er irgendwo ist, wo er nicht sein sollte, und alles, was ihn verwendet, erhält sofort eine 401.

Fünf davon, und vier lesen nur.

Alles liegt unter /api/v1/. Die Version steht vom ersten Tag an im Pfad, damit eines Tages eine v2 existieren kann, ohne das zu brechen, was Sie heute schreiben.

GET /api/v1/me

Das Konto, zu dem der Schlüssel gehört, sowie der Name und das Präfix des Schlüssels. Vor allem für eines nützlich: um Ihnen zu zeigen, dass der Schlüssel in dieser Umgebung der Schlüssel ist, für den Sie ihn halten.

Beispiel

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

Jede Website im Konto. Die id ist das, worauf die Artikelliste filtert, und die Domain ist da, damit ein Build-Skript auf etwas abgleichen kann, das es bereits kennt, statt eine id mitzuführen.

Beispiel

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

Eine Seite mit Artikeln, neueste Änderung zuerst, ohne den Inhalt. Sortiert danach, wann jeder Artikel zuletzt geändert wurde, nicht danach, wann er geschrieben wurde. Genau deshalb ist updated_since nützlich: Ein Artikel, der bereits live ist, kann später noch bearbeitet werden, wenn ein Link eingefügt oder wieder entfernt wird.

Abfrageparameter

Name Was es macht
site_id Eine Website, aus /sites. Eine id, die nicht zu Ihrem Konto gehört, antwortet mit 404.
status Einer von draft, qa, needs_repair, review, ready, published, failed. Alles andere ist eine 422 statt einer leeren Seite. "ready" ist das, was ein Build will: geschrieben, geprüft und noch nirgends.
updated_since ISO 8601, zum Beispiel 2026-09-06T00:00:00Z. Merken Sie sich den Zeitstempel Ihres letzten Laufs und geben Sie ihn beim nächsten wieder mit.
per_page Bis zu 100. Standard ist 25.
page Ab 1. meta.has_more sagt, ob Sie eine weitere anfordern sollen.

Beispiel

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}

Ein Artikel, mit allem, was die Liste weglässt: content_markdown, content_html, die FAQ als schema.org-JSON-LD, bereit zum Einfügen in die Seite, und alle Austausch-Links, die der Artikel enthält.

Die Feldnamen sind absichtlich dieselben, die unser Webhook sendet. Wenn Sie bereits einen Webhook-Empfänger haben, liest derselbe Parser auch dies.

Beispiel

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

Sie schalten den Artikel live, hier teilen Sie uns die Adresse mit. Dies ist der einzige Endpunkt, der etwas ändert.

Es macht genau das, was auch eine Auslieferung durch uns selbst macht: Der Artikel wird als veröffentlicht markiert, Ihr monatliches Kontingent zählt ihn, der Planpunkt wird abgeschlossen, alle Austausch-Links darin erhalten die Adresse, auf die der Verifier gewartet hat, und Ihre Facebook Page wird informiert, wenn Sie eine verbunden haben. Ohne diesen Aufruf bleibt der Artikel für immer bereit, und nichts davon passiert.

Beispiel

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"}'

Antworten

200 Erfasst. Der Artikel kommt mit seinem neuen Status, published_at und published_url zurück.
422 Die URL fehlt oder ist keine vollständige http://- oder https://-Adresse.
409 Der Artikel ist nicht bereit zur Veröffentlichung oder bereits als veröffentlicht erfasst. Der Artikel wird mit der Ablehnung zurückgegeben, damit Sie sehen können, was davon zutrifft.

Verbinden Sie "REST API" als Ihre Veröffentlichungs-Engine.

Unter Einstellungen und dann Veröffentlichung gibt es eine Engine namens "REST API: Sie rufen ab und veröffentlichen". Sie verlangt nichts, weil wir nichts zu senden haben. Sie ändert, was jeden Morgen passiert: Ein fertiger Artikel bleibt ohne Adresse bereit, und der Veröffentlichungsbildschirm zeigt an, dass er darauf wartet, von Ihnen abgerufen zu werden, statt eine fehlgeschlagene Zustellung anzuzeigen.

Sie können die API verwenden, ohne sie zu verbinden: Die Endpunkte funktionieren für jedes Konto mit einem Schlüssel. Durch das Verbinden weiß der Rest des Produkts, dass keine eigene Adresse mehr erwartet werden soll, und es verhindert, dass ein von Ihnen selbst veröffentlichter Artikel als Fehler gezählt wird.

Jeder Fehler ist JSON mit einer Meldung.

Durchgehend eine Form, egal ob die Ablehnung von der Schlüsselprüfung oder vom Validator kam, damit nichts zwei Formate parsen muss.

{ "message": "That API key is not valid, or it has been revoked." }
Status Was es bedeutet
401 Kein Schlüssel, ein Schlüssel, der nicht von uns ist, oder ein Schlüssel, der widerrufen wurde.
404 Kein solcher Artikel und keine solche Website in diesem Konto. Der Artikel eines anderen Kontos antwortet mit 404 statt 403: Eine API, die sagt "das gehört Ihnen nicht", hat bestätigt, dass das Objekt existiert.
409 Die Anfrage war in Ordnung, aber der Artikel ist nicht in einem passenden Status dafür.
422 Ein Parameter fehlt oder ist falsch. Die Antwort enthält ein errors-Objekt mit dem Feldnamen sowie der Meldung.
429 Über dem Rate-Limit. Retry-After sagt, wie lange Sie warten sollen.

Was ein Build-Schritt tatsächlich macht.

#!/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

Erstellen Sie einen Schlüssel und probieren Sie es aus.

Die Testphase reicht aus, um die API zu lesen: Die darin geschriebenen Artikel sind echte Artikel und kommen über diese Endpunkte zurück wie alle anderen auch.

Kostenlose Testversion starten