REST API v1: API-Schlüssel, Authentifizierung und Endpunkte
So erstellen Sie einen API-Schlüssel, senden den Authorization-Header, beachten die Anfragen-Limits und nutzen jeden v1-Endpunkt samt Parametern, Response-Envelope und Fehlercodes.
Diese Ansicht im Panel öffnenDie REST API v1 ermöglicht es Ihnen, den Großteil der Aktionen aus dem Panel per Code auszuführen: Websites auflisten, Crawls starten, Probleme abrufen, KI-Fixes öffnen und Pixel-Regeln, Keywords, Inhalte, Backlinks, Outreach, Mitbewerber sowie Social-Media-Beiträge verwalten. Schlüssel gehören zu einer Organisation; ein Schlüssel sieht nur die Daten seiner eigenen Organisation. Der MCP-Server ruft dieselben Endpunkte auf.
Voraussetzungen
- Nur der Inhaber oder ein Admin der Organisation kann Schlüssel erstellen und widerrufen. Andere Rollen sehen den Reiter API-Schlüssel nicht.
- Der API-Zugriff ist in den Plänen Pro und Agency enthalten. Falls Ihr Plan diesen nicht beinhaltet, zeigt der Reiter einen Hinweis mit dem Link Pläne ansehen; Sie können eventuell weiterhin einen Schlüssel erstellen, Anfragen geben jedoch 403
plan_requiredzurück.
API-Schlüssel erstellen
- Öffnen Sie Einstellungen → Profil → API-Schlüssel.
- Beschreiben Sie unter Schlüsselname, wofür der Schlüssel verwendet wird (mindestens 2 Zeichen, z. B. "CI").
- Falls der Schlüssel Crawls starten oder Fixes, Regeln, Keywords oder Inhalte erstellen muss, aktivieren Sie Schreib-Berechtigung (write scope). Lassen Sie die Option deaktiviert für einen Schlüssel mit reinem Lesezugriff.
- Klicken Sie auf Schlüssel erstellen.
- Kopieren Sie den Schlüssel, der mit
sa_live_beginnt, sofort über Schlüssel kopieren. Er wird nie wieder angezeigt; die Liste speichert nur seinen Präfix.
Eine Organisation kann maximal 20 aktive Schlüssel haben. Falls ein Schlüssel durchsickert, widerrufen Sie ihn sofort über das Papierkorb-Symbol (Widerrufen) in der Liste. Anfragen mit einem widerrufenen Schlüssel erhalten direkt 401.
Verbindungen, die KI-Apps über OAuth einrichten, erscheinen nicht in dieser Liste; sie befinden sich in der Liste Verbundene Assistenten auf der Seite KI-Assistenten verbinden.
Authentifizierung und Basis-URL
- Basis-URL:
https://seoasist.com/api/v1 - Header:
Authorization: Bearer sa_live_… - Ein
?api_key=sa_live_…Query-Parameter wird ebenfalls akzeptiert. Da Schlüssel in URLs leicht in Logdateien landen, sollten Sie dies nur zu Testzwecken nutzen.
Berechtigungen (Scopes): Ein read-Schlüssel kann jeden GET-Endpunkt aufrufen. Die write-Berechtigung schaltet POST-, PATCH- und DELETE-Anfragen frei. Eine Schreibanfrage mit einem Nur-Lese-Schlüssel gibt 403 zurück.
Limits: Maximal 240 Anfragen pro Minute pro Organisation und maximal 30 KI-Fixes pro Stunde (POST /sites/{id}/fixes). Darüber hinaus erhalten Sie 429 rate_limited.
curl -H "Authorization: Bearer sa_live_..." \
https://seoasist.com/api/v1/sites
Response-Envelope
Jede erfolgreiche JSON-Antwort sieht wie folgt aus:
{ "ok": true, "data": {}, "ms": 42 }
data enthält das Ergebnis des Endpunkts und ms ist die Antwortzeit in Millisekunden. Die einzige Ausnahme ist llms.txt, das reinen Text (text/plain) zurückgibt. Fehler liefern { "ok": false, "error": "<code>", "message": "…" }.
Endpunkte
Alle Pfade beziehen sich auf die Basis-URL. {id} ist eine Website-ID, die Sie über GET /sites erhalten.
Konto und Websites
| Methode | Pfad | Berechtigung | Funktion |
|---|---|---|---|
| GET | /me | read | Organisation und Berechtigungen des Schlüssels: orgId, scopes |
| GET | /sites | read | Listet Websites auf: id, name, domain, url, healthScore, lastCrawlAt, gscProperty, ga4PropertyId, repo, pixelKey … und die Positionstrends der Search Console (movement) |
| GET | /sites/{id} | read | Website-Felder + lastCrawl (id, pages, finishedAt), issueTotals, Problemgruppen (code, severity, title, count), Code-Repos (repos), Fix-Kanäle (fixChannels) sowie steigende / fallende Suchanfragen |
| GET | /sites/{id}/data-sources | read | Die aktive Datenquelle und deren Status für jeden Datentyp |
| POST | /sites/{id}/crawl | write | Startet einen Crawl; gibt { crawlId, status: "queued" } zurück. 402 limit_reached, wenn das monatliche Seiten-Kontingent aufgebraucht ist |
Probleme, Fixes und Regeln
| Methode | Pfad | Berechtigung | Funktion |
|---|---|---|---|
| GET | /sites/{id}/issues | read | Gruppierte Probleme (totals, groups). Mit ?code= erhalten Sie diese Gruppe und Beispiel-urls; ?limit= ist standardmäßig 200, max. 1000 |
| POST | /sites/{id}/issues/{code}/rule-fix | write | Behebt einen Problem-Code auf allen betroffenen URLs mittels Regeln (benötigt die Site API, das WordPress-Plugin oder Pixel) |
| POST | /sites/{id}/fixes | write | Öffnet einen KI-Fix (PR- / MR-Job). Body: issueCode oder instructions (eines ist erforderlich), optional repo und model. Gibt { jobId, status: "queued" } zurück |
| GET | /sites/{id}/fixes | read | Die letzten 50 Fix-Jobs: status, model, repo, prUrl, summary, error … |
| GET | /sites/{id}/pixel/rules | read | Regeln |
| POST | /sites/{id}/pixel/rules | write | Fügt eine Regel hinzu. Body: kind, matchType (Standard exact), matchPath (Standard /), payload, optional note |
| DELETE | /sites/{id}/pixel/rules/{ruleId} | write | Löscht die Regel; { deleted: true } |
Keywords und Inhalte
| Methode | Pfad | Berechtigung | Funktion |
|---|---|---|---|
| GET | /sites/{id}/keywords | read | avgPosition, buckets und Keywords (position, prevPosition, change, best, url, volume, kd, intent, aiOverview, aiCited …) plus Search Console movers |
| POST | /sites/{id}/keywords | write | Body: { keywords: string[] } (max. 200 pro Anfrage). Gibt { added } zurück; bereits getrackte Keywords werden übersprungen |
| GET | /sites/{id}/keywords/opportunities | read | Der Keyword-Pool mit einem Opportunity-Score (0–100) und einer Aktion (new / strengthen); ?limit= ist standardmäßig 50, max. 300 |
| POST | /sites/{id}/keywords/ideas | write | Body: { keywords: string[], note? } (2–60 Keywords). Clustert die Keywords und erstellt Blog-Ideen mit dem Status idea |
| GET | /sites/{id}/content | read | Die letzten 100 Inhalts-Elemente; filtern mit ?status= |
| POST | /sites/{id}/content | write | Erstellt eine Blog-Idee. Body: title (erforderlich), targetKeywords?, angle?, generate? (true reiht die Texterstellung ein) |
| GET | /sites/{id}/content/{itemId} | read | Ein Inhalts-Element mit allen Feldern (inklusive HTML) |
| PATCH | /sites/{id}/content/{itemId} | write | Bearbeitet einen Blog-Beitrag, der nicht live ist: title, html, faq, metaTitle, metaDescription, excerpt, slug, targetKeywords. Ein freigegebener oder geplanter Beitrag geht zurück in die Überprüfung. Seiten-Überarbeitungen und Live-Beiträge geben 422 / 409 not_editable zurück |
| POST | /sites/{id}/content/{itemId}/approve | write | Gibt das Element frei. Mit scheduledFor (YYYY-MM-DD) wird der Status scheduled; die Planung muss die automatischen Veröffentlichungsprüfungen bestehen |
| POST | /sites/{id}/content/{itemId}/publish | write | Reiht einen Veröffentlichungs-Job ein. Body: channel (wordpress, github, siteapi, manual), live?. Eine Live-Veröffentlichung muss die automatischen Veröffentlichungsprüfungen bestehen; Seiten-Überarbeitungen können nicht live veröffentlicht werden |
| GET / POST | /sites/{id}/content/{itemId}/brief | read / write | Das gespeicherte Recherche-Briefing / ein neues Briefing (keyword, urls?); nutzt das monatliche Briefing-Kontingent |
| POST | /sites/{id}/score | read | Bewertet Artikel-HTML mit 0–100 (html, itemId?, keyword?, title?, metaDescription?) |
| POST | /sites/{id}/articles | write | Sendet einen von Ihrer eigenen KI geschriebenen Artikel zur Überprüfung (HTML bereinigt, max. 300 KB, wird nicht auf das monatliche Inhalts-Kontingent angerechnet) |
| GET | /sites/{id}/brand | read | Markenprofil: Tonalität, Zielgruppe, verbotene Wörter, Autor |
Backlinks, Outreach und Mitbewerber
| Methode | Pfad | Berechtigung | Funktion |
|---|---|---|---|
| GET | /sites/{id}/backlinks | read | Backlink-Profil: Übersicht, Trend, Top-Domains und Ankertexte |
| GET | /sites/{id}/backlinks/links | read | Einzelne Backlinks; ?status= (active, new, lost, toxic, broken), ?limit= ist standardmäßig 200, max. 1000 |
| POST | /sites/{id}/backlinks/opportunities | write | Domains, die auf Mitbewerber verlinken, aber nicht auf die Website; verbraucht DataForSEO-Credits |
| GET / POST | /sites/{id}/outreach | read / write | Outreach-Einträge / ein neuer Prospect (domain, url?, contactName?, contactEmail?, notes?, rank?) |
| PATCH | /sites/{id}/outreach/{outreachId} | write | Status (idea, contacted, replied, won, lost), Kontaktdaten oder Notizen |
| GET / POST | /sites/{id}/competitors | read / write | Mitbewerber / eine neue Mitbewerber-Domain (max. 20 pro Website) |
| GET | /sites/{id}/competitors/gap | read | Content-Lücke; ?competitorId=, ?minVolume=, ?maxKd=, ?limit= |
| GET | /sites/{id}/competitors/{competitorId}/keywords | read | Keywords, für die sowohl die Website als auch der Mitbewerber ranken |
Überwachung und KI
| Methode | Pfad | Berechtigung | Funktion |
|---|---|---|---|
| GET | /sites/{id}/geo | read | KI-Sichtbarkeitsübersicht; ?days= ist standardmäßig 90 |
| GET | /sites/{id}/monitors | read | uptime (30 Tage), index-Anzahlen und changes30d |
| GET | /sites/{id}/ai-access | read | Die letzte Prüfung auf Zugriff durch KI-Bots: checkedAt, result, policy |
| GET | /sites/{id}/llms.txt | read | Die generierte llms.txt als reiner Text |
Organisation
| Methode | Pfad | Berechtigung | Funktion |
|---|---|---|---|
| GET | /notifications | read | { unread, items }; ?unread=1 gibt nur ungelesene zurück, ?limit= ist standardmäßig 50, max. 200 |
| POST | /notifications/read | write | Body: { ids?: string[] }; ohne ids werden alle als gelesen markiert |
| GET | /todo | read | Zeigt, was auf Bearbeitung durch einen Menschen wartet und was die Automatisierung erledigt hat; ?siteId=, ?days= (Standard 7) |
| GET | /agent/tasks | read | Fällige manuelle Aufgaben aus den Plänen; ?siteId= |
| POST | /agent/tasks/{taskId}/complete | write | Schließt eine manuelle Aufgabe mit einer Notiz ab (note, mindestens 10 Zeichen) |
| POST | /agent/activity | write | Schreibt eine Zeile in den Aktivitäts-Feed (message, siteId?) |
| GET | /reports | read | Die letzten 50 Berichte und deren öffentliche urls; filtern mit ?siteId= |
| GET | /social/accounts, /social/posts, /social/insights | read | Social-Media-Konten, Beiträge und Konten-Analysen (aus der gemeinsamen Social-Media-Engine) |
| POST | /social/posts, /social/posts/{postId}/schedule, /social/campaign | write | Erstellen von Beiträgen, Festlegen von Daten und Kampagnenserien; Beiträge landen in der Überprüfung |
Inhalts-Statuswerte: idea, planned, generating, draft, review, approved, scheduled, published, failed, archived. Regel-kind-Werte: title, meta_description, canonical, robots, h1, img_alt, og, json_ld, hreflang, redirect, lang, attr, link, meta. matchType: exact, prefix, regex, all.
In Organisationen, die über CoSuite abgerechnet werden, sind Websites außerhalb des Kontingents schreibgeschützt. Jede Anfrage, die darauf schreiben möchte, gibt 403 site_read_only zurück; Leseanfragen funktionieren weiterhin.
Beispiele
Einen KI-Fix starten:
curl -X POST https://seoasist.com/api/v1/sites/SITE_ID/fixes \
-H "Authorization: Bearer sa_live_..." \
-H "Content-Type: application/json" \
-d '{"issueCode":"missing_meta_description"}'
Keywords zum Tracking hinzufügen:
curl -X POST https://seoasist.com/api/v1/sites/SITE_ID/keywords \
-H "Authorization: Bearer sa_live_..." \
-H "Content-Type: application/json" \
-d '{"keywords":["seo tool","site audit"]}'
Aufgaben wie Crawls und Fixes werden in eine Warteschlange eingereiht. Verfolgen Sie das Ergebnis über den passenden GET-Endpunkt (/sites/{id}, /sites/{id}/fixes).
Fehlercodes
| HTTP | error | Wann |
|---|---|---|
| 400 | bad_request | Ein Feld im Body fehlt oder ist ungültig (z. B. title, kind, keywords[]) |
| 401 | unauthorized | Der Schlüssel fehlt, ist ungültig oder wurde widerrufen |
| 402 | limit_reached | Ein Plan-Kontingent ist aufgebraucht (z. B. monatlich gecrawlte Seiten, getrackte Keywords, Recherche-Briefings) |
| 403 | plan_required | Der Plan beinhaltet keinen API-Zugriff (Pro oder Agency erforderlich) |
| 403 | forbidden | Eine Schreibanfrage mit einem Nur-Lese-Schlüssel |
| 403 | site_read_only | Die Website liegt außerhalb des CoSuite-Website-Kontingents; Schreibzugriffe sind deaktiviert |
| 404 | not_found | Die Website oder der Datensatz gehört nicht zu dieser Organisation, existiert nicht oder der Endpunkt ist unbekannt |
| 409 | conflict | Zum Beispiel besitzt die Website kein Code-Repository, der Code-Host ist nicht verbunden, es ist kein KI-Modell verfügbar, per KI markierte Aussagen sind noch nicht verifiziert oder eine Seiten-Überarbeitung sollte live geschaltet werden |
| 409 | publish_gate | Der Beitrag hat die automatischen Veröffentlichungsprüfungen nicht bestanden; er ging zurück in die Überprüfung und der Inhaber wurde benachrichtigt |
| 409 / 422 | not_editable | Inhalt, der nicht bearbeitet werden kann (ein Live-Beitrag oder eine Seiten-Überarbeitung) |
| 413 | too_large | Der Body ist zu groß (z. B. Artikel-HTML über 300 KB) |
| 422 | no_ai | Für diese Aktion ist keine KI verfügbar |
| 429 | rate_limited | Das Limit von 240 Anfragen pro Minute oder 30 Fixes pro Stunde wurde überschritten |
| 500 | internal | Unerwarteter Fehler. Details werden aus Sicherheitsgründen nicht zurückgegeben |
FAQ
Ich habe meinen Schlüssel verloren. Kann ich ihn wieder ansehen?
Nein. Schlüssel werden nur als Hash gespeichert. Widerrufen Sie den alten Schlüssel und erstellen Sie einen neuen.
Kann ich denselben Schlüssel in einem MCP-Client verwenden?
Ja. Es gibt zwei Wege:
- Remote MCP (ohne Installation, empfohlen):
https://seoasist.com/api/mcp. Fügen Sie diese URL als Connector in claude.ai, Claude Desktop, ChatGPT, Cursor oder VS Code hinzu; es öffnet sich eine SEOAsist-Anmeldung, Sie wählen die Organisation sowie die Berechtigungen aus und müssen keinen Schlüssel kopieren. Schritt-für-Schritt-Anleitungen und Ein-Klick-Installationslinks finden Sie im Panel unter Einstellungen → Integrationen → KI-Assistenten verbinden. Führen Sie in Claude Codeclaude mcp add --transport http seoasist https://seoasist.com/api/mcpaus und melden Sie sich beim ersten Aufruf mit/mcpan. Wo sich kein Anmeldefenster öffnen kann (Server, CI), senden Sie den API-Schlüssel mit--header "Authorization: Bearer sa_live_...". - Lokal (stdio): Die Ansicht MCP-Server im Reiter API-Schlüssel bietet eine fertige Konfiguration für Claude Desktop, Claude Code und Cursor; Sie tragen den Schlüssel in die Variable
SEOASIST_API_KEYein.
Nach der Verbindung erscheinen die vorgefertigten Befehle seo_round, content_from_gap, backlink_outreach, agent_tasks und weekly_report im Befehlsmenü der KI-App. MCP-Tools rufen dieselben Endpunkte auf; Schreib-Tools benötigen einen Schlüssel mit Schreib-Berechtigung. Seiten-Überarbeitungen (page_update) können über die API nicht live veröffentlicht werden; es werden nur Blog-Beiträge veröffentlicht. Alle Tools, Berechtigungen und Fehlercodes finden Sie in der MCP-Referenz; die Einrichtung pro App wird unter KI verbinden beschrieben.
Kann ich die API direkt aus dem Browser aufrufen?
Die API liefert einen Access-Control-Allow-Origin: * Header zurück. Dennoch sollten Sie einen Schlüssel niemals in eine öffentliche Seite einbetten; jeder, der den Schlüssel sieht, kann auf die Daten Ihrer Organisation zugreifen.
Verwandte Artikel
- Audit-Probleme als beabsichtigt akzeptieren und automatisch behebenSo markieren Sie gewollte Probleme als Beabsichtigt, machen dies rückgängig und beheben Probleme automatisch mit Regeln oder einem GitHub-Pull-Request.
- Tarife, das monatliche Seiten-Kontingent und enthaltene SEOAsist KI-AufrufeDie Limits der Tarife Free, Starter, Pro und Agency, wie das monatliche Crawl-Kontingent, die enthaltenen SEOAsist KI-Aufrufe und Plattform-Datenanfragen gezählt werden, wie die Zahlung funktioniert und wo Sie Ihre Nutzung verfolgen können.
- Site-API-Referenz (seoasist-site-api/1)Die vollständige SEOAsist Site-API-Spezifikation: Authentifizierung und HMAC-Signierung, die vier Endpunkte, Regeltypen und eine Übersicht der fertigen Next.js/PHP-Beispiele.
- MCP-Server: Endpoint, Authentifizierung, Tools und fertige BefehleDie URL des Remote-MCP-Servers von SEOAsist, Authentifizierung mit OAuth 2.1 oder API-Schlüssel, Scopes, alle Tools, die fünf fertigen Befehle, Regeln, das lokale stdio-Paket und Fehlercodes.
- Content-Studio: Beiträge, Seitennachbesserungen, E-E-A-T und VeröffentlichungVerwandeln Sie Keywords in Beitragsideen, lassen Sie Beiträge schreiben und über den Kalender verteilen, lesen Sie den E-E-A-T-Wert und Prüfmarkierungen im Editor ab, erweitern Sie bestehende Seiten basierend auf deren Quelle und veröffentlichen Sie auf WordPress, der Site-API, GitHub oder Shopify.