You do not need a Google Maps key, or a credit card, to put coordinates on your data. I geocoded addresses through eight APIs this morning with zero keys, and every one answered with a plain HTTP GET. The catch is not price. It's the rate limit and the one-line attribution you owe OpenStreetMap.
A free geocoding API turns an address into latitude/longitude, or a coordinate back into an address, without a paid vendor. The eight below need no API key and no signup. I re-verified each with a live curl on July 2, 2026 (HTTP 200), and every response you see is the actual output, trimmed for length, not paraphrased. If you scrape directories or reviews like I do, the rows come back carrying messy addresses. Geocoding is the enrichment step that turns those strings into something you can map, dedupe by location, or filter by region.
This came out of a real gap. My last post here was a roundup of keyless APIs an agent can use to read the web, and I ended it asking readers for the one thing I kept missing: a good free geocoder that survives real traffic. This is my answer to my own question. I am not claiming each of these ran inside my 2,190 production scraper runs. That would be a lie. I'm claiming I re-ran a live curl against every one and pasted back what came out.
Here is the whole set at a glance, then one section each.
| # | API | What it does | Coverage | No key? |
|---|---|---|---|---|
| 1 | Nominatim (OSM) | Address → coords, coords → address, structured | Global | Yes (1 req/s) |
| 2 | Photon (Komoot) | Autocomplete-style forward + reverse | Global | Yes |
| 3 | api-adresse.data.gouv.fr | French addresses, forward + reverse | France | Yes |
| 4 | Zippopotam.us | Postal code ↔ place name | ~60 countries | Yes |
| 5 | Postcodes.io | UK postcode ↔ coords + admin geography | UK | Yes |
| 6 | OpenPLZ | Postal code / locality directory | DE / AT / CH / LI | Yes |
| 7 | 3geonames.org | Reverse: coords → nearest place | Global | Yes |
| 8 | ip-api.com | Bonus: IP → location (no address needed) | Global | Yes (HTTP) |
1. Nominatim: the OpenStreetMap workhorse (global, forward + reverse)
Nominatim is the default answer to "free geocoder." It searches OpenStreetMap data and does all three jobs: address to coordinates, coordinates to address, and structured lookups where you pass street and city as separate fields.
Forward. Ask it for the Eiffel Tower:
curl -A "my-app/1.0 (you@example.com)" \
"https://nominatim.openstreetmap.org/search?q=Eiffel+Tower,+Paris&format=jsonv2&limit=1"
[{"place_id":98616190,"osm_type":"way","osm_id":5013364,
"lat":"48.8582599","lon":"2.2945006",
"category":"man_made","type":"tower","name":"Tour Eiffel",
"display_name":"Tour Eiffel, 5, Avenue Anatole France, ... Paris 7e Arrondissement, ... 75007, France",
"importance":0.6205937724353116,
"licence":"Data © OpenStreetMap contributors, ODbL 1.0. http://osm.org/copyright"}]
Reverse. Hand it a lat/lon and get the nearest address back:
curl -A "my-app/1.0 (you@example.com)" \
"https://nominatim.openstreetmap.org/reverse?lat=48.8584&lon=2.2945&format=jsonv2"
{"lat":"48.8583982","lon":"2.2944933",
"display_name":"Avenue Gustave Eiffel, ... Paris 7e Arrondissement, ... 75007, France",
"address":{"road":"Avenue Gustave Eiffel","suburb":"Paris 7e Arrondissement",
"city":"Paris","postcode":"75007","country":"France","country_code":"fr"}}
Structured. If your scraped rows already split street from city, ?street=1600+Amphitheatre+Parkway&city=Mountain+View&format=jsonv2 returns lat 37.4224858 / lon -122.0855846 for "Google Building 41". Cleaner matches than jamming everything into one q= string.
Why it's free, and the real cost. The public instance is run by the OpenStreetMap Foundation. Their usage policy is the thing you actually have to respect: a maximum of 1 request per second, a valid User-Agent that identifies your app, cache your results, and show attribution ("© OpenStreetMap contributors", ODbL). Notice I sent a User-Agent in every curl above. My very first request without one got a stern response. Keyless does not mean anonymous.
2. Photon: fast forward and reverse, built for typing (global)
Photon is also OSM-based, hosted for free by Komoot, and tuned for search-as-you-type. Same two directions, GeoJSON out.
curl "https://photon.komoot.io/api/?q=1600+Amphitheatre+Parkway+Mountain+View&limit=1"
{"type":"FeatureCollection","features":[{"type":"Feature",
"properties":{"osm_id":23733659,"name":"Google Building 41","housenumber":"1600",
"street":"Amphitheatre Parkway","city":"Mountain View","state":"CA",
"postcode":"94043","country":"United States","countrycode":"US"},
"geometry":{"type":"Point","coordinates":[-122.0855846,37.4224858]}}]}
Reverse works the same way: https://photon.komoot.io/reverse?lat=52.5163&lon=13.3777 came back with "Quadriga mit Victoria" in Berlin, postcode 10117.
The gotcha I hit live. My first Photon query was q=Brandenburg+Gate, expecting the Berlin landmark. It returned this instead:
{"features":[{"properties":{"name":"Brandenburg Gate","osm_value":"residential",
"city":"Stuttgart","county":"Arkansas","state":"Arkansas","country":"United States"},
"geometry":{"type":"Point","coordinates":[-91.556358,34.5155358]}}]}
A residential street named "Brandenburg Gate" in Stuttgart, Arkansas. Not the monument. Fuzzy name matching will happily hand you the wrong hemisphere. So verify the first hit against city and country before you trust it, or add the country to your query. Komoot runs this for free and asks you not to hammer it; self-host for heavy batch work.
3. api-adresse.data.gouv.fr: the French government geocoder (France)
If your data touches France, this beats generic geocoders. It's the official Base Adresse Nationale, run by the French state, keyless, and very accurate on French addresses.
curl "https://api-adresse.data.gouv.fr/search/?q=8+bd+du+port&limit=1"
{"features":[{"geometry":{"type":"Point","coordinates":[2.062821,49.031624]},
"properties":{"label":"8 Boulevard du Port 95000 Cergy","score":0.4924265550239234,
"housenumber":"8","postcode":"95000","city":"Cergy",
"context":"95, Val-d'Oise, Île-de-France"}}]}
That score field is real and useful. It tells you how confident the match is, so you can drop low-confidence rows in a batch instead of writing garbage coordinates to your database. Reverse works too (/reverse/?lon=2.2945&lat=48.8584 returned Avenue Anatole France, 75007 Paris, with a per-result score of 0.9967). Free because it's public infrastructure. It has a rate limit; verify the current number on adresse.data.gouv.fr before you run a bulk job.
4. Zippopotam.us: postal code to place, both ways (~60 countries)
Sometimes you don't have a street, only a ZIP or postcode. Zippopotam covers dozens of countries and needs no key or signup.
curl "https://api.zippopotam.us/us/90210"
{"post code":"90210","country":"United States","country abbreviation":"US",
"places":[{"place name":"Beverly Hills","state":"California",
"state abbreviation":"CA","latitude":"34.0901","longitude":"-118.4065"}]}
It goes the other way as well. https://api.zippopotam.us/us/ca/beverly%20hills returns every ZIP for that place (90209, 90210, 90211, and more). The granularity is a postal code, not a street number, so this is for coarse mapping and region filtering, not doorstep accuracy.
5. Postcodes.io: UK postcodes with a mountain of admin geography (UK)
For UK data this is the one I reach for. Free, open-source, self-hostable, and it returns far more than coordinates.
curl "https://api.postcodes.io/postcodes/SW1A1AA"
{"status":200,"result":{"postcode":"SW1A 1AA",
"longitude":-0.141563,"latitude":51.50101,
"region":"London","admin_district":"Westminster","admin_ward":"St James's",
"parliamentary_constituency":"Cities of London and Westminster",
"country":"England","lsoa":"Westminster 018C"}}
I trimmed that. The full response carries roughly 80 fields per postcode: constituencies, health areas, census output areas, ONS codes. Reverse geocoding is a query string away (?lon=-0.141563&lat=51.50101). If you're joining scraped UK addresses to any government dataset, those admin codes save you a second lookup.
6. OpenPLZ: postal and locality directory for German-speaking Europe (DE/AT/CH/LI)
OpenPLZ is a clean open-data directory for Germany, Austria, Switzerland, and Liechtenstein. Good for validating a postal code against a locality and pulling the administrative hierarchy.
curl "https://openplzapi.org/de/Localities?postalCode=10117"
[{"postalCode":"10117","name":"Berlin",
"municipality":{"key":"11000000","name":"Berlin, Stadt","type":"Kreisfreie Stadt"},
"federalState":{"key":"11","name":"Berlin"}}]
It's a directory, not a full street geocoder, so treat it as the DACH postal-lookup piece of your pipeline rather than a Nominatim replacement. Keyless, backed by open data.
7. 3geonames.org: quick reverse geocoding, quirky format (global)
When all I want is "what place is near this coordinate," 3geonames is a one-liner. No key.
curl "https://api.3geonames.org/48.8584,2.2945.json"
{"threegeonames":"PARIS-STURGIS-KULDEEP",
"nearest":{"latt":"48.8627","longt":"2.28858",
"name":"Cité de l'architecture et du patrimoine",
"city":"Paris","state":"FR","region":"Paris",
"timezone":"Europe/Paris","elevation":"63","distance":"0.645"}}
Yes, that top-level threegeonames field really says "PARIS-STURGIS-KULDEEP". The response shape is idiosyncratic and there's a lot of it, but the nearest block gives you name, region, timezone, and elevation in one call. I'd use it for a fast reverse lookup, not as a primary geocoder.
8. Bonus: no address? Geolocate by IP with ip-api.com (global)
This one is a different category, so I'm listing it honestly as a bonus. It maps an IP address to an approximate location, which is not the same job as address-to-coordinates. But if you're enriching web logs or want a rough country/city for a visitor, it's the keyless workhorse.
curl "http://ip-api.com/json/24.48.0.1"
{"status":"success","country":"Canada","regionName":"Quebec",
"city":"Montreal","zip":"H1K","lat":45.6085,"lon":-73.5493,
"isp":"Le Groupe Videotron Ltee","query":"24.48.0.1"}
Read the terms carefully. The free tier is for non-commercial use over plain HTTP (not HTTPS), no key, and it's rate-limited (their docs say around 45 requests per minute; verify the current limit before you build on it). HTTPS and commercial use are paid.
Honorable mentions: free tier, but you need a free key (no card)
Three services have a genuinely free tier with no credit card, but they do want a free API key, so they didn't make the keyless list. I did not live-test these, so I'm not quoting their quotas. Check the current numbers on their pricing pages before you commit: OpenCage Geocoder (opencagedata.com), Geoapify (geoapify.com), and LocationIQ (locationiq.com). All three are OSM-backed and fine for modest volumes.
Why some "free" geocoders didn't make the cut
Keyless is a promise the network sometimes breaks. Here's what failed when I tested on July 2, 2026, so you don't waste an afternoon:
- US Census Geocoder is genuinely free and keyless, and it's the authoritative source for US addresses. But its WAF rejected my datacenter curl on both attempts, even with a browser User-Agent ("Request Rejected"). It works from a browser or a residential IP. Free is not the same as callable from any environment.
-
BigDataCloud reverse-geocode-client is keyless, but its TLS certificate had expired:
notAfter Jul 1 2026, and curl refused the connection the day after. Can't verify a clean call. -
GeoNames is free, but the shared
demoaccount was over its daily limit ("daily limit of 20000 credits for demo has been exceeded"). You need your own free username, which means a signup. -
geocode.xyz is keyless but returned
Throttled! See geocode.xyz/pricingon the free tier. -
geocode.maps.co now answers
401 Missing API Key.
Two more I left out on purpose: Open-Meteo geocoding and Wikipedia GeoSearch are both keyless and excellent, but I covered those providers in my last keyless-APIs post, so this list stays on fresh names.
Geocoding a lot of addresses without getting blocked
The failure mode with free geocoders is never the first call. It's the ten-thousandth. Three habits keep you alive:
Cache aggressively. Scraped addresses repeat constantly, so the same string should never hit the API twice. When I geocode enrichment rows, the cache hit rate does most of the work and the API sees a fraction of the traffic. Hash the normalized address, store the result, reuse it.
Respect the rate limit with a real queue. Nominatim means one request per second. Not "roughly." Put a token-bucket or a plain sleep between calls, and back off on any non-200. A queue that honors 1 req/s will out-survive a burst that gets your IP blocked in thirty seconds.
Self-host when the volume gets serious. Nominatim, Photon, and Postcodes.io are all open-source. For real production load the honest answer is usually to run your own instance or pay a tier, not to lean harder on someone's donated server. This list is a fast start, not a free lunch.
FAQ
What is the best free geocoding API with no API key?
For global coverage, Nominatim and Photon (both OpenStreetMap-based) are the default choices, keyless with a plain GET. For a specific country, the government options are more accurate: Postcodes.io for the UK, api-adresse.data.gouv.fr for France, OpenPLZ for German-speaking Europe.
Can I do reverse geocoding for free?
Yes. Nominatim, Photon, and the French BAN API all take a latitude/longitude and return the nearest address with no key. 3geonames.org is a lightweight reverse-only option. Postcodes.io reverse-geocodes UK coordinates to a postcode.
Is the OpenStreetMap Nominatim API really free?
Yes, and it needs no key or signup. The conditions are the price: a maximum of 1 request per second, a valid User-Agent, caching your results, and attribution to "© OpenStreetMap contributors" under the ODbL license. Break those and the public instance will block your IP.
Do free geocoding APIs need a credit card?
None of the eight here do. The free-key services (OpenCage, Geoapify, LocationIQ) issue a key without a card on their free tiers. Verify the current quota on each provider's pricing page before you build on it.
How do I geocode thousands of addresses without getting blocked?
Cache results (scraped addresses repeat, so most lookups are cache hits), queue requests to honor each API's rate limit, and self-host the open-source ones (Nominatim, Photon, Postcodes.io) for real volume.
Written by Aleksei Spinov. I build web-scraping and data-enrichment tool layers, currently 2,190 runs across 32 actors in production. Every API above was re-verified with a live curl (HTTP 200, real response) on July 2, 2026 before publishing; responses are trimmed, not paraphrased. Free tiers drift, so run the curl yourself before you wire one into anything that matters. Drafted with an AI assistant, fact-checked and edited by me.
Follow for the next batch of keyless tools I test for the enrichment layer. And tell me: which free geocoder holds up under your real traffic, and how do you cache the repeats? I read every comment.
Top comments (0)