What it does
Social media agencies and local marketers often want a simple list: which restaurants, gyms or salons in this city have a Facebook Page, and how do I reach them? Getting that from Facebook itself means logins, cookies, proxies and an account at risk, and the Graph API will not hand you pages by location.
This actor answers the question from a different direction. In the Overture Maps places dataset, Meta contributes its business places under CDLA-Permissive-2.0, so most businesses carry their Facebook Page link. The actor searches a city, bounding box or radius, keeps only places that link a real Page, normalises the URL and parses out the numeric page ID (or vanity handle), and returns the business name, category, address, coordinates, phone, website, business email and other social links. In central Lisbon, 24,243 places at confidence 0.6 or more link a Facebook Page (23,718 unique pages).
It is not a Facebook scraper and it is not affiliated with or endorsed by Meta. You get contact and location data, not page stats: no likes, followers, posts, ads, reviews or about text, and you cannot feed it a list of page URLs to look up. If that fits your workflow, it is fast, blocks nothing and costs $4 per 1,000 pages.
How it works
- You choose an area (city name, bbox or lat/lon plus radius) and optional categories such as restaurant, gym or dentist.
- The actor reads the matching part of the newest monthly Overture places release and keeps places whose links include a Facebook Page.
- Page links in many formats (numeric ids, vanity handles, /pages/ URLs, profile.php?id=, mobile hosts) are normalised and parsed into facebookPageId or pageHandle; groups, events and share links are skipped for free.
- When several places point to the same page, only the highest-confidence one is returned, so you get one row per page.
- Phones are normalised to E.164, personal-looking emails are removed, and each row carries sources, licence and attribution.
Input example
A typical run input (JSON). Every field is also available as a form in the Apify console.
{
"location": "Lisbon",
"categories": [
"restaurant"
],
"maxResults": 100,
"minConfidence": 0.6,
"requirePhone": true
}All input fields
| Field | Type | Required | Default | What it does |
|---|---|---|---|---|
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… | |
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.… |
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… |
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… |
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). |
Output example
Restaurants in Lisbon come back like this, one row per unique Facebook Page:
| 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 |
Pricing
Pay per event: you are charged only for the results you receive, with no subscription. Set a maximum total charge on any run and it stops cleanly at the cap.
| Charged for | When | Price | Per 1,000 | Worked example |
|---|---|---|---|---|
| Area query | once per run, when the area query returns at least one page | $0.003 | $3 | Any city, bbox or radius = $0.003; a query with no matching pages is free |
| Page result | Charged per Facebook Page row delivered (page URL and id, contacts, address, coordinates, sources and attribution included) | $0.004 | $4 | 50 restaurants in Lisbon = $0.003 + $0.20 = $0.203; 1,000 pages = $4.003 |
| Actor Start (platform start fee) | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.00005 | — | One run at 1 GB = $0.00005 |
Prices are read from the live Apify Store listing when this page is built. The listing is always authoritative.
Try Facebook Pages by City on Apify. Pay only for the results you get.
Run on Apify →Use cases
Prospecting for social media agencies
Build a list of local businesses that already run a Facebook Page, with a phone and website to reach the owner. Filter by category to focus on the verticals you sell to.
Seeding ad audiences and outreach by area
Get every gym or salon page inside a radius around a location, nearest first, with distanceKm on each row. Useful for hyper-local campaigns or field sales routes.
Matching pages to your CRM
Each row has the page URL, numeric page ID, website and normalised phone, which gives you several keys to join Facebook presence onto existing company records.
Market checks on social adoption
Compare how many businesses in a category link a Facebook Page across cities, with sourceUpdatedAt showing when each source last touched the record.
How it compares
| ActorForge Facebook Pages by City | Typical Facebook page scrapers | Facebook Graph API yourself | |
|---|---|---|---|
| Find pages by city or radius | Yes | Varies | No |
| Login, cookies or proxies needed | No | Often | Access token required |
| Likes, followers, posts, reviews | No | Yes | Partial, for pages you have access to |
| Look up a page URL you already have | No | Yes | Yes |
| Phone, website, email, address | Yes, where published in the source data | Partial | Partial |
| Licence for the data | CDLA-Permissive-2.0 and other permissive licences | Unclear | Meta platform terms |
| Price | $4 per 1,000 pages + $0.003 per area query | About $12 per 1,000 for the leading scraper | No per-row fee |
If you need engagement data (likes, followers, posts) or want to enrich URLs you already have, a page scraper or the Graph API is the right tool. This actor is for discovering which businesses in an area have a Page and how to contact them.
Limits and 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 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) - 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) - 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. 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.
FAQ
How can I find all Facebook business pages in a city?
Enter the city as location, optionally add categories, and run. The actor returns every business in that area whose Overture place record links a Facebook Page, up to 20,000 per run (maxResults). One run covers up to about one metro area.
Does this actor log in to Facebook or scrape facebook.com?
No. It never visits facebook.com, graph.facebook.com or any Meta service and does not use the Graph API. The page links come from the Overture Maps open data, where Meta contributes its places under CDLA-Permissive-2.0.
Why are most page URLs numeric instead of a vanity name?
That is how the links appear in the source data. Numeric links such as facebook.com/2113811702277065 open the page normally, and facebookPageId holds the id. A pageHandle is filled only when the source uses a vanity link, which is rare (about 0.1% of Lisbon pages).
Can I get page likes or follower counts?
No. There are no likes, followers, check-ins, ratings, reviews, posts, ads, opening hours, photos, creation dates or about text. The actor returns contact and location data only.
What share of pages include a phone or email?
In central Lisbon (release 2026-09-23.1), of the top 20,000 pages 91% had a phone, 65% a website and 39% a business email after the personal-email filter. Coverage varies by country and is thinner in parts of Africa and Asia.
How much does it cost?
$0.003 per area query plus $0.004 per page delivered. 50 restaurants in Lisbon cost $0.203 and 1,000 pages cost $4.003. Duplicate places pointing to the same page and rows you filter out are free.
Use it from code
Run the actor through the Apify API with the input above.
cURL
curl -X POST "https://api.apify.com/v2/acts/actor-forge~facebook-pages-data/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"location": "Lisbon", "categories": ["restaurant"], "maxResults": 100, "minConfidence": 0.6, "requirePhone": true}'JavaScript (Node.js)
// Node.js 18+ (built-in fetch). Set APIFY_TOKEN in your environment.
const input = {
"location": "Lisbon",
"categories": [
"restaurant"
],
"maxResults": 100,
"minConfidence": 0.6,
"requirePhone": true
};
const res = await fetch(
"https://api.apify.com/v2/acts/actor-forge~facebook-pages-data/run-sync-get-dataset-items",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIFY_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify(input),
}
);
const items = await res.json();
console.log(items.length, items[0]);Python
# pip install apify-client (set APIFY_TOKEN in your environment)
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"location": "Lisbon",
"categories": [
"restaurant"
],
"maxResults": 100,
"minConfidence": 0.6,
"requirePhone": True
}
run = client.actor("actor-forge/facebook-pages-data").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)The run-sync-get-dataset-items endpoint waits for the run (up to 5 minutes) and returns the dataset rows directly. For longer runs, start the run asynchronously and read the dataset when it finishes, as the Python example does. Replace APIFY_TOKEN with your own token from the Apify console.
Step-by-step guides
How to Get Local Business Leads Without Scraping Google Maps
Query the open Overture Maps places dataset by city and category with Business Places Data to get names, addresses, phones, websites and emails for…
Related actors
Business Places Data — Google Maps Alternative, 80M+ POIs
Business leads by city from open Overture Maps data: name, category, address, lat/lon, phone, website, email, socials and brand for 80M+ places…
$3 per 1,000 · area queryAny URL to Markdown — Web Pages, PDF, Word, Excel & OCR
Turn any URL into clean, LLM-ready Markdown: web pages, PDFs, Word, Excel, PowerPoint, EPUB, CSV and JSON, plus OCR for images and scanned PDFs. One…
$1 per 1,000 · page resultGoogle Ads Transparency Scraper — Competitor Ads | $0.60/1K
Scrape competitor ads from the Google Ads Transparency Center by domain, advertiser name or ID: format, first/last shown, regions, impressions, ad…
$0.60 per 1,000 · ad resultTry Facebook Pages by City on Apify. Pay only for the results you get.
Run on Apify →