Wil je je zoekprestaties automatisch ophalen en wegschrijven naar een dashboard, dan koppel je de Search Console API het slimst via een service account. In tegenstelling tot een OAuth-flow met een persoonlijk Google-account hoef je bij een service account nooit handmatig in te loggen of tokens te verversen: n8n draait de workflow volledig onbemand, dag en nacht. In deze gids zet je stap voor stap een Google Cloud-project op, schakel je de Search Console API in, maak je een service account met JSON-key aan, geef je dat account leesrechten op je property en bouw je een n8n-flow die query-data naar Google Sheets schrijft. Onderweg behandelen we de fouten waar bijna iedereen op vastloopt.
Waarom een service account in plaats van OAuth?
Een service account is een soort robot-gebruiker: het heeft een eigen e-mailadres, eigen rechten en authenticeert zichzelf met een private sleutel zonder browser. Voor geautomatiseerde rapportages is dat precies wat je wilt. Een OAuth2-credential vraagt om een refresh token dat kan verlopen of ingetrokken worden zodra een collega zijn wachtwoord wijzigt. Een service account blijft werken zolang de sleutel geldig is en het account rechten heeft op de property.
De prijs: je moet het service-account-e-mailadres handmatig toevoegen aan elke property die je wilt uitlezen. Dat wordt vaak vergeten, met de beruchte fout "user does not have sufficient permission" tot gevolg.
Stap 1 — Google Cloud-project en API inschakelen
- Ga naar de Google Cloud Console en maak een nieuw project aan (of kies een bestaand project). Geef het een herkenbare naam, bijvoorbeeld
n8n-search-console. - Open in het menu APIs & Services → Library.
- Zoek op Google Search Console API en klik op Enable. Let op: dit is een andere API dan de oude "Webmaster Tools API"-naamgeving; de huidige heet Search Console API.
Zonder deze stap krijg je later een 403 met de melding dat de API niet is ingeschakeld voor het project. Schakel hem dus expliciet in voor het project waarin je service account leeft.
Stap 2 — Service account aanmaken en JSON-key downloaden
- Ga naar APIs & Services → Credentials.
- Klik op Create credentials → Service account.
- Geef een naam op (bijvoorbeeld
gsc-reader). Een rol op projectniveau is voor de Search Console API niet nodig; sla die stap over of laat hem leeg. De rechten regel je straks in Search Console zelf. - Open het zojuist gemaakte service account, ga naar het tabblad Keys en kies Add key → Create new key → JSON.
- Er wordt een JSON-bestand gedownload. Bewaar dit veilig: het bevat de private sleutel en kan niet opnieuw worden gedownload.
In dat JSON-bestand vind je twee velden die je nodig hebt: client_email (het service-account-e-mailadres, eindigt op @...iam.gserviceaccount.com) en private_key. Kopieer het client_email-adres alvast; dat heb je in de volgende stap nodig.
Stap 3 — Service account als gebruiker toevoegen in Search Console
Dit is de stap die het vaakst misgaat. Het service account staat los van je eigen Google-account en heeft standaard nul rechten op je properties. Je moet het expliciet toevoegen.
- Open Search Console en selecteer de property die je wilt uitlezen.
- Ga naar Settings → Users and permissions.
- Klik op Add user en plak het
client_email-adres van je service account. - Kies permissie Full of Restricted. Voor alleen lezen van rapportdata volstaat Restricted.
Herhaal dit voor elke property die je via n8n wilt benaderen. Eén service account kan rechten hebben op tientallen properties tegelijk.
Property-type: domain vs URL-prefix
Search Console kent twee soorten properties, en het verkeerde type kiezen levert lege resultaten of een 403 op. Het type bepaalt namelijk hoe je de property-URL (de siteUrl) in de API-aanroep schrijft.
| Type | Dekt | siteUrl in de API |
|---|---|---|
| Domain | Alle subdomeinen en protocollen (http/https, www/non-www) | sc-domain:n8nen.nl |
| URL-prefix | Exact dat protocol + pad | https://n8nen.nl/ |
Schrijf je sc-domain:n8nen.nl terwijl je in werkelijkheid een URL-prefix-property hebt (of andersom), dan vindt de API niets. Controleer in Search Console welk type je property is en kopieer de exacte schrijfwijze.
Stap 4 — Credential opslaan in n8n (credential hygiene)
Plak de inhoud van je JSON-key nooit rechtstreeks in een node-veld of in een Code-node. Gebruik altijd de credentials store van n8n; die versleutelt secrets en houdt ze buiten je workflow-export.
- Ga in n8n naar Credentials → Add credential en kies Google Service Account API (of Google API → Service Account).
- Plak het
client_emailen de completeprivate_key(inclusief de-----BEGIN PRIVATE KEY-----regels) uit het JSON-bestand. - Sla de credential op onder een duidelijke naam, bijvoorbeeld
GSC service account.
Door de credential apart op te slaan kun je hem hergebruiken in meerdere workflows, en blijft de sleutel buiten je versiebeheer als je workflows als JSON exporteert. Wil je breder leren hoe je credentials veilig beheert? Lees dan onze gids over n8n-credentials veilig beheren.
Stap 5 — Voorbeeldflow: query-data naar Google Sheets
Een minimale rapportage-flow ziet er zo uit:
- Schedule Trigger — draait bijvoorbeeld elke maandag om 07:00.
- HTTP Request (of de Google API-node) — roept de
searchanalytics.query-endpoint aan met je service-account-credential. - Code / Set — vlakt de respons af tot losse rijen.
- Google Sheets — schrijft de rijen weg (Append).
De API-aanroep gaat naar dit endpoint, waarbij je de siteUrl url-encodeert:
POST https://www.googleapis.com/webmasters/v3/sites/sc-domain%3An8nen.nl/searchAnalytics/query
Stel in de HTTP Request-node de authenticatie in op je opgeslagen service-account-credential (n8n regelt dan de OAuth2-token-uitwisseling op de achtergrond) en stuur deze JSON-payload mee:
{
"startDate": "2026-05-01",
"endDate": "2026-05-31",
"dimensions": ["query", "page"],
"rowLimit": 1000,
"dataState": "final"
}
Een rij uit de respons ziet er zo uit:
{
"keys": ["n8n search console api", "https://n8nen.nl/blog/..."],
"clicks": 42,
"impressions": 980,
"ctr": 0.0428,
"position": 7.3
}
In de Code-node splits je keys uit naar kolommen (query en page) en koppel je clicks, impressions, ctr en position eraan. De Google Sheets-node schrijft elke rij weg als nieuwe regel. Vervang Sheets gerust door een database-node of een webhook naar je eigen dashboard; de rest van de flow blijft identiek.
Veelvoorkomende fouten oplossen
| Foutmelding | Oorzaak en oplossing |
|---|---|
| user does not have sufficient permission | Het service-account-e-mailadres staat niet als gebruiker in deze property. Voeg het client_email toe via Settings → Users and permissions. |
| email not found / invalid_grant | De private_key is onvolledig geplakt (regeleindes weggevallen) of het verkeerde client_email staat ingevuld. Plak de volledige sleutel opnieuw uit het JSON-bestand. |
| 403 — API niet ingeschakeld | De Search Console API is niet aangezet voor dit project. Schakel hem in via APIs & Services → Library. |
| Lege resultaten / 404 op siteUrl | Verkeerd property-type: je gebruikt sc-domain: terwijl het een URL-prefix-property is (of omgekeerd). Controleer het type in Search Console. |
Loop je vast op de Search Console API-authenticatie, controleer dan altijd in deze volgorde: is de API ingeschakeld, is het service-account toegevoegd aan de juiste property, en klopt de schrijfwijze van de siteUrl. In negen van de tien gevallen zit het probleem in één van deze drie.
Aan de slag
Je hebt nu een service account dat de Search Console API onbemand uitleest en de data wegschrijft naar Sheets of een dashboard. Plan de workflow in op een vaste dag en je rapportages vullen zichzelf. Wil je dieper de automatisering in, bekijk dan meer praktische gidsen op de n8nen.nl homepage.