Entwickler

API & Entwickler

Geo-Autopilot bringt fertige Artikel in jedes System, auch ohne fertige Integration. Du baust einen schlanken Empfänger (eine Serverless-Funktion, eine Route in deiner App), und Geo-Autopilot schickt jeden freigegebenen Artikel als neutrales JSON dorthin. Diese Seite ist der komplette Vertrag für Entwickler.

Komplette Spezifikation als Markdown, fertig zum Einfügen in Claude, Codex & Co.

So funktioniert es

  1. Du legst in Geo-Autopilot ein Veröffentlichungsziel vom Typ Custom API an und hinterlegst deine Endpunkt-URL und ein selbst gewähltes Geheimnis.
  2. Wird ein Artikel veröffentlicht (manuell oder per Autopilot), schickt Geo-Autopilot einen POST mit dem Artikel als JSON an deine URL.
  3. Dein Empfänger prüft das Geheimnis, speichert/veröffentlicht den Beitrag und antwortet mit einer ID.

Der Request

POST {deine-url} mit Content-Type: application/json und deinem Geheimnis im Header (empfohlener Name X-Geo-Autopilot-Token). Der Body:

POST https://dein-cms.example/geo-autopilot/ingest
Content-Type: application/json
X-Geo-Autopilot-Token: geo_live_abc123

{
  "title": "Wie GEO funktioniert",
  "slug": "wie-geo-funktioniert",
  "content_html": "<h1>Wie GEO funktioniert</h1><p>…</p>",
  "excerpt": "Kurzfassung für Listen und Meta-Description.",
  "meta_title": "Wie GEO funktioniert | Beispiel",
  "meta_description": "Kurzfassung für Listen und Meta-Description.",
  "meta_keywords": "geo, seo",
  "status": "publish",
  "remote_post_id": "",
  "images": [
    {
      "role": "featured",
      "url": "",
      "filename": "wie-geo-funktioniert.png",
      "mime_type": "image/png",
      "data_base64": "iVBORw0KGgo…"
    },
    {
      "role": "inline",
      "url": "https://app.geo-autopilot.de/media/articles/abc/inline-1.png",
      "filename": "inline-1.png",
      "mime_type": "image/png",
      "data_base64": "iVBORw0KGgo…"
    }
  ]
}
  • content_html ist nur der Body des Artikels, ohne <html>/<head>-Rahmen. Bei Mermaid-Diagrammen enthält der Body einen <pre class="mermaid">-Block und das passende Mermaid-Script am Ende; dein Empfänger muss dieses Script erlauben oder Mermaid im Ziel-CMS selbst laden.
  • status ist "draft" oder "publish", abgeleitet aus der Einstellung des Ziels.
  • remote_post_id ist beim ersten Sende eines Artikels leer. Bei einem erneuten Senden (bearbeiteter Inhalt oder ein live geschalteter Entwurf) enthält es die id, die dein Empfänger zuletzt zurückgegeben hat: behandle einen gefüllten Wert als „diesen Beitrag aktualisieren" statt einen neuen anzulegen, damit keine Dubletten entstehen. Gib dieselbe id wieder zurück.
  • images ist eine (ggf. leere) Liste. role ist "featured" (Beitragsbild, nicht im Body referenziert) oder "inline" (im Body verwendet). data_base64 ist die Datei roh, Base64-kodiert.
  • Bei inline-Bildern enthält url exakt die Adresse, wie sie im content_html steht. Speichere die Datei bei dir und schreibe die URL auf deine eigene Kopie um, damit der Beitrag nicht mehr auf unseren Server verlinkt.

Die Antwort

Antworte mit 2xx und einem JSON-Objekt, das den erstellten Beitrag identifiziert. Geo-Autopilot liest die erste vorhandene von id, post_id, dann url als ID und url (falls vorhanden) als öffentlichen Link:

{ "id": "12345", "url": "https://dein-cms.example/blog/wie-geo-funktioniert" }

Fehlt jede von id / post_id / url, gilt der Versuch als fehlgeschlagen (eine ID hält das erneute Veröffentlichen idempotent).

Empfänger in Pseudocode

function handleIngest(request):
    if request.header("X-Geo-Autopilot-Token") != SECRET:
        return 401

    article = parseJson(request.body)

    for image in article.images:
        bytes = base64Decode(image.data_base64)
        savedUrl = storeFile(image.filename, bytes)
        if image.role == "inline":
            article.content_html = replace(article.content_html, image.url, savedUrl)

    // A non-empty remote_post_id means "update that post" (no duplicate);
    // otherwise create a new one and return its id.
    post = upsert(article.remote_post_id or article.slug, {
        title:    article.title,
        body:     article.content_html,
        excerpt:  article.excerpt,
        metaTitle: article.meta_title,
        status:   article.status,
    })

    return json({ id: post.id, url: post.publicUrl })
Hinweis: Ausgehende Requests laufen durch einen SSRF-Schutz, der private/localhost-Adressen ablehnt. Dein Endpunkt muss öffentlich erreichbar sein (HTTPS).

WordPress?

Für WordPress brauchst du nichts davon: Geo-Autopilot spricht die eingebaute REST-API direkt über ein Anwendungspasswort an. Siehe Integrationen.

Fragen zur Anbindung? Schreib uns an kontakt@geo-autopilot.de oder nutz den Chat.

Noch Fragen offen?

Starte kostenlos in 60 Sekunden – oder sprich mit unserem Team.