# Facebook Pages Scraper (`vortex_data/facebook-pages`) Actor

💰$1/1K result💰Stop wasting your budget on slow, resource-heavy browser-based scrapers. This is the fastest, most cost-effective, and data-rich Facebook Pages scraper on Apify, designed for high-scale lead generation, reputation monitoring, and competitor research.

- **URL**: https://apify.com/vortex\_data/facebook-pages.md
- **Developed by:** [VortexData](https://apify.com/vortex_data) (community)
- **Categories:** Lead generation, Social media, Automation
- **Stats:** 30 total users, 18 monthly users, 97.1% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$1.00 / 1,000 results

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/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

## 📘 Facebook Pages Scraper

Extract **Facebook Page data** — page details, posts, photos, videos, reels, reviews, and events when Facebook exposes them — from one or more pages in a single run. It works anonymously by default, and can optionally use cookies from your own Facebook session for pages your account is allowed to view.

You give the Actor a list of Facebook page URLs. It returns one readable record per page in a competitor-compatible one-row-per-page shape, plus useful status, fallback, and authenticated-mode fields.

---

### What does Facebook Pages Scraper do?

For every Facebook page you provide, the Actor returns a single dataset record. There is no input selector for individual sections: the Actor automatically attempts every supported section for each page, then keeps only the data Facebook exposes to anonymous viewers or to your supplied session. The row can contain:

- 🏷️ **Page details** — title, page ID, handle, categories, intro, address, phone, email, website, hours, rating (% recommend + review count), follower / likes / following counts, profile photo, cover photo, page creation date, ad status, ad library id, linked Instagram, and more (≈40 fields).
- 📝 **Recent posts** — text, URL, publish timestamp, reactions / comments / shares counts, author, attached media.
- 🖼️ **Photos** — IDs and CDN URLs for the most recent uploads.
- 🎥 **Videos** — title-less videos with description, play count, publish time, permalink.
- 🎞️ **Reels** — short-form video URLs with timestamps.
- ⭐ **Reviews** — public recommendations (when the page has any).
- 📅 **Events** — upcoming and past events with names, URLs, and venues.

Each section is a nested array inside the main page record, so the dataset stays one row per URL — easy to filter, view, and export.

---

### Why use this Actor?

- **Anonymous by default.** It works without Facebook cookies for ordinary public pages.
- **Optional authenticated mode.** Paste cookies from your own logged-in Facebook browser session to collect pages that your account can view. Cookie values are treated as secret input and are never written to logs, dataset rows, or OUTPUT.
- **One row per page.** Compatible with the popular community Facebook Pages Scraper's page-centric output shape, with extra status and recovery fields.
- **All data types in a single run.** The input has no type filter; the Actor attempts page details, posts, photos, videos, reels, reviews, and events automatically.
- **Fast.** A typical page returns in 6–12 seconds on Apify Datacenter US, even with full extraction.
- **Cheap unavailable handling.** When Facebook says a page is missing or refuses to render it, the Actor returns a clear `not_available` row and reason instead of spending extra proxy traffic on external recovery sources.
- **Apify-native.** Works with the standard `startUrls` input format, dataset views, schedules, integrations, and REST API.

#### Common use cases

- Lead enrichment — pull contacts and rating signals for local-business pages.
- Reputation monitoring — track review counts and overall rating over time.
- Social-media tracking — collect recent posts, videos, and reels across competitor pages.
- Event monitoring — list upcoming and past events for venues, restaurants, or brands.

---

### How to use it

1. Open the Actor on Apify and switch to the **Input** tab.
2. Paste one or more Facebook page URLs into **Start URLs** (each entry is a `{"url": "https://www.facebook.com/<handle>/"}` object). You can also use the **Page handles or IDs** field with bare handles like `copperkettleyqr` or numeric page IDs — both formats are merged.
3. Pick **Max items per page section** (default 50) — it caps how many posts / photos / videos are kept per section. It does not choose which sections to scrape; the Actor always attempts all supported sections. Page details are collected once when Facebook exposes them.
4. (Optional) Toggle **Paginate available items** (`parseAllResults`) to paginate older items when Facebook provides authenticated pagination tokens. In anonymous mode, the Actor keeps what the public initial HTML exposes but cannot force logged-out deep pagination.
5. (Optional) Adjust **Page concurrency** (`pageConcurrency`) for large batches. Default `4` runs four pages at a time; use `1` for sequential debugging, `6-8` only when the proxy/network is stable.
6. (Optional) Paste your own Facebook session cookies into **Facebook cookies** if you need authenticated mode.
7. Click **Save & Start**.

The Actor uses Apify Datacenter US Proxy internally — no configuration needed, no settings to tweak.

When the run finishes, open **Storage → Dataset** to view, filter, or export the results as JSON / CSV / Excel / XML / HTML.

---

### Input

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `startUrls` | `array<{url}>` | yes¹ | List of full Facebook Page URLs. Each entry is `{"url": "https://www.facebook.com/<handle>/"}`. Groups and personal profiles are not supported. Numeric `profile.php?id=...` URLs are accepted as possible Page IDs, but personal profiles may return unavailable. |
| `urls` | `array<string>` | yes¹ | Alternative input — accepts handles (`copperkettleyqr`) or numeric IDs (`100064027242849`). |
| `maxResults` | `integer` | no | How many items per section to keep (default `50`, max `10000`). |
| `parseAllResults` | `boolean` | no | Paginate older section items when authenticated pagination tokens are available (default `false`). Anonymous runs are limited to the public initial HTML batch. |
| `pageConcurrency` | `integer` | no | How many input pages to scrape at the same time (default `4`, range `1-8`). Higher values speed up large batches but create more simultaneous Facebook/proxy requests. |
| `facebookCookies` | `string` | no | Optional secret field for authenticated mode. Paste a Cookie header (`c_user=...; xs=...`) or a JSON cookie export. Must include `c_user` and `xs`. |

¹ At least one of `startUrls` or `urls` must contain a value.

#### Example — minimal input

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/copperkettleyqr/" }
  ]
}
````

#### Example — multiple pages with a tighter cap

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/copperkettleyqr/" },
    { "url": "https://www.facebook.com/Microsoft/" }
  ],
  "urls": [
    "100064027242849"
  ],
  "maxResults": 20
}
```

#### Optional authenticated mode with cookies

Use this only with a Facebook account you control or are authorized to use. Cookies act like a temporary session key; do not paste passwords, 2FA codes, or cookies from someone else's account.

Where to paste them:

1. Open the Actor on Apify.
2. Go to the **Input** tab.
3. Scroll to **Facebook cookies (optional)**.
4. Paste either a raw Cookie header value or a JSON export.
5. Start the run.

How to copy a Cookie header from Chrome / Edge:

1. Log in to `facebook.com` in your browser.
2. Open a Facebook Page that your account can view.
3. Press `F12` and open the **Network** tab.
4. Reload the page.
5. Click the first `facebook.com` document request.
6. In **Headers -> Request Headers**, copy the value of `Cookie`.
7. Paste that value into **Facebook cookies (optional)**.

Expected format:

```text
c_user=123456789; xs=...; fr=...; datr=...; sb=...
```

JSON exports from cookie extensions are also accepted:

```json
[
  {"domain": ".facebook.com", "name": "c_user", "value": "123456789"},
  {"domain": ".facebook.com", "name": "xs", "value": "..."}
]
```

If the cookies are valid, the run log says `Authenticated mode enabled`, and dataset rows show `resultStatus: "authenticated"` when the main data came from that session. Cookies are sent only to `facebook.com` hosts. If Facebook logs the account out, rotates the session, or the account cannot view the target page, the Actor returns a `not_available` row and explains the result in `resultSummary`, `nextAction`, and `OUTPUT.skippedPages`.

***

### Output

One record per input URL is pushed to the default Apify dataset. Each row starts with a readable status block (`resultStatus`, `dataQuality`, `resultSummary`, `sourceSummary`, `contentCounts`, `nextAction`) before the raw page fields. Per-section content lives in nested arrays.

#### Sample (truncated)

```json
{
  "resultStatus": "full_public",
  "dataQuality": "Full",
  "accessLevel": "public",
  "resultSummary": "Full public page data collected: 22 posts, 8 photos, 6 videos, 3 reels.",
  "sourceSummary": "Facebook public page",
  "contentCounts": "22 posts, 8 photos, 6 videos, 3 reels",
  "nextAction": "Ready to use.",
  "url": "https://www.facebook.com/copperkettleyqr/",
  "type": "page",
  "facebookUrl": "https://www.facebook.com/copperkettleyqr/",
  "pageUrl": "https://www.facebook.com/copperkettleyqr/",
  "pageId": "100064027242849",
  "facebookId": "100064027242849",
  "pageName": "copperkettleyqr",
  "displayName": "The Copper Kettle Restaurant",
  "title": "The Copper Kettle Restaurant | Regina SK",
  "intro": "Longstanding local restaurant. Mediterranean specialties...",
  "info": [
    "The Copper Kettle Restaurant, Regina. 3,212 likes",
    "39 talking about this",
    "1,136 were here. Longstanding local restaurant..."
  ],
  "categories": ["Page", "Pizza place"],
  "category": "Pizza place",
  "likes": 3212,
  "followers": 3212,
  "followings": 341,
  "talking_about": 39,
  "were_here": 1136,
  "rating": "94% recommend (202 Reviews)",
  "ratings": "94% recommend (202 Reviews)",
  "ratingOverall": 94,
  "ratingCount": 202,
  "phone": "+1 306-525-3545",
  "email": "copperkettle.events@gmail.com",
  "website": "http://www.thecopperkettle.online/",
  "websites": [
    "https://www.bing.com/maps/...",
    "https://www.instagram.com/copperkettleyqr",
    "http://www.thecopperkettle.online/"
  ],
  "alternativeSocialMedia": "https://www.instagram.com/copperkettleyqr",
  "instagram": [
    {"username": "copperkettleyqr", "url": "https://www.instagram.com/copperkettleyqr"}
  ],
  "address": "1953 Scarth Street, Regina, SK, Canada, S4P 2H1",
  "addressUrl": "https://www.bing.com/maps/...",
  "services": "Outdoor seating",
  "business_services": "Outdoor seating",
  "priceRange": "$$",
  "business_price": "Price Range · $$",
  "business_hours": "Open now",
  "creation_date": "October 29, 2014",
  "ad_status": "This Page is currently running ads.",
  "pageAdLibrary": {"id": "851606664870954", "pamv_comms_data": null},
  "profilePictureUrl": "https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=100064027242849",
  "profilePhoto": "https://www.facebook.com/photo/?fbid=...&set=a....",
  "coverPhotoUrl": "https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=...",
  "verified": false,

  "posts": [
    {
      "type": "post",
      "post_id": "1259602942850602",
      "url": "https://www.facebook.com/copperkettleyqr/posts/...",
      "message": "THE SASKATCHEWAN ROUGHRIDERS WIN THE 112TH GREY CUP! 🏆",
      "timestamp": 1763349499,
      "reactions_count": 10,
      "comments_count": 0,
      "reshare_count": 1,
      "author": {"id": "100064027242849", "name": "...", "url": "..."},
      "media": ["https://lookaside.fbsbx.com/..."]
    }
  ],

  "photos":     [ /* … */ ],
  "videos":     [ /* … */ ],
  "reels":      [ /* … */ ],
  "past_events":[ /* … */ ],

  "scraped_at": "2026-05-09T08:12:34.567+00:00"
}
```

If a section has zero records (e.g. the page has no public reviews), that key is **omitted from the record entirely** — keeping the JSON tight.

***

### Pricing and runtime

The Actor is billed per Apify compute unit + Apify Proxy traffic — there are no per-result fees declared by the Actor itself. Internally the Actor uses Apify Datacenter US Proxy, the cheapest pool, which gives sub-second per-request latency for Facebook.

Typical runtime per URL:

| Workload | Wall-clock |
| --- | --- |
| 1 page, default `maxResults=50` | ~6–12 seconds |
| 100 pages, default `pageConcurrency=4` | ~3–8 minutes, depending on Facebook/proxy latency |
| `parseAllResults=true` on a busy page | minutes per page when authenticated pagination is available |

Each request rotates through a fresh exit IP, so you don't have to pre-provision sticky sessions.

***

### How it works (under the hood)

1. **Resolve every input URL / handle / numeric id** to a canonical Facebook page URL.
2. Process multiple pages at once, capped by `pageConcurrency` (default `4`).
3. For each page, fetch up to **three Facebook endpoints concurrently**: `/about/` (page metadata), `/about_profile_transparency/` (page creation date, ad status), and the page root `/` (profile photo viewer URL).
4. For listing sections (posts, photos, videos, reels, reviews, future events, past events) fetch each section URL in parallel.
5. Parse the embedded GraphQL JSON inside the HTML, extract structured records, and merge per-page results into one aggregate record.
6. Strip empty arrays and `null` fields, then push exactly one polished record per URL to the dataset.

The Actor uses `curl_cffi` with **Chrome TLS impersonation**. In anonymous mode it uses the `facebookexternalhit/1.1` user-agent — the same combination Facebook uses internally for link-preview crawling — to pull rich public page data without authentication. When `facebookCookies` is provided, it switches to a normal browser user-agent and sends those cookies only with Facebook requests so Facebook can render whatever that account is allowed to view.

***

### Tips and best practices

- **Keep `maxResults` small** (the default 50 is usually enough) when first testing the Actor on new pages.
- **Avoid `parseAllResults=true`** unless you really need older items and are using cookies that expose pagination — busy pages with thousands of items can run for many minutes per page.
- **Run on a schedule** for monitoring: the Apify Console lets you trigger this Actor every X hours and pipe new dataset items into webhooks, integrations, or your own infrastructure.

***

### FAQ

**Does this Actor scrape personal Facebook profiles or Groups?**
No. It is for Facebook **Pages** only. `/groups/` URLs are rejected. Numeric `profile.php?id=...` URLs are accepted as possible Page IDs because some Pages use that shape, but personal profiles are unsupported and will usually return an unavailable row rather than profile data.

**Why are some fields like `past_events[*].timestamp` `null`?**
Facebook's bundle does not ship every field for every record. We fill what FB serves; missing fields are omitted entirely from the output to keep records clean. Authenticated mode can expose more data when your account is allowed to view it, but it still cannot create fields Facebook does not send.

**Can I provide just a page handle without the full URL?**
Yes. Use the **Page handles or IDs** input field for bare handles (`copperkettleyqr`) or numeric IDs (`100064027242849`).

**The locale of the output isn't English.**
Facebook localises page output by the geo of the exit IP. The Actor pins the internal proxy to a United States exit so you always receive native en-US output (`Reviews` capitalised, `$$` price symbols, `mkt=en-US` in map links).

**Can it scrape pages with limited access?**
In anonymous mode it cannot read content that Facebook only shows after login or to a specific audience. To avoid extra proxy and compute cost, the Actor does not query external fallback sources for those unavailable pages. For fuller access, paste cookies from a Facebook account that is allowed to view the page into **Facebook cookies (optional)**. If that account cannot view the page either, the Actor returns a `not_available` row plus a detailed reason in `OUTPUT.skippedPages`.

**What if a large run is close to timeout?**
The Actor writes progress checkpoints to `OUTPUT` while it runs. When Apify provides a platform timeout timestamp, the Actor stops starting new pages before that deadline (about 150 seconds on long runs, less on short smoke tests), saves partial results, and lists the remaining inputs in `OUTPUT.notStartedPages`. Increase the run timeout, increase memory if needed, or split the remaining URLs into a smaller batch.

**Are cookies stored or printed anywhere?**
No. The raw cookie value is only used as request input. Logs and OUTPUT include only a safe summary such as `3 cookie(s): c_user, xs, fr`; dataset rows only say whether cookies were used.

**Is this legal?**
You are responsible for using this Actor in compliance with applicable laws, Facebook's terms, and the rules of your specific use case. Only collect and use data you are allowed to process.

***

### Run programmatically

The Apify Console auto-generates ready-to-copy code samples for every language (Python, JavaScript, cURL, etc.) on the Actor's **API** tab. Open the Actor page, switch to **API → Run Actor synchronously / asynchronously** and copy the snippet pre-filled with your token and Actor name — no manual setup required.

***

### Support

Open an Issue on the Actor's Apify page if you spot a bug, want a new field added, or have a custom-version request.

# Actor input Schema

## `startUrls` (type: `array`):

Paste the full URL of each Facebook page you want to scrape (one per line). Example: https://www.facebook.com/copperkettleyqr/. Groups and personal profiles are not supported. Numeric profile.php?id URLs are accepted as possible Page IDs, but personal profiles may return unavailable.

## `urls` (type: `array`):

Use this if you have just the handle (the part after facebook.com/, e.g. 'copperkettleyqr') or a numeric page ID (e.g. '100064027242849'). These are merged with the URLs above — you don't have to fill in both fields.

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

How many posts / photos / videos / reels / events to keep per page. This is a per-section cap, not a section selector: the Actor still attempts all supported sections. Page details (name, address, rating, etc.) are collected once when Facebook exposes them and are not counted against this cap. Ignored when 'Paginate available items' is on.

## `parseAllResults` (type: `boolean`):

Turn on to keep loading older posts, photos, etc. when Facebook provides authenticated pagination tokens. In anonymous mode, the Actor keeps what the public initial HTML exposes but cannot force logged-out deep pagination. Off by default — leave off unless you really need the archive.

## `pageConcurrency` (type: `integer`):

How many input pages to scrape at the same time. Higher values finish large batches faster but create more simultaneous Facebook/proxy requests. Use 4 for normal bulk runs; lower it to 1-2 if you see many proxy timeouts.

## `facebookCookies` (type: `string`):

Optional authenticated mode. Paste cookies from your own logged-in Facebook browser session to scrape pages that your account can view. Accepts a Cookie header value like 'c\_user=...; xs=...; fr=...' or a JSON export from a cookie extension. Must include c\_user and xs. Leave empty for anonymous mode.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/copperkettleyqr/"
    }
  ],
  "maxResults": 50,
  "parseAllResults": false,
  "pageConcurrency": 4
}
```

# Actor output Schema

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

The main dataset — one row per Facebook page from your input. Start with Status, Quality, Summary, Sources, Counts, and Next action; the raw page fields and nested arrays follow.

## `runSummary` (type: `string`):

A friendly JSON summary with progress checkpoints, totals, result breakdown, one compact page summary per processed input, unavailable-page diagnostics, timeout-guard not-started pages, and section warnings.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.facebook.com/copperkettleyqr/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("vortex_data/facebook-pages").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 = { "startUrls": [{ "url": "https://www.facebook.com/copperkettleyqr/" }] }

# Run the Actor and wait for it to finish
run = client.actor("vortex_data/facebook-pages").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 '{
  "startUrls": [
    {
      "url": "https://www.facebook.com/copperkettleyqr/"
    }
  ]
}' |
apify call vortex_data/facebook-pages --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Facebook Pages Scraper",
        "description": "💰$1/1K result💰Stop wasting your budget on slow, resource-heavy browser-based scrapers. This is the fastest, most cost-effective, and data-rich Facebook Pages scraper on Apify, designed for high-scale lead generation, reputation monitoring, and competitor research.",
        "version": "0.1",
        "x-build-id": "GSIIakLzIUaWAw4nd"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/vortex_data~facebook-pages/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-vortex_data-facebook-pages",
                "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/vortex_data~facebook-pages/runs": {
            "post": {
                "operationId": "runs-sync-vortex_data-facebook-pages",
                "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/vortex_data~facebook-pages/run-sync": {
            "post": {
                "operationId": "run-sync-vortex_data-facebook-pages",
                "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": {
                    "startUrls": {
                        "title": "Facebook page URLs",
                        "type": "array",
                        "description": "Paste the full URL of each Facebook page you want to scrape (one per line). Example: https://www.facebook.com/copperkettleyqr/. Groups and personal profiles are not supported. Numeric profile.php?id URLs are accepted as possible Page IDs, but personal profiles may return unavailable.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "urls": {
                        "title": "Page handles or numeric IDs (optional)",
                        "uniqueItems": true,
                        "type": "array",
                        "description": "Use this if you have just the handle (the part after facebook.com/, e.g. 'copperkettleyqr') or a numeric page ID (e.g. '100064027242849'). These are merged with the URLs above — you don't have to fill in both fields.",
                        "items": {
                            "type": "string",
                            "minLength": 1
                        }
                    },
                    "maxResults": {
                        "title": "Max items per section",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "How many posts / photos / videos / reels / events to keep per page. This is a per-section cap, not a section selector: the Actor still attempts all supported sections. Page details (name, address, rating, etc.) are collected once when Facebook exposes them and are not counted against this cap. Ignored when 'Paginate available items' is on.",
                        "default": 50
                    },
                    "parseAllResults": {
                        "title": "Paginate available items (slower)",
                        "type": "boolean",
                        "description": "Turn on to keep loading older posts, photos, etc. when Facebook provides authenticated pagination tokens. In anonymous mode, the Actor keeps what the public initial HTML exposes but cannot force logged-out deep pagination. Off by default — leave off unless you really need the archive.",
                        "default": false
                    },
                    "pageConcurrency": {
                        "title": "Page concurrency",
                        "minimum": 1,
                        "maximum": 8,
                        "type": "integer",
                        "description": "How many input pages to scrape at the same time. Higher values finish large batches faster but create more simultaneous Facebook/proxy requests. Use 4 for normal bulk runs; lower it to 1-2 if you see many proxy timeouts.",
                        "default": 4
                    },
                    "facebookCookies": {
                        "title": "Facebook cookies (optional)",
                        "type": "string",
                        "description": "Optional authenticated mode. Paste cookies from your own logged-in Facebook browser session to scrape pages that your account can view. Accepts a Cookie header value like 'c_user=...; xs=...; fr=...' or a JSON export from a cookie extension. Must include c_user and xs. Leave empty for anonymous mode."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
