Fehler von Geocoding-APIs erklärt
Was «Access blocked», 403, 429 und 509 bei Nominatim bedeuten, was OVER_QUERY_LIMIT und REQUEST_DENIED bei Google bedeuten, warum geopy nichts zurückgibt, und warum eine Suche keine Hausnummer findet. Jeweils mit der üblichen Ursache und der Lösung.
| Sie sehen | Meistens | Lösung |
|---|---|---|
| Nominatim: «Access blocked», 403 Forbidden | Die Anfrage verletzt die Nutzungsrichtlinie von nominatim.openstreetmap.org, oft durch einen fehlenden User-Agent. | Einen User-Agent senden, der Ihre App nennt, höchstens eine Anfrage pro Sekunde, Antworten zwischenspeichern. |
| 429 Too Many Requests | Zu viele Anfragen in kurzer Zeit, oder das Kontingent des Monats ist aufgebraucht. | Auf Retry-After warten, langsamer werden, zwischenspeichern. |
| Nominatim: 509 Bandwidth Limit Exceeded | Massnahmen des Nominatim-Teams gegen Scraper. | Später noch einmal versuchen; für regelmässige Nutzung ein anderer Server. |
geopy: GeocoderInsufficientPrivileges, GeocoderRateLimited, ConfigurationError | geopy macht aus dem HTTP-Status eine Ausnahme und lehnt Beispiel-User-Agents für Nominatim ab. | user_agent setzen, RateLimiter verwenden. |
geopy liefert None für jede Zeile | RateLimiter schluckt die Fehler. | Die Warnungen lesen, oder swallow_exceptions=False setzen. |
Google: REQUEST_DENIED, OVER_QUERY_LIMIT, OVER_DAILY_LIMIT | Die API ist nicht aktiviert, die Abrechnung fehlt, der Schlüssel ist auf Websites beschränkt, oder ein Kontingent ist erreicht. | error_message lesen. |
Leere Ergebnisse, ZERO_RESULTS, «Unable to geocode» | Die Adresse ist nicht in den Daten, oder ein Filter ist zu streng. | Nach der Strasse suchen, Filter weglassen, die Schreibweise des Orts prüfen. |
| Die Suche beim Tippen ist gesperrt oder langsam | Nominatim verbietet Autovervollständigung; eine Anfrage pro Tastendruck ist zu viel. | Einen Dienst verwenden, der dafür gemacht ist, 250 ms nach dem letzten Tastendruck warten. |
| «has been blocked by CORS policy» | Eine Fehlerantwort ohne CORS-Header. | Den Statuscode im Netzwerk-Tab ansehen. |
400 Bad Request, INVALID_REQUEST | Ein fehlender oder falsch geschriebener Parameter. | Die Meldung lesen; sie nennt den Parameter. |
Nominatim: «Access blocked» und 403 Forbidden
Der öffentliche Server unter nominatim.openstreetmap.org wird von der OpenStreetMap Foundation auf gespendeter Hardware betrieben. Andere Apps dürfen ihn im Rahmen seiner Nutzungsrichtlinie verwenden: höchstens eine Anfrage pro Sekunde, ein User-Agent oder Referer, der die App erkennen lässt, Ergebnisse bei Ihnen zwischengespeichert, und keine Autovervollständigung. Verletzt ein Client die Richtlinie, antwortet der Server mit 403 und einer Seite mit dem Titel «Access blocked», die die üblichen Ursachen nennt: eine fehlende Kennung und zu viele Massenanfragen.
- Ein fehlender oder allgemeiner User-Agent ist die häufigste Ursache. Skripte, die den Standard-Header ihrer HTTP-Bibliothek senden, etwa
python-requests/2.32oder einen leeren, werden schnell gesperrt. Senden Sie einen Header, der Ihre App nennt und sagt, wie man Sie erreicht, etwaUser-Agent: shop-locator/1.2 (admin@example.com). - Anfragen schneller als eine pro Sekunde, oder dieselbe Abfrage immer wieder, gelten als Missbrauch.
- Browser senden den Referer der Seite, der die Website erkennen lässt. Eine Seite mit
Referrer-Policy: no-referrersendet keinen.
Eine Sperre endet, sobald der Client korrigiert ist. Bleibt sie bestehen, bittet die Sperrseite darum, an nominatim@openstreetmap.org zu schreiben. Die Einzelheiten, mit Code für curl, Python und JavaScript, stehen in der Anleitung Nominatim: «Access blocked», 403 und 429.
429 Too Many Requests
Der Dienst begrenzt die Anfragen pro Sekunde oder pro Minute, oder die Anfragen des Monats sind aufgebraucht. Die meisten Dienste senden einen Header Retry-After mit den Sekunden, die Sie warten müssen.
- Warten Sie so lange, wie
Retry-Aftersagt, und senden Sie dann erneut. Wiederholen Sie nicht sofort in einer Schleife: Das hält den Client über dem Limit und kann aus einem 429 eine Sperre machen. - Speichern Sie Antworten zwischen. Viele Apps geocodieren dieselben Adressen immer wieder.
- Für das Geocoding einer Liste in grosser Menge takten Sie die Anfragen in einem Thread, statt sie parallel zu senden.
Nominatim: 509 Bandwidth Limit Exceeded
Im Februar 2026 geriet das öffentliche Nominatim unter extreme Last durch anonyme Scraper, verteilt auf mehr als 100'000 IP-Adressen, wie das Operations-Team von OpenStreetMap berichtete. Die Massnahmen dagegen beantworteten einige normale Clients für ein paar Tage mit 509. Die Betreuer von Nominatim baten darum, es noch einmal zu versuchen, bevor man es meldet, und empfahlen für kommerzielle Apps einen kommerziellen Geocoding-Dienst oder einen eigenen Server (Forumsbeitrag).
Ausnahmen von geopy
geopy wirft für jede Antwort ausser 200 eine Ausnahme. Die häufigsten:
| Ausnahme | HTTP-Status | Meistens |
|---|---|---|
GeocoderInsufficientPrivileges | 403 | Von Nominatim gesperrt, oder ein Schlüssel, der für diese Anfrage nicht erlaubt ist. |
GeocoderRateLimited | 429 | Zu schnell. |
GeocoderQuotaExceeded | 402 | Das bezahlte Kontingent ist aufgebraucht. |
GeocoderAuthenticationFailure | 401 | Falscher oder fehlender Schlüssel. |
GeocoderTimedOut | 408, 503, 504, oder keine Antwort rechtzeitig | Der Dienst ist langsam oder überlastet; der Standard-Timeout ist 1 Sekunde. |
ConfigurationError | – | Nominatim mit dem Standard- oder einem Beispiel-user_agent; kommt vor jeder Anfrage. |
Die Anleitung geopy: GeocoderInsufficientPrivileges, GeocoderRateLimited und ConfigurationError hat die vollständige Tabelle, die User-Agents, die geopy ablehnt, und Einstellungen für RateLimiter, die funktionieren.
geopy liefert None für jede Zeile
RateLimiter aus geopy.extra.rate_limiter wiederholt eine fehlgeschlagene Anfrage zweimal im Abstand von 5 Sekunden und gibt dann None zurück, statt eine Ausnahme zu werfen (standardmässig swallow_exceptions=True). Ein gesperrtes Skript füllt also eine ganze Spalte mit None, und der Grund steht nur in den Warnungen im Log. Setzen Sie beim Testen swallow_exceptions=False, damit der erste Fehler den Lauf stoppt.
Google Geocoding API: REQUEST_DENIED und OVER_QUERY_LIMIT
Die Google API antwortet mit HTTP 200 und einem Feld status. REQUEST_DENIED heisst, dass die Anfrage abgelehnt wurde, OVER_QUERY_LIMIT, dass ein Kontingent aufgebraucht ist, und OVER_DAILY_LIMIT meist ein fehlender oder ungültiger Schlüssel, eine nicht eingerichtete Abrechnung oder ein Nutzungslimit, das Sie selbst gesetzt haben. Das Feld error_message sagt, was zutrifft, zum Beispiel «This API project is not authorized to use this API.» (die Geocoding API ist im Projekt nicht aktiviert) oder «API keys with referer restrictions cannot be used with this API.» (ein Browser-Schlüssel, der von einem Server gesendet wird). Jeder Status mit seiner Lösung steht in Google Geocoding API: REQUEST_DENIED, OVER_QUERY_LIMIT und ZERO_RESULTS.
Leere Ergebnisse, ZERO_RESULTS und «Unable to geocode»
Die Suche hat funktioniert, aber nichts gefunden. Nominatim antwortet auf eine Suche mit [] und für einen Punkt ohne etwas in der Nähe mit {"error": "Unable to geocode"}; Google antwortet mit ZERO_RESULTS.
- Die Hausnummer ist nicht in den Daten. Dienste auf OpenStreetMap-Daten kennen nur die dort erfassten Hausnummern; in weiten Teilen Europas sind das die meisten, in anderen Regionen weniger. Suchen Sie nach Strasse und Ort, um die Strasse zu erhalten.
- Ein Filter ist zu streng: ein Ländercode, ein Begrenzungsrahmen oder ein Typfilter, der den Ort ausschliesst.
- Die Adresse mischt Sprachen oder alte Namen, oder setzt die Postleitzahl in einer strukturierten Suche ins falsche Feld.
- Ein Tippfehler in einem strukturierten Feld. Freitext verzeiht mehr als getrennte Felder.
Suche beim Tippen
Die Nutzungsrichtlinie des öffentlichen Nominatim verbietet Autovervollständigung, auch aus dem Browser, und seine Suche ist nicht für Wortteile gemacht. Eine Anfrage pro Tastendruck verbraucht auch Limits pro Sekunde schnell. Verwenden Sie einen Dienst, der dafür gebaut ist, etwa Photon, und warten Sie in Ihrem Code nach dem letzten Tastendruck etwa 250 ms, beginnen Sie ab drei Buchstaben, und verwerfen Sie Antworten, die eintreffen, nachdem eine neuere Anfrage gesendet wurde.
«has been blocked by CORS policy»
Der Browser blockiert eine Antwort ohne Header Access-Control-Allow-Origin. Geocoding-APIs für das Web senden ihn bei normalen Antworten, aber Fehlerseiten fehlt er oft; ein 403 oder 429 erscheint dann als CORS-Fehler. Öffnen Sie den Netzwerk-Tab, sehen Sie sich den Status der Anfrage an, und beheben Sie diesen. Der Geocoding-Webdienst von Google ist für Server gedacht; im Browser verwenden Sie die Klasse Geocoder der Maps JavaScript API.
400 Bad Request und INVALID_REQUEST
Ein Parameter fehlt, ist falsch geschrieben oder ausserhalb des Bereichs: lat über 90, ein unbekanntes format, eine Sprache, die der Dienst nicht hat. Die Meldung nennt meist den Parameter. Google antwortet mit INVALID_REQUEST, wenn address, components oder latlng fehlt.
Fehlercodes des Geocodings von overpass.ch
| Status | Code | Bedeutung auf overpass.ch |
|---|---|---|
| 400 | bad_request | Ein Parameter, den die API nicht annimmt; die Meldung nennt ihn. |
| 401 | unauthorized | Der Schlüssel in der URL fehlt oder ist unbekannt. |
| 403 | forbidden_referer | Die Website gehört nicht zu den erlaubten Referern des Schlüssels. |
| 403 | no_geocoding | Der Tarif enthält kein Geocoding. |
| 429 | rate_limited, quota_exceeded | Das Limit pro Minute, oder die Anfragen des Monats; siehe Retry-After. |
| 501 | not_supported | Nominatim /lookup und /details, die wir nicht anbieten. |
| 502, 503 | geocoding_unavailable, busy | Nach den Sekunden in Retry-After noch einmal versuchen. |
Fehler kommen als JSON, {"error": "rate_limited", "message": "…"}, mit CORS-Headern. Alle Codes stehen in der Dokumentation.
Geocoding von overpass.ch
Suche, Suche beim Tippen und Rückwärts-Geocoding auf OpenStreetMap-Daten, mit der API von Nominatim und der API von Photon; die meisten Programme brauchen also nur eine neue Basis-URL. 100'000 Anfragen im Monat sind kostenlos, und Sie dürfen die Ergebnisse speichern.