# Facebook Page ID Finder: Names to Page IDs (`automation_craft/facebook-page-id-finder`) Actor

Facebook page ID finder for brand, advertiser and page names in bulk, no login. Get every page that carries the exact name with its page ID, likes, category, verification and Instagram, or paste links, @handles and IDs. Add page transparency, contact details and ads. CSV, JSON or API.

- **URL**: https://apify.com/automation_craft/facebook-page-id-finder.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** Social media, Marketing, Developer tools
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.47 / 1,000 page matches

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

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 Page ID Finder: Names to Page IDs

**Facebook Page ID Finder** turns brand, advertiser and page names into Facebook page IDs in bulk, without a login and without a Facebook app. Paste up to 10,000 names, @handles, page links, Ad Library links, page ids or company websites, and get one row per input: every page that carries exactly that name, with its page id, alias, category, likes, verification and linked Instagram account, plus the other pages the Meta Ad Library suggested. Optional add-ons read each matched page's transparency facts (creation date, name changes, the countries of the people who manage it, the confirmed owner, the active ads count), its public contact section and its first ads.

The page id is what the Meta Ad Library, the Graph API, Ads Manager and Ad Library scrapers ask for. Facebook's help pages send a page's admins to that page's own transparency section to find it; for any other page there is no box that turns a name into its id. This Actor reads it from the Meta Ad Library's own search box, the same way the Ad Library website finds pages.

### What does Facebook Page ID Finder do?

- **Names to page ids in bulk.** One lookup per name, worldwide or in the one country you choose, up to 10,000 inputs in one run.
- **Every page of a name, never a guess.** A name like "adidas" is carried by eleven pages (the global page and country pages). All of them are listed with their facts; the page id column is filled when exactly one page carries the name, or when you choose how to pick one (the page whose address is the name, a website, the most likes).
- **Any kind of input.** Names, @handles, `facebook.com/<page>` links, `profile.php?id=` links, Ad Library links (`view_all_page_id` or a search), numeric page ids (either of a page's two ids) and company websites (`patagonia.com`).
- **A free row for every input without a match**, with the closest pages the Ad Library suggested and the reason.
- **Page details** (paid add-on): creation date, name change dates, admin countries with counts, confirmed owner with address and phone, state media label, active ads count, related country pages, the page's second id, ad spend by disclaimer for one country.
- **Page contact** (paid add-on): website, phone, e-mail, address, rating with review count, hours, price range, services, followers, cover photo.
- **Page ads** (paid add-on): up to 30 of a page's ads from the Ad Library with text, link, call to action, images, videos, platforms and dates.

### How to find Facebook page IDs

1. Open the Actor and paste your names into **Names, links or ids**, one per line. Add `| website.com` after a name to tell pages of one name apart: `Patagonia | patagonia.com`.
2. Keep **When several pages match** on "Pick the page whose address is the name" to get one page id for most brands, or choose "List them all" to get every page and pick yourself.
3. Switch on **Page details**, **Page contact** or **Ads per page** if you need them.
4. Click **Start**. A run of 120 names takes about one minute.
5. Download the results as JSON, CSV or Excel, or read them through the API.

### What you get

One `pageMatch` row per input. The main fields:

| Field | What it holds | Filled (measured) |
|---|---|---|
| `input`, `inputIndex` | the value as you gave it and its place in the run | every row |
| `status` | `matched`, `multiple_matches`, `no_exact_match`, `matches_filtered_out`, `not_found`, `invalid_input`, `duplicate_input`, `lookup_failed`, `skipped` | every row |
| `pageId` | the page id (the classic id the Ad Library, the Graph API and Ads Manager use) | 93 of 120 brand, artist, news, sport, local business and government names with "Pick the page whose address is the name" |
| `pageName`, `pageAlias`, `pageUrl`, `adLibraryUrl` | the page's name, the vanity name in its address, its address and its Ad Library view | alias on 72 percent of matching pages |
| `category`, `likes`, `verification`, `isVerified` | category (in English), like count, blue verification | category 100, likes 95 percent |
| `igUsername`, `igFollowers`, `igVerified` | the Instagram account linked to the page | 56 percent |
| `entityType`, `country`, `isDeleted`, `imageUrl` | the Ad Library's page type, the page's country (country pages of global brands), the deleted flag, the profile picture | country 43 percent |
| `matchType`, `rank`, `foundBy`, `pickedBy` | how the page matched (`name`, `name_folded`, `alias`, `id`, `profile_id`), its place in the Ad Library's list, where it was found, which rule picked it | every matched row |
| `matches`, `matchCount`, `matchPageIds` | every page that carries the name, each with the fields above | every matched row |
| `candidates`, `candidateCount` | the other pages the Ad Library suggested | 5 by default, up to 15 |
| `message` | why a row is free | free rows |

Fill rates are from 639 matching pages of a platform run of 120 names (2026-10-13). A real row:

```json
{
  "type": "pageMatch",
  "input": "Nike",
  "status": "matched",
  "pageId": "15087023444",
  "pageName": "Nike",
  "pageAlias": "nike",
  "pageUrl": "https://www.facebook.com/nike",
  "adLibraryUrl": "https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=ALL&media_type=all&search_type=page&view_all_page_id=15087023444",
  "category": "Sportswear Store",
  "likes": 39504725,
  "verification": "BLUE_VERIFIED",
  "isVerified": true,
  "igUsername": "nike",
  "igFollowers": 291004422,
  "matchType": "name",
  "rank": 1,
  "matchCount": 1,
  "candidateCount": 14
}
```

#### Page details (add-on)

One `pageDetails` row per matched page, from the Meta Ad Library's About tab of the page. Fill over 20 pages of different kinds (brands, news outlets, public figures, local businesses, government and political pages, a sports team, pages with few likes): creation date 20 of 20, admin countries 19, confirmed owner 15 (address 8, phone 4), Instagram 17, about text 17, name changes 6, state media label where Facebook sets one.

```json
{
  "type": "pageDetails",
  "pageId": "15087023444",
  "profileId": "100044541544829",
  "pageName": "Nike",
  "followersText": "39M",
  "createdAt": "2008-05-21T14:51:36.000Z",
  "nameChangeCount": 1,
  "nameChanges": ["2010-07-17T00:46:00.000Z"],
  "adminCountries": [{ "country": "United States", "count": 94 }, { "country": "India", "count": 26 }, { "country": "South Korea", "count": 26 }],
  "adminCountryCount": 30,
  "adminCount": 306,
  "confirmedOwnerName": "NIKE, Inc.",
  "confirmedOwnerId": "10152356643698445",
  "activeAdsCount": 2740,
  "adsCountry": "ALL"
}
```

The active ads count is for the country of the run (`adsCountry`: ALL unless you give a country code); switch on **Total ads count** to add every ad the page ever ran. With a country code, `spend` holds the page's ad spend by disclaimer in that country (political and issue ads).

#### Page contact and Page ads (add-ons)

`pageContact` rows hold the fields the page shows in its public Contact and basic info section: `website`, `phone`, `email`, `address`, `rating`, `recommendPercent`, `reviewCount`, `hours`, `priceRange`, `services`, `followersText`, `followingText`, `coverPhotoUrl` (website on 5 of 5 sampled pages, phone 4, e-mail 3, address 1, rating 2). `pageAd` rows hold `adArchiveId`, `adUrl`, `isActive`, `startDate`, `endDate`, `platforms`, `displayFormat`, `body`, `title`, `linkUrl`, `caption`, `ctaText`, `imageUrls`, `videoUrls`.

### How a name matches a page

A page matches a name when its page name, or its alias (the name in its address), is the same text as the name once case, spaces, punctuation and accents on Latin letters are set aside: "Coca Cola", "coca-cola" and "COCA-COLA" all match a page named "Coca-Cola". It is always the whole text: "Nike" never matches "Nike Football". Deleted pages never match.

| Status | Meaning | Charged |
|---|---|---|
| `matched` | one page carries the name (or the alias, or the id you gave) | Page match |
| `multiple_matches` | several pages carry the name; all are in `matches`; `pageId` is filled only when your website or pick rule singles one out | Page match, once |
| `no_exact_match` | pages were found, none carries exactly this name; the closest are in `candidates` | free |
| `matches_filtered_out` | pages carry the name but none passes your filters (verified only, minimum likes) | free |
| `not_found` | the Ad Library knows no page for this input | free |
| `invalid_input`, `duplicate_input` | not a value this Actor reads, or the same as an earlier input | free |
| `lookup_failed`, `skipped` | Facebook did not answer after the run's tries, or the run stopped first | free |

Pick rules for names that several pages carry (all pages stay listed either way):

- **A website** after `|`: the one matching page whose alias is the website's name (`Patagonia | patagonia.com` picks facebook.com/PATAGONIA, not facebook.com/PatagoniaUK).
- **Pick the page whose address is the name** (`aliasMatch`): the global page of most brands (adidas, PUMA, LEGO, Google, McDonald's). In a run of 120 names it filled a page id for 57 of the 76 names several pages carry.
- **Most likes** or **verified with the most likes**: only when one page has strictly more likes than every other; the country pages of one global brand share one like count, so then nothing is picked.

A name can be carried only by small pages when the brand's own page is not among the 15 pages the Ad Library suggests for it; check `likes` and `isVerified` in `matches`.

Lookups that find no page cost a request each and are not charged, so a run keeps an allowance for them that grows with every name it finds: a list of real names runs through even with many misses among them, while a run of names that all match nothing stops looking up after five to ten of them (5, 10 and 9 in three platform test runs of 400 made up words). Inputs not reached get a free `skipped` row while the allowance holds its write; the summary row counts the rest (`freeRowsNotWritten`) and names the first input without a row (`firstInputWithoutRow`).

### How much does it cost to find Facebook page IDs?

Pay per event. Prices per 1,000 events:

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Page match (one input that found its page or pages) | $2.06 | $1.88 | $1.71 | $1.47 |
| Page details (one row per page) | $1.00 | $1.00 | $0.90 | $0.80 |
| Page contact (one row per page) | $1.00 | $1.00 | $0.90 | $0.80 |
| Page ad (one row per ad) | $0.50 | $0.50 | $0.45 | $0.40 |
| Actor start (once per run) | $0.003 | $0.003 | $0.003 | $0.003 |

Platinum and Diamond plans pay the Gold price. The Store pricing card shows these prices per 1,000 events: "$2.06 / 1,000" on the Page match row means one name found costs $0.00206. Inputs without a match, invalid or duplicate inputs, failed lookups and skipped inputs are free; a page read for two names of one run is charged once.

Examples at the Bronze price: 1,000 names with a match cost $0.003 + $1.88 = $1.883; 100 names with Page details for each matched page cost $0.003 + $0.188 + $0.10 = $0.291; one name costs $0.00488.

### Input

| Field | What it does |
|---|---|
| `names` | names, @handles, page links, Ad Library links, page ids or websites, one per line (also `queries`, `keywords`, `brand_name`; `pageUrls`/`startUrls`; `pageIds`; `adLibraryUrls`) |
| `countries` | `ALL` (default) or one country code such as `US`, `GB` or `DE`; one country per run (start one run per country for several) |
| `onMultipleMatches` | `list` (default for API calls), `aliasMatch`, `mostLiked`, `verifiedMostLiked` |
| `verifiedOnly`, `minLikes` | only verified pages, or pages with at least this many likes, count as matches |
| `maxCandidates` | other candidates listed per row (0 to 15, default 5) |
| `adSearchFallback` | when no suggested page matches, also look at the advertisers behind the ads that mention the name (no extra charge) |
| `pageDetails`, `includeTotalAdsCount` | the Page details add-on, and the total ads count inside it |
| `pageContact` | the Page contact add-on |
| `adsPerPage`, `adStatus`, `adMediaType` | the Page ad add-on: how many ads per page (0 to 30), active, all or inactive ads, and a media type |
| `maxDetailsPerName` | how many matching pages the add-ons read when none is picked (1 to 15, default 5) |
| `includeRawData` | adds the Ad Library's own record of each page |

```json
{
  "names": ["Nike", "Patagonia | patagonia.com", "@nike", "https://www.facebook.com/ads/library/?view_all_page_id=97830335456", "15087023444"],
  "countries": ["ALL"],
  "onMultipleMatches": "aliasMatch",
  "pageDetails": true
}
```

### Use it from the API, n8n, Make, Zapier or an AI agent

Call it like any Apify Actor: `POST https://api.apify.com/v2/acts/automation_craft~facebook-page-id-finder/run-sync-get-dataset-items?token=<your token>` with the input above as the JSON body returns the rows directly. The Apify nodes of n8n, Make and Zapier run it by name, and AI agents can run it through the Apify MCP server (`https://mcp.apify.com`) as `automation_craft/facebook-page-id-finder`. Feed `pageId` or `adLibraryUrl` to an Ad Library scraper, or use `pageId` with the Graph API.

### What this Actor does not do

- It reads public data only, logged out; it never needs or accepts cookies or a Facebook login.
- More than 15 candidate pages per name: the Ad Library suggests at most 15.
- Several countries in one run: one country per run keeps every name's lookup at one request; start one run per country.
- Keyword and location suggestions: the Ad Library's search box does not return them logged out.
- Ads past the first 30 of a page, and ads found by keyword as rows: that is the job of an Ad Library scraper (this Actor finds the pages to feed it).
- Old page names: Facebook shows when a page changed its name, not the earlier names.
- Check-ins, "talking about" counts and a business account flag: not in the public sources this Actor reads.
- E-mails and phones from a company's own website: this Actor reads Facebook only.
- A Standby (HTTP endpoint) mode.

### FAQ

#### How do I find a Facebook page ID from the page name?

Paste the name into this Actor. It asks the Meta Ad Library's own search box and returns every page that carries exactly that name with its page id. When several pages carry it (country pages of a global brand), choose "Pick the page whose address is the name" or add the brand's website after a `|`.

#### Can I get the page ID from a Facebook page link or username?

Yes. Paste `facebook.com/<page>`, `@<page>` or a `profile.php?id=` link; links whose page the Ad Library search box does not show are resolved through Facebook's page plugin. Ad Library links with `view_all_page_id` are read directly.

#### Which page ID does it return, and why do some tools show a different one?

A Facebook page has two ids: the classic page id, which the Ad Library, the Graph API and Ads Manager use (Nike: 15087023444), and the id of the newer Pages experience in the page's own address (Nike: 100044541544829). `pageId` is always the classic id; Page details also carry the second one in `profileId`. Either id works as input.

#### Can I still see who runs a Facebook page and where it is managed from?

Yes, with Page details: the Ad Library's About tab of each page shows the creation date, the countries of the people who manage the page with their counts, name change dates and the organisation Facebook confirmed as responsible for it. This Actor returns them as columns for many pages at once.

#### Why does this Actor run with limited permissions?

It runs with the least privilege Apify offers: it can only write to its own run's dataset and key-value store, and it keeps no memory between runs.

### More data tools by Automation Craft

- [Meta Ads Library Scraper - Ad Library, All Filters](https://apify.com/automation_craft/meta-ads-library-scraper)
- [Facebook Ads Library Scraper - Ad Library & Spy](https://apify.com/automation_craft/facebook-ads-library-scraper)
- [Instagram Ads Library Scraper - Creatives, Video](https://apify.com/automation_craft/instagram-ads-library-scraper)
- [Meta Ad Spend Scraper: Advertiser Spend by Country](https://apify.com/automation_craft/meta-ad-spend-scraper)
- [Facebook Posts Scraper - Page Posts, No Login](https://apify.com/automation_craft/facebook-posts-scraper)
- [Instagram Posts Scraper: Profiles, Reels, No Login](https://apify.com/automation_craft/instagram-posts-scraper)
- [Threads Scraper: Posts, Search, Tags, Replies](https://apify.com/automation_craft/threads-scraper)
- [Google Ads Transparency Scraper - Decoded Creatives](https://apify.com/automation_craft/google-ads-transparency-scraper)
- [TikTok Creative Center Scraper: Top Ads, No Login](https://apify.com/automation_craft/tiktok-creative-center-scraper)

### Changelog

- 0.1 (2026-10-13): first release.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/facebook-page-id-finder/changelog.md

# Actor input Schema

## `names` (type: `array`):

Brand, advertiser or page names (Nike), @handles (@nike), Facebook page links (https://www.facebook.com/nike), Ad Library links with view_all_page_id or a search word, numeric page ids (either of a page's two ids) or company websites (patagonia.com). Add a website after a | to tell pages of one name apart: Patagonia | patagonia.com. Matching ignores case, spaces, punctuation and accents, never part of a word.

## `countries` (type: `array`):

The Ad Library country the name is looked up in: ALL (the default) or one two letter country code such as US, GB or DE. One country per run: for several countries, start one run per country. With a country code, Page details also carry the page's ad spend in that country (political and issue ads).

## `pageDetails` (type: `boolean`):

One Page details row per matched page from the Ad Library's About tab: creation date, name change dates, the countries of the people who manage the page with their counts, the confirmed owner with address and phone, state media label, active ads count, related country pages, the page's second id, and spend when one country is given. Charged per row (Page details event).

## `pageContact` (type: `boolean`):

One Page contact row per matched page from the page's public Contact and basic info section: website, phone, email, address, rating with review count, hours, price range, services. Only what the page itself shows publicly. Charged per row (Page contact event).

## `adsPerPage` (type: `integer`):

Up to this many of the page's ads from the Ad Library (active ones unless Ad status says otherwise), one Page ad row each: text, title, link, call to action, images, videos, platforms, start date. The Ad Library shows the first 30; 0 (the default) reads none. Charged per row (Page ad event).

## `adStatus` (type: `string`):

Which of the page's ads the Page ad rows show (used only with Ads per page above 0). Page details always count the active ads.

## `adMediaType` (type: `string`):

Only Page ad rows of this media type, as the Ad Library sorts them (used only with Ads per page above 0).

## `includeTotalAdsCount` (type: `boolean`):

Page details always carry the active ads count. Switch this on to add the count of every ad the page ever ran (one more request per page, no extra charge).

## `verifiedOnly` (type: `boolean`):

Only blue verified pages count as matches; unverified pages of the same name are counted as filtered out. A name whose matches are all filtered out gets a free row.

## `minLikes` (type: `integer`):

Only pages with at least this many likes count as matches. 0 (the default) keeps every page.

## `onMultipleMatches` (type: `string`):

Every matching page is always listed in matches; a pick only fills pageId. aliasMatch picks the page whose address name is the name itself (the brand's main page: facebook.com/adidas, not facebook.com/adidasUS); the like rules pick only when one page has strictly more likes than every other (the country pages of a global brand share one count: then nothing is picked). A website after | picks first. Left empty, no page is picked.

## `maxCandidates` (type: `integer`):

How many of the other pages the Ad Library suggested (not matching the name exactly) are listed in each row. Default 5, at most 15 (the Ad Library suggests at most 15 pages per name).

## `maxDetailsPerName` (type: `integer`):

When several pages match a name and none is picked, the add-ons read up to this many of them, in the Ad Library's order. Default 5.

## `adSearchFallback` (type: `boolean`):

When no page the Ad Library suggests matches a name, also look at the advertisers behind the ads that mention the name (one more request). Pages found this way match by the same rule and say foundBy: ad_search. No extra charge.

## `includeRawData` (type: `boolean`):

Add the Ad Library's own record of each page (raw) to the rows, for developers who want every source field.

## Actor input object example

```json
{
  "names": [
    "Nike",
    "Patagonia | patagonia.com",
    "Mia's Brooklyn Bakery"
  ],
  "countries": [
    "ALL"
  ],
  "pageDetails": true,
  "onMultipleMatches": "aliasMatch"
}
```

# 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 = {
    "names": [
        "Nike",
        "Patagonia | patagonia.com",
        "Mia's Brooklyn Bakery"
    ],
    "countries": [
        "ALL"
    ],
    "pageDetails": true,
    "onMultipleMatches": "aliasMatch"
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/facebook-page-id-finder").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 = {
    "names": [
        "Nike",
        "Patagonia | patagonia.com",
        "Mia's Brooklyn Bakery",
    ],
    "countries": ["ALL"],
    "pageDetails": True,
    "onMultipleMatches": "aliasMatch",
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/facebook-page-id-finder").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 '{
  "names": [
    "Nike",
    "Patagonia | patagonia.com",
    "Mia'\''s Brooklyn Bakery"
  ],
  "countries": [
    "ALL"
  ],
  "pageDetails": true,
  "onMultipleMatches": "aliasMatch"
}' |
apify call automation_craft/facebook-page-id-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation_craft/facebook-page-id-finder"
        }
    }
}
```

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/hP6IRAR8K9a95t0aZ/builds/2Zbf7tcFuVsCC0uVz/openapi.json
