Bulk SERP API

Bulk SERP API : collectez les résultats Google à grande échelle

Mettez un million de recherches Google en file d'attente en quelques minutes, Semscraper se charge de la collecte. Jusqu'à 1 000 mots-clés par appel, traitement asynchrone, callbacks signés et récupération gratuite de chaque résultat.

  • 1 000 mots-clés par appel
  • Asynchrone, avec callbacks signés
  • Environ 30 € les 100 000 SERP
  • 1 000 SERP gratuites
  • Pas de carte de crédit

1 million de recherches Google en file d'attente en quelques minutes

Envoyez jusqu'à 1 000 mots-clés par appel, à raison de 500 appels par minute au maximum, sans attendre la fin des lots précédents. Vos requêtes sont mises en file d'attente immédiatement, puis traitées au fil de l'eau, à mesure que la capacité se libère. La capacité d'envoi n'est pas le débit de traitement : les délais réels dépendent de la charge de la file et de la capacité disponible, que nous augmentons au rythme de la demande.

1. Vous envoyez

Des lots de 1 000 mots-clés, autant d'appels que nécessaire. Chaque recherche peut avoir ses propres paramètres : pays, langue, ville, appareil et profondeur.

2. Nous collectons

Chaque SERP est rendue dans un vrai navigateur. Chaque compte a sa propre file d'attente, les comptes sont servis à tour de rôle, et une priorité de 1 à 10 ordonne vos propres requêtes.

3. Vous recevez

Chaque résultat est envoyé sur votre URL de callback dès qu'il est prêt, ou vous récupérez les résultats terminés par lots, quand vous le souhaitez.

Conçue pour les volumes de production

Ce dont une équipe qui lance des dizaines de milliers de recherches par jour a réellement besoin.

Callbacks signés

Chaque callback porte dans l'en-tête X-Signature une signature HMAC SHA-256 de son corps, calculée avec la clé affichée dans votre menu Clés API.

Rattrapage fiable, récupération gratuite

Les résultats traités mais non récupérés restent disponibles : vous pouvez en lister jusqu'à 1 000 par appel. La récupération est gratuite et peut être répétée : seule la création d'une recherche est facturée.

SERP complètes, jusqu'à 10 pages

Résultats naturels avec rang et position pixel, AI Overviews, annonces, pack local et tous les autres blocs, en JSON ou en HTML. La liste complète figure sur la page API Google Search.

Ce que ça coûte à grande échelle

Facturation à la SERP, sans abonnement. Votre solde n'expire jamais.

SERPPage 1 (environ 10 résultats)10 pages (environ 100 résultats)
10 0003,00 €21,00 €
100 00030,00 €210,00 €
1 000 000300,00 €2 100,00 €

Tarif standard, avant remise de 1 à 10 % selon le montant rechargé. Si Google renvoie moins de pages que demandé, seules les pages trouvées sont facturées. Tarifs détaillés.

Un exemple complet, testé

En Python : mettre une liste de mots-clés en file d'attente, vérifier les callbacks, puis rattraper ce que votre serveur aurait manqué. Exécuté sur l'API en production le 9 octobre 2026 : callbacks reçus avec des signatures valides, boucle de rattrapage lancée deux fois sans plus rien à récupérer au second passage, et aucun frais supplémentaire pour la récupération. Cet exemple cible Google.com en anglais : pour Google France, utilisez location "fr" et language "fr".

1. bulk.py : mettre tous les mots-clés en file d'attente
# bulk.py  -  python bulk.py queue keywords.txt   then later   python bulk.py catch-up
import json, sys, time
import requests

API = "https://api.semscraper.com/v1/serp"
HEADERS = {"Authorization": "Bearer API_KEY"}
CALLBACK = "https://your-server.com/serp-callback"  # or None: catch-up only

def save(serp, path="serps.jsonl"):
    with open(path, "a", encoding="utf-8") as f:
        f.write(json.dumps(serp, ensure_ascii=False) + "\n")

def queue(keywords):
    for i in range(0, len(keywords), 1000):  # 1,000 keywords per call
        batch = [{
            "search_engine": "google_search",
            "keyword": kw,  # a keyword must not contain a comma
            "device": "desktop",
            "location": "en",
            "language": "en",
            "depth": 1,
            **({"callback_url": CALLBACK} if CALLBACK else {}),
        } for kw in keywords[i:i + 1000]]
        for attempt in range(6):
            r = requests.post(API, json=batch, headers=HEADERS, timeout=60)
            if r.status_code != 429:  # 429: over 500 calls/minute, nothing was queued
                break
            time.sleep(10 * (attempt + 1))
        r.raise_for_status()
        print(r.json()["count"], "keywords queued")
2. callback_server.py : recevoir et vérifier chaque callback (Flask)
# callback_server.py  -  flask --app callback_server run
import hashlib, hmac, json
from flask import Flask, request

SECRET = b"hmac_..."  # HMAC key from your API keys menu
app = Flask(__name__)

def save(serp, path="serps.jsonl"):
    with open(path, "a", encoding="utf-8") as f:
        f.write(json.dumps(serp, ensure_ascii=False) + "\n")

@app.post("/serp-callback")
def serp_callback():
    raw = request.get_data()
    expected = hmac.new(SECRET, raw, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected, request.headers.get("X-Signature", "")):
        return "Invalid signature", 401
    for serp in json.loads(raw):  # a list holding the finished SERP
        save(serp)
    return {"status": "ok"}       # anything but 200 leaves it unfetched
3. bulk.py, suite : rattraper ce qui a été manqué
# bulk.py, continued: finished results that were never fetched
def catch_up():
    while True:
        r = requests.get(API, headers=HEADERS, timeout=60)  # up to 1,000 per call
        r.raise_for_status()
        ids = [p["id"] for p in r.json().get("data", [])]
        if not ids:
            break
        for i in range(0, len(ids), 100):
            r = requests.get(API, headers=HEADERS, timeout=60,
                             params={"ids": ",".join(ids[i:i + 100]), "output": "json"})
            r.raise_for_status()
            for serp in r.json()["data"]:
                save(serp)  # fetching marks it as fetched, and is never billed

if __name__ == "__main__":
    if sys.argv[1] == "queue":
        queue(open(sys.argv[2], encoding="utf-8").read().splitlines())
    else:
        catch_up()

Mesuré sur 958 176 SERP

Notre étude sur les AI Overviews a collecté au total plus de 2,15 millions de SERP, sur desktop et mobile. L'une de ses campagnes a mis en file d'attente près d'un million de mots-clés français le 12 septembre 2026. Les 958 176 SERP ont toutes été collectées et récupérées en 4 h 23 après la première requête, sans aucune erreur. L'heure la plus chargée en a livré 237 043. Il s'agit d'une collecte réelle sur notre propre compte, pas d'un débit garanti : le délai dépend de la profondeur, du nombre de requêtes en attente et de la capacité disponible.

958 176

SERP d'une page collectées et récupérées, sans aucune erreur.

4 h 23

entre la première requête et le dernier résultat.

237 043

SERP durant l'heure la plus chargée de la collecte.

À quoi vous attendre

SujetFonctionnement
Une SERP ou un lot entierUne SERP prend en médiane une trentaine de secondes, environ une minute pour 10 pages, car elle est rendue dans un vrai navigateur. De nombreux robots travaillent en parallèle : un lot est donc traité au fil de l'eau et se termine bien plus vite que la somme de ses SERP.
CapacitéNotre flotte de robots grandit avec la demande : nous ajoutons de la capacité à mesure que les volumes augmentent. Si vous prévoyez de très gros volumes récurrents, prévenez-nous à l'avance et nous la dimensionnerons pour vous.
Envoi des callbacksChaque résultat est envoyé une seule fois. Si votre endpoint ne répond pas HTTP 200, le résultat reste simplement non récupéré et la boucle de rattrapage s'en charge.
Récupération par identifiantJusqu'à 100 identifiants par appel. Pour les gros volumes, appuyez-vous sur les callbacks ou sur la liste des résultats terminés non récupérés (jusqu'à 1 000 par appel).
Temps réelConçue pour la collecte à grande échelle, pas pour répondre à un chatbot dans l'instant. Pour les jeux de données et les agents IA, voyez l'API SERP pour l'IA.
FAQ

Questions fréquentes

Combien de mots-clés puis-je envoyer à la fois ?
Jusqu'à 1 000 par appel et jusqu'à 500 appels par minute. Inutile d'attendre la fin d'un lot pour envoyer le suivant : tout est mis en file d'attente immédiatement et traité au fil de l'eau.
Que se passe-t-il si mon URL de callback est indisponible ?
Rien n'est perdu. Un callback qui n'obtient pas de réponse HTTP 200 laisse le résultat non récupéré. Un appel à GET /v1/serp sans identifiant liste jusqu'à 1 000 résultats terminés non récupérés, que vous récupérez ensuite par identifiant. La récupération n'est jamais facturée.
Comment vérifier qu'un callback provient bien de Semscraper ?
Calculez un HMAC SHA-256 du corps brut de la requête avec la clé HMAC affichée dans votre menu Clés API (elle commence par hmac_), puis comparez-le à l'en-tête X-Signature avec une comparaison à temps constant.
Un même lot peut-il mélanger pays, appareils et profondeurs ?
Oui. Chaque élément du lot a sa propre version de Google, sa langue, sa géolocalisation, son appareil, sa profondeur et sa priorité. Une seule règle : un mot-clé ne doit pas contenir de virgule, sinon il serait découpé en deux recherches.
Combien de temps faut-il pour 100 000 SERP ?
Nous ne garantissons pas de durée : elle dépend de la profondeur et de la charge de la file au moment de l'envoi. À titre de repère, notre propre collecte de 958 176 SERP d'une page s'est terminée en 4 h 23. Notre infrastructure s'adapte à la demande : pour de très gros volumes récurrents, contactez-nous en amont et nous ajouterons la capacité nécessaire.

Commencez avec votre propre liste de mots-clés

1 000 SERP offertes, sans carte bancaire.