Hit 429 on public Nominatim? Use your own server
Your script sleeps a second between addresses and still gets 429 Too Many Requests or a block. The public server is shared and says so; the fix is a server of your own, not a longer sleep.
What you have
What the public server asks, read November 10, 2026 on the Nominatim usage policy: an absolute maximum of 1 request per second, a User-Agent that names your application, and no bulk geocoding of large amounts of data. A geopy script that keeps to it, pointed at a local server instead:
from geopy.geocoders import Nominatim
# before: Nominatim(user_agent="my-app") with RateLimiter(min_delay_seconds=1)
geo = Nominatim(user_agent="my-app", domain="127.0.0.1:8080", scheme="http")
for line in ["233 S Wacker Dr, Chicago, IL 60606",
"1600 Pennsylvania Ave NW, Washington, DC 20500",
"350 Fifth Avenue, New York, NY 10118"]:
place = geo.geocode(line)
print(place.latitude, place.longitude, place.address)
Steps
1. Start the server for the country of your addresses; it answers /search, /reverse and /status the way Nominatim does:
$ gridpin serve usa.bin --port 8080
$ curl -s "http://127.0.0.1:8080/status?format=json"
{"data_updated":"2026-09-23.1","database_version":"2026-09-23.1","message":"OK","software_version":"gridpin 0.8.0","status":0}
2. Run the script with the host changed and the delay removed:
$ python3 geocode.py 41.878658 -87.6358684 233 South WACKER Drive, Chicago, 60606 38.8976751 -77.036547 1600 PENNSYLVANIA Avenue Northwest, Washington, 20500 40.7488827 -73.9860301 350 5 Ave, Times Square, 10118
3. There is no rate limit to hit: two hundred requests in a row, every one answered:
$ for i in $(seq 200); do curl -s -o /dev/null -w "%{http_code}\n" "http://127.0.0.1:8080/search?q=233+S+Wacker+Dr,+Chicago&format=json"; done | sort | uniq -c
200 200
What you get
The same Location objects as before, from your machine. Any client that lets you set the Nominatim URL works the same way: seven clients, one line each; trackers such as Traccar: fleet tracking.
Why it works
The server reads the country file into memory once and answers each request in the process, so the only limit is your machine. It speaks the Nominatim formats (json, jsonv2, geojson) on the same paths, so clients do not notice the change of host.
Limits
- Addresses of the countries GridPin has files for, one country per server; Nominatim also finds shops, parks and places by name worldwide.
- Only the parameters clients commonly send are read; see the server page for the list.
- GridPin is not affiliated with the OpenStreetMap Foundation; its server is not Nominatim.
All its keys: command reference. The function: local server.