OpenStreetMap Places Scraper – POI & Local Business Data avatar

OpenStreetMap Places Scraper – POI & Local Business Data

Pricing

from $3.00 / 1,000 results

Go to Apify Store
OpenStreetMap Places Scraper – POI & Local Business Data

OpenStreetMap Places Scraper – POI & Local Business Data

Extract clean POI / local business data from OpenStreetMap by area and category. No Overpass QL, no API key; data is open (ODbL) and legally redistributable.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

Daniel Brenner

Daniel Brenner

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

a day ago

Last modified

Share

Extract clean, structured local business / POI data from OpenStreetMap by area and category — no Overpass query language, no API key, no anti-bot battles. A legal, open-data alternative to Google Maps scrapers.

Give it an area like "Berlin, Germany" and categories like ["restaurant", "cafe"], and get back tidy rows: name, brand, address, coordinates, phone, email, website, opening hours, cuisine, and the full OpenStreetMap tag set. You can also search by name (find every "Starbucks" or all "Aldi" supermarkets in a city) or search around a point (every café within 800 m of a hotel).

Why use this scraper?

  • Legal & open. OpenStreetMap data is licensed under the ODbL — you can redistribute it (with attribution). No Terms-of-Service violations and no scraping behind logins.
  • No API key, no setup. Just give it an area and the categories you want.
  • Global coverage. Anywhere OpenStreetMap has data — worldwide.
  • Search by area, radius, or name. A whole city/region, everything within X metres of a point, or every location of a brand.
  • Clean, flat output. Ready for CSV / Excel / JSON, plus the raw OSM tags when you need more detail.
  • No Overpass QL required. It builds and runs the query for you.
  • No duplicates. When OpenStreetMap maps one place twice (a node and a building outline), you get a single, richer row — not two.
  • Honest data. Every value comes straight from OpenStreetMap; a field that isn't mapped is left empty (null) — never guessed or padded.
  • Reliable. Automatically retries across multiple Overpass mirrors to handle transient timeouts.

What you can extract

115+ place categories across food & drink, retail shops, hotels & lodging, health & beauty, finance, automotive (including EV charging stations), education, public services, leisure, tourism & attractions, professional offices, and trades — restaurants, cafés, bars, hotels, supermarkets, pharmacies, dentists, banks, fuel stations, museums, real-estate agents and many more (full list below). Great for:

  • Local business / POI datasets for analysis, lead generation, or store-locator features
  • Market research, competitor mapping, and location intelligence
  • Real-estate, retail site selection, and territory planning
  • Feeding AI / RAG pipelines with structured place data
  • A clean, legal alternative to "Google Maps scraper" tools

Common uses

  • "Get every restaurant / café / bar in a city" for a directory or delivery app
  • "List all dentists / doctors / pharmacies in a region" for healthcare outreach
  • "Export EV charging stations and fuel stations" for mobility products
  • "Find real-estate agents, lawyers, or accountants" for B2B lead lists
  • "Map hotels, museums, and attractions" for travel and tourism datasets

Input

FieldTypeDescription
areastringPlace to search within, e.g. "Berlin, Germany". Geocoded to a bounding box via Nominatim.
categoriesarrayPlace categories to extract, e.g. ["restaurant","cafe","hotel"].
searchTermstring(optional) Only return places whose name contains this text (case-insensitive), e.g. "Starbucks". Combine with categories to narrow (supermarkets named "Aldi"), or use alone to find a brand across all place types.
aroundLocationstring(optional) An address or place to search around within a radius, e.g. "Times Square, New York". Geocoded to a center point; pair with radiusMeters.
radiusMetersinteger(optional) Radius in meters for the around-a-location search (default 1000).
centerPointobject(advanced) Explicit center { "lat":.., "lon":.. } to search around. Overrides aroundLocation.
maxResultsintegerMaximum number of POIs to return (default 1000).
boundingBoxobject(advanced) Explicit { "south":.., "west":.., "north":.., "east":.. }. Overrides area when set.

Choosing a search area: use area for a whole city/region (bounding box), or aroundLocation + radiusMeters for everything within X meters of a point (e.g. "cafés within 1 km of a hotel"). boundingBox and centerPoint are explicit-coordinate alternatives.

Example input

{
"area": "Heidelberg, Germany",
"categories": ["cafe", "restaurant"],
"maxResults": 200
}

To find every location of a brand, use searchTerm (with or without categories):

{
"area": "Berlin, Germany",
"categories": ["supermarket"],
"searchTerm": "Aldi"
}

To find places within a radius of a point, use aroundLocation + radiusMeters:

{
"aroundLocation": "Times Square, New York",
"categories": ["cafe", "restaurant"],
"radiusMeters": 800
}

Output

One row per place:

FieldDescription
namePlace name
categoryPrimary category (e.g. cafe, lawyer, charging_station)
brandBrand / chain name when tagged — useful for competitor & chain mapping
brand_wikidataWikidata id of the brand (e.g. Q38076) — a stable entity id for brand / market-share analysis
brand_logoOfficial brand logo image URL (from the brand's Wikidata entry) when one exists — handy for directories/UIs; null otherwise
latitude, longitudeCoordinates
street, housenumber, city, postcode, countryAddress parts (see Field coverage below for fallbacks)
phone, email, website, opening_hoursContact details and hours
cuisineCuisine type(s) for food places, e.g. italian;pizza
operatorWho operates the place (chains, councils, franchises)
wheelchairAccessibility: yes / no / limited
osm_id, osm_typeOpenStreetMap identifiers
all_tagsFull raw OpenStreetMap tag object
source_urlLink to the element on openstreetmap.org
full_addressAll present address parts in one string (e.g. Main St 1, 10115 Berlin) — convenient for CRM/mail-merge
map_urlGoogle Maps link to the coordinates

Example output

{
"name": "Cafe Frisch",
"category": "cafe",
"brand": null,
"latitude": 49.4128139,
"longitude": 8.678372,
"street": "Jahnstraße",
"housenumber": "34",
"city": "Heidelberg",
"postcode": "69120",
"phone": null,
"email": null,
"website": "https://www.cafe-frisch.de",
"opening_hours": "Mo-Fr 06:00-18:00; Sa 06:00-12:00; Su,PH 08:00-17:00",
"cuisine": "coffee_shop",
"operator": null,
"wheelchair": "yes",
"osm_id": 305963168,
"osm_type": "node",
"source_url": "https://www.openstreetmap.org/node/305963168"
}

Any field is null when the place hasn't tagged it in OpenStreetMap. brand and email are populated for many chains and businesses (coverage varies by region) — and all_tags always carries every raw tag if you need more.

Field coverage

OpenStreetMap is community-mapped, so coverage varies by place and region. To maximise filled fields without ever inventing data, several fields fall back to alternate OSM tags on the same record:

  • streetaddr:street, else addr:place
  • housenumberaddr:housenumber, else addr:housename
  • cityaddr:city, else addr:town / addr:village / addr:suburb / addr:municipality / addr:hamlet
  • postcodeaddr:postcode, else postal_code
  • websitewebsite, else contact:website / url / contact:url
  • phonephone, else contact:phone / contact:mobile
  • emailemail, else contact:email
  • country → the place's own addr:country / addr:country_code when present; otherwise the country of the area you searched (an area / aroundLocation name resolved via Nominatim). Raw boundingBox / centerPoint searches don't fill it.
  • stateaddr:state, else addr:province (common in the US / Canada / Australia; null where not tagged)
  • branch → a chain outlet's branch/location name (OSM branch), e.g. "Times Square" for a specific Starbucks; null when not a tagged branch

Every value comes straight from OpenStreetMap (or, for the country fallback, from the geocoded area you searched). Fields that aren't mapped stay null — this scraper never guesses or fabricates a value.

Supported categories

Pass any of these in categories (use the exact key). 115+ categories grouped by theme:

Food & drink: restaurant, cafe, bar, pub, fast_food, food_court, ice_cream, biergarten

Lodging: hotel, hostel, guest_house, motel, apartment, camp_site

Groceries & food shops: supermarket, convenience, bakery, butcher, greengrocer, deli, confectionery, beverages, alcohol, kiosk, marketplace

Retail: clothes, shoes, jewelry, books, stationery, gift, toys, furniture, electronics, computer, mobile_phone, hardware, doityourself, garden_centre, florist, sports, outdoor, bicycle, pet, optician, variety_store, department_store, mall, tobacco

Health & beauty: pharmacy, chemist, hospital, clinic, doctors, dentist, veterinary, beauty, cosmetics, hairdresser

Services: laundry, dry_cleaning, travel_agency

Finance: bank, atm, bureau_de_change

Automotive & transport: fuel, charging_station, parking, car, car_repair, car_parts, car_rental, car_wash, taxi, bicycle_rental

Education: school, university, college, kindergarten, library, driving_school, language_school

Public & civic: post_office, police, fire_station, townhall, courthouse, place_of_worship, community_centre

Leisure, sport & tourism: gym, sports_centre, swimming_pool, stadium, golf_course, park, playground, marina, cinema, theatre, nightclub, museum, gallery, attraction, theme_park, zoo, viewpoint

Offices (B2B): estate_agent, lawyer, accountant, insurance, architect, it, employment_agency, company, coworking

Trades: electrician, plumber, carpenter, painter

More OpenStreetMap categories can be added on request.

FAQ

Do I need an API key or account? No — give it an area (plus optional categories/filters) and run. No data-provider key, no quota, no setup.

Is the data legal to use and redistribute? Yes. It comes from OpenStreetMap under the Open Database License (ODbL): public data you can redistribute with attribution (© OpenStreetMap contributors). No logins, no Terms-of-Service violations.

How is this different from a Google Maps scraper? It uses open OpenStreetMap data instead of scraping a site behind anti-bot defenses and Terms of Service — so it's legal, needs no API key, and returns an honest null for anything OSM hasn't mapped instead of guessing.

How much does it cost? Pay-per-result: $3 per 1,000 results — you only pay for the rows you actually get.

Which countries does it cover? Worldwide — anywhere OpenStreetMap has data.

How fresh is the data? It's pulled live from OpenStreetMap at run time, so it reflects the current map.

Data source & license

Data comes from OpenStreetMap via the public Nominatim (geocoding) and Overpass (querying) APIs. OpenStreetMap data is © OpenStreetMap contributors and licensed under the Open Database License (ODbL). If you publish or redistribute results, please attribute "© OpenStreetMap contributors".

Notes

  • Coverage and detail vary by region — OpenStreetMap is community-mapped, so dense urban areas are richer than remote ones.
  • Larger areas + many categories return more results and take longer; use maxResults to cap output.

More OpenStreetMap data actors

Part of dataquarry's family of clean, ODbL OpenStreetMap extractors — same flexible area / radius / bounding-box / name search, same honest-null data (a field that isn't mapped is left empty, never guessed):