# Business Locations Worldwide: Shops, Restaurants, Services (`scrapemint/business-locations-worldwide`) Actor

Keyless business listings anywhere on earth. Name a city, or pass a bounding box or a radius around a point, and get every restaurant, hotel, pharmacy, supermarket, bank, gym or charging point mapped there, with brand, address, phone, website, email and opening hours. No browser and no proxy.

- **URL**: https://apify.com/scrapemint/business-locations-worldwide.md
- **Developed by:** [Ken M](https://apify.com/scrapemint) (community)
- **Categories:** Lead generation, Business
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$6.00 / 1,000 place rows

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## Business Locations Worldwide: Shops, Restaurants, Services

Every restaurant, hotel, pharmacy, supermarket, bank, gym or charging point mapped in any city on earth, with the name, brand, address, phone, website, email and opening hours the map carries.

Name a city and the boundary is resolved for you, or pass your own bounding box or a radius around a point. No key, no login, no proxy.

### What you get

| Field | Meaning |
| --- | --- |
| `category`, `name`, `brand`, `operator` | What it is and who runs it |
| `latitude`, `longitude` | Exact position, including for premises mapped as building outlines |
| `street`, `houseNumber`, `postcode`, `cityName`, `country` | Address as mapped |
| `phone`, `website`, `email`, `openingHours` | Contact details where the map has them |
| `cuisine`, `wheelchair`, `takeaway`, `outdoorSeating` | Useful extras on hospitality listings |
| `hasWebsite`, `hasPhone` | Quick filters for outreach lists |
| `osmType`, `osmId`, `osmUrl` | The exact record, so anything can be checked or corrected at source |

### Categories

`restaurant`, `cafe`, `bar`, `pub`, `fast_food`, `hotel`, `guest_house`, `hostel`, `supermarket`, `convenience`, `bakery`, `butcher`, `clothing`, `hairdresser`, `beauty`, `pharmacy`, `doctor`, `dentist`, `hospital`, `veterinary`, `bank`, `atm`, `fuel`, `ev_charging`, `gym`, `coworking`, `car_dealer`, `car_repair`, `electronics`, `furniture`, `hardware`, `florist`, `optician`, `school`, `kindergarten`, `cinema`, `museum`.

### Example input

```json
{
  "city": "Lisbon, Portugal",
  "categories": ["restaurant", "cafe", "hotel"],
  "maxResults": 150
}
```

An outreach list of gyms with a phone number, in a precise rectangle:

```json
{
  "boundingBox": "40.70,-74.02,40.78,-73.95",
  "categories": ["gym", "coworking"],
  "requirePhone": true
}
```

Every Starbucks within 3km of a point:

```json
{
  "latitude": "52.52",
  "longitude": "13.405",
  "radiusMeters": 3000,
  "categories": ["cafe"],
  "brand": "Starbucks"
}
```

### Three things worth knowing

**Results are ranked by how complete the listing is, not by map order.** The map server returns every point first and every building outline afterwards, so a capped run taken in that order would hand back only points and quietly drop the businesses mapped as outlines, which skews against larger premises. Ranking by completeness fixes both problems at once: in testing, an 80 row run went from zero building-outline records and patchy contacts to every single row carrying both a website and a phone number.

**Contact coverage varies, and that is the honest trade-off.** This is community maintained mapping, so a chain café in a capital city usually carries phone, website, email and opening hours, while a small independent may carry only a name and a position. Use `requireWebsite` or `requirePhone` when the output feeds outreach, and expect a smaller, richer list.

**The map servers are free community infrastructure.** They are occasionally busy and answer with an error page rather than data, so this actor rotates across several and reports plainly when they are all unavailable rather than returning an empty result as if the area were empty. Smaller areas always run faster and fail less.

### Pricing

Pay per place, `$0.006`. The first 2 rows of every run are free. Unknown categories, areas with nothing mapped, and runs where every server was busy return a free note and are never charged.

### Attribution

Data from OpenStreetMap contributors, available under the Open Database Licence. Every row carries the `osmUrl` of the underlying record.

### Related actors

- **Website Contact Scraper** to enrich the websites this returns with more contact details
- **Local Lead Pipeline** for a fuller lead workflow
- **Global Company Verification** to confirm a company's legal registration

# Actor input Schema

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

Anywhere on earth, e.g. Lisbon, Portugal or Austin, Texas. The boundary is resolved for you. Ignored if you give a bounding box or a radius.

## `categories` (type: `array`):

restaurant, cafe, bar, pub, fast\_food, hotel, guest\_house, hostel, supermarket, convenience, bakery, butcher, clothing, hairdresser, beauty, pharmacy, doctor, dentist, hospital, veterinary, bank, atm, fuel, ev\_charging, gym, coworking, car\_dealer, car\_repair, electronics, furniture, hardware, florist, optician, school, kindergarten, cinema, museum.

## `boundingBox` (type: `string`):

south,west,north,east in decimal degrees. Overrides the city, and is the precise way to cover a district or a delivery zone.

## `latitude` (type: `string`):

Decimal degrees, e.g. 52.52. Use with longitude and radius to search around a point instead of an area.

## `longitude` (type: `string`):

Decimal degrees, e.g. 13.405. Use with latitude and radius.

## `radiusMeters` (type: `integer`):

Search this far around the point. Up to 50000.

## `brand` (type: `string`):

Keep only places carrying this brand, e.g. Starbucks, Lidl, Shell. Case insensitive.

## `requireWebsite` (type: `boolean`):

Useful when the output feeds outreach rather than a map.

## `requirePhone` (type: `boolean`):

Keep only listings carrying a phone number.

## `requireOpeningHours` (type: `boolean`):

A rough proxy for how well maintained a listing is.

## `maxResults` (type: `integer`):

Cap on places returned. Controls total cost.

## Actor input object example

```json
{
  "city": "Lisbon, Portugal",
  "categories": [
    "restaurant",
    "cafe",
    "hotel"
  ],
  "boundingBox": "",
  "latitude": "",
  "longitude": "",
  "radiusMeters": 0,
  "brand": "",
  "requireWebsite": false,
  "requirePhone": false,
  "requireOpeningHours": false,
  "maxResults": 150
}
```

# 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 = {
    "city": "Lisbon, Portugal",
    "categories": [
        "restaurant",
        "cafe",
        "hotel"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapemint/business-locations-worldwide").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 = {
    "city": "Lisbon, Portugal",
    "categories": [
        "restaurant",
        "cafe",
        "hotel",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("scrapemint/business-locations-worldwide").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "city": "Lisbon, Portugal",
  "categories": [
    "restaurant",
    "cafe",
    "hotel"
  ]
}' |
apify call scrapemint/business-locations-worldwide --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapemint/business-locations-worldwide"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/SeXNJexXRv9OdZZza/builds/vll1jSedckBJqQtG3/openapi.json
