Leads & companies · Coming soon

OpenStreetMap POI Extractor

Get places from OpenStreetMap for a city or a map box. Add a map tag like amenity=cafe. You get one row per place with name, coordinates and contact fields.

Built and tested. Prices will be shown after release.

Coming soon to the Apify StoreFollow us on Apify

What you get, for example

osmIdway/1455905589
osmTypeway
osmUrlhttps://www.openstreetmap.org/way/1455905589

How it will work: 3 steps

  1. Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
  2. Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example: amenity=cafe in OSM tags. Each start is one run.
  3. Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.

What it does

Get points of interest from OpenStreetMap for a city or a map rectangle. Add a place name and one or more map tags such as amenity=cafe, and the Actor returns one row per place with name, coordinates, address, website, phone and opening hours.

  • It finds your area. A place name becomes the official OSM boundary of that place. A bounding box is used as it is.
  • It asks the public Overpass API for every place inside the area that has your tags.
  • It saves one clean row per place in the Dataset. You can export the rows as JSON, CSV or Excel.

Good for

  • Lists of cafes, restaurants, hotels or shops in one city, with coordinates and contact fields.
  • Store-location and competitor maps: all supermarkets, pharmacies or fuel stations in a region.
  • Travel and tourism data: hotels, attractions, viewpoints and museums for a guide or an app.
  • Any other map object with an OSM tag, from bicycle parking to charging stations.

Not a good fit

  • Reviews, ratings, photos or prices. OpenStreetMap does not store them.
  • A full business directory. Some places are missing from the map. Many places have no phone or website.
  • Many cities in one run. Run the Actor once per area, or use a bounding box.
  • Live opening status. openingHours is the schedule that mappers wrote down.

Who uses it

Local marketers

Make lists of cafes, shops or hotels in a city.

Retail analysts

Map supermarkets, pharmacies or fuel stations in a region.

Travel app makers

Get hotels, museums and viewpoints for a guide or an app.

Price

Prices will be shown after release.

Questions

Do I need an OpenStreetMap account or key?

No. It uses public OSM services. You need only an Apify account.

Can I use the data in my product?

Yes, under the ODbL licence. You must credit OpenStreetMap contributors.

Is the list complete?

No map is complete. Many places have no phone or website. A truncated flag shows when more places exist.

Does it give reviews or ratings?

No. OpenStreetMap does not store reviews, ratings, photos or prices.

Will two runs return the same places?

Yes, if the map did not change. osmId stays the same, so you can compare runs by osmId.

Does the Actor collect personal data?

No. It returns only public map data about places. Phone and email fields are business contacts that mappers added to the map.

Details

Step by step on Apify
  1. Open the Input tab.
  2. Type a city in Area, for example Pattaya.
  3. Keep amenity=cafe in OSM tags, or add your own tag.
  4. Keep Max POIs at 20 for a first test.
  5. Click Start.
  6. Open the Output tab and check the POIs table.
Use cases
TaskInputKey fieldsNext step
Lead list of local businessesarea = city, tags = amenity=restaurantname, phone, website, addressExport CSV to your CRM or spreadsheet
Store and competitor maparea = region, tags = shop=supermarketbrand, lat, lng, addressLoad into a GIS tool or a map library
Travel guide dataarea = city, tags = tourism=hotel, tourism=attractionname, type, website, openingHoursFeed a travel app or a content plan
Accessibility checkarea = district, tags = amenity=restaurantwheelchair, name, lat, lngFilter by wheelchair in a spreadsheet
Tips for better results
  • Use a bounding box when a city name is not exact enough.
  • Run once for each area, because one run covers one area.
  • Compare runs by osmId to see what changed on the map.
Limits and good to know
  • One area per run. A bounding box can be 5° per side at most
  • maxItems is 10000 at most. A run with 10000 rows in Paris took about 90 seconds
  • 1–20 tags per run
  • The Actor waits for OSM servers for about 150 seconds at most. After that it stops and reports a source error
  • Data depends on OSM volunteers. Coverage is different from region to region
  • The data is as fresh as the Overpass server. dataTimestamp shows the time, usually a few minutes old
  • The Actor uses public OSM servers. It follows the Nominatim usage policy and does not send heavy parallel requests

For developers

Sample result

One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.

one result · JSON
{
  "status": "complete",
  "statusReason": null,
  "errorCode": null,
  "osmId": "way/1455905589",
  "osmType": "way",
  "osmUrl": "https://www.openstreetmap.org/way/1455905589",
  "name": "Espresso Love",
  "nameEn": null,
  "category": "amenity",
  "type": "cafe",
  "matchedTag": "amenity=cafe",
  "lat": 12.9049444,
  "lng": 100.869448,
  "address": {
    "street": "Thappraya Rd",
    "houseNumber": "315",
    "postcode": "20150",
    "city": null,
    "suburb": null,
    "country": null,
    "full": "Thappraya Rd 315, 20150"
  },
  "website": null,
  "phone": "+66 81 982 4727",
  "email": null,
  "openingHours": "Mo-Su 06:00-19:00",
  "cuisine": "coffee_shop",
  "brand": null,
  "operator": null,
  "wheelchair": null,
  "tags": {
    "amenity": "cafe",
    "cuisine": "coffee_shop",
    "name": "Espresso Love",
    "opening_hours": "Mo-Su 06:00-19:00",
    "outdoor_seating": "no"
  },
  "area": "Pattaya",
  "areaName": "Pattaya City, Nong Pla Lai, Bang Lamung District, Chon Buri Province, Thailand",
  "areaOsmId": "relation/12645794",
  "attribution": "© OpenStreetMap contributors",
  "license": "ODbL 1.0",
  "licenseUrl": "https://www.openstreetmap.org/copyright",
  "source": "overpass",
  "sourceEndpoint": "https://overpass-api.de/api/interpreter",
  "dataTimestamp": "2026-10-17T08:32:06Z",
  "fetchedAt": "2026-10-17T08:33:11.550Z"
}
Data fields (33)
FieldTypeMeaning
statusstringRow result: complete (a POI), not_found (the area or POIs were not found, free) or error (free). See statusReason and errorCode.
statusReasonstringPlain-English reason for a not_found or error row; null for POIs.
errorCodestringMachine code for error rows: INVALID_INPUT, RATE_LIMITED, SOURCE_UNAVAILABLE, SOURCE_TIMEOUT, SOURCE_INCOMPLETE, SOURCE_BAD_REQUEST, DEADLINE_REACHED; null otherwise.
osmIdstringOpenStreetMap element id with its type: node/123, way/456 or relation/789. Stable across runs.
osmTypestringOSM element type: node (a point), way (a building or outline) or relation.
osmUrlstringLink to the element on openstreetmap.org.
namestringPOI name as mapped (local language); null when unnamed.
nameEnstringEnglish name (name:en tag) when mapped.
categorystringOSM key of the tag that matched, e.g. amenity, shop, tourism.
typestringValue of the matched key, e.g. cafe, supermarket, hotel.
matchedTagstringThe matched tag as key=value, e.g. amenity=cafe.
latnumberLatitude (WGS84). For ways and relations the centre of the outline.
lngnumberLongitude (WGS84). For ways and relations the centre of the outline.
addressobjectAddress from addr:* tags: street, houseNumber, postcode, city, suburb, country, full (one line). null when the mappers recorded no address.
websitestringBusiness website from website, contact:website or url tags, normalized to an http(s) URL.
phonestringBusiness phone as mapped (phone or contact:phone tag). Business data only, no private persons.
emailstringBusiness e-mail as mapped (email or contact:email tag).
openingHoursstringOpening hours in OSM opening_hours syntax, e.g. Mo-Fr 08:00-18:00; Sa 09:00-14:00.
cuisinestringcuisine tag for food places, e.g. thai;seafood.
brandstringBrand or chain name (brand tag).
operatorstringOperating company (operator tag).
wheelchairstringWheelchair accessibility: yes, limited or no.
tagsobjectAll OSM tags of the element as key/value pairs; null when includeTags is off.
areastringYour area input as given.
areaNamestringPlace name resolved by the geocoder (English where available), or the bounding box.
areaOsmIdstringOSM boundary used for the search, e.g. relation/1234; null for bounding boxes.
attributionstring© OpenStreetMap contributors. Keep this credit when you publish the data.
licensestringData licence: ODbL 1.0.
licenseUrlstringhttps://www.openstreetmap.org/copyright
sourcestringData route: overpass (Overpass API over OpenStreetMap).
sourceEndpointstringOverpass instance that answered this run.
dataTimestampstringOSM data freshness on that instance (timestamp_osm_base), ISO 8601 UTC.
fetchedAtstringWhen the Actor read the source, ISO 8601 UTC.
Input settings (5)

The main fields of the input form. With the API you send them as JSON.

SettingName in the APITypeExample value
Area (city or bounding box) requiredareastring"Pattaya"
OSM tags requiredtagsarray["amenity=cafe"]
Combine tagsmatchstring"any"
Max POIsmaxItemsinteger20
Include raw OSM tagsincludeTagsbooleantrue

Start on Apify

Make a free Apify account: you get $5 of free usage every month. Missing a tool? Suggest it. We read every idea, but we do not promise to build it.

Apify links on this page are affiliate links. We may earn a commission. You pay the same price. Affiliate disclosure