# Facebook Pages by City — Open Data, Not Affiliated with Meta (`actor-forge/facebook-pages-data`) Actor

Facebook Page leads by city: page URL and ID, name, category, address, lat/lon, phone, website, email and other socials, from Overture Maps open data (Meta contribution, CDLA-Permissive-2.0). Never fetches facebook.com; no likes, followers or posts. Not affiliated with Meta. $4 per 1,000 pages.

- **URL**: https://apify.com/actor-forge/facebook-pages-data.md
- **Developed by:** [ActorForge](https://apify.com/actor-forge) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 area queries

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Facebook Pages by City — Open Data, Not Affiliated with Meta

Facebook Page leads by city: page URL and ID, name, category, address, lat/lon, phone, website, email and other socials, from Overture Maps open data (Meta contribution, CDLA-Permissive-2.0). Never fetches facebook.com; no likes, followers or posts. Not affiliated with Meta. $4 per 1,000 pages.

**Facebook page contact and location data, not page stats.** Type a city and a business type ("restaurants in Lisbon", "dentists in Austin TX", "gyms in Manchester") and get **one row per Facebook Business Page**: the **page URL** (normalised, with the numeric **page ID** or vanity **handle** parsed out), the business **name, category, full address, latitude/longitude, phone numbers, website, business email** and **other social links** (Instagram, X, LinkedIn...). The rows come from the **Overture Maps Foundation places dataset**, open GeoParquet refreshed monthly, where **Meta contributes its business places under CDLA-Permissive-2.0**, so most businesses carry their Facebook Page link. In central Lisbon, **24,243 of the places at confidence 0.6 or more link a Facebook Page** (23,718 unique Facebook business pages). **Nothing is fetched from facebook.com**: no login, no cookies, no proxies, no blocks, and a whole city comes back in seconds. Search by city name (32,000+ cities built in), bounding box or lat/lon + radius; filter by **2,100+ categories**, name and confidence, and keep only pages with a phone, email or website. Every row carries its **sources, licence and attribution**, and the licences are permissive (no share-alike), so you may store, enrich and resell the leads. **$4 per 1,000 pages plus $0.003 per area query**, a third of the leading Facebook pages scraper's $12 per 1,000.

**What it is not:** this actor is **not affiliated with or endorsed by Meta**, and it is not a Facebook scraper. There are **no likes, followers, ratings, reviews, posts, ads, page creation dates or "about" text**. It cannot look up a page URL you already have; it finds pages by location. Pages are as fresh as the latest monthly Overture release.

📘 **Step-by-step guide:** [How to Get Local Business Leads Without Scraping Google Maps](https://devtaonas.github.io/actorforge-site/guides/business-leads-without-google-maps/)

### What data does it return?

Every run outputs clean, schema-validated rows like these:

| facebookUrl | name | category | fullAddress | phones | websites | emails | confidence |
| --- | --- | --- | --- | --- | --- | --- | --- |
| https://www.facebook.com/2113811702277065 | Zenith Brunch & Cocktails | restaurant | Rua do Telhal, 4, Lisboa, 1150-346, PT | +351211527583 | http://www.zenithcaffe.pt | lisboa@zenithcaffe.pt | 0.9998 |
| https://www.facebook.com/104278498501896 | Rocco Ristorante | restaurant | R. Ivens 14, Lisboa, 1200-227, PT | +351210543168 | https://www.rocco.pt/ | rocco@rocco.pt | 0.9998 |
| https://www.facebook.com/852281738198577 | Sala de Corte | steakhouse | Rua da Ribeira Nova, 28, Lisboa, 1200-376, PT | +351213460030 | https://www.saladecorte.pt/ | saladecorte@saladecorte.pt | 0.9998 |
| https://www.facebook.com/100778948316901 | A Severa Restaurant | portuguese_restaurant | R. das Gáveas 51, Lisboa, 1200-206, PT | +351213428314 | http://www.asevera.com/ | reservas@asevera.com | 0.9997 |
| https://www.facebook.com/218914655356179 | Restaurante Capricciosa | italian_restaurant | Doca de Santo Amaro, Calçada Santo Amaro Armazém 8, Lisboa, 1350-353, PT | +351213955977 | http://www.capricciosa.com.pt/ |  | 0.9998 |

### How much does it cost?

Transparent pay-per-event pricing — you only pay for what you get, and the
actor **always respects your run budget**: set a maximum total charge and it
stops cleanly at the cap instead of overrunning.

| Event | Price | Charged | Worked example |
| --- | --- | --- | --- |
| `area-query` | $0.003 | once per run, when the area query returns at least one page | Any city, bbox or radius = $0.003; a query with no matching pages is free |
| `page-result` | $0.004 | per Facebook Page row delivered (page URL and id, contacts, address, coordinates, sources and attribution included) | 50 restaurants in Lisbon = $0.003 + $0.20 = $0.203; 1,000 pages = $4.003 |
| `apify-actor-start` | $0.00005 | per run per GB of memory (platform start fee) | One run at 1 GB = $0.00005 |

### Input options

| Field | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `location` | string | no | — | A city, optionally with region or country: "Lisbon", "Austin, TX", "Paris France". You can also type "restaurants in Lisbon" (the part before "in" becomes the category when Categories is empty), coordinates "38.7223,-9.1393,3km", or a bbox "west,south,east,north". 32,000+ cities with 15,000+ people are built in; smaller towns are looked up in Overture's own divisions data and need a region or country. Ignored when bbox or lat/lon are set. |
| `categories` | array | no | `[]` | Plain words (restaurant, dentist, hotel, gym, lawyer, coffee...) or Overture category ids (dental_clinic, italian_restaurant...). A parent category includes its children, so restaurant also returns italian_restaurant. Empty = every business with a Facebook Page in the area. Run with listCategories to see all 2,100+ ids. |
| `keyword` | string | no | `""` | Optional. Only places whose name (or brand name) contains this text, case-insensitive, e.g. "Starbucks" or "dental". |
| `maxResults` | integer | no | `500` | Stop after this many Facebook Pages. Highest-confidence places come first (nearest first for a radius search). Pages beyond the cap are never charged. |
| `minConfidence` | number | no | `0.6` | Overture's 0-1 confidence that the place exists as described. 0.6 (default) drops most stale or duplicate records; 0.9 keeps only well-corroborated places; 0 returns everything. |
| `bbox` | array | no | — | Optional \[west, south, east, north] in degrees (longitude, latitude, longitude, latitude), e.g. \[-9.20, 38.69, -9.10, 38.76]. Up to 1.5 x 1.5 degrees (about one metro area). Takes priority over location. |
| `lat` | number | no | — | Optional centre latitude for a radius search (with lon and radiusKm). Takes priority over location. |
| `lon` | number | no | — | Optional centre longitude for a radius search. |
| `radiusKm` | number | no | — | Radius for lat/lon (default 5 km). With a city name it searches this radius around the city centre instead of the whole city. Results get distanceKm and come nearest first. |
| `countryCode` | string | no | `""` | Optional two-letter ISO code (US, DE, GB...). Picks the right city when a name exists in several countries and keeps only places whose address is in that country. |
| `requireWebsite` | boolean | no | `false` | Skip businesses without a website. Skipped rows are never charged. |
| `requirePhone` | boolean | no | `false` | Skip businesses without a phone number. Skipped rows are never charged. |
| `requireEmail` | boolean | no | `false` | Skip businesses without a business email (after the personal-email filter). Skipped rows are never charged. |
| `includePhones` | boolean | no | `true` | Business phone numbers as published for the place, normalised to E.164 (+15125550100) where possible. |
| `includeEmails` | boolean | no | `true` | Business emails from the source data. Addresses on the business's own website domain and role mailboxes (info@, office@, bookings@...) are kept; free-mail addresses (gmail, outlook...) are kept only when they contain the business name. Others are dropped as possibly personal and counted in droppedPersonalEmails. |
| `matchAlternateCategories` | boolean | no | `false` | Also return places whose secondary (alternate) categories match, not only their main category. Wider but less precise. |
| `includeFields` | array | no | `[]` | Optional. Keep only these fields in each row (facebookUrl is always kept). Any of: facebookUrl, pageHandle, facebookPageId, name, category, categoryHierarchy, phones, websites, emails, otherSocials, address, fullAddress, lat, lon, distanceKm, brand, confidence, sourceUpdatedAt, overtureId, sources, licence, licenceUrls, attribution, overtureRelease, droppedPersonalEmails. Keep attribution if you republish the data. |
| `listCategories` | boolean | no | `false` | Instead of places, output Overture's category list (id, parent, hierarchy, worldwide place count). Filter it with Categories or Name contains, e.g. "dent". Free. |
| `release` | string | no | `""` | Optional, advanced: pin an Overture release such as 2026-09-23.1. Empty = the newest release (Overture publishes monthly). |

### Limits & honest notes

- Not Meta data via Facebook: the rows come from Overture Maps open data. There are no likes, followers, check-ins, ratings, reviews, posts, ads, opening hours, photos, page creation dates or "about" text, and nothing is fetched from facebook.com.
- No page-URL lookup: you search by location, not by a list of page URLs (matching a given URL would mean scanning 80M+ places per run).
- Most page links are numeric ids (facebook.com/2113811702277065), which open the page as normal; a vanity handle (pageHandle) is filled only when the source link uses one, which is rare (about 0.1% of Lisbon pages). facebookPageId holds the id when the link carries one.
- Coverage, central Lisbon (release 2026-09-23.1, confidence 0.6 or more): 24,243 places with a Facebook Page link, 23,718 unique pages; of the top 20,000 pages 91% have a phone, 65% a website and 39% a business email (after the personal-email filter); 0.7% list another social profile. Coverage varies by country and is thinner in parts of Africa and Asia.
- Freshness follows Overture's monthly releases; sourceUpdatedAt shows when the contributing source last updated each row. A closed business or a deleted page can still appear until a source drops it; minConfidence (default 0.6) filters most stale records.
- One row per page: when several places link the same page (chains, duplicates), only the highest-confidence place is returned and the rest are free. Places whose link is not a page (groups, events, share links) are skipped and free.
- One query per run, up to 1.5 x 1.5 degrees (about one metro area). For a region or country, run once per city. A city query typically reads 15-45 MB of public GeoParquet in 5-15 seconds at 1 GB memory.
- Business contacts only: phones, emails and socials are the business's published contacts. Free-mail addresses that do not contain the business name and off-domain personal-looking addresses are removed (counted in droppedPersonalEmails). You remain responsible for how you use the data under GDPR, CAN-SPAM and similar laws.
- The run's spend limit is respected: the area query is reserved first, pages are charged before delivery, and the run stops cleanly at the limit.

### Data licence and attribution

Places come from the [Overture Maps Foundation](https://overturemaps.org) places theme. Each row's `sources` lists the contributing datasets with their record ids, `licence` and `licenceUrls` give the licences, and `attribution` holds the required credit lines. If you republish the data, keep the `attribution` field (or show the lines below).

- © Overture Maps Foundation, overturemaps.org
- Meta, Microsoft, PinMeTo, Krick, RenderSEO, DAC, BrightQuery: "Data from <source>. Available under CDLA Permissive 2.0." ([CDLA-Permissive-2.0](https://cdla.dev/permissive-2-0/))
- Foursquare: "Copyright 2024 Foursquare Labs, Inc. All rights reserved. Available under Apache 2.0. Foursquare data was transformed to the Overture schema. Changed: 2026-03-18." ([Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0))
- AllThePlaces: "Data from AllThePlaces. Available under CC0 1.0."

None of these licences is share-alike, so the rows may be used commercially, stored, merged with your own data and redistributed, provided the attribution and licence texts travel with them.

City boundaries used to turn a city name into a search area come from the Overture divisions theme: © OpenStreetMap contributors, Overture Maps Foundation, available under the [Open Database License (ODbL) 1.0](https://opendatacommons.org/licenses/odbl/1-0/). They are used only for the search area and are not part of the output rows. The built-in city list is a derivative database offered under the ODbL; it is rebuilt from the public Overture release by a documented query.

**Changes made by this actor:** rows are selected by area, category, name, confidence and the presence of a Facebook Page link; page links are normalised and parsed into a handle or id; repeated pages are removed; fields are flattened and renamed; phone numbers are normalised to E.164; possibly personal emails are removed.

**Foursquare OS Places NOTICE** (preserved in full, as Apache-2.0 requires; also included in the run's OUTPUT record whenever Foursquare rows are delivered):

> © 2026 Foursquare Labs, Inc. All rights reserved.
>
> The Foursquare OS Places dataset (the "Data") is licensed under the Apache License, Version 2.0 (the "License"). You may not use, modify, or distribute the Data except in compliance with the License.
>
> As set forth more fully in the License, if you use, modify, or distribute the Data, you must: provide recipients with a copy of the License; if applicable, include prominent notices to the extent you've changed the Data; preserve attribution to Foursquare, including preserving the full content of this NOTICE.txt file.
>
> To ensure appropriate attribution to Foursquare, we recommend the following: if using/distributing the Data in flat file form as-is or after making changes/modifications: include this NOTICE.txt file, which may be modified to include an additional notice of your changes/modifications, if any; if using/distributing the Data in API form as-is or after making changes/modifications: include a copy of the content from this NOTICE.txt file prominently in your developer documentation for such API, which may be modified to include an additional notice of your changes/modifications, if any.
>
> You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0. Unless required by applicable law or agreed to in writing, the Data distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

This actor is **not affiliated with, endorsed by or sponsored by Meta Platforms, Inc.**, Facebook, the Overture Maps Foundation or any data contributor. "Facebook" is a trademark of Meta Platforms, Inc. and is used only to describe the page links contained in the open data. The data comes from the Overture Maps places dataset (where Meta contributes its places under CDLA-Permissive-2.0); this actor never visits facebook.com, graph.facebook.com or any Meta service, and it does not use the Facebook Graph API.

### Related ActorForge actors

- [Business Places Data — Google Maps Alternative, 80M+ POIs](https://apify.com/actor-forge/business-places-data) — every business in the area, with or without a Facebook Page, at $1 per 1,000 places
- [Contact Details Scraper — Company Emails, Phones & Socials](https://apify.com/actor-forge/contact-details-scraper) — find more role emails and socials on the websites in your page list
- [Domain Enrichment for Clay — Tech, DNS, WHOIS, Logo & Socials](https://apify.com/actor-forge/domain-enrichment) — turn the websites into company rows: logo, socials, email provider, domain age
- **Learn more:** [How to Get Local Business Leads Without Scraping Google Maps](https://devtaonas.github.io/actorforge-site/guides/business-leads-without-google-maps/)

### Changelog

- **2026-10-20** — Initial release: Facebook Business Pages by city from Overture Maps places (release 2026-09-23.1); page URL normalisation (numeric ids, vanity handles, /pages/<name>/<id>, profile.php?id=, m./web./language hosts) with handle and id parsing; one row per page; business-only email filter; per-row sources, licence and attribution.

***

*Built and maintained by **ActorForge**. Reliability first: every actor in the
portfolio is monitored by an automated nightly self-test, and breakages are
typically fixed the same day.*

# Actor input Schema

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

A city, optionally with region or country: "Lisbon", "Austin, TX", "Paris France". You can also type "restaurants in Lisbon" (the part before "in" becomes the category when Categories is empty), coordinates "38.7223,-9.1393,3km", or a bbox "west,south,east,north". 32,000+ cities with 15,000+ people are built in; smaller towns are looked up in Overture's own divisions data and need a region or country. Ignored when bbox or lat/lon are set.

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

Plain words (restaurant, dentist, hotel, gym, lawyer, coffee...) or Overture category ids (dental_clinic, italian_restaurant...). A parent category includes its children, so restaurant also returns italian_restaurant. Empty = every business with a Facebook Page in the area. Run with listCategories to see all 2,100+ ids.

## `keyword` (type: `string`):

Optional. Only places whose name (or brand name) contains this text, case-insensitive, e.g. "Starbucks" or "dental".

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

Stop after this many Facebook Pages. Highest-confidence places come first (nearest first for a radius search). Pages beyond the cap are never charged.

## `minConfidence` (type: `number`):

Overture's 0-1 confidence that the place exists as described. 0.6 (default) drops most stale or duplicate records; 0.9 keeps only well-corroborated places; 0 returns everything.

## `bbox` (type: `array`):

Optional \[west, south, east, north] in degrees (longitude, latitude, longitude, latitude), e.g. \[-9.20, 38.69, -9.10, 38.76]. Up to 1.5 x 1.5 degrees (about one metro area). Takes priority over location.

## `lat` (type: `number`):

Optional centre latitude for a radius search (with lon and radiusKm). Takes priority over location.

## `lon` (type: `number`):

Optional centre longitude for a radius search.

## `radiusKm` (type: `number`):

Radius for lat/lon (default 5 km). With a city name it searches this radius around the city centre instead of the whole city. Results get distanceKm and come nearest first.

## `countryCode` (type: `string`):

Optional two-letter ISO code (US, DE, GB...). Picks the right city when a name exists in several countries and keeps only places whose address is in that country.

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

Skip businesses without a website. Skipped rows are never charged.

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

Skip businesses without a phone number. Skipped rows are never charged.

## `requireEmail` (type: `boolean`):

Skip businesses without a business email (after the personal-email filter). Skipped rows are never charged.

## `includePhones` (type: `boolean`):

Business phone numbers as published for the place, normalised to E.164 (+15125550100) where possible.

## `includeEmails` (type: `boolean`):

Business emails from the source data. Addresses on the business's own website domain and role mailboxes (info@, office@, bookings@...) are kept; free-mail addresses (gmail, outlook...) are kept only when they contain the business name. Others are dropped as possibly personal and counted in droppedPersonalEmails.

## `matchAlternateCategories` (type: `boolean`):

Also return places whose secondary (alternate) categories match, not only their main category. Wider but less precise.

## `includeFields` (type: `array`):

Optional. Keep only these fields in each row (facebookUrl is always kept). Any of: facebookUrl, pageHandle, facebookPageId, name, category, categoryHierarchy, phones, websites, emails, otherSocials, address, fullAddress, lat, lon, distanceKm, brand, confidence, sourceUpdatedAt, overtureId, sources, licence, licenceUrls, attribution, overtureRelease, droppedPersonalEmails. Keep attribution if you republish the data.

## `listCategories` (type: `boolean`):

Instead of places, output Overture's category list (id, parent, hierarchy, worldwide place count). Filter it with Categories or Name contains, e.g. "dent". Free.

## `release` (type: `string`):

Optional, advanced: pin an Overture release such as 2026-09-23.1. Empty = the newest release (Overture publishes monthly).

## Actor input object example

```json
{
  "location": "Lisbon",
  "categories": [
    "restaurant"
  ],
  "keyword": "",
  "maxResults": 100,
  "minConfidence": 0.6,
  "countryCode": "",
  "requireWebsite": false,
  "requirePhone": false,
  "requireEmail": false,
  "includePhones": true,
  "includeEmails": true,
  "matchAlternateCategories": false,
  "includeFields": [],
  "listCategories": false,
  "release": ""
}
```

# Actor output Schema

## `pages` (type: `string`):

One row per Facebook Page (charged): page URL, handle/ID, name, category, address, lat/lon, phones, websites, emails, other socials, sources, licence and attribution.

## `leads` (type: `string`):

The same rows as a flat contact table: name, page URL, category, phones, emails, websites, other socials and address parts.

## `summary` (type: `string`):

OUTPUT record: the resolved area and categories, Overture release, places matched, pages delivered, contact coverage, billing summary, licences and (when Foursquare rows are present) the Foursquare NOTICE.

# 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 = {
    "location": "Lisbon",
    "categories": [
        "restaurant"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("actor-forge/facebook-pages-data").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 = {
    "location": "Lisbon",
    "categories": ["restaurant"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("actor-forge/facebook-pages-data").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 '{
  "location": "Lisbon",
  "categories": [
    "restaurant"
  ],
  "maxResults": 100
}' |
apify call actor-forge/facebook-pages-data --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,actor-forge/facebook-pages-data"
        }
    }
}
```

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/2ZcmfvYHpCPE78Qhz/builds/Od6PdmMcUZMzkUoMm/openapi.json
