---
title: "Gibt es eine Google Search API? Optionen nach Custom Search"
slug: google-search-api
date: 2026-10-18T11:35:32+00:00
modified: 2026-10-18T11:35:34+00:00
permalink: https://brightdata.de/blog/web-data-de/google-search-api
type: blog
---

[ Blog ](https://brightdata.de/blog "Blog") / [Web Data](https://brightdata.de/blog/web-data-de)







 [Web Data](https://brightdata.de/blog/web-data-de)

# Gibt es eine Google Search API? Optionen nach Custom Search

Erfahren Sie, wie Sie von Googles Custom Search JSON API zu Bright Datas SERP API migrieren, mit einem Drop-in cse.list()-Adapter und einer Parameterzuordnung.

 7 min lesen





 [ ![Satyam Tripathi](https://media.brightdata.de/2024/09/Satyam-Tripathi-50x50.png) ](https://brightdata.com/blog/authors/satyam-tripathi)

 [Satyam Tripathi

Technical Writer

 ](https://brightdata.com/blog/authors/satyam-tripathi)





 ![Is There a Google Search API](https://media.brightdata.de/2026/10/Is-There-a-Google-Search-API_.png)





Google hat seine Custom Search JSON API für Neukunden geschlossen, der Zugang für Bestandskunden endet am 1. Januar 2027. Gibt es also noch eine Google Search API, für die man sich anmelden kann? Nicht für Full-Web-Ergebnisse, denn Googles öffentliche Optionen durchsuchen ausgewählte Seiten oder liefern Gemini-Antworten basierend auf der Google-Suche. Bright Datas SERP API liefert vollständige Google-Web-Ergebnisse als JSON.

Die Custom Search JSON API gibt neuen Projekten einen 403-Fehler zurück. Direkte HTTP-Anfragen an google.com schlugen im Test stillschweigend fehl, mit Status 200 und 0 Ergebnissen.

Dieser Leitfaden vergleicht Googles Optionen, erklärt, warum direkte Anfragen scheitern, und zeigt, wie man migriert.

## TL;DR

- **Google verkauft keine Self-Service Full-Web-Such-API an neue Entwickler.** Das Enddatum der Custom Search JSON API ist der 1. Januar 2027.
- **Grounding with Google Search liefert Gemini-Antworten, keine Ergebnislisten.** Die Nutzungsbedingungen verbieten das Caching oder Analysieren der Ergebnisse sowie das Indexieren ihrer Links.
- **Direkte HTTP-Anfragen an die Google-Suche lieferten im Test keine Ergebnisse.** Browser über dieselbe Verbindung erhielten anschließend ein CAPTCHA.
- **Bright Datas SERP API liefert Googles Ergebnisseite als JSON.** 5.000 Anfragen pro Monat sind kostenlos, danach 1,50 $ pro 1.000 erfolgreiche Anfragen. Ein Drop-in-Adapter konvertiert `cse.list()`-Aufrufe.

## Welcher Custom-Search-API-Ersatz passt zu Ihrem Code

Finden Sie heraus, was Ihr Code benötigt:

Wenn Ihr Code benötigtVerwenden SieGoogle-Suchergebnisse für das gesamte Web[Bright Data SERP API](#migrate)Suche beschränkt auf eine feste Liste von Seiten[Bright Data SERP API](#step-3) mit `site:`-Filtern, oder [Agent Search von Google](#google-options)Beibehaltung vorhandener `cse.list()`-Parameter[Der Adapter in Schritt 3](#step-3)Google-Bilder-Ergebnisse[Der Adapter in Schritt 3](#step-3) mit `searchType="image"`Ein MCP- (Model Context Protocol), LangChain- oder n8n-Suchtool[Bright Data Web MCP, ein LangChain-Tool oder der n8n-Node](#agent-tools)Eine Gemini-Antwort, die dem anfragenden Nutzer angezeigt wird[Grounding with Google Search](#google-options)Eine Lösung für eine Fehlermeldung[Die Fehlerbehebungstabelle](#troubleshooting)## Was mit der Google Custom Search JSON API passiert ist

Google hat die Abschaltung am 20. Januar 2026 angekündigt. Die [Übersicht zur Custom Search JSON API](https://developers.google.com/custom-search/v1/overview) kennzeichnet die API als “geschlossen für Neukunden” und gibt Bestandskunden bis zum 1. Januar 2027 Zeit.

![Google for Developers-Seite für die Custom Search JSON API, mit hervorgehobenem Hinweis. Der Hinweis besagt, dass die API für Neukunden geschlossen ist, nennt Vertex AI Search als Alternative für bis zu 50 Domains, bittet Full-Web-Nutzer, Google zu kontaktieren, und gibt Bestandskunden bis zum 1. Januar 2027 Zeit.](https://media.brightdata.com/2026/10/rk7YQLLoMg.png)Neue Projekte erhalten bereits jetzt einen 403-Fehler von der Custom Search JSON API, noch vor der Frist 2027. Dies ist die Antwort, gekürzt auf die Hauptfelder.

```none
{
  "error": {
    "code": 403,
    "message": "This project does not have the access to Custom Search JSON API.",
    "status": "PERMISSION_DENIED"
  }
}
```

Im Entwicklerforum von Google berichtet ein Entwickler von diesem 403-Fehler bei einem bestehenden Projekt nach einer Änderung der Abrechnung.

Die Tabelle stellt Googles dokumentierte Grenzen der [Bright Data SERP API](/products/serp-api) gegenüber:

Custom Search JSON APIBright Data SERP APIKostenlose Nutzung100 Anfragen pro Tag, etwa 3.000 pro Monat5.000 Anfragen pro Monat, keine Kreditkarte nötigBezahlte Nutzung5 $ pro 1.000 Anfragen, bis zu 10.000 pro Tag[1,50 $ pro 1.000 erfolgreiche Anfragen](/pricing/serp), unbegrenzte GleichzeitigkeitErgebnisse pro AnfrageBis zu 10Eine vollständige Google-ErgebnisseiteErgebnisse pro AbfrageBis zu 100Paginierung mit `start`, oder Positionen 1 bis 100 in einem AufrufStandort`gl` bevorzugt Ergebnisse aus einem LandErgebnisse wie von einem Nutzer im eingestellten Land gesehenWas die API zurückgibtErgebnisse einer Programmable Search Engine, die eine Teilmenge des Google-Index durchsuchtGoogles Ergebnisseite, einschließlich Anzeigen und People Also Ask, wenn Google diese anzeigt. Ein zusätzlicher Parameter fügt den AI Overview hinzuDie Migration ist einfacher als sie aussieht, denn Custom-Search-Ergebnisse unterschieden sich bereits von google.com-Ergebnissen. Googles [Hilfeseite](https://support.google.com/programmable-search/answer/70392?hl=en) besagt, dass eine Full-Web-Engine nur “eine Teilmenge des gesamten Google-Web-Search-Corpus” durchsucht und Echtzeitergebnisse ausschließt. Sie müssen also alte Ergebnisse nicht exakt reproduzieren. Prüfen Sie die neuen Ergebnisse gegen google.com und nutzen Sie gespeicherte Custom-Search-Ergebnisse, um Fehler in Ihrer Migration zu finden.

## Googles eigene Alternativen zur Custom Search API

Google verweist Custom-Search-Nutzer auf Agent Search und ein Interessenformular für Full-Web. Grounding with Google Search, eine Funktion der Gemini API, taucht ebenfalls auf, wenn man nach einem Ersatz sucht:

Produkt und UmfangWas es zurückgibtListenpreisAgent Search (auch Vertex AI Search genannt), für bis zu 50 DomainsErgebnisse und Antworten von diesen Seiten[4 $ pro 1.000 Website-Suchanfragen](https://cloud.google.com/generative-ai-app-builder/pricing)Grounding with Google Search (Gemini API), für die Google-SucheEine Gemini-Antwort mit Links[14 $ pro 1.000 Suchanfragen](https://ai.google.dev/gemini-api/docs/pricing)Full-Web-Suchlösung, für Googles vollständigen IndexNicht öffentlich dokumentiertNur InteressenformularWenn Ihre Engine eine feste Liste von Seiten durchsucht hat, haben Sie 2 Optionen. Die Bright Data SERP API akzeptiert dieselbe Liste als `site:`-Filter, und Agent Search unterstützt bis zu 50 Domains.

Grounding ist das Produkt, das der Websuche am nächsten kommt, aber seine Nutzungsbedingungen begrenzen, was Sie bauen können. Die [Gemini-API-Nutzungsbedingungen](https://ai.google.dev/gemini-api/terms) verlangen, dass Sie fundierte Ergebnisse dem anfragenden Nutzer zeigen. Sie verbieten Ihnen, diese Ergebnisse zu “cachen, framen, syndizieren, weiterzuverkaufen, zu analysieren, darauf zu trainieren oder anderweitig daraus zu lernen” oder ihre Links zu indexieren.

Auch Microsoft hat seine Bing Search APIs im August 2025 eingestellt. Unsere Leitfäden zu [Bing-Search-API-Alternativen](/blog/web-data/best-bing-search-apis) und den [besten SERP-APIs](/blog/web-data/best-serp-apis) vergleichen die anderen Anbieter.

Keines der Self-Service-Produkte von Google liefert Neukunden vollständige Web-Suchergebnisse. Die Bright Data SERP API hingegen schon.

## Warum direkte Anfragen an die Google-Suche scheitern

Da Custom Search geschlossen wird, liegt der direkte Abruf der Google-Ergebnisseite als Fallback nahe. Die Google-Suche erfordert seit Januar 2025 JavaScript. Im Test über eine Heim-Breitbandverbindung erhielten 10 Anfragen von HTTP-Clients und dann mehrere echte Browser keine Suchergebnisse:

![Flussdiagramm direkter Anfragen an google.com/search im Test. Ein HTTP-Client ohne JavaScript endet bei HTTP 200 mit 0 Ergebnissen, markiert als stiller Fehler. Ein echter Browser, der JavaScript ausführt, getestet nach 10 solchen Anfragen, endet bei einer /sorry/-CAPTCHA-Seite mit blockierter Verbindung.](https://media.brightdata.com/2026/10/Bkz9XILsMe.png)Die HTTP-Clients scheitern auf die am schwersten zu erkennende Weise. Die 10 Anfragen stammten von 5 gängigen HTTP-Client-Konfigurationen, darunter `curl` und Python `httpx`. Alle 10 erhielten Status 200 und keine Ergebnisse, sodass ein Scraper, der nur Statuscodes prüft, einen Erfolg protokolliert und nichts speichert. Die Seite enthielt nur ein Skript, das in einer JavaScript-Engine ausgeführt werden muss, bevor Ergebnisse erscheinen.

Prüfen Sie jede Antwort auf Ergebnisse, nicht nur den Statuscode.

Jeder getestete Browser, einschließlich headless Chromium und Chrome, führte das JavaScript aus, erhielt aber bei der ersten Anfrage Googles `/sorry/`-CAPTCHA-Seite. Sie liefen nach jenen 10 HTTP-Anfragen, und die Blockade galt für die gesamte Verbindung für 40 Minuten oder länger.

Bei Produktionsvolumen müssten Sie Googles JavaScript für jede Suche ausführen und Parser für sich ändernde Markup pflegen. Bright Datas SERP API übernimmt die Browser und Parser für Sie und liefert geparste Ergebnisse.

## So migrieren Sie Custom-Search-JSON-API-Code zu Bright Datas SERP API

Sie senden eine normale Google-Such-URL, und die Antwort ist diese Seite als JSON. Die Schritte 1 bis 3 bilden die Kernmigration.

### Schritt 1: Einrichten und erste Anfrage senden

Sie benötigen ein kostenloses [Bright-Data-Konto](/cp/start), einen API-Schlüssel und eine SERP-API-Zone. Eine Zone ist ein benannter Satz von Einstellungen, den Ihre Anfragen nutzen. Wenn Ihr Sicherheitsteam neue Anbieter zuerst prüft, senden Sie dem Team den [Bright Data Trust Center](/trustcenter)-Link. Diese Seite listet SOC-2- und SOC-3-Berichte, ISO-27701-Zertifikate und GDPR-Dokumentation auf.

Im Kontrollfeld wird eine Zone als API bezeichnet. Öffnen Sie **Web Access**, wählen Sie **Create API**, wählen Sie **SERP API** und wählen Sie **Continue**:

![Bright-Data-Kontrollfeld, Web Access, Add-API-Seite. Die SERP-API-Option ist unter Browser API, Web Unlocker API und SERP API hervorgehoben, über dem Continue-Button.](https://media.brightdata.com/2026/10/H1dsm8Ljfx.png)Geben Sie der API einen Namen, stellen Sie sicher, dass das Datenformat **Raw HTML** ist, und wählen Sie **Add API**. Das JSON stammt aus einem Parameter in jeder Anfrage, nicht aus dieser Einstellung. Der von Ihnen gewählte API-Name ist Ihr Zonenname, den Sie unten in `BRIGHTDATA_SERP_ZONE` einstellen:

![Bright-Data-Kontrollfeld, Configure-API-Schritt für eine SERP API. Das Name-Feld und der Add-API-Button sind hervorgehoben, und ein Hinweis unter dem Feld besagt, dass der Name später nicht geändert werden kann.](https://media.brightdata.com/2026/10/B1haX8LiGe.png)Der API-Schlüssel befindet sich in der **Quick start**-Leiste am unteren Rand der **Home**-Seite:

![Bright-Data-Kontrollfeld Home-Seite. Das API-Key-Feld in der Quick-start-Leiste am unteren Rand ist hervorgehoben. Der Schlüssel und die MCP-Server-URL sind in diesem Bild verborgen.](https://media.brightdata.com/2026/10/SyAAXULifg.png)Erstellen Sie eine virtuelle Umgebung, setzen Sie den Schlüssel und den Zonennamen, und installieren Sie die einzige Python-Abhängigkeit. Ersetzen Sie beide Werte durch Ihren eigenen Schlüssel und Zonennamen:

```none
python3 -m venv .venv && source .venv/bin/activate
export BRIGHTDATA_API_KEY="your-api-key"
export BRIGHTDATA_SERP_ZONE="serp_api1"
python -m pip install "httpx>=0.27,<1"
```

Unter Windows PowerShell verwenden Sie stattdessen diesen Block:

```none
python -m venv .venv; .venv\Scripts\Activate.ps1
$env:BRIGHTDATA_API_KEY = "your-api-key"
$env:BRIGHTDATA_SERP_ZONE = "serp_api1"
python -m pip install "httpx>=0.27,<1"
```

Mit uv überspringen Sie die virtuelle Umgebung und starten jedes Skript mit `uv run --with "httpx>=0.27,<1" python`, gefolgt vom Skriptnamen.

Ein einzelner POST an Bright Datas `/request`-Endpunkt ruft eine Google-URL über Ihre Zone ab und liefert eine Ergebnisseite zurück. Dieser curl-Befehl sendet diese Anfrage und formatiert die Antwort übersichtlich:

```none
curl https://api.brightdata.com/request \
  -H "Authorization: Bearer $BRIGHTDATA_API_KEY" \
  -H "Content-Type: application/json" \
  --data @- <<EOF | python -m json.tool
{
  "zone": "$BRIGHTDATA_SERP_ZONE",
  "url": "https://www.google.com/search?q=is+there+a+google+search+api&gl=us&hl=en&brd_json=1",
  "format": "raw"
}
EOF
```

Der Parameter `brd_json=1` wandelt die Seite in geparstes JSON um, und `"format": "raw"` gibt dieses JSON unverändert zurück. Die untenstehende Antwort ist gekürzt:

```none
{
  "general": {
    "search_engine": "google",
    "query": "is there a google search api",
    "language": "en",
    "country_code": "US"
  },
  "organic": [
    {
      "link": "https://developers.google.com/custom-search/v1/overview",
      "title": "Custom Search JSON API | Google for Developers",
      "description": "The Custom Search JSON API lets you develop websites and applications to retrieve and display search results from Programmable Search Engine ...",
      "rank": 1
    }
  ],
  "pagination": {
    "current_page": 1,
    "next_page": 2,
    "next_page_start": 10
  }
}
```

Dieselbe Antwort enthielt zudem 8 verwandte Suchen und 4 People-Also-Ask-Fragen. Die Custom-Search-Antwort hat für beides keine Felder.

### Schritt 2: Custom-Search-Parameter auf Google-Parameter abbilden

Bright Datas [Referenz zu Google-Abfrageparametern](https://docs.brightdata.com/products/serp-api/query-parameters/google) und die Liste der [Google-Such-URL-Parameter und -Operatoren](/blog/web-data/google-search-url-parameters) erklären Googles Parameter im Detail. Antwortfelder befinden sich in `items[]` bei Custom Search und in `organic[]` in der SERP-API-Antwort:

Custom Search JSON APIGoogle, über die SERP API`q``q``num` (maximal 10)Von Google entfernt. Der Adapter fordert weitere Seiten an`start` (zählt ab 1)`start` (zählt ab 0, in Schritten von 10)`gl` (bevorzugt Ergebnisse aus einem Land)`gl` (führt die Suche als Nutzer in diesem Land aus)`hl` (Oberflächensprache)`hl``siteSearch=a.com``site:a.com` zu `q` hinzugefügt`siteSearchFilter=e``-site:a.com` zu `q` hinzugefügt`exactTerms=a b``"a b"` zu `q` hinzugefügt`excludeTerms=a``-"a"` zu `q` hinzugefügt`fileType=pdf``filetype:pdf` zu `q` hinzugefügt`dateRestrict=d7``tbs=qdr:d7`, ebenso für `w`, `m` und `y``safe=active``safe=active``searchType=image``udm=2` (Google Bilder)`title`, `link``title`, `link``snippet``description``displayLink`Hostname von `link``queries.nextPage`Vom Adapter berechnetBei Google funktionieren 3 Parameter anders:

**Google zählt Offsets ab 0.** Custom Search behandelt `start=11` als den Anfang von Seite 2, Google behandelt `start=10` als Seite 2. Senden Sie `start` in Schritten von 10 und verwerfen Sie die Ergebnisse vor Ihrer Startposition im Code, wie es der Adapter tut.

**Google hat `num` entfernt.** Die SERP-API-Dokumentation besagt, dass Google `num` am 11. September 2025 abgeschafft hat. Jede Google-Seite enthält etwa 10 Ergebnisse, und der Adapter fordert so viele Seiten an, wie `num` benötigt. Für mehr Ergebnisse pro Abfrage kann Bright Data die [Top 100 Google-Ergebnisse](https://docs.brightdata.com/products/serp-api/get-top-100-google-results), Positionen 1 bis 100, in einem Aufruf liefern.

**Bei Google legt `gl` das Suchland fest.** Die Abfrage “cloud hosting pricing” lieferte UK-, deutsche und indische Top-Ergebnisse, die keine URLs mit den US-Top-Ergebnissen teilten. Setzen Sie `gl` bei jeder Anfrage auf das Land, aus dem Ihre Nutzer suchen.

### Schritt 3: Drop-in-Adapter für cse.list() hinzufügen

Der Adapter sendet `cse.list()`-Aufrufe an die Bright Data SERP API und läuft unter Python 3.9 und neuer. Er akzeptiert die Custom-Search-Parameter aus der Tabelle und behält die Felder `title`, `link`, `snippet` und `displayLink` in `items` bei. Er ignoriert `cx` mit einer Warnung, da die Google-Suche keine Engine-ID hat, und fügt die Einstellungen `attempts` und `timeout` hinzu.

An jeder Aufrufstelle sieht die Änderung so aus:

```none
# Vorher, mit dem Google-API-Client
res = service.cse().list(q=query, cx=CX, num=10).execute()

# Nachher, mit denselben Kernfeldern in items, ohne Engine-ID, mit gesetztem gl und hl
from cse_to_serp import cse_list

res = cse_list(q=query, num=10, gl="us", hl="en")
```

Prüfen Sie 3 weitere Dinge an jeder Aufrufstelle:

- Wenn Ihre Engine eine feste Liste von Seiten durchsucht hat, fügen Sie diese als `(site:a.com OR site:b.com)` in die Abfrage ein. Eine so auf 2 Dokumentationsseiten beschränkte Abfrage lieferte 10 Ergebnisse, alle von diesen 2 Hosts.
- Übergeben Sie in einem Web-Request-Handler `attempts=1` und ein `timeout`, das zum Zeitbudget des Handlers passt.
- Wo Sie zuvor `HttpError` abgefangen haben, fangen Sie stattdessen `(httpx.HTTPError, ValueError, RuntimeError)` ab.

Speichern Sie den Adapter als `cse_to_serp.py`, oder klonen Sie das [Begleit-Repository auf GitHub](https://github.com/triposat/google-custom-search-api-alternative), das auch die anderen unten genannten Skripte und Offline-Tests enthält. Hier ist die vollständige Datei:

```none
"""Replace Google Custom Search JSON API calls with the Bright Data SERP API.

Same cse.list() parameters and core items fields.
"""

import math
import os
import time
import warnings
from urllib.parse import urlencode, urlparse

import httpx

API_URL = "https://api.brightdata.com/request"
API_KEY = os.environ.get("BRIGHTDATA_API_KEY")
if not API_KEY:
    raise RuntimeError("Set the BRIGHTDATA_API_KEY environment variable "
                       "to your Bright Data API key (step 1).")
ZONE = os.environ.get("BRIGHTDATA_SERP_ZONE", "serp_api1")
RETRY_STATUSES = {429, 500, 502, 503, 504}

def fetch_serp(params: dict, attempts: int = 4, timeout: float = 60) -> dict:
    """Fetch one Google results page as parsed JSON."""
    url = "https://www.google.com/search?" + urlencode(params)
    body = {"zone": ZONE, "url": url, "format": "raw"}
    headers = {"Authorization": f"Bearer {API_KEY}"}
    for attempt in range(attempts):
        try:
            resp = httpx.post(API_URL, json=body, headers=headers,
                              timeout=timeout)
        except httpx.TransportError:  # timeout or dropped connection
            if attempt == attempts - 1:
                raise
            time.sleep(16 + attempt * 10)
            continue
        error = (resp.headers.get("x-brd-error")  # API-level errors
                 or resp.headers.get("x-brd-err-msg"))  # proxy-level errors
        if resp.status_code == 200 and not error:
            page = resp.json()
            if "general" not in page:  # not a parsed results page
                raise ValueError("Unexpected response: " + resp.text[:200])
            return page
        if not error and resp.status_code not in RETRY_STATUSES:
            break  # wrong key, zone, or URL, so retrying will not help
        if attempt < attempts - 1:
            # Back off before resending the same query.
            time.sleep(16 + attempt * 10)
    resp.raise_for_status()
    code = (resp.headers.get("x-brd-error-code")  # maps to the error catalog
            or resp.headers.get("x-brd-err-code"))
    raise RuntimeError(f"SERP API error {code}: {error or resp.status_code}")

def cse_list(q, num=10, start=1, gl=None, hl=None, siteSearch=None,
             siteSearchFilter="i", exactTerms=None, excludeTerms=None,
             fileType=None, dateRestrict=None, safe="off", searchType=None,
             attempts=4, timeout=60, **extra):
    """Accept cse.list() parameters, return a dict in cse.list() format."""
    if extra.pop("cx", None):  # no engine ID, so every call searches Google
        warnings.warn("cx is ignored. Add (site:a.com OR site:b.com) to q "
                      "if your engine searched a fixed list of sites")
    if extra:  # fail loudly instead of ignoring a filter
        raise TypeError(f"No mapping for: {sorted(extra)}")
    if exactTerms:  # Custom Search filters become Google search operators
        q = f'{q} "{exactTerms}"'
    if excludeTerms:
        q = f'{q} -"{excludeTerms}"'
    if fileType:
        q = f"{q} filetype:{fileType}"
    if siteSearch:
        exclude = "-" if siteSearchFilter == "e" else ""
        q = f"{q} {exclude}site:{siteSearch}"
    params = {"q": q, "brd_json": 1}  # brd_json=1 returns parsed JSON
    if gl:
        params["gl"] = gl
    if hl:
        params["hl"] = hl
    if safe == "active":
        params["safe"] = "active"
    if dateRestrict:  # "d7" -> qdr:d7 (past 7 days), "m6" -> qdr:m6
        params["tbs"] = "qdr:" + dateRestrict
    if searchType == "image":
        return image_list(params, num, start, attempts, timeout)
    if searchType:
        raise ValueError(f"No mapping for: searchType={searchType}")

    # Custom Search counts from 1 (start=11 is page 2), Google from 0
    # (start=10 is page 2). Track each result's Google position.
    first = start - 1
    offset = first // 10 * 10  # the Google page that contains `start`
    items, next_start = [], None
    # Fetch the pages for positions first to first + num - 1, 1 request each
    for _ in range(math.ceil((num + first - offset) / 10)):
        params["start"] = offset
        page = fetch_serp(params, attempts, timeout)
        for i, result in enumerate(page.get("organic", [])):
            position = offset + i
            if position < first or not result.get("link"):
                continue
            if len(items) == num:
                next_start = position + 1  # convert to 1-based
                break
            items.append({
                "title": result.get("title", ""),
                "link": result["link"],
                "snippet": result.get("description", ""),
                "displayLink": urlparse(result["link"]).netloc,
            })
        if next_start:
            break
        offset = (page.get("pagination") or {}).get("next_page_start")
        if not offset:  # Google has no further pages for this query
            break
    else:
        next_start = offset + 1  # continue at the next Google page

    response = {"items": items, "queries": {}}
    if next_start:
        response["queries"]["nextPage"] = [{"startIndex": next_start}]
    return response

def image_list(params, num, start, attempts, timeout):
    """Google Images returns the whole image grid in one request."""
    params["udm"] = 2
    page = fetch_serp(params, attempts, timeout)
    images = [i for i in page.get("images") or [] if i.get("original_image")]
    items = [{
        "title": image.get("image_alt", ""),
        "link": image["original_image"],
        "snippet": image.get("image_alt", ""),
        "displayLink": urlparse(image["original_image"]).netloc,
    } for image in images[start - 1:start - 1 + num]]
    response = {"items": items, "queries": {}}
    if start - 1 + num < len(images):
        response["queries"]["nextPage"] = [{"startIndex": start + num}]
    return response

if __name__ == "__main__":
    res = cse_list("httpx timeout configuration", num=10,
                   gl="us", hl="en")
    for i, item in enumerate(res["items"], start=1):
        print(i, item["displayLink"], "|", item["title"][:60])
```

Das Ausführen von `python cse_to_serp.py` gab diese 5 ersten Ergebnisse aus. Die Ergebnisse stammen von Googles Live-Seite, Ihre können also abweichen.

```none
1 www.python-httpx.org | Timeouts
2 github.com | Proposal: Add a Global Timeout Setting in httpx #3356
3 www.python-httpx.org | QuickStart
4 stackoverflow.com | python - Httpx requests timing out when it shouldn't
5 oneuptime.com | How to Use httpx for Async HTTP Requests
```

Mit `num=10` ruft jeder `nextPage`-Aufruf eine einzelne Google-Seite ab, sodass er 1 Anfrage kostet.

Mit `searchType="image"` lieferte 1 Anfrage für “ergonomic office chair” 100 Bilder, während Custom Search höchstens 10 pro Anfrage lieferte. Jeder Adapteraufruf ruft das vollständige Bilderraster ab und liefert `num` Bilder daraus zurück.

### Suchtool in MCP-Agenten, LangChain und n8n ersetzen

Agenten, die sich über MCP mit Tools verbinden, benötigen keinen Adapter. Der [Bright Data Web MCP](/ai/mcp-server/google)-Server bietet die Google-Suche als `search_engine`-Tool an, und der gehostete Server ist eine einzige URL mit einer [kostenlosen Stufe](/blog/ai/web-mcp-free-tier). In Claude Code fügen Sie ihn mit einem Befehl hinzu:

```none
claude mcp add --transport http brightdata https://mcp.brightdata.com/mcp
```

MCP-Clients, die OAuth unterstützen, wie Claude Code und Cursor, melden sich über Ihren Browser an, ohne API-Schlüssel in einer Konfigurationsdatei. Für CI-Jobs und Skripte verwenden Sie stattdessen `https://mcp.brightdata.com/mcp?token=YOUR_API_KEY`. Fügen Sie dieser URL `&tools=search_engine,scrape_as_markdown` hinzu, um dem Agenten Suche plus ein Tool zu geben, das jede Ergebnisseite als Markdown liest.

Coding-Agenten können auch Bright Datas CLI nutzen. Installieren Sie sie mit `npm install -g @brightdata/cli`, führen Sie dann `brightdata login` aus, um sich über Ihren Browser anzumelden. Der Agent erhält einen `brightdata search`-Befehl.

Für Code, der bereits LangChain aufruft, liefert die Methode `GoogleSearchAPIWrapper.results()` Dicts mit `title`, `link` und `snippet`. Die Items des Adapters haben dieselben Schlüssel. Installieren Sie LangChains Core-Paket, das Python 3.10 oder neuer benötigt, mit `python -m pip install "langchain-core>=1.0,<2"`. Speichern Sie diese Datei als `langchain_tool.py` neben dem [`cse_to_serp.py`-Adapter](https://github.com/triposat/google-custom-search-api-alternative/blob/main/cse_to_serp.py), und übergeben Sie `google_search` in der Tool-Liste Ihres Agenten.

```none
"""LangChain tool that replaces GoogleSearchAPIWrapper.results()."""

from langchain_core.tools import ToolException, tool

from cse_to_serp import cse_list

@tool
def google_search(query: str) -> list[dict]:
    """Search Google and return the top results with title, link, snippet."""
    try:  # 2 attempts and a 20 s timeout limit each search
        return cse_list(q=query, num=10, gl="us", hl="en",
                        attempts=2, timeout=20)["items"]
    except Exception as exc:
        raise ToolException(f"Google search failed: {exc}") from exc

google_search.handle_tool_error = True  # the agent gets the error as text
```

Für einen vollständig so aufgebauten Agenten siehe [Nutzung von LangChain und Bright Data für die Websuche](/blog/ai/langchain-serp-scraping).

No-Code-Workflows, die Custom Search aufrufen, erhalten denselben 403-Fehler, und das n8n-Community-Forum hat einen Thread genau zu diesem Fehler. Bright Datas offizieller [n8n-Node](https://github.com/brightdata/n8n-nodes-brightdata) wird als `@brightdata/n8n-nodes-brightdata`-Community-Node installiert. Er verfügt über eine Web-Search-Operation, die die Abfrage über die von Ihnen gewählte Zone, etwa Ihre SERP-API-Zone, an Google sendet. Ersetzen Sie die Custom-Search-Anfrage des Workflows durch diese Operation.

### Suchen im Produktionsvolumen ausführen

Batch-Jobs und Agenten, die viele Suchen in einer Aufgabe senden, müssen mehrere Abfragen gleichzeitig ausführen. Das [`serp_batch.py`-Modul](https://github.com/triposat/google-custom-search-api-alternative/blob/main/serp_batch.py) des Begleit-Repositorys führt eine asynchrone Version der Anfrage- und Wiederholungsschleife des Adapters parallel aus. Separat bietet die SERP API selbst einen asynchronen Modus für Batches von 1.000 Abfragen oder mehr.

Der Hauptblock der Datei sendet dieselben 10 Abfragen zweimal, und der zweite Durchlauf wird aus dem In-Memory-Cache bedient.

```none
{'queries': 20, 'cache_hits': 10, 'empty': 0, 'failed': 0}
```

Die Funktion `search_many()` hat 3 Einstellungen und einen Satz von Zählern.

- **`concurrency`** legt fest, wie viele Anfragen gleichzeitig laufen. Die SERP API hat kein Gleichzeitigkeitslimit, setzen Sie den Wert also auf die Last, die Ihr eigenes System bewältigen kann.
- **`deadline`** begrenzt die Gesamtzeit für eine Abfrage, halten Sie sie also kurz für ein Agenten-Tool und länger für einen Batch-Job.
- **`ttl`** legt fest, wie lange eine zwischengespeicherte Seite gültig bleibt.
- **Zähler** zeigen Cache-Treffer, leere Ergebnisse und Fehlschläge, sodass ein falscher `site:`-Filter oder `gl`-Wert früh als leere Ergebnisse auffällt.

Ein Aufruf gibt ein Dict zurück, das jede Abfrage ihrer geparsten Seite zuordnet, oder `None`, wenn die Abfrage fehlschlug.

```none
import asyncio

from serp_batch import search_many

pages = asyncio.run(search_many(["redis cache ttl", "nginx rate limiting"],
                                concurrency=20, gl="us", hl="en"))
```

### AI Overview und People-Also-Ask-Fragen abrufen

Agenten, RAG-Pipelines und SEO-Teams benötigen manchmal mehr als eine Liste von 10 Links. Googles Seite für “what is retrieval augmented generation” zeigt einen AI Overview und People-Also-Ask-Fragen, die Custom Search nie zurückgab.

![Google-Ergebnisseite für "what is retrieval augmented generation", mit hervorgehobenem AI Overview und 3 People-Also-Ask-Fragen.](https://media.brightdata.com/2026/10/S1QlNLUsGe.png)Ein zusätzlicher Parameter fordert den AI Overview an, und dieselbe Antwort enthält alle People-Also-Ask-Fragen. Speichern Sie dieses Skript neben dem `cse_to_serp.py`-Adapter aus Schritt 3.

```none
"""Read the AI Overview and People Also Ask questions from one Google query."""

from cse_to_serp import fetch_serp

page = fetch_serp({
    "q": "what is retrieval augmented generation",
    "gl": "us",
    "hl": "en",
    "brd_json": 1,
    "brd_ai_overview": 2,  # requests the AI Overview
})

overview = page.get("ai_overview") or {}
print("AI Overview text blocks:", len(overview.get("texts", [])))
print("AI Overview sources:", len(overview.get("references", [])))
questions = dict.fromkeys(  # keeps each question once, in order
    item["question"] for item in page.get("people_also_ask", [])
    if item.get("question")
)
for question in list(questions)[:2]:
    print("People also ask:", question)
```

Das Skript gab diese Ausgabe aus. Googles Seite ist live, Ihre Fragen können also vom Screenshot abweichen.

```none
AI Overview text blocks: 3
AI Overview sources: 8
People also ask: Does ChatGPT use Retrieval-Augmented Generation?
People also ask: What is RAG in LLM with example?
```

Jeder `references`-Eintrag enthält `href` und `title` der zitierten Seite, sodass SEO-Teams nachverfolgen können, welche Seiten der AI Overview zitiert. Bright Datas Seite zur [Google AI Overview API](/products/serp-api/google-search/ai-overview) erklärt den Parameter im Detail. Für Googles AI Mode liefert die [Google Scraper API](https://docs.brightdata.com/products/scrapers/google/introduction) AI-Mode-Suchergebnisse als JSON.

Eine RAG-Pipeline, die die Ergebnisseiten liest, kann diese über denselben `/request`-Endpunkt abrufen. Verwenden Sie eine [Web-Unlocker](/products/web-unlocker)-Zone und denselben API-Schlüssel.

## Migrations-Checkliste vor dem 1. Januar 2027

Führen Sie diese Schritte aus, solange Ihr Custom-Search-Schlüssel noch funktioniert, da Punkt 2 ihn benötigt.

1. Finden Sie jede Aufrufstelle. Durchsuchen Sie Ihren Code nach `customsearch/v1`, `cse().list` und Wrappern wie `GoogleSearchAPIWrapper`. In einer großen Codebasis kann ein Coding-Agent diese Suche ausführen und die Änderung aus Schritt 3 an jeder Aufrufstelle vornehmen.
2. Speichern Sie die Custom-Search-Ergebnisse für eine Stichprobe echter Produktionsabfragen, damit Sie eine Baseline behalten, nachdem der Schlüssel nicht mehr funktioniert. Wenn der Schlüssel bereits nicht mehr funktioniert, speichern Sie stattdessen google.com-Ergebnisse für dieselben `gl`– und `hl`-Werte.
3. Beginnen Sie in der kostenlosen Stufe und kalkulieren Sie dann 1 SERP-API-Anfrage pro Ergebnisseite.
4. Lassen Sie den Adapter 1-basierte `start`-Werte in Googles 0-basierte Werte umwandeln, oder wandeln Sie sie selbst um und fordern Sie ganze Seiten an.
5. Setzen Sie `gl` und `hl` bei jeder Anfrage.
6. Vergleichen Sie alte und neue Ergebnisse als URL-Mengen, nicht nach exaktem Rang. Für Agenten führen Sie zusätzlich Ihre Aufgaben-Evaluierungen erneut aus und bewerten die endgültigen Antworten. Erwarten Sie einige Unterschiede, da die neuen Ergebnisse von Googles vollständiger Ergebnisseite stammen, nicht von Custom Searchs Teilmenge des Index.
7. Wechseln Sie über ein Feature-Flag, lassen Sie beide Pfade einige Tage parallel laufen, und löschen Sie dann den Google-Schlüssel.

Für Punkt 6 bewertet der [`compare_baseline.py`-Helfer](https://github.com/triposat/google-custom-search-api-alternative/blob/main/compare_baseline.py) jede Abfrage von 0 bis 1. Die Bewertung ist der Anteil der gespeicherten Top-10-URLs, die noch in den neuen Top 10 erscheinen.

Führen Sie zunächst jede Abfrage zweimal über die SERP API aus und bewerten Sie die 2 Durchläufe gegeneinander. Googles Rangfolge kann sich zwischen Aufrufen ändern, sodass ein Wert knapp unter 1,0 normal sein kann. Im Test erzielten 2 Durchläufe einer Abfrage mit demselben `gl` einen Wert von 1,0, und ein US-Durchlauf gegen einen UK-Durchlauf ergab 0,0. Bewerten Sie dann jede gespeicherte Abfrage, prüfen Sie die niedrigsten Werte manuell, und kontrollieren Sie `gl`– und `site:`-Filter bei jedem Wert nahe 0.

## Fehlerbehebung bei Migrationsfehlern

Dies sind Einrichtungsprobleme beim ersten Durchlauf oder Googles Verhalten.

SymptomUrsacheLösungGoogle gibt 403 bei Custom-Search-Aufrufen zurückAPI für Neukunden geschlossenEin neuer Schlüssel hilft nicht. Migrieren Sie zur Bright Data SERP API`RuntimeError: Set the BRIGHTDATA_API_KEY environment variable…`Variable in diesem Terminal nicht gesetztSetzen Sie `BRIGHTDATA_API_KEY` wie in Schritt 1401 “Invalid token”Falscher Bright-Data-API-SchlüsselKopieren Sie den Schlüssel aus der Quick-start-Leiste auf Home400 `zone "..." not found`Falscher ZonennameVerwenden Sie den Namen, den Sie der API in Schritt 1 gegeben haben`UserWarning: cx is ignored…`Die Google-Suche hat keine Engine-IDEntfernen Sie `cx`. Falls die Engine eine feste Liste von Seiten durchsucht hat, fügen Sie `(site:a.com OR site:b.com)` zu `q` hinzu`TypeError: No mapping for: [...]`Ein Parameter, der nicht in der Tabelle aus Schritt 2 stehtFügen Sie das Google-Äquivalent zu `q` oder zu den `params` des Adapters hinzu, oder entfernen Sie den Parameter`KeyError` bei `pagemap` oder `searchInformation`Der Adapter gibt 4 Kernfelder zurückEntfernen Sie den Code, der das Feld liest, oder bilden Sie es aus der SERP-API-Antwort ab`items` hat weniger als `num` ErgebnisseGoogles Seite enthielt weniger organische ErgebnisseFolgen Sie `queries.nextPage``items` ist leerKeine Übereinstimmung, oder ein falscher `site:`-Filter oder `gl`-WertTesten Sie die Abfrage auf google.comErgebnisse weichen von Custom Search abCustom Search durchsuchte eine Teilmenge von Googles IndexVergleichen Sie URL-Mengen. Führen Sie jede Abfrage zunächst zweimal aus, um normale Schwankungen zu sehenEine Meldung `RuntimeError: SERP API error…` enthält den Wert `x-brd-error-code` oder `x-brd-err-code`. Finden Sie den Code im [SERP-API-Fehlerkatalog](https://docs.brightdata.com/products/serp-api/debugging).

## Fazit

Googles Full-Web-Suchprodukt ist nicht öffentlich, und das Enddatum der Custom Search JSON API ist der 1. Januar 2027. Googles öffentliche Optionen durchsuchen eine feste Liste von Domains oder liefern Gemini-Antworten, und die Gemini-Nutzungsbedingungen verbieten das Caching oder Analysieren der Ergebnisse. Direkte HTTP-Anfragen lieferten im Test keine Ergebnisse, daher ist die Bright Data SERP API der praktische Ersatz, wenn Ihr Code die Ergebnisseite benötigt.

Der Adapter in Schritt 3 übernimmt Googles 0-basiertes `start` und das entfernte `num`, sodass Ihr Code hauptsächlich `gl` bei jedem Aufruf benötigt. Führen Sie Ihre gespeicherten Abfragen über die kostenlose Stufe der [Bright Data SERP API](/products/serp-api/google-search) aus, ohne Kreditkarte, und vergleichen Sie sie mit Ihrer Custom-Search-Baseline oder mit google.com.

## FAQ

### Ist die Google Custom Search API eingestellt?

Ja, in 2 Phasen. Google hat die Custom Search JSON API im Januar 2026 für Neukunden geschlossen, der Zugang für Bestandskunden endet am 1. Januar 2027. Google empfiehlt Agent Search für bis zu 50 Domains. Die Bright Data SERP API liefert vollständige Google-Web-Ergebnisse als JSON.

### Hat Google eine Search API?

Keine Full-Web-Such-API, für die sich neue Entwickler anmelden können. Google bietet Agent Search für bis zu 50 Domains und Grounding with Google Search, das Gemini-Antworten mit Links liefert. Googles Full-Web-Suchprodukt ist nicht öffentlich. Für Google-Ergebnisse als JSON nutzen Sie Bright Datas Google Search API, Teil ihrer SERP API.

### Ist die Google Search API kostenlos?

Nicht für neue Entwickler, die Full-Web-Ergebnisse benötigen. Die Custom Search JSON API gibt Bestandskunden 100 kostenlose Anfragen pro Tag, danach 5 $ pro 1.000, bis zum 1. Januar 2027. Bright Datas SERP API liefert Google-Ergebnisse als JSON, mit 5.000 kostenlosen Anfragen pro Monat.

### Was kann die Google Custom Search API ersetzen?

Die Bright Data SERP API ersetzt die Custom Search JSON API direkt, da sie Googles vollständige Ergebnisseite als JSON liefert. Googles eigene Optionen liefern KI-Antworten oder durchsuchen eine feste Liste von Domains. Ein Open-Source-Drop-in-Python-Adapter wandelt Ihre `cse.list()`-Aufrufe in Google-Parameter um.

### Wie kann ich Google-Suchergebnisse scrapen?

Nicht allein mit einem HTTP-Client. Die Google-Suche erfordert JavaScript, sodass HTTP-Clients im Test eine 200-Seite ohne Ergebnisse erhielten. Browser über dieselbe Verbindung erhielten anschließend eine CAPTCHA-Seite. Bright Datas SERP API liefert Googles Ergebnisseite als geparstes JSON, ohne dass Sie Browser oder Parser pflegen müssen.

### Warum gibt die Custom Search API 403 zurück?

Google hat die Custom Search JSON API im Januar 2026 für Neukunden geschlossen, sodass ein neuer Schlüssel oder ein neues Projekt den 403-Fehler nicht beheben. Im Entwicklerforum von Google berichtet auch ein Entwickler, dass ein bestehendes Projekt nach einer Änderung der Abrechnung den Zugang verlor. Verlagern Sie die Aufrufe auf die Bright Data SERP API, die Google-Ergebnisse als JSON liefert.



Vertrieb kontaktierenGratis testen![google social icon](/wp-content/themes/brightdata/assets/images/ic_google.svg)









 Inhaltsverzeichnis







Dedicated Scraper APIs &amp; No-Code Scrapers

Over 1000 scrapers for all popular domains. Simplify your web scraping.

[See pricing](/pricing/web-scraper "See pricing")

Just want data? Skip scraping.

Hundreds of ready-to-use datasets from all popular domains.

[See pricing](/pricing/datasets "See pricing")







 [ ](https://news.ycombinator.com/submitlink?t=Gibt+es+eine+Google+Search+API%3F+Optionen+nach+Custom+Search&u=https://brightdata.de/blog/web-data-de/google-search-api) [ ](https://www.linkedin.com/shareArticle?mini=true&title=Gibt+es+eine+Google+Search+API%3F+Optionen+nach+Custom+Search&url=https://brightdata.de/blog/web-data-de/google-search-api) [ ](http://www.reddit.com/submit?title=Gibt+es+eine+Google+Search+API%3F+Optionen+nach+Custom+Search&url=https://brightdata.de/blog/web-data-de/google-search-api)







##  Das könnte Sie auch interessieren

 [ ![Bright Data Python SDK](https://media.brightdata.de/2026/10/Bright-Data-Python-SDK.png) ](https://brightdata.de/blog/ai/bright-data-python-sdk "Das Bright Data Python SDK: Scrapen, Suchen und Web-Daten abrufen")

 [AI



 ![Antonello Zanini](https://media.brightdata.de/2022/12/Antonello-Zanini-2-50x50.jpg)

Antonello Zanini

Technical Writer





### Das Bright Data Python SDK: Scrapen, Suchen und Web-Daten abrufen

Erfahren Sie, wie Sie das Bright Data Python SDK nutzen, um Websites zu scrapen, Google und Bing zu durchsuchen, Daten zu exportieren und Jobs parallel in Python auszuführen.



 18-Oct-2026

 20 min lesen

 ](https://brightdata.de/blog/ai/bright-data-python-sdk)

 [ ![Claude Code Routines](https://media.brightdata.de/2026/10/Claude-Code-Routines.png) ](https://brightdata.de/blog/ai/claude-code-routines "Claude Code Routines: Tägliche Web-Überwachung mit Bright Data planen")

 [AI



 ![Satyam Tripathi](https://media.brightdata.de/2024/09/Satyam-Tripathi-50x50.png)

Satyam Tripathi

Technical Writer





### Claude Code Routines: Tägliche Web-Überwachung mit Bright Data planen

Erfahre, wie du Claude Code Routinen mit Bright Data Webzugriff gibst und einen täglichen Preismonitor baust, der jede gelesene Seite prüft.



 18-Oct-2026

 29 min lesen

 ](https://brightdata.de/blog/ai/claude-code-routines)

 [ ![Amazon Bedrock Knowledge Bases with Bright Data](https://media.brightdata.de/2026/08/Amazon-Bedrock-Knowledge-Bases-with-Bright-Data.png) ](https://brightdata.de/blog/wie/amazon-bedrock-knowledge-bases-with-bright-data "Wie man Amazon Bedrock Knowledge Bases mit Bright Data mit Live-Webdaten versorgt")

 [How Tos



 ![Satyam Tripathi](https://media.brightdata.de/2024/09/Satyam-Tripathi-50x50.png)

Satyam Tripathi

Technical Writer





### Wie man Amazon Bedrock Knowledge Bases mit Bright Data mit Live-Webdaten versorgt

Bright Data ermöglicht es Amazon Bedrock Knowledge Bases, auf Webdaten zuzugreifen, die durch JavaScript-Rendering, Bot-Schutz oder Geo-Beschränkungen blockiert sind.



 15-Oct-2026

 46 min lesen

 ](https://brightdata.de/blog/wie/amazon-bedrock-knowledge-bases-with-bright-data)
