Join our community of websites already using SEOJuice to automate the boring SEO work.
See what our customers say and learn about sustainable SEO that drives long-term growth.
Explore the blog →TL;DR: Die Google Search Console stellt exakt die Abfrage-, Seiten-, Positions- und Impression-Daten bereit, für die SEMrush und Ahrefs monatlich 129–449 $ kassieren. Die GSC-API bietet kostenlos 1 200 Requests pro Minute, ein Payload-Limit von 25 000 Zeilen und vier Endpunkte, die ungefähr 90 % dessen abdecken, was ein Solo-Founder benötigt. Dieser Beitrag führt durch das OAuth-Setup mit Dienstkonto, erklärt die vier relevanten Endpunkte, zeigt ein ausführbares Python-Skript für eine Query-by-Page-CTR-Matrix und beschreibt drei Automatisierungsmuster (Cron + Slack, Google Sheets, eine schlanke Django-View), die rohe API-Zeilen in ein brauchbares Dashboard verwandeln. Falls Sie die Integration nicht selbst warten möchten, übernimmt SEOJuice das gleiche Wiring als Managed Service.
Das Ärgerliche an einer SEO-Suite für 449 $ im Monat: Rund 70 % der Dashboard-Daten stammen direkt aus der Search Console. Bezahltools legen im Wesentlichen drei Dinge obendrauf: externes Rank-Tracking über gemietete Proxys, einen Backlink-Graphen aus gecrawlten Web-Archiven und ein UI, das Ihnen SQL erspart. Letzteres ist das Einzige, was ein Solo-Founder wirklich braucht – und am günstigsten nachzubauen.
Die API stellt für jede verifizierte Property Folgendes bereit:
Fehlend ist alles außerhalb der eigenen Property: Rankings von Wettbewerbern, Backlink-Entwicklung fremder Domains, Share-of-Voice-Berechnungen. Für die meisten Pre-PMF-Gründer sind das Eitelkeitsmetriken, die nicht beeinflussen, was sie als Nächstes shippen. In einem längeren Artikel über ein Zwei-Tool-SEO-Setup komme ich zum selben Fazit: GSC plus eine Writing-Oberfläche liefern genug Signal zum Handeln.
„Die Daten in der Search Console stammen direkt von Google. Es ist die genaueste Quelle, um zu verstehen, wie Ihre Website in der Google-Suche performt.“
Aus der Search Console-Hilfe von Google.
Es gibt zwei sinnvolle Auth-Flows für die GSC-API: User-Flow-OAuth (Browser-Redirect, Refresh-Token) und Dienstkonto-OAuth (Server-zu-Server, kein Browser). Für einen Founder, der einen Cron auf einem einzelnen VPS betreibt, sind Dienstkonten kürzer und robuster – kein Refresh-Token-Ablauf, kein Consent-Screen.
Die Bereitstellung dauert etwa zehn Minuten und kostet nichts:
gsc-dashboard-reader anlegen. Keine projektweiten Rollen erforderlich.@<project-id>.iam.gserviceaccount.com) hinzufügen. Beschränkt reicht zum Lesen.Der letzte Schritt wird oft vergessen. Das Dienstkonto ist zwar eine Google-Identität, aber ohne explizite Freigabe auf die Property liefert die API einen scheinbar richtigen 403 user does not have sufficient permission for site. Berechtigung pro Property vergeben; bei mehreren wiederholen.

Die GSC-API ist überschaubar. Vier Endpunkte genügen für Query-Daten, Sitemap-Status, URL-Inspection und die Liste der verfügbaren Properties. Den Rest der Doku können Sie ignorieren, bis Sie einen konkreten Anlass haben.
| Endpoint | Rückgabe | Kontingent | Einsatz |
|---|---|---|---|
searchanalytics.query | Bis zu 25 000 Zeilen mit Klicks, Impressionen, Position, CTR nach Query, Seite, Datum, Gerät, Land | 1 Unit / Request | Kerndaten des Dashboards: welche Queries Traffic bringen, welche Seiten Impressionen in Klicks umwandeln |
sitemaps.list | Alle eingereichten Sitemaps mit Status, letztem Abruf, URL-Zahlen | 1 Unit / Request | Sitemap-Gesundheit; Warnungen bei fallenden oder teil-indexierten Sitemaps |
urlInspection.index.inspect | Pro URL: Abdeckungsstatus, letzter Crawl, kanonische URL, Mobile Usability, AMP- und Schema-Ergebnisse | 2 000 / Tag (separates Kontingent) | Stichproben kritischer Seiten; automatisierte Indexierungs-Audits |
sites.list | Alle Properties, auf die die Auth-Identität Zugriff hat | 1 Unit / Request | Multi-Property-Dashboards; Iteration über ein Portfolio |
Das 1 200-Requests-pro-Minute-Limit auf Leseendpunkten ist für Solo-Founder praktisch unendlich. Die einzige echte Kappe sind 2 000 URL-Inspections pro Tag – genug für ein tägliches Audit von 1 500 URLs.
Die sinnvollste Abfrage ist eine Query-by-Page-Aufschlüsselung der letzten 28 Tage. Sie zeigt, welche Seite für welche Query rankt und wie die CTR an der Schnittstelle aussieht. Zellen mit vielen Impressionen und niedriger CTR sind Ihre Kurzfrist-Optimierungskandidaten.
Benötigte Pakete installieren:
pip install google-auth google-api-python-client
Das minimal lauffähige Skript: Auth, Query, Print. Den heruntergeladenen JSON-Key als gsc-credentials.json im selben Verzeichnis speichern:
from datetime import date, timedelta
from google.oauth2 import service_account
from googleapiclient.discovery import build
SCOPES = ["https://www.googleapis.com/auth/webmasters.readonly"]
SITE_URL = "sc-domain:example.com" # oder "https://example.com/"
KEY_FILE = "gsc-credentials.json"
creds = service_account.Credentials.from_service_account_file(
KEY_FILE, scopes=SCOPES
)
service = build("searchconsole", "v1", credentials=creds)
end = date.today() - timedelta(days=2) # GSC hinkt ~2 Tage hinterher
start = end - timedelta(days=27)
request = {
"startDate": start.isoformat(),
"endDate": end.isoformat(),
"dimensions": ["query"],
"rowLimit": 25,
"orderBy": [{"field": "clicks", "descending": True}],
}
response = service.searchanalytics().query(
siteUrl=SITE_URL, body=request
).execute()
for row in response.get("rows", []):
q = row["keys"][0]
print(f"{row['clicks']:>5} {row['impressions']:>6} "
f"{row['ctr']*100:>5.1f}% pos={row['position']:>5.1f} {q}")
Das ist die gesamte Integration. Ausführen und Sie sehen die 25 Top-Queries der letzten 28 Tage, nach Klicks sortiert. Zwei Hinweise: sc-domain:example.com gilt für Domain-Properties (empfohlen); die vollständige URL-Form nur für URL-Prefix-Properties verwenden. GSC-Daten sind ca. zwei Tage verzögert, daher endet die Abfrage bei today - 2.
Die Query-by-Page-Matrix – die Version, die wirklich Entscheidungen treibt – fügt eine zweite Dimension hinzu und erhöht das Zeilenlimit:
request = {
"startDate": start.isoformat(),
"endDate": end.isoformat(),
"dimensions": ["query", "page"],
"rowLimit": 5000,
"orderBy": [{"field": "impressions", "descending": True}],
}
response = service.searchanalytics().query(
siteUrl=SITE_URL, body=request
).execute()
opportunities = []
for row in response.get("rows", []):
query, page = row["keys"]
impressions = row["impressions"]
ctr = row["ctr"]
position = row["position"]
# Zellen mit >500 Impressionen und CTR <2 % sind CTR-Leak-Kandidaten
if impressions > 500 and ctr < 0.02 and position < 15:
opportunities.append((impressions, query, page, position, ctr))
opportunities.sort(reverse=True)
for imp, q, p, pos, ctr in opportunities[:20]:
print(f"{imp:>6} imp pos={pos:>4.1f} ctr={ctr*100:>4.1f}% {q} → {p}")
Der Filter unten (hohe Impressionen, niedrige CTR, Position < 15) ist die klassische Liste für Title-Tag-Rewrites. Sie ranken bereits; der Klick-Through ist das Leck. Genau dieselbe Logik bieten Bezahltools als „Ranking Opportunities“ an – in sechs Zeilen Code.

Sobald Sie die Zeilen haben, stellt sich die Frage: Was charten? Die meisten SEO-Tools ertränken Sie in 40 Widgets; für wöchentliche Entscheidungen genügen vier. Nutzen Sie das Charting-Framework, das Sie ohnehin einsetzen: Chart.js im HTML, matplotlib im Jupyter-Notebook oder native Diagramme, wenn Sie in Google Sheets schreiben.

Manuell ziehen reicht einmalig. Wirklich nützlich wird das Dashboard, wenn es von allein läuft. Drei Muster, nach Einrichtungsaufwand sortiert:
Muster 1: Cron und Slack-Alerts. Der billigste Weg. Ein täglicher Cron führt das Skript aus und postet bei drei Triggern – Klicks > 20 % Woche-zu-Woche gefallen, eine Top-10-Query aus den Top 20 gefallen oder eine zuvor indexierte Seite verloren – in Slack. Etwa 80 Zeilen Python inkl. Webhook. Läuft in 4 Sekunden auf einem 5-$-VPS. Ihr Dashboard hat eine Aufgabe: schreien, wenn sich etwas ändert.
import json, os, urllib.request
def post_slack(text):
payload = {"text": text}
req = urllib.request.Request(
os.environ["SLACK_WEBHOOK_URL"],
data=json.dumps(payload).encode(),
headers={"Content-Type": "application/json"},
)
urllib.request.urlopen(req, timeout=10).read()
# Nachdem wow_change aus zwei 7-Tage-GSC-Pulls berechnet wurde:
if wow_change < -0.20:
post_slack(
f":warning: GSC-Klicks um {wow_change*100:.0f}% WoW gefallen "
f"({last_week} → {this_week}). Stärkste Abfälle: {falling[:3]}"
)
Muster 2: Google Sheets Sink. Über die Sheets-API oder das einfachere gspread die Zeilen in ein Sheet schreiben. Das Sheet ist Ihr Dashboard: Pivot-Tabellen für Ad-hoc-Analysen, native Diagramme, mit dem nicht-technischen Co-Founder teilbar. Circa 30 Zeilen zusätzlich. Nachteil: Aktualisierungslatenz je nach Cron-Takt, und Sheets wird ab ~20 000 Zeilen träge.
Muster 3: Schlanke Django-View. Eine View, die den GSC-Pull ausführt, 6 Stunden in Redis cached und die vier Charts via Chart.js rendert. Rund 200 Zeilen Python + HTML. Lohnt sich, sobald ein Co-Founder mitten in der Woche draufschauen will. Cache ist Pflicht; ohne ihn würde jeder Page-View einen neuen GSC-Call auslösen und das Minuten-Kontingent am Launch-Tag sprengen.
„Habe mein 329-$/Monat-Ahrefs-Abo gekündigt, nachdem mir klar wurde, dass ich täglich nur das Widget ‚Top Organic Queries‘ anschaue. Gegen die Search-Console-API in einem Nachmittag nachgebaut.“
Ein Muster, das in Indie-Hacker-Threads auf Hacker News und in den Bootstrapper-Ecken von IndieHackers regelmäßig auftaucht.
Die wirkliche Gründer-Frage lautet selten „welches Bezahl-Tool“, sondern: zahlen, selbst bauen oder die kostenlose GSC-UI inkl. ihrer Grenzen akzeptieren? So schneiden die fünf Optionen ab:
| Option | Monatskosten | Setup-Zeit | Wartung | Multi-Property | Historie |
|---|---|---|---|---|---|
| Freie GSC-UI | 0 $ | 0 h | keine | manuelles Umschalten | 16 Mon., langsame Exporte |
| DIY GSC-API + Cron + Sheets | 0–5 $ (VPS) | 4–8 h | ~30 min/q (Auth-Rotation, Deprecations) | trivial | 16 Mon., in Sekunden querybar |
| SEOJuice | 29–99 $ | ~10 min | keine (managed) | integriert | 16 Mon. GSC + eigene Crawl-Historie |
| SEMrush | 139–499 $ | ~30 min | keine (managed) | Projekt-Limits je Plan | >2 Jahre |
| Ahrefs | 129–449 $ | ~30 min | keine (managed) | Projekt-Limits je Plan | >2 Jahre |
DIY gewinnt bei den Kosten, ist bei Eigenschafts-Daten gleichauf und verliert bei Konkurrenz- und Backlink-Insights. Frühphasen-Teams mit der Frage „was funktioniert auf meiner Site?“ fahren mit DIY am besten. Beim Skalieren, Competitor-Research oder Link-Building verdienen die Bezahl-Tools ihr Geld. SEOJuice positioniert sich dazwischen: Managed GSC-Integration plus Crawl-, Audit- und AI-Visibility-Tracking ohne Enterprise-Aufschlag.
Fragen Sie ChatGPT oder Gemini, wie GSC-Daten zu interpretieren sind, bekommen Sie plausibel klingende, aber in drei Punkten falsche Antworten. Diese Fehler finden sich in jedem „KI-generierten SEO-Report“-Tool.
Falsche Behauptung #1: „Position ist der Durchschnittsrang, den Sie für die Query hatten.“ Es ist der Durchschnitt des besten Rangs, den eine Ihrer URLs in Impressionen erreicht hat, bei denen die Query eine SERP auslöste, die Ihre Site enthielt. Ranken zwei URLs im selben SERP, zählt nur die höhere. Deshalb ändert sich die „Position“, wenn Sie einen neuen Artikel veröffentlichen, der den alten überragt.
Falsche Behauptung #2: „CTR wird pro Impression berechnet.“ CTR ist Klicks ÷ Impressionen auf der Aggregationsebene Ihrer Abfrage. Nach Datum gibt site-weite Tages-CTR; nach Query + Page liefert Zellen-CTR. Die Zahlen summieren sich über Ebenen nicht, weil sich der Nenner ändert.
Falsche Behauptung #3: „Wenn eine Query Impressionen ohne Klicks hat, rankt die Seite schlecht.“ Im AI-Overview-Zeitalter ist das oft das Muster einer zitierten Quelle ohne Klick. Impressionen stabil, Klicks runter = klassisch. Die Seite rankt nicht schlechter; die SERP hat sich verändert. Mehr dazu im AI-Overview-Citations-Artikel.
Fünf Stolpersteine, die Erstnutzer der GSC-API Zeit kosten:
startRow paginieren. google-api-python-client macht das nicht automatisch; selbst schleifen.sc-domain:) und URL-Prefix-Properties liefern andere Zahlen. Domain-Properties aggregieren über Sub-Domains und Protokolle. Eine als Single-Source-of-Truth wählen.(anonymized) zusammengefasst und sind nicht rekonstruierbar. Top-Query-Analysen darauf ausrichten.Kein Show-Stopper, aber jeder Punkt hat mich anfangs eine Stunde gekostet. Die offizielle Referenz listet alles – nur nicht laut genug.
Wie lange behält die GSC-API historische Daten? 16 Monate. Danach sind sie weg; es gibt kein Archiv-Endpoint. Für längere Trends das rollierende Fenster selbst in Storage kippen. Ein 365-Tage-Fenster in Postgres belegt pro Property wenige hundert MB.
Kann ich per API URLs zur Indexierung einreichen? Nein. Die URL-Submission wurde 2020 nach Spam-Missbrauch entfernt. Die Indexing-API existiert noch, funktioniert aber nur für Job-Postings und Live-Streams; für normalen Content ist das gegen Googles Richtlinie.
Was ist der Unterschied zwischen impressions und clicks? Impressionen zählen jede SERP-Einblendung Ihrer URL, egal ob der Nutzer scrollt. Klicks zählen Nutzer-Klicks. CTR ist das Verhältnis. Im AI-Overview-Zeitalter geht die Schere weiter auf, weil Nutzer die Antwort lesen und nicht klicken.
Gibt es ein höheres Free-Tier als das Standard-Kontingent? Das Kontingent ist für alle gleich: 1 200 Requests/Min. auf Analytics-Endpoints, 2 000/Tag für URL Inspection. Kein bezahltes Upgrade; Erhöhungen kann man im Cloud Console anfragen, für Solo-Workloads selten nötig.
Kann ich Zugriff delegieren, ohne meinen Google-Account zu teilen? Ja, genau dafür sind Dienstkonten da. Pro Integration eins anlegen, „Beschränkt“ auf die Property, und bei Bedarf Rechte entziehen, ohne Ihren Login anzufassen.
Welche Language-Bindings unterstützt die API? Offiziell: Python, Node, Java, PHP, Ruby, Go, .NET. Inoffiziell: alles, was einen REST-Call mit Bearer-Token absetzen kann. JSON-Shapes sind identisch.

Das DIY-Dashboard rechnet sich, solange die benötigten Daten innerhalb Ihrer Property liegen. Sobald die Frage „Warum rankt mein Konkurrent über mir?“ oder „Wer verlinkt ihn, mich aber nicht?“ lautet, stoßen Sie an das GSC-Limit. Dann bleibt: SEMrush oder Ahrefs 129–449 $ für Backlink- und Competitor-Daten zahlen oder ein kleineres Tool wie SEOJuice für dieselbe GSC-Integration plus Crawl-, Audit- und AI-Visibility-Tracking, meist 15–25 % der Enterprise-Preise.
Für die meisten Solo-Founder liegt die Schwelle zwischen 500 $ MRR und 5 000 $ MRR. Darunter lohnt DIY; Engineering-Zeit ist günstiger als das Abo und man lernt die Daten. Darüber ist Zeit wertvoller als Auth-Rotation und Kontingent-Retry. Dazwischen hängt es davon ab, wie gern Sie nachts Python schreiben.
Der andere Weg: Dieses Wochenende die Cron-+-Slack-Version bauen (sechs Stunden inkl. OAuth), einen Monat laufen lassen und beobachten, was Sie wirklich ansehen. Wenn Sie nur den „Top-Queries-Dropping“-Alert checken und alles andere ignorieren, wissen Sie, dass ein Widget reicht – weiterbauen oder kaufen. Die günstigen SEO-Strategien skizzieren das Budget-Playbook.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "Wie lange behält die GSC-API historische Daten?", "acceptedAnswer": { "@type": "Answer", "text": "16 Monate. Danach sind die Daten weg; es gibt kein Archiv-Endpoint. Wer längere Trends analysieren möchte, sollte mit einem täglichen Cron das rollierende Fenster in eigenen Speicher schreiben." } }, { "@type": "Question", "name": "Kann ich die GSC-API nutzen, um URLs zur Indexierung einzureichen?", "acceptedAnswer": { "@type": "Answer", "text": "Nein. Die URL-Einreichung wurde 2020 wegen Spam entfernt. Die Indexing-API existiert nur noch für Jobanzeigen und Livestreams; für normalen Content ist das laut Google verboten." } }, { "@type": "Question", "name": "Was ist der Unterschied zwischen Impressionen und Klicks in GSC?", "acceptedAnswer": { "@type": "Answer", "text": "Impressionen zählen jede SERP-Einblendung Ihrer URL. Klicks erfassen tatsächliche Nutzerklicks. Die CTR ist das Verhältnis. Durch AI Overview geht die Schere weiter auseinander, weil Nutzer die Antwort lesen, aber nicht klicken." } }, { "@type": "Question", "name": "Gibt es ein kostenloses Kontingent oberhalb des Standardlimits?", "acceptedAnswer": { "@type": "Answer", "text": "Das Limit ist für alle identisch: 1 200 Requests/Minute für Analytics-Endpunkte, 2 000/Tag für URL Inspection. Ein bezahltes Upgrade gibt es nicht; höhere Limits kann man im Google Cloud Console beantragen, benötigt sie aber selten." } }, { "@type": "Question", "name": "Kann ich GSC-Zugriff delegieren, ohne meinen Google-Account zu teilen?", "acceptedAnswer": { "@type": "Answer", "text": "Ja. Genau dafür sind Dienstkonten gedacht: pro Integration ein Konto anlegen, 'Beschränkt' auf die Property vergeben und bei Bedarf wieder entziehen – ganz ohne Ihren eigenen Login preiszugeben." } }, { "@type": "Question", "name": "Welche Programmiersprachen unterstützt die GSC-API?", "acceptedAnswer": { "@type": "Answer", "text": "Offiziell: Python, Node, Java, PHP, Ruby, Go, .NET. Inoffiziell: jede Sprache, die einen REST-Call mit Bearer-Token absetzen kann. Die JSON-Strukturen sind überall gleich." } } ] } </script>no credit card required