Guide

Geocoding API errors explained

What “Access blocked”, 403, 429 and 509 mean on Nominatim, what OVER_QUERY_LIMIT and REQUEST_DENIED mean on Google, why geopy returns nothing, and why a search finds no house number. Each with the usual cause and the fix.

You seeUsuallyFix
Nominatim: “Access blocked”, 403 ForbiddenThe request breaks the usage policy of nominatim.openstreetmap.org, often by a missing User-Agent.Send a User-Agent that names your app, at most one request a second, cache answers.
429 Too Many RequestsToo many requests in a short time, or the allowance of the month is used up.Wait for Retry-After, slow down, cache.
Nominatim: 509 Bandwidth Limit ExceededMeasures of the Nominatim team against scrapers.Retry later; for steady use, another server.
geopy: GeocoderInsufficientPrivileges, GeocoderRateLimited, ConfigurationErrorgeopy turns the HTTP status into an exception, and refuses sample user agents for Nominatim.Set user_agent, use RateLimiter.
geopy returns None for every rowRateLimiter swallows the errors.Read the warnings, or set swallow_exceptions=False.
Google: REQUEST_DENIED, OVER_QUERY_LIMIT, OVER_DAILY_LIMITThe API is not enabled, billing is missing, the key is restricted to websites, or a quota is reached.Read error_message.
Empty results, ZERO_RESULTS, “Unable to geocode”The address is not in the data, or a filter is too strict.Search for the street, drop filters, check the spelling of the town.
Search as you type is blocked or slowNominatim forbids autocomplete; one request per keystroke is too many.Use a service made for it, wait 250 ms after the last key.
“has been blocked by CORS policy”An error answer without CORS headers.Look at the status code in the network tab.
400 Bad Request, INVALID_REQUESTA missing or misspelled parameter.Read the message; it names the parameter.

Nominatim: “Access blocked” and 403 Forbidden

The public server at nominatim.openstreetmap.org is run by the OpenStreetMap Foundation on donated hardware. Other apps may use it within its usage policy: at most one request per second, a User-Agent or Referer that identifies the app, results cached on your side, and no autocomplete. When a client breaks the policy, the server answers 403 with a page titled “Access blocked”, which names the usual causes: a missing identification and too many bulk requests.

  • A missing or generic User-Agent is the most common cause. Scripts that send the default header of their HTTP library, such as python-requests/2.32 or an empty one, get blocked quickly. Send a header that names your app and how to reach you, such as User-Agent: shop-locator/1.2 (admin@example.com).
  • Requests faster than one a second, or the same query sent again and again, are treated as abuse.
  • Browsers send the Referer of the page, which identifies the website. A page with Referrer-Policy: no-referrer sends none.

A block lifts once the client is fixed. If it stays, the block page asks you to write to nominatim@openstreetmap.org. The details, with code for curl, Python and JavaScript, are in the guide Nominatim: “Access blocked”, 403 and 429.

429 Too Many Requests

The service limits requests per second or per minute, or the requests of the month are used up. Most services send a Retry-After header with the seconds to wait.

  • Wait as long as Retry-After says, then send again. Do not retry at once in a loop: that keeps the client over the limit and can turn a 429 into a block.
  • Cache answers. Many apps geocode the same addresses again and again.
  • For bulk geocoding of a list, pace the requests in one thread instead of sending them in parallel.

Nominatim: 509 Bandwidth Limit Exceeded

In February 2026 the public Nominatim came under extreme load from anonymous scrapers spread across more than 100,000 IP addresses, as the OpenStreetMap operations team reported. The measures against them answered some normal clients with 509 for a few days. The Nominatim maintainers asked users to retry before reporting it, and recommended a commercial geocoding service or a server of your own for commercial apps (forum thread).

geopy exceptions

geopy raises an exception for every answer other than 200. The most common:

ExceptionHTTP statusUsually
GeocoderInsufficientPrivileges403Blocked by Nominatim, or a key not allowed for this request.
GeocoderRateLimited429Too fast.
GeocoderQuotaExceeded402The paid allowance is used up.
GeocoderAuthenticationFailure401Wrong or missing key.
GeocoderTimedOut408, 503, 504, or no answer in timeThe service is slow or overloaded; the default timeout is 1 second.
ConfigurationError–Nominatim with the default or a sample user_agent; raised before any request.

The guide geopy: GeocoderInsufficientPrivileges, GeocoderRateLimited and ConfigurationError has the full table, the user agents geopy refuses, and RateLimiter settings that work.

geopy returns None for every row

RateLimiter from geopy.extra.rate_limiter retries a failed request twice, 5 seconds apart, and then returns None instead of raising (swallow_exceptions=True by default). A blocked script therefore fills a whole column with None, and the reason is only in the log warnings. Set swallow_exceptions=False while testing, so the first error stops the run.

Google Geocoding API: REQUEST_DENIED and OVER_QUERY_LIMIT

The Google API answers HTTP 200 with a status field. REQUEST_DENIED means the request was rejected, OVER_QUERY_LIMIT that a quota is used up, and OVER_DAILY_LIMIT usually a missing or invalid key, billing that is not set up, or a usage cap you set yourself. The error_message field says which, for example “This API project is not authorized to use this API.” (the Geocoding API is not enabled in the project) or “API keys with referer restrictions cannot be used with this API.” (a browser key sent from a server). Each status with its fix is in Google Geocoding API: REQUEST_DENIED, OVER_QUERY_LIMIT and ZERO_RESULTS.

Empty results, ZERO_RESULTS and “Unable to geocode”

The search worked but found nothing. Nominatim answers [] for a search and {"error": "Unable to geocode"} for a point without anything near it; Google answers ZERO_RESULTS.

  • The house number is not in the data. Services on OpenStreetMap data know only the house numbers mapped there, which is most of them in much of Europe and fewer in other regions. Search for the street and town to get the street.
  • A filter is too strict: a country code, a bounding box or a type filter that leaves the place out.
  • The address mixes languages or old names, or puts the postcode in the wrong field of a structured search.
  • A typo in a structured field. Free text forgives more than separate fields do.

Search as you type

The usage policy of the public Nominatim forbids autocomplete, also from the browser, and its search is not made for partial words. One request per keystroke also uses up per-second limits quickly. Use a service built for it, such as Photon, and in your code wait about 250 ms after the last keystroke, start at three letters, and drop answers that arrive after a newer request was sent.

“has been blocked by CORS policy”

The browser blocks an answer without an Access-Control-Allow-Origin header. Geocoding APIs for the web send it on normal answers, but error pages often lack it, so a 403 or 429 shows up as a CORS error. Open the network tab, look at the status of the request, and fix that. The Google Geocoding web service is meant for servers; in a browser, use the Geocoder class of the Maps JavaScript API.

400 Bad Request and INVALID_REQUEST

A parameter is missing, misspelled or out of range: lat above 90, an unknown format, a language the service does not have. The message usually names the parameter. Google answers INVALID_REQUEST when address, components or latlng is missing.

Error codes of overpass.ch geocoding

StatusCodeMeaning on overpass.ch
400bad_requestA parameter the API does not accept; the message names it.
401unauthorizedThe key in the URL is missing or unknown.
403forbidden_refererThe website is not among the allowed referers of the key.
403no_geocodingThe plan includes no geocoding.
429rate_limited, quota_exceededThe per-minute limit, or the requests of the month; see Retry-After.
501not_supportedNominatim /lookup and /details, which we do not offer.
502, 503geocoding_unavailable, busyRetry after the seconds in Retry-After.

Errors come as JSON, {"error": "rate_limited", "message": "…"}, with CORS headers. All codes are in the documentation.

Geocoding from overpass.ch

Search, search as you type and reverse geocoding on OpenStreetMap data, with the API of Nominatim and the API of Photon, so most code needs only a new base URL. 100'000 requests a month are free, and you may store the results.