# OpenStreetMap Places & POI Scraper (`crawlerbros/openstreetmap-places-scraper`) Actor

Scrape Points of Interest (POIs) and business listings from OpenStreetMap via the free Overpass API. Search by location, category, or keyword which returns name, address, coordinates, phone, website, opening hours, and OSM link. No API key required.

- **URL**: https://apify.com/crawlerbros/openstreetmap-places-scraper.md
- **Developed by:** [Crawler Bros](https://apify.com/crawlerbros) (community)
- **Categories:** Developer tools, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.00 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## OpenStreetMap Places & POI Scraper

Extract Points of Interest (POIs) and business listings from **OpenStreetMap** using the free [Overpass API](https://overpass-api.de/). Search by location, category, or keyword — no API key or account required.

> **Note:** This actor was originally designed as an Apple Maps scraper. Apple Maps requires a paid Apple Developer Server API key and its website (maps.apple.com) is a JS-SPA that returns no data without a browser session. OpenStreetMap via the Overpass API provides equivalent (or richer) globally-structured POI data completely free.

### Features

- Search POIs by **free-text query** (e.g. "Starbucks", "Italian restaurant")
- Filter by **33 OSM categories** (cafe, restaurant, hotel, hospital, school, etc.)
- Set **search radius** from 100 m to 50 km
- Returns: name, category, address, coordinates (lat/lon), phone, website, opening hours, OSM link
- Geocoding via Nominatim — just type a city name or address
- No API key, no login, no proxy required

### Input

| Field | Type | Description |
|---|---|---|
| `mode` | select | `search` (free-text) or `nearbySearch` (category browse) |
| `searchQuery` | string | Text to search in place names (used in `search` mode) |
| `location` | string | City or address to search near (e.g. "London", "Paris, France") |
| `category` | select | OSM category filter (cafe, restaurant, hotel, etc.) |
| `radius` | integer | Search radius in metres (100–50000, default 1000) |
| `maxItems` | integer | Max places to return (1–1000, default 20) |

### Output

Each record contains:

| Field | Description |
|---|---|
| `placeId` | OSM node/way/relation ID (e.g. `osm:node/123456`) |
| `name` | Place name |
| `category` | OSM amenity/shop/tourism category |
| `address` | Street address from OSM tags |
| `lat` | Latitude |
| `lon` | Longitude |
| `phone` | Phone number |
| `website` | Website URL |
| `openingHours` | Opening hours (OSM format, e.g. "Mo-Fr 07:00-20:00") |
| `cuisine` | Cuisine type (restaurants/cafes) |
| `brand` | Brand name |
| `wheelchair` | Wheelchair accessibility (`yes`/`no`/`limited`) |
| `url` | OpenStreetMap permalink |
| `scrapedAt` | ISO 8601 timestamp |

### Example Input

```json
{
  "mode": "search",
  "searchQuery": "coffee shops",
  "location": "London",
  "maxItems": 10
}
````

### Example Output

```json
{
  "placeId": "osm:node/4321765",
  "name": "Costa Coffee",
  "category": "cafe",
  "address": "10 Oxford Street, London, W1D 1BS",
  "lat": 51.5074,
  "lon": -0.1278,
  "phone": "+44 20 7946 0000",
  "website": "https://www.costa.co.uk",
  "openingHours": "Mo-Fr 07:00-20:00; Sa-Su 08:00-18:00",
  "brand": "Costa Coffee",
  "url": "https://www.openstreetmap.org/node/4321765",
  "recordType": "place",
  "scrapedAt": "2026-05-22T10:00:00+00:00"
}
```

### Supported Categories

Cafe, Restaurant, Fast Food, Bar, Pub, Hotel, Hostel, Motel, Hospital, Clinic, Pharmacy, Dentist, School, University, Library, Bank, ATM, Supermarket, Convenience Store, Bakery, Clothes Shop, Hairdresser, Parking, Fuel/Petrol Station, Gym/Fitness Centre, Park, Museum, Cinema, Theatre, Police, Post Office, Place of Worship.

### FAQ

**Is this free?** Yes. The Overpass API is completely free with no rate limits for reasonable use. No API key, no billing.

**How accurate is the data?** OpenStreetMap is crowd-sourced and updated by millions of contributors. Data quality varies by region but is generally excellent in Europe, North America, and major cities globally.

**What does "opening\_hours" format mean?** OSM uses a standardized format: `Mo-Fr 09:00-17:00; Sa 10:00-14:00`. Many parsers can interpret this directly.

**Can I search globally?** Yes. OSM covers the entire world. Just set `location` to any city or country.

**Why OpenStreetMap instead of Apple Maps?** Apple Maps requires a paid Apple Developer account for server-side API access. OSM is free, open, and programmatically accessible without restrictions.

**What's the maximum results?** Up to 1000 per run. For large city-wide scans, increase `radius` to 5000–10000m.

# Actor input Schema

## `mode` (type: `string`):

Scraping mode: 'search' for free-text name search, 'nearbySearch' for category-based search near a location.

## `searchQuery` (type: `string`):

Text to search for in place names (used in 'search' mode). E.g. 'Starbucks', 'coffee shops', 'Italian restaurant'. Also accepts 'query' as an alias.

## `query` (type: `string`):

Alias for 'searchQuery'. Text to search for in place names.

## `location` (type: `string`):

City, address, or region to search near. E.g. 'London', 'New York, NY', 'Paris, France'. Also accepts 'city' as an alias.

## `city` (type: `string`):

Alias for 'location'. City or region to search near.

## `latitude` (type: `number`):

Latitude for 'nearbySearch' mode (skips geocoding). E.g. 51.5074 for London.

## `longitude` (type: `number`):

Longitude for 'nearbySearch' mode (skips geocoding). E.g. -0.1278 for London.

## `category` (type: `string`):

Filter by OpenStreetMap category. Used in 'nearbySearch' mode. Leave blank to search all categories.

## `amenity` (type: `string`):

Alias for 'category'. OSM amenity/shop/tourism tag for nearbySearch mode.

## `radius` (type: `integer`):

Radius in metres around the location to search. Min 100m, max 50000m (50km).

## `maxItems` (type: `integer`):

Maximum number of places to return. Min 1, max 1000.

## Actor input object example

```json
{
  "mode": "search",
  "searchQuery": "coffee shops",
  "location": "London",
  "category": "cafe",
  "radius": 1000,
  "maxItems": 10
}
```

# Actor output Schema

## `items` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "search",
    "searchQuery": "coffee shops",
    "location": "London",
    "category": "cafe",
    "radius": 1000,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawlerbros/openstreetmap-places-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "search",
    "searchQuery": "coffee shops",
    "location": "London",
    "category": "cafe",
    "radius": 1000,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("crawlerbros/openstreetmap-places-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "search",
  "searchQuery": "coffee shops",
  "location": "London",
  "category": "cafe",
  "radius": 1000,
  "maxItems": 10
}' |
apify call crawlerbros/openstreetmap-places-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=crawlerbros/openstreetmap-places-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "OpenStreetMap Places & POI Scraper",
        "description": "Scrape Points of Interest (POIs) and business listings from OpenStreetMap via the free Overpass API. Search by location, category, or keyword which returns name, address, coordinates, phone, website, opening hours, and OSM link. No API key required.",
        "version": "1.0",
        "x-build-id": "PAPCLokPWZ1g10nau"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/crawlerbros~openstreetmap-places-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-crawlerbros-openstreetmap-places-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/crawlerbros~openstreetmap-places-scraper/runs": {
            "post": {
                "operationId": "runs-sync-crawlerbros-openstreetmap-places-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/crawlerbros~openstreetmap-places-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-crawlerbros-openstreetmap-places-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "search",
                            "nearbySearch"
                        ],
                        "type": "string",
                        "description": "Scraping mode: 'search' for free-text name search, 'nearbySearch' for category-based search near a location.",
                        "default": "search"
                    },
                    "searchQuery": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Text to search for in place names (used in 'search' mode). E.g. 'Starbucks', 'coffee shops', 'Italian restaurant'. Also accepts 'query' as an alias."
                    },
                    "query": {
                        "title": "Search Query (alias)",
                        "type": "string",
                        "description": "Alias for 'searchQuery'. Text to search for in place names."
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "City, address, or region to search near. E.g. 'London', 'New York, NY', 'Paris, France'. Also accepts 'city' as an alias.",
                        "default": "London"
                    },
                    "city": {
                        "title": "City (alias for Location)",
                        "type": "string",
                        "description": "Alias for 'location'. City or region to search near."
                    },
                    "latitude": {
                        "title": "Latitude",
                        "type": "number",
                        "description": "Latitude for 'nearbySearch' mode (skips geocoding). E.g. 51.5074 for London."
                    },
                    "longitude": {
                        "title": "Longitude",
                        "type": "number",
                        "description": "Longitude for 'nearbySearch' mode (skips geocoding). E.g. -0.1278 for London."
                    },
                    "category": {
                        "title": "Category (OSM amenity/shop/tourism tag)",
                        "enum": [
                            "",
                            "cafe",
                            "restaurant",
                            "fast_food",
                            "bar",
                            "pub",
                            "hotel",
                            "hostel",
                            "motel",
                            "hospital",
                            "clinic",
                            "pharmacy",
                            "dentist",
                            "school",
                            "university",
                            "library",
                            "bank",
                            "atm",
                            "supermarket",
                            "convenience",
                            "bakery",
                            "clothes",
                            "hairdresser",
                            "parking",
                            "fuel",
                            "gym",
                            "park",
                            "museum",
                            "cinema",
                            "theatre",
                            "police",
                            "post_office",
                            "place_of_worship"
                        ],
                        "type": "string",
                        "description": "Filter by OpenStreetMap category. Used in 'nearbySearch' mode. Leave blank to search all categories.",
                        "default": ""
                    },
                    "amenity": {
                        "title": "Amenity (alias for Category)",
                        "type": "string",
                        "description": "Alias for 'category'. OSM amenity/shop/tourism tag for nearbySearch mode."
                    },
                    "radius": {
                        "title": "Search Radius (metres)",
                        "minimum": 100,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Radius in metres around the location to search. Min 100m, max 50000m (50km).",
                        "default": 1000
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum number of places to return. Min 1, max 1000.",
                        "default": 20
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
