DOKU
App öffnen ↗

API-Referenz

Die REST-API zum Lesen von Graph, Score und Empfehlungen – und zum Starten von Scans. JSON-Antworten, authentifiziert mit API-Keys.

Basis-URL

Alle Endpunkte liegen unter dem Präfix /v1 und werden ausschließlich über HTTPS ausgeliefert.

Basis-URL
https://api.graphorank.com

Authentifizierung

Erzeugen Sie einen Key auf der Seite API & MCP der App. Keys tragen das Präfixgr_, werden nur bei der Erstellung einmalig vollständig angezeigt und gehasht gespeichert. Senden Sie den Key mit jeder Anfrage im X-Api-Key Header.

Keys haben Scopes: read (stets enthalten) deckt alle GET-Endpunkte ab, während write zum Anlegen von Websites, Starten von Scans und Verwalten von Zeitplänen nötig ist. Die Sitzung der App selbst nutzt stattdessen ein JWT im Header Authorization: Bearer – API-Keys sind für den programmatischen Zugriff gedacht.

Shell
# Create a key in the app under API & MCP — keys start with "gr_"
export GRAPHORANK_API_KEY="gr_..."

curl https://api.graphorank.com/v1/sites \
  -H "X-Api-Key: $GRAPHORANK_API_KEY"

Endpunkte

GET/v1/sitesListet die Websites in Ihrem Workspace auf.
POST/v1/sitesFügt eine Website hinzu.
GET/v1/sites/{site_id}Ruft eine einzelne Website ab.
POST/v1/sites/{site_id}/verifyFührt die Besitzprüfung mit der gewählten Methode aus.
POST/v1/sites/{site_id}/scansStartet einen On-Demand-Scan.
GET/v1/scans/{scan_id}Fragt einen Scan ab, bis der Status done lautet; danach lassen sich Graph, Score und Empfehlungen lesen.
GET/v1/scans/{scan_id}/graphKnoten enthalten die Rolle (pillar | cluster | hub | money | orphan | noindex), strukturelle und semantische Cluster-IDs, PageRank, Ein-/Ausgangsgrad, Klicktiefe und Indexierbarkeit.
GET/v1/scans/{scan_id}/scoreGraphRank und die vier Bereichs-Scores für einen abgeschlossenen Scan.
GET/v1/scans/{scan_id}/recommendationsListet die Empfehlungen des Scans auf, die schwerwiegendsten zuerst.
GET/v1/sites/{site_id}/historyGraphRank-Zeitreihe für die Website, ein Punkt pro abgeschlossenem Scan, nach Zeitstempel sortiert.
GET/v1/sites/{site_id}/diffVergleicht zwei Scans derselben Website.
POST/v1/sites/{site_id}/scheduleLegt den Zeitplan der Website an oder aktualisiert ihn (Upsert – einer pro Website).
GET/v1/sites/{site_id}/scheduleLiest den aktuellen Zeitplan.
DELETE/v1/sites/{site_id}/scheduleEntfernt den Zeitplan.
GET/v1/usageTarif, Abrechnungsstatus und Kontingentverbrauch des Workspace.
GET/v1/api-keysListet die Keys des Workspace auf.
POST/v1/api-keysErstellt einen Key.
DELETE/v1/api-keys/{key_id}Widerruft einen Key.

Websites

Eine Site ist eine Root-Domain in Ihrem Workspace. Fügen Sie sie hinzu, weisen Sie Ihren Besitz nach und scannen Sie sie dann. Der Besitznachweis erfolgt per Well-known-Datei oder Meta-Tag – das genaue Token-Snippet finden Sie unter Erste Schritte.

GET/v1/sites

Listet die Websites in Ihrem Workspace auf.

200 · JSON
[
  {
    "id": "0d9f1c4e-6a3b-4f6e-9a2d-1b7c8e5f0a21",
    "root_url": "https://rovere-arredamenti.com",
    "label": "Rovere Arredamenti",
    "verified": true,
    "created_at": "2026-06-02T08:15:00Z"
  }
]

POST/v1/sites

Fügt eine Website hinzu. Erfordert den Scope write. Liefert 201 mit der neuen Site – verified beginnt mit false.

root_urlbody · string (uri)erforderlichRoot-URL der Website, z. B. https://ihredomain.de.
labelbody · stringOptionaler Anzeigename, bis zu 200 Zeichen.
Shell
curl -X POST https://api.graphorank.com/v1/sites \
  -H "X-Api-Key: $GRAPHORANK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"root_url": "https://rovere-arredamenti.com", "label": "Rovere Arredamenti"}'
201 · JSON
{
  "id": "0d9f1c4e-6a3b-4f6e-9a2d-1b7c8e5f0a21",
  "root_url": "https://rovere-arredamenti.com",
  "label": "Rovere Arredamenti",
  "verified": false,
  "created_at": "2026-07-03T09:12:44Z"
}

GET/v1/sites/{site_id}

Ruft eine einzelne Website ab. Die Antwort hat dieselbe Form wie ein Listeneintrag von GET /v1/sites.

site_idpath · uuiderforderlichKennung der Website.

POST/v1/sites/{site_id}/verify

Führt die Besitzprüfung mit der gewählten Methode aus. Die Antwort enthält immer Ihr Site-Token, sodass Sie diesen Endpunkt einmal aufrufen können, um es abzurufen, bevor Sie die Datei oder das Meta-Tag veröffentlichen.

site_idpath · uuiderforderlichKennung der Website.
methodbody · stringerforderlichVerifizierungsmethode: "file" (Well-known-Datei) oder "meta" (Meta-Tag auf der Startseite).
Shell
curl -X POST https://api.graphorank.com/v1/sites/{site_id}/verify \
  -H "X-Api-Key: $GRAPHORANK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"method": "file"}'
200 · JSON
{
  "verified": true,
  "method": "file",
  "token": "9Kd2mQx7Ln4pTv8waZrGQg",
  "detail": "token found at /.well-known/graphorank-verify.txt"
}

Scans

Ein Scan durchläuft die gesamte Pipeline: Crawl, semantische Analyse, Graph-Aufbau, Scoring. Sein Status wechselt von queued → crawling → embedding → scoring → done (oder failed, mit einem Fehlercode). Scans zählen auf das monatliche Kontingent Ihres Tarifs.

POST/v1/sites/{site_id}/scans

Startet einen On-Demand-Scan. Erfordert den Scope write. Liefert 202 mit dem eingereihten Scan; ist das monatliche Kontingent erschöpft, erhalten Sie 402 quota_exceeded.

site_idpath · uuiderforderlichKennung der Website.
render_modebody · stringOptional: "http", "js" oder "auto". Weglassen, um den Standard zu verwenden – auto aktiviert JS-Rendering nur, wenn die Website es braucht.
Shell
curl -X POST https://api.graphorank.com/v1/sites/{site_id}/scans \
  -H "X-Api-Key: $GRAPHORANK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"render_mode": "auto"}'
202 · JSON
{
  "id": "7f2a4c0e-9d1b-4b8a-b6c3-2e5f8a7d9c10",
  "site_id": "0d9f1c4e-6a3b-4f6e-9a2d-1b7c8e5f0a21",
  "status": "queued",
  "render_mode": "auto",
  "pages_count": 0,
  "error_code": null,
  "error_detail": null,
  "started_at": null,
  "finished_at": null,
  "created_at": "2026-07-03T09:38:12Z"
}

GET/v1/scans/{scan_id}

Fragt einen Scan ab, bis der Status done lautet; danach lassen sich Graph, Score und Empfehlungen lesen.

scan_idpath · uuiderforderlichKennung des Scans.
200 · JSON
{
  "id": "7f2a4c0e-9d1b-4b8a-b6c3-2e5f8a7d9c10",
  "site_id": "0d9f1c4e-6a3b-4f6e-9a2d-1b7c8e5f0a21",
  "status": "done",
  "render_mode": "auto",
  "pages_count": 214,
  "error_code": null,
  "error_detail": null,
  "started_at": "2026-07-03T09:38:20Z",
  "finished_at": "2026-07-03T09:40:41Z",
  "created_at": "2026-07-03T09:38:12Z"
}

Graph

Der vollständige Knoten-Kanten-Graph eines abgeschlossenen Scans, im selben Format, das die interaktive Ansicht der App verwendet. Große Graphen werden in Cursor-Seiten zu je 1.000 Elementen ausgeliefert (zuerst Knoten, dann Kanten): Fragen Sie weiter mit dem zurückgegebenen next_cursor ab, bis er null zurückgibt. Das meta-Objekt wird auf jeder Seite wiederholt.

GET/v1/scans/{scan_id}/graph

Knoten enthalten die Rolle (pillar | cluster | hub | money | orphan | noindex), strukturelle und semantische Cluster-IDs, PageRank, Ein-/Ausgangsgrad, Klicktiefe und Indexierbarkeit. Kanten sind interne Links.

scan_idpath · uuiderforderlichKennung des Scans.
cursorquery · integerVom vorherigen Abruf zurückgegebener Cursor. Standard ist 0 (erste Seite).
Shell
curl "https://api.graphorank.com/v1/scans/{scan_id}/graph?cursor=0" \
  -H "X-Api-Key: $GRAPHORANK_API_KEY"
200 · JSON
{
  "nodes": [
    {
      "id": "d41f4d6a-1a52-4b0e-8c7a-b9e4f1c2a3d4",
      "url": "https://rovere-arredamenti.com/collezioni/tavoli",
      "role": "pillar",
      "cluster_struct": 3,
      "cluster_sem": 2,
      "pagerank": 0.0184,
      "in_degree": 42,
      "out_degree": 18,
      "depth": 1,
      "indexable": true
    }
  ],
  "edges": [
    { "s": "d41f4d6a-…", "t": "9c2b1e07-…", "type": "internal" }
  ],
  "meta": {
    "nodes": 214,
    "edges": 1310,
    "modularity": 0.62,
    "avg_depth": 2.4,
    "orphan_count": 7,
    "cluster_agreement": 0.81
  },
  "next_cursor": 1000
}

Score

GraphRank ist ein Benchmark von 0 bis 100 dafür, wie sichtbar eine Website für generative Suchmaschinen ist. Der Endpunkt liefert ihn zusammen mit den vier Bereichs-Scores aus der App – Struktur, Thematik, GEO und Technik – sowie dem Detail-Objekt, das die Erklärungen in der App speist. Die Methodik hinter der Zahl ist proprietär und wird bei jeder Website identisch angewendet.

GET/v1/scans/{scan_id}/score

GraphRank und die vier Bereichs-Scores für einen abgeschlossenen Scan.

scan_idpath · uuiderforderlichKennung des Scans.
200 · JSON
{
  "scan_id": "7f2a4c0e-9d1b-4b8a-b6c3-2e5f8a7d9c10",
  "graphrank": 68.4,
  "sub_structural": 78.2,
  "sub_topical": 71.5,
  "sub_geo": 54.1,
  "sub_tech": 49.8,
  "detail": { … }
}

Empfehlungen

Priorisierte Maßnahmen, aus dem Scan erzeugt, jeweils mit einem Schweregrad (P0 blockierend, P1 wichtig, P2 wünschenswert), lokalisierten Meldungen und einem meta-Objekt mit der betroffenen URL sowie zusätzlichem Kontext.

GET/v1/scans/{scan_id}/recommendations

Listet die Empfehlungen des Scans auf, die schwerwiegendsten zuerst.

scan_idpath · uuiderforderlichKennung des Scans.
severityquery · stringOptionaler Filter: "P0", "P1" oder "P2".
Shell
curl "https://api.graphorank.com/v1/scans/{scan_id}/recommendations?severity=P0" \
  -H "X-Api-Key: $GRAPHORANK_API_KEY"
200 · JSON
[
  {
    "id": "b7e3a9c1-5d2f-4e8b-a1c6-3f9d7e2b8a54",
    "page_id": "9c2b1e07-4f6a-4d3e-b8a1-7c5e9f2d1b36",
    "type": "orphan_page",
    "severity": "P0",
    "message_it": "Pagina orfana: nessun link interno la raggiunge. Collegala dalla sezione pertinente.",
    "message_en": "Orphan page: no internal link reaches it and crawlers struggle to find it. Link it from the relevant section.",
    "meta": { "url": "https://rovere-arredamenti.com/blog/cura-del-rovere" }
  }
]

Verlauf & Vergleich

Verfolgen Sie, wie sich der Score über mehrere Scans entwickelt, und vergleichen Sie zwei davon, um genau zu sehen, was sich geändert hat – hinzugekommene und entfernte Seiten, verwaiste Seiten, Indexierbarkeit.

GET/v1/sites/{site_id}/history

GraphRank-Zeitreihe für die Website, ein Punkt pro abgeschlossenem Scan, nach Zeitstempel sortiert.

site_idpath · uuiderforderlichKennung der Website.
fromquery · date-timeNur Punkte ab diesem ISO-8601-Zeitstempel.
toquery · date-timeNur Punkte bis zu diesem ISO-8601-Zeitstempel.
200 · JSON
[
  {
    "ts": "2026-06-05T03:00:00Z",
    "graphrank": 64.2,
    "sub_structural": 76.0,
    "sub_topical": 70.1,
    "sub_geo": 50.3,
    "sub_tech": 47.9
  },
  {
    "ts": "2026-07-03T09:40:41Z",
    "graphrank": 68.4,
    "sub_structural": 78.2,
    "sub_topical": 71.5,
    "sub_geo": 54.1,
    "sub_tech": 49.8
  }
]

GET/v1/sites/{site_id}/diff

Vergleicht zwei Scans derselben Website. Ohne Parameter werden die beiden jüngsten abgeschlossenen Scans verglichen. score_delta und sub_deltas sind null, wenn einer der Scans keinen Score hat.

site_idpath · uuiderforderlichKennung der Website.
from_scanquery · uuidBasis-Scan. Standard ist der zweitjüngste abgeschlossene Scan.
to_scanquery · uuidZiel-Scan. Standard ist der jüngste abgeschlossene Scan.
200 · JSON
{
  "from_scan": "5b1c8e2d-7a4f-4c9b-8d3e-1f6a2c7b9e05",
  "to_scan": "7f2a4c0e-9d1b-4b8a-b6c3-2e5f8a7d9c10",
  "score_delta": 4.2,
  "sub_deltas": { "structural": 2.2, "topical": 1.4, "geo": 3.8, "tech": 1.9 },
  "pages_added": {
    "count": 6,
    "sample": ["https://rovere-arredamenti.com/blog/cura-del-rovere"]
  },
  "pages_removed": {
    "count": 1,
    "sample": ["https://rovere-arredamenti.com/vecchia-landing"]
  },
  "orphans_from": 12,
  "orphans_to": 7,
  "indexable_from": 195,
  "indexable_to": 203
}

Geplante Scans

Ein wiederkehrender Scan pro Website, mit E-Mail-Report nach Abschluss. Verfügbar in den Tarifen Pro und Agency – in niedrigeren Tarifen liefern diese Endpunkte 402 quota_exceeded mit einem Upgrade-Hinweis.

POST/v1/sites/{site_id}/schedule

Legt den Zeitplan der Website an oder aktualisiert ihn (Upsert – einer pro Website). Erfordert den Scope write.

site_idpath · uuiderforderlichKennung der Website.
freqbody · stringerforderlich"weekly" oder "monthly".
daybody · integererforderlichWöchentlich: 0–6 mit Montag = 0. Monatlich: 1–28.
timebody · stringerforderlich24-Stunden-Format „HH:MM“, UTC.
recipientsbody · string[]erforderlichBis zu 10 E-Mail-Adressen, die den Report erhalten.
activebody · booleanStandardwert ist true.
Shell
curl -X POST https://api.graphorank.com/v1/sites/{site_id}/schedule \
  -H "X-Api-Key: $GRAPHORANK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"freq": "weekly", "day": 0, "time": "03:00", "recipients": ["seo@rovere-arredamenti.com"]}'
200 · JSON
{
  "id": "3e8d1f5a-2b7c-4a9e-b4d1-6c8f2a5e7b93",
  "site_id": "0d9f1c4e-6a3b-4f6e-9a2d-1b7c8e5f0a21",
  "freq": "weekly",
  "day": 0,
  "time": "03:00",
  "recipients": ["seo@rovere-arredamenti.com"],
  "active": true,
  "last_run_at": null,
  "created_at": "2026-07-03T10:02:19Z"
}

GET/v1/sites/{site_id}/schedule

Liest den aktuellen Zeitplan. Liefert 404 not_found, wenn keiner konfiguriert ist.

site_idpath · uuiderforderlichKennung der Website.

DELETE/v1/sites/{site_id}/schedule

Entfernt den Zeitplan. Erfordert den Scope write. Liefert 204 No Content.

site_idpath · uuiderforderlichKennung der Website.

Nutzung

Wo Sie im aktuellen Abrechnungszeitraum gegenüber dem Kontingent Ihres Tarifs stehen. Limits werden als null zurückgegeben, wenn sie unbegrenzt sind.

GET/v1/usage

Tarif, Abrechnungsstatus und Kontingentverbrauch des Workspace.

200 · JSON
{
  "tier": "pro",
  "billing_status": "active",
  "scans_used": 4,
  "scans_limit": 6,
  "pages_limit": 500,
  "sites_used": 2,
  "sites_limit": 3
}

API-Keys

Keys auf Workspace-Ebene für den programmatischen Zugriff, mit dem Präfix gr_ und gehasht gespeichert. Der Klartext-Key wird nur einmal zurückgegeben, in der Antwort auf die Erstellung – bewahren Sie ihn in einem Secret Manager auf. Scopes: read (immer enthalten) deckt alle GET-Endpunkte ab; write ist für alles erforderlich, was den Zustand verändert.

GET/v1/api-keys

Listet die Keys des Workspace auf. Secrets werden nach der Erstellung nie zurückgegeben.

200 · JSON
[
  {
    "id": "a1f7c3e9-8b2d-4e6a-9c5f-2d7b4a8e1c60",
    "scopes": ["read"],
    "created_at": "2026-06-20T11:05:00Z",
    "last_used_at": "2026-07-03T09:41:07Z"
  }
]

POST/v1/api-keys

Erstellt einen Key. Das Feld key in der Antwort ist die einzige Gelegenheit, bei der das Secret sichtbar ist.

scopesbody · string[]"read" und/oder "write". "read" wird immer gewährt; unbekannte Scopes liefern 422.
Shell
curl -X POST https://api.graphorank.com/v1/api-keys \
  -H "X-Api-Key: $GRAPHORANK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scopes": ["read", "write"]}'
201 · JSON
{
  "id": "e4b8d2f6-1c9a-4d7e-8b3c-5f2a7d9c1e48",
  "key": "gr_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "scopes": ["read", "write"],
  "created_at": "2026-07-03T10:15:33Z"
}

DELETE/v1/api-keys/{key_id}

Widerruft einen Key. Er funktioniert sofort nicht mehr. Liefert 204 No Content.

key_idpath · uuiderforderlichKennung des Keys.

Rate Limits & Fehler

Zwei Token-Buckets schützen die API: einer pro Client-IP (vor der Authentifizierung) und einer pro Workspace (danach). Wenn Sie ein Limit erreichen, lautet die Antwort 429 mit einem Retry-After Header, der angibt, wie viele Sekunden Sie warten sollen.

Fehler werden im Format application/problem+json mit den Feldern { type, title, status, detail, code } zurückgegeben. Validierungsfehler (422) liefern das Standard-Array detail zurück, das auf die fehlerhaften Felder verweist.

402 · problem+json
{
  "type": "about:blank",
  "title": "Quota Exceeded",
  "status": 402,
  "detail": "monthly scan quota reached (6/6): upgrade your plan or wait for the next period",
  "code": "quota_exceeded"
}
401unauthorizedFehlende oder ungültige Zugangsdaten (X-Api-Key oder Bearer-JWT).
402quota_exceededTarifkontingent erreicht, oder die Funktion erfordert einen höheren Tarif. Upgraden oder bis zum nächsten Zeitraum warten.
403forbiddenDie Scopes des Keys erlauben diesen Aufruf nicht (z. B. wenn write erforderlich ist).
404not_foundDie Ressource existiert in Ihrem Workspace nicht – Daten anderer Mandanten sehen Sie nie.
422validation_errorFehlerhafter Body oder fehlerhafte Parameter; die Antwort listet die betroffenen Felder auf.
429rate_limitedZu viele Anfragen – beachten Sie den Header Retry-After (Sekunden).
503service_unavailableEine nachgelagerte Abhängigkeit ist nicht verfügbar. Versuchen Sie es später erneut.