OpenStreetMap Nominatim drop-in replacement

The public Nominatim instance asks for at most one request per second and no heavy use. osm.mygeocode.com speaks the same search and reverse interface, in JSON, JSONv2 and GeoJSON formats, with a quota you can actually plan around.

Change one hostname

Original host
  • nominatim.openstreetmap.org
Use insteadosm.mygeocode.com
Key parameterNone on the original, and none needed here either: any address gets 2,500 requests a day without one. For credit, packages and a usage history add key=... to the query or send the X-API-Key header.
Before
curl "https://nominatim.openstreetmap.org/search?q=Brandenburg+Gate+Berlin&format=json&addressdetails=1"
After
curl "https://osm.mygeocode.com/search?q=Brandenburg+Gate+Berlin&format=json&addressdetails=1"

Why people move

The public Nominatim server is a shared resource with a strict usage policy. Running your own is a full-time job. This is the same interface without either problem.

Same free allowance, key or not. Requests to osm.mygeocode.com count toward the same 2,500 free requests a day your address, or your key, gets on our own endpoints. Above that, prepaid credit at €0.0001 per request, or €50 a month for an Unlimited key. Signing up takes a name and an email address, and no card.

See pricing Get a free key

Endpoints

Path on osm.mygeocode.comWhat it doesBacked by
/search?q=...&format=jsonFree-form searchForward geocoding
/search?street=...&city=...&country=...&format=jsonStructured searchForward geocoding
/reverse?lat=...&lon=...&format=jsonReverseReverse geocoding

Example response

This is what the request above returns. Field names, nesting and types follow Nominatim (OSM). Only the data behind them is ours.

Response from osm.mygeocode.com
[
  {
    "place_id": 1691459985,
    "licence": "Data by My Geocode, https://www.mygeocode.com/terms/",
    "osm_type": "node",
    "osm_id": 3893494686,
    "lat": "52.5162679",
    "lon": "13.3776921",
    "class": "tourism",
    "type": "attraction",
    "place_rank": 30,
    "importance": 0.9,
    "addresstype": "tourism",
    "name": "Brandenburg Gate",
    "display_name": "Brandenburg Gate, State of Berlin, Germany",
    "address": {
      "tourism": "Brandenburg Gate",
      "state": "State of Berlin",
      "country": "Germany",
      "country_code": "de"
    },
    "boundingbox": ["52.5142688", "52.5182711", "13.3756907", "13.3796911"]
  }
]

Details and differences

Nominatim has no key, and none is needed here either for the first 2,500 requests a day. For credit, packages and a usage history, add key=... to the query or send the X-API-Key header.

Copyright lines, licence names, terms and privacy links in the response are ours rather than the original provider’s. Everything else keeps the original shape.

  • /search answers jsonv2 by default and /reverse answers XML, matching Nominatim’s own defaults.
  • The xml, json, jsonv2, geojson and geocodejson formats are all served.
  • The licence line and the XML attribution attribute are ours.
  • No batch endpoint, because the original has none. For bulk work use POST /v1/forward or /v1/reverse on api.mygeocode.com (up to 100 per call, one request each).
  • extratags=1 adds the population and Wikidata id where we know them, and namedetails=1 the place’s names by language, in JSON and in XML.
  • polygon_geojson, polygon_text, polygon_kml and polygon_svg return the outline of a country, region or city from open administrative boundaries, one per request as Nominatim allows. entrances=1 answers null: no entrance data is held.

If your client depends on a field or behaviour that is not listed here, tell us. Compatibility gaps get fixed quickly because they are usually small.

Other drop-in hosts

How the drop-ins work, the overview, and the JavaScript library drop-ins.