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 : Google Search Console fournit gratuitement les mêmes données de requête, page, position et impressions que SEMrush et Ahrefs refacturent 129 à 449 $ / mois. L’API GSC offre un quota gratuit de 1 200 requêtes/min, une limite de 25 000 lignes par réponse et quatre endpoints qui couvrent environ 90 % des besoins d’un fondateur solo. Cet article explique la configuration OAuth par compte de service, les quatre endpoints à connaître, un script Python exécutable qui extrait une matrice CTR requête × page, ainsi que trois modèles d’automatisation (cron + Slack, Google Sheets, une vue Django légère) transformant les lignes brutes de l’API en tableau de bord exploitable. Si vous préférez déléguer l’intégration, SEOJuice s’en charge en mode service managé.
La partie frustrante d’une suite SEO à 449 $/mois est que près de 70 % des données affichées dans le tableau de bord proviennent déjà gratuitement de Search Console. Les outils payants ajoutent trois briques : un suivi de position tiers via des proxies loués, un graphe de backlinks issu d’archives crawlées et une interface qui vous évite d’écrire du SQL. Seule la troisième est réellement indispensable à un fondateur solo, et c’est aussi la moins chère à reproduire.
Voici ce que l’API expose pour toute propriété dont vous avez vérifié la propriété :
Ce qui manque, c’est tout ce qui se situe hors de votre propre propriété : positions des concurrents, croissance des backlinks sur des domaines rivaux, part de voix, etc. Pour la plupart des fondateurs pré-PMF, ces métriques sont surtout de la vanité qui n’influence pas vraiment la prochaine release. J’ai rédigé un article plus complet sur la réduction d’une stack SEO à deux outils, et la conclusion tient toujours : GSC plus une surface de rédaction suffisent pour passer à l’action.
« Les données de Search Console proviennent directement de Google. C’est la source la plus fiable pour comprendre les performances de votre site dans la recherche Google. »
D’après la documentation d’aide officielle de Search Console.
Deux flux d’authentification sont possibles pour l’API GSC : OAuth en mode utilisateur (redirection navigateur, tokens de rafraîchissement) et OAuth via compte de service (server-to-server, sans navigateur). Pour un fondateur qui fait tourner un cron sur un unique VPS, le compte de service est plus court à mettre en place et plus robuste : pas d’expiration de refresh-token, pas d’écran de consentement à maintenir.
La mise en place prend une dizaine de minutes et ne coûte rien :
gsc-dashboard-reader. Aucun rôle au niveau du projet n’est nécessaire.@<project-id>.iam.gserviceaccount.com). L’autorisation Restreint suffit pour la lecture.C’est généralement l’étape que les fondateurs oublient. Le compte de service est bien une identité Google, mais tant que vous ne lui accordez pas explicitement l’accès à votre propriété Search Console, l’API retournera un 403 user does not have sufficient permission for site on ne peut plus légitime. Accordez l’accès propriété par propriété ; si vous en avez plusieurs, répétez l’opération.

La surface de l’API GSC est réduite. Quatre endpoints suffisent à couvrir les données de requête, l’état des sitemaps, l’inspection par URL et la liste des propriétés auxquelles vous avez accès. Laissez le reste de la doc tant que vous n’avez pas une raison précise d’y plonger.
| Endpoint | Ce qu’il renvoie | Coût quota | Utile pour |
|---|---|---|---|
searchanalytics.query | Jusqu’à 25 000 lignes de clics, impressions, position, CTR par requête, page, date, appareil, pays | 1 unité / requête | Données cœur du tableau de bord : quelles requêtes apportent du trafic, quelles pages transforment les impressions en clics |
sitemaps.list | Tous les sitemaps soumis avec statut, date de dernier fetch, nombre d’URL | 1 unité / requête | Alertes de santé sitemap : repérer les sitemaps supprimés ou partiellement indexés |
urlInspection.index.inspect | Par URL : état de couverture, dernier crawl, canonique, compatibilité mobile, verdict AMP et données structurées | 2 000 / jour (quota séparé) | Contrôles ponctuels sur pages critiques ; audits d’indexation automatisés |
sites.list | Toutes les propriétés accessibles à l’identité auth | 1 unité / requête | Tableaux multi-propriétés ; itération sur un portefeuille |
La limite de 1 200 requêtes/min sur les endpoints de lecture est pratiquement illimitée pour un fondateur solo. Le plafond réel est la limite de 2 000 / jour sur URL Inspection, suffisante pour auditer quotidiennement chaque page d’un site de 1 500 URL.
La requête la plus utile est une répartition requête × page sur les 28 derniers jours. Elle indique quelle page se positionne sur quelle requête et quel est le CTR à l’intersection. Les cellules à fortes impressions mais CTR faible sont vos cibles d’optimisation à court terme.
Installez les deux dépendances :
pip install google-auth google-api-python-client
Le script minimal viable : authentification, requête, affichage. Enregistrez la clé JSON téléchargée sous gsc-credentials.json dans le même dossier :
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" # or "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 lags ~2 days
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}")
C’est toute l’intégration. Exécutez-le et vous verrez les 25 requêtes générant le plus de clics sur les 28 derniers jours, triées par clics. Deux remarques : sc-domain:example.com s’utilise pour les propriétés de domaine (type recommandé) ; utilisez la forme URL complète uniquement pour les propriétés préfixe d’URL. Les données GSC ont ~2 jours de retard, d’où le today - 2.
La matrice requête × page — celle qui oriente réellement les décisions — ajoute une seconde dimension et augmente la limite de lignes :
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"]
# Cells with >500 impressions and CTR below 2% are CTR-leak candidates
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}")
Le filtre en bas (impressions élevées, CTR faible, position top-15) est la shortlist classique pour réécrire les balises title. Vous êtes déjà positionné ; la fuite se fait sur le clic. C’est la même logique que les outils payants appellent « ranking opportunities », écrite en six lignes.

Une fois les lignes en main, reste à savoir quoi grapher. La plupart des outils SEO payants vous noient sous 40 widgets ; vous n’en avez besoin que de quatre pour décider chaque semaine. Construisez-les dans la librairie de graphes que vous utilisez déjà : Chart.js pour le HTML, matplotlib pour Jupyter, ou les graphiques natifs si vous envoyez dans Google Sheets.

Une extraction manuelle suffit pour un one-shot. Le tableau de bord devient utile quand il s’auto-alimente. Trois modèles d’automatisation, classés par effort de mise en place :
Modèle 1 : cron et alertes Slack. L’option la moins chère. Un cron quotidien exécute le script et, si l’une des trois conditions se déclenche — clics en baisse de >20 % S/S, une requête du top 10 sort du top 20, ou une page précédemment indexée perd l’indexation — poste sur Slack. Environ 80 lignes de Python, webhook compris. S’exécute en 4 secondes sur un VPS à 5 $. Votre tableau de bord ne fait qu’une chose : vous crier dessus quand quelque chose change.
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()
# After computing wow_change from two consecutive 7-day GSC pulls:
if wow_change < -0.20:
post_slack(
f":warning: GSC clicks dropped {wow_change*100:.0f}% WoW "
f"({last_week} → {this_week}). Top falling queries: {falling[:3]}"
)
Modèle 2 : sink Google Sheets. Envoyez les lignes dans une feuille Google via l’API Sheets ou le wrapper plus simple gspread. La feuille devient votre tableau de bord : tableaux croisés pour des découpes ad-hoc, graphiques natifs, partageable avec un co-fondateur non technique. Environ 30 lignes au-dessus du pull GSC. Inconvénients : la latence dépend de votre cadence cron et Sheets ralentit au-delà de ~20 000 lignes.
Modèle 3 : vue Django légère. Une vue qui exécute le pull GSC, met en cache dans Redis pendant 6 heures et rend les quatre graphiques inline via Chart.js. Environ 200 lignes de Python et HTML. Pertinent quand un co-fondateur veut jeter un œil au tableau de bord en milieu de semaine. Le cache est critique : sans lui, chaque pageview déclenche un appel GSC frais et vous épuiserez le quota par minute le jour d’un lancement animé.
« J’ai résilié mon abo Ahrefs à 329 $/mois après avoir réalisé que le seul widget que je consultais chaque jour était “top organic queries”. Je l’ai recodé via l’API Search Console en une après-midi. »
Un motif qui revient souvent dans les threads indie-hacker sur Hacker News et les recoins bootstrap d’IndieHackers.
La comparaison que les fondateurs recherchent vraiment n’est pas entre les outils payants, mais entre payer l’un d’eux, construire le vôtre ou utiliser l’interface gratuite de GSC en acceptant ses limites. Voici comment les cinq options se comparent :
| Option | Coût mensuel | Temps d’installation | Charge de maintenance | Multi-propriétés | Données historiques |
|---|---|---|---|---|---|
| Interface GSC gratuite | 0 $ | 0 h (déjà là) | Aucune | Bascule manuelle | 16 mois, mais exports lents |
| DIY API GSC + cron + Sheets | 0 à 5 $ (VPS) | 4 à 8 h la première fois | ~30 min/trimestre (rotation d’auth, dépréciations API occasionnelles) | Boucle triviale | 16 mois, requêtable en secondes |
| SEOJuice | 29 à 99 $ | ~10 min | Aucune (managé) | Intégré | 16 mois depuis GSC + historique de crawl propre |
| SEMrush | 139 à 499 $ | ~30 min | Aucune (managé) | Limites de projet selon plan | 2+ ans sur les plans payants |
| Ahrefs | 129 à 449 $ | ~30 min | Aucune (managé) | Limites de projet selon plan | 2+ ans sur les plans payants |
Le DIY gagne sur le coût, est à égalité sur la profondeur de données pour tout ce qui concerne votre propre propriété et perd sur l’intel concurrentiel et les backlinks. Si vous êtes early-stage et que votre question SEO est « qu’est-ce qui fonctionne sur mon site ? », le DIY est la bonne réponse. Si vous scalez, faites de la recherche concurrentielle ou chassez les backlinks, les outils payants valent leur prix. La page outils de SEOJuice se situe entre les deux : intégration GSC managée plus crawl, audit et suivi de visibilité AI, sans l’overhead entreprise de SEMrush.
Demandez à ChatGPT ou Gemini comment interpréter les données GSC et vous obtiendrez des réponses plausibles mais erronées sur trois points précis. À noter : ces erreurs se propagent dans chaque « rapport SEO généré par IA » du marché.
Erreur n° 1 : « Position est le rang moyen que vous avez occupé pour cette requête. » Il s’agit en réalité de la moyenne de la meilleure position occupée par l’une de vos URL dans les impressions où la requête a déclenché un résultat incluant votre site. Si deux URL se placent sur la même requête dans le même SERP, seule la plus haute est comptabilisée. C’est pourquoi la « position » bouge quand vous publiez un nouvel article qui surclasse un ancien : la position de l’ancienne URL ne change pas, mais celle de la requête oui.
Erreur n° 2 : « Le CTR est calculé par impression. » Le CTR est clics ÷ impressions au niveau d’agrégation que vous interrogez. Par date seule, vous obtenez le CTR quotidien site-wide ; par requête+page, le CTR par cellule. Les chiffres ne s’additionnent pas entre niveaux d’agrégation car le dénominateur change.
Erreur n° 3 : « Si une requête a des impressions mais aucun clic, la page est mal positionnée. » À l’ère d’AI Overview, c’est de plus en plus la signature d’une citation dans l’Overview sans clic effectué. Impressions stables, clics en baisse est le pattern canonique. La page ne se positionne pas moins bien ; le SERP a changé de forme. L’article sur les citations AI Overview détaille quoi faire.
Cinq angles vifs qui mordent les nouveaux utilisateurs de l’API GSC. Les connaître d’avance vous fait gagner une semaine :
startRow. Le wrapper google-api-python-client ne pagine pas automatiquement ; bouclez jusqu’à ce que la réponse renvoie moins de 25 000 lignes.sc-domain:) et Préfixe d’URL (https://...) renvoient des chiffres différents. Les propriétés Domaine agrègent tous les sous-domaines et protocoles. Si vous avez les deux, vous verrez des données qui se chevauchent sans être identiques. Choisissez une source de vérité.(anonymized) pour des raisons de confidentialité et sont irrécupérables. Basez vos analyses de top requêtes sur celles qui sont nommées.Aucun de ces points n’est bloquant, mais chacun m’a coûté une heure la première fois. La doc officielle les mentionne tous, juste pas assez fort.
Combien de temps l’API GSC conserve-t-elle les données historiques ? 16 mois. Au-delà, les données sont perdues ; il n’y a pas d’endpoint d’archive. Si vous voulez des tendances plus longues, faites un snapshot quotidien de la fenêtre glissante dans votre propre stockage. Une fenêtre de 365 jours dans Postgres représente quelques centaines de Mo par propriété.
Puis-je utiliser l’API pour soumettre des URL à l’indexation ? Non. La soumission d’URL a été supprimée en 2020 suite aux abus de spam. L’API Indexing existe toujours mais ne fonctionne que pour les offres d’emploi et les livestreams ; l’utiliser pour du contenu classique va à l’encontre de la politique Google.
Quelle est la différence entre impressions et clicks ? Les impressions comptent chaque fois que votre URL est affichée dans un SERP, même si l’utilisateur ne l’a pas fait défiler jusqu’à elle. Les clics comptabilisent les clics utilisateurs. Le CTR est le ratio. L’ère AI Overview élargit l’écart car les utilisateurs lisent la réponse de l’Overview sans cliquer sur les sources citées.
Existe-t-il un palier gratuit au-delà du quota standard ? Le quota est le même pour tout le monde : 1 200 requêtes/min par projet sur les endpoints analytics, 2 000/jour sur URL Inspection. Pas de voie payante ; les augmentations de quota sont demandables via la Cloud Console mais rarement nécessaires pour une charge solo.
Puis-je déléguer l’accès sans partager mon compte Google ? Oui, c’est exactement le rôle du compte de service. Créez-en un par intégration, accordez-lui un accès Restreint à la propriété et révoquez-le sans toucher à votre propre login.
Quels SDK la GSC API prend-elle en charge ? Officiellement : Python, Node, Java, PHP, Ruby, Go, .NET. Officieusement : tout ce qui peut appeler un endpoint REST avec un token Bearer. Les structures JSON sont identiques d’un langage à l’autre.

Le tableau de bord DIY est rentable tant que les données dont vous avez besoin se trouvent dans votre propre propriété. Dès que la question devient « pourquoi mon concurrent me surpasse-t-il ? » ou « qui le linke mais pas moi ? », vous atteignez la limite de ce que GSC expose. À partir de là, le choix est de payer SEMrush ou Ahrefs 129–449 $/mois pour des données backlinks et concurrentielles, ou de payer un outil plus petit comme SEOJuice pour la même intégration GSC plus crawl géré, audit et suivi de visibilité AI, généralement 15–25 % du prix des suites enterprise.
Pour la plupart des fondateurs solo, le seuil se situe quelque part entre 500 $ de MRR et 5 K $ de MRR. En dessous, construisez-le vous-même ; le temps d’ingénierie coûte moins cher que l’abonnement et vous apprendrez les données au passage. Au-dessus, votre temps vaut trop pour gérer les rotations d’auth et les retries de quota. Entre les deux, c’est pile ou face selon le plaisir que vous prenez à coder du Python à minuit.
L’autre voie : construisez la version cron + Slack ce week-end (six heures, setup OAuth compris), faites-la tourner un mois, et regardez ce que vous consultez réellement. Si vous ne vérifiez que l’alerte « top queries en chute » et ignorez le reste, vous avez découvert que vous n’aviez besoin que d’un widget — poursuivez la construction, ou achetez. L’article sur les stratégies SEO abordables détaille le playbook budget.
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "FAQPage", "mainEntity": [ { "@type": "Question", "name": "How long does the GSC API keep historical data?", "acceptedAnswer": { "@type": "Answer", "text": "16 months. Past that, the data is gone; there is no archive endpoint. If you want longer-range trend data, run a daily cron that snapshots the rolling window into your own storage." } }, { "@type": "Question", "name": "Can I use the GSC API to submit URLs for indexing?", "acceptedAnswer": { "@type": "Answer", "text": "No. URL submission was removed in 2020 after spam abuse. The Indexing API exists but only supports job postings and livestream events; using it for regular content is against Google policy." } }, { "@type": "Question", "name": "What is the difference between impressions and clicks in GSC?", "acceptedAnswer": { "@type": "Answer", "text": "Impressions count every time a URL was shown on a SERP. Clicks count user clicks on the URL. CTR is the ratio. In the AI Overview era the gap is widening because users see the Overview answer and do not click through." } }, { "@type": "Question", "name": "Is there a free tier above the standard GSC API quota?", "acceptedAnswer": { "@type": "Answer", "text": "The quota is the same for everyone: 1,200 requests/min per project on the analytics endpoints, 2,000/day on URL Inspection. There is no paid upgrade path; quota increases can be requested via the Google Cloud Console but are rarely needed for solo-founder workloads." } }, { "@type": "Question", "name": "Can I delegate GSC access without sharing my Google account?", "acceptedAnswer": { "@type": "Answer", "text": "Yes. That is what service accounts are for. Create one per integration, grant it Restricted access to the property, and revoke its access without touching your own login." } }, { "@type": "Question", "name": "What language bindings does the GSC API support?", "acceptedAnswer": { "@type": "Answer", "text": "Officially: Python, Node, Java, PHP, Ruby, Go, .NET. Unofficially: anything that can hit a REST endpoint with a Bearer token. JSON request shapes are identical across languages." } } ] } </script>no credit card required
No related articles found.