OpenStreetMap Places Scraper – POI & Local Business Data
Pricing
from $3.00 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
a day ago
Last modified
Categories
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
| Field | Type | Description |
|---|---|---|
area | string | Place to search within, e.g. "Berlin, Germany". Geocoded to a bounding box via Nominatim. |
categories | array | Place categories to extract, e.g. ["restaurant","cafe","hotel"]. |
searchTerm | string | (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. |
aroundLocation | string | (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. |
radiusMeters | integer | (optional) Radius in meters for the around-a-location search (default 1000). |
centerPoint | object | (advanced) Explicit center { "lat":.., "lon":.. } to search around. Overrides aroundLocation. |
maxResults | integer | Maximum number of POIs to return (default 1000). |
boundingBox | object | (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:
| Field | Description |
|---|---|
name | Place name |
category | Primary category (e.g. cafe, lawyer, charging_station) |
brand | Brand / chain name when tagged — useful for competitor & chain mapping |
brand_wikidata | Wikidata id of the brand (e.g. Q38076) — a stable entity id for brand / market-share analysis |
brand_logo | Official brand logo image URL (from the brand's Wikidata entry) when one exists — handy for directories/UIs; null otherwise |
latitude, longitude | Coordinates |
street, housenumber, city, postcode, country | Address parts (see Field coverage below for fallbacks) |
phone, email, website, opening_hours | Contact details and hours |
cuisine | Cuisine type(s) for food places, e.g. italian;pizza |
operator | Who operates the place (chains, councils, franchises) |
wheelchair | Accessibility: yes / no / limited |
osm_id, osm_type | OpenStreetMap identifiers |
all_tags | Full raw OpenStreetMap tag object |
source_url | Link to the element on openstreetmap.org |
full_address | All present address parts in one string (e.g. Main St 1, 10115 Berlin) — convenient for CRM/mail-merge |
map_url | Google 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:
street→addr:street, elseaddr:placehousenumber→addr:housenumber, elseaddr:housenamecity→addr:city, elseaddr:town/addr:village/addr:suburb/addr:municipality/addr:hamletpostcode→addr:postcode, elsepostal_codewebsite→website, elsecontact:website/url/contact:urlphone→phone, elsecontact:phone/contact:mobileemail→email, elsecontact:emailcountry→ the place's ownaddr:country/addr:country_codewhen present; otherwise the country of the area you searched (anarea/aroundLocationname resolved via Nominatim). RawboundingBox/centerPointsearches don't fill it.state→addr:state, elseaddr:province(common in the US / Canada / Australia;nullwhere not tagged)branch→ a chain outlet's branch/location name (OSMbranch), e.g."Times Square"for a specific Starbucks;nullwhen 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
maxResultsto 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):
- OpenStreetMap Places Scraper — POI & local business, 115+ categories
- EV Charging Stations Scraper — socket types, power (kW), networks
- Hotels & Lodging Scraper — stars, rooms, brands
- Healthcare Facilities Scraper — pharmacies, doctors, dentists, clinics
- Tourist Attractions & Museums Scraper — Wikidata & Wikipedia links
- Fuel Station Scraper — fuel types, brands, payment methods
- Supermarket & Grocery Scraper — brands, organic, payment methods