# Facebook Public Posts Scraper Ultra Premium (`qaseemiqbal/facebook-public-posts-scraper-ultra-premium`) Actor

Scrape public Facebook page posts with text, timestamps, author details, media, links, and engagement signals. Built for monitoring brands, campaigns, competitors, and public content with clean, structured, analysis-ready data.

- **URL**: https://apify.com/qaseemiqbal/facebook-public-posts-scraper-ultra-premium.md
- **Developed by:** [Muhammad Qaseem Iqbal](https://apify.com/qaseemiqbal) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $12.50 / 1,000 facebook posts

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 Public Posts Scraper Ultra Premium

Facebook Public Posts Scraper Ultra Premium helps you collect public Facebook post data from pages, public profiles, individual posts, photos, videos, and reels. Paste one or more Facebook URLs, choose how much data you want, and run the Actor. Your results are saved in a structured dataset that you can download or send to other tools.

Use it to monitor public posts, track engagement, research content trends, collect media metadata, or build reports from publicly available Facebook content.

This Actor works with public content only. It does not access private profiles, private groups, direct messages, login-only content, CAPTCHAs, or anything hidden by Facebook privacy settings.

### What Can You Do With This Actor?

- Scrape public posts from Facebook pages, public profiles, direct post URLs, videos, photos, and reels.
- Collect post text, author name, post URL, post ID, post type, and publish time when available.
- Capture visible engagement numbers such as likes, comments, shares, views, and reaction breakdowns.
- Extract hashtags, mentions, external links, and linked domains from post text.
- Save media information such as image URLs, video thumbnails, dimensions, media IDs, and alt or OCR text when available.
- Optionally collect visible top comments and replies.
- Filter posts by date range and post type.
- Run repeated monitoring jobs with incremental mode, so later runs can focus on new posts.
- Export results as JSON, CSV, Excel, HTML, or access them through the Apify API.

### What Facebook Post Data Can I Extract?

| Category | Data included |
| --- | --- |
| Post details | Post ID, post URL, canonical URL, post type, source URL, source type |
| Author details | Public author or page name, author URL when available |
| Text content | Full post text, short text preview, hashtags, mentions, external links, linked domains |
| Dates | Published date when detected, visible timestamp text, scrape time |
| Engagement | Likes, comments, shares, views, and reaction breakdown when Facebook exposes it |
| Media | Image or video URLs, thumbnails, media IDs, dimensions, alt text, OCR text |
| Comments | Optional visible top comments, reactions, timestamps, and replies |
| Quality signals | Extraction quality and missing fields, so you can see what was or was not available |

### Common Use Cases

- Brand monitoring: Track how public Facebook posts mention or discuss your brand.
- Competitor research: Compare content, engagement, posting patterns, and media strategy across public pages.
- Campaign reporting: Collect public posts and engagement numbers for marketing reports.
- Content research: Find high-performing topics, formats, links, and hashtags.
- Media monitoring: Follow public updates from organizations, publishers, public figures, or communities.
- Academic or market research: Build structured datasets from public Facebook posts for analysis.
- Automated workflows: Send public post data to Google Sheets, BI tools, CRMs, dashboards, or AI workflows.

### How Do I Use Facebook Public Posts Scraper Ultra Premium?

1. Create or log in to your Apify account.
2. Open Facebook Public Posts Scraper Ultra Premium.
3. Paste one or more public Facebook URLs into the input field.
4. Choose the maximum number of posts to collect from each URL.
5. Optional: add date filters, choose post types, enable media, comments, reactions, or incremental mode.
6. Click "Save & Start".
7. Download your results from the Dataset tab as JSON, CSV, Excel, HTML, or use the API.

### Input

The only required input is at least one Facebook URL. You can use public Facebook page URLs, public profile URLs, direct post URLs, photo URLs, video URLs, or reel URLs.

Example input:

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/cern" },
    { "url": "https://www.facebook.com/OurWorldinData" }
  ],
  "maxPostsPerSource": 50,
  "dateFrom": "2026-01-01",
  "includeMedia": true,
  "blockHeavyResources": true,
  "includeReactionBreakdown": true,
  "includeComments": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
````

#### Main Input Options

| Option | What it means |
| --- | --- |
| `startUrls` | Facebook URLs you want to scrape. This is required. |
| `maxPostsPerSource` | Maximum number of posts to collect from each URL. |
| `dateFrom` and `dateTo` | Only include posts within a selected date range. |
| `postTypes` | Choose which post types to include, such as text, photo, video, reel, link, or shared posts. |
| `includeMedia` | Save media metadata such as image URLs, thumbnails, and dimensions. |
| `blockHeavyResources` | Reduce cost by blocking browser loading of heavy images, videos, and fonts. Media URLs can still be extracted. |
| `includeReactionBreakdown` | Try to collect Like, Love, Care, Haha, Wow, Sad, and Angry counts when visible. |
| `includeComments` | Collect visible top comments for each post. |
| `includeCommentReplies` | Collect visible replies to comments. This can increase runtime and cost. |
| `includeVideoDetails` | Open video or reel links for richer video information when available. |
| `includeVideoTranscripts` | Try to collect public captions or transcripts when Facebook exposes them. |
| `incrementalMode` | Return only posts that were not seen in previous runs for the same source. |
| `proxyConfiguration` | Proxy settings. Residential Apify Proxy is recommended for Facebook. |

### Output

Each item in the main dataset represents one public Facebook post. This makes the output easy to count, filter, export, and price.

You will also get supporting files in the key-value store:

- `RUN_SUMMARY` with totals, status, and error summary.
- `SOURCE_STATUS` with success or failure details for each input URL.
- `MEDIA_MANIFEST` when media manifest saving is enabled.
- `INPUT_NORMALIZED` with the cleaned version of your input.

Example output item:

```json
{
  "recordType": "post",
  "sourceUrl": "https://www.facebook.com/cern",
  "inputUrl": "https://www.facebook.com/cern",
  "sourceType": "page",
  "postId": "1315686150601111",
  "url": "https://www.facebook.com/cern/posts/1315686150601111",
  "canonicalUrl": "https://www.facebook.com/cern/posts/1315686150601111",
  "authorName": "CERN",
  "authorUrl": "https://www.facebook.com/cern",
  "postType": "photo",
  "publishedAt": "2026-01-20T13:00:05.000Z",
  "timestampText": "January 20 at 1:00 PM",
  "text": "What can you do with 380 million #Higgs bosons?",
  "textPreview": "What can you do with 380 million #Higgs bosons?",
  "hashtags": ["Higgs"],
  "mentions": [],
  "externalLinks": [],
  "externalDomains": [],
  "engagement": {
    "likes": 146,
    "comments": 3,
    "shares": 27,
    "views": null,
    "reactionBreakdown": {
      "like": 135,
      "love": 8,
      "care": 2,
      "haha": null,
      "wow": 1,
      "sad": null,
      "angry": null
    }
  },
  "media": [
    {
      "type": "photo",
      "url": "https://example.com/image.jpg",
      "thumbnailUrl": "https://example.com/thumbnail.jpg",
      "mediaId": null,
      "width": 960,
      "height": 540,
      "altText": "May be an image of fireworks"
    }
  ],
  "comments": [],
  "transcriptText": null,
  "adLibraryUrl": null,
  "extractionQuality": "partial",
  "missingFields": [],
  "scrapedAt": "2026-06-12T09:00:00.000Z"
}
```

If Facebook does not show a field publicly, the Actor returns `null`, an empty list, or records the field in `missingFields`.

### How Many Posts Can It Scrape?

You can set the maximum number of posts per source. The actual number of results depends on what Facebook publicly shows for that page, profile, post, video, or reel.

Results can vary because of:

- Facebook privacy settings
- Deleted or unavailable posts
- Login, age, or region restrictions
- Date filters and post type filters
- How much content Facebook loads for a source
- Public visibility of engagement, reactions, comments, and media

For the best estimate, run a small test with your real input URLs first, then increase the limit.

### Tips for Better Results

- Use public Facebook URLs that open without needing special access.
- Use date filters when you only need a specific time period.
- Keep `includeComments`, `includeCommentReplies`, video transcripts, and media downloads turned off unless you need them, because they can make runs slower.
- Keep `blockHeavyResources` enabled to reduce proxy traffic and browser data transfer.
- Use lower concurrency for small jobs; the Actor now scales default memory with concurrency to avoid overpaying for small runs.
- Use incremental mode for recurring monitoring jobs.
- Use Residential Apify Proxy for more stable Facebook scraping.
- Check `RUN_SUMMARY` and `SOURCE_STATUS` after each run to see what was collected and whether any source had limited visibility.

### Export and Integrations

After the run finishes, you can download the dataset in common formats including JSON, CSV, Excel, HTML, and more. You can also connect the results to other tools through Apify integrations, webhooks, scheduled runs, or the Apify API.

This makes it easy to send Facebook post data to spreadsheets, dashboards, reporting tools, databases, AI workflows, or your own application.

### FAQ

#### Can this scrape private Facebook content?

No. This Actor is designed for publicly visible Facebook content only. It does not scrape private profiles, private groups, direct messages, hidden comments, or content behind access controls.

#### Do I need to log in to Facebook?

For public content, no login is required. The Actor includes an optional cookies field for content you are authorized to access, but it still does not bypass Facebook privacy settings, CAPTCHAs, or access restrictions.

#### Why did I get fewer posts than expected?

Facebook may not publicly show all posts, especially on profiles or restricted pages. Results can also be affected by date filters, post type filters, deleted posts, region restrictions, login prompts, or Facebook's dynamic loading behavior.

#### Can I scrape comments with this Actor?

Yes, you can enable visible top comments and replies. For very deep comment collection, a dedicated Facebook comments scraper may be more suitable.

#### Can I collect videos and reels?

Yes. You can use public video or reel URLs, and you can enable video details or transcripts when you need richer video information. Availability depends on what Facebook exposes publicly.

#### Can I run this Actor on a schedule?

Yes. You can schedule runs on Apify and use incremental mode to collect only posts that were not seen in previous runs for the same source.

#### Is it legal to scrape Facebook posts?

This Actor is intended for publicly available content. Public web scraping can be legal, but laws and platform rules vary by country and use case. If you store, process, or share scraped data, make sure you have a valid reason and follow applicable privacy, data protection, and platform rules.

#### What happens when a source fails?

The Actor does not silently hide failures. It saves run-level and source-level details in `RUN_SUMMARY` and `SOURCE_STATUS`, so you can see which URLs worked, which failed, and why.

### Responsible Use

Use this Actor only for public Facebook data that you are allowed to collect and process. Do not use it to target private individuals, bypass access controls, collect sensitive personal data, or violate Facebook's terms or applicable laws.

# Actor input Schema

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

Public Facebook page, profile, post, reel, or video URLs to scrape.

## `maxPostsPerSource` (type: `integer`):

Maximum number of posts to extract from each source URL.

## `dateFrom` (type: `string`):

Only include posts published on or after this date. Use YYYY-MM-DD.

## `dateTo` (type: `string`):

Only include posts published on or before this date. Use YYYY-MM-DD.

## `sortOrder` (type: `string`):

Preferred crawl order. Facebook availability may vary by source.

## `postTypes` (type: `array`):

Filter by post type when detectable.

## `includeTextReferences` (type: `boolean`):

Extract hashtags, mentions, and external links referenced in post text.

## `includeReactionBreakdown` (type: `boolean`):

Extract counts for Like, Love, Care, Haha, Wow, Sad, and Angry when available.

## `includeComments` (type: `boolean`):

Extract visible top comments for each post.

## `maxCommentsPerPost` (type: `integer`):

Maximum number of top-level comments to extract per post when comments are enabled.

## `includeCommentReplies` (type: `boolean`):

Extract visible replies to comments. Increases runtime and cost.

## `maxRepliesPerComment` (type: `integer`):

Maximum visible replies to extract per comment when replies are enabled.

## `includeMedia` (type: `boolean`):

Extract media URLs, thumbnails, dimensions, IDs, and OCR/alt text when available.

## `downloadMedia` (type: `boolean`):

Download media files to key-value store. Disabled by default to reduce cost and storage usage.

## `blockHeavyResources` (type: `boolean`):

Block browser loading of images, videos, and fonts to reduce proxy traffic and run cost. Media URLs can still be extracted from the page.

## `maxMediaPerPost` (type: `integer`):

Maximum number of media items to include for each post.

## `includeVideoDetails` (type: `boolean`):

Open visible video/reel permalinks for richer metrics where available.

## `includeVideoTranscripts` (type: `boolean`):

Extract public captions/transcripts when visible. Increases runtime.

## `includeOcrText` (type: `boolean`):

Capture visible image alt/OCR text when Facebook exposes it.

## `includeAdLibraryInfo` (type: `boolean`):

Collect available public page ad-library identifiers or links when present.

## `saveMediaManifest` (type: `boolean`):

Write MEDIA\_MANIFEST.json to key-value store.

## `incrementalMode` (type: `boolean`):

Only return posts not seen in previous runs for the same canonical source URL.

## `stateStoreName` (type: `string`):

Named key-value store used to persist incremental cursors.

## `proxyConfiguration` (type: `object`):

Proxy settings. Residential Apify Proxy is recommended for Facebook.

## `maxConcurrency` (type: `integer`):

Maximum number of browser pages to process at once.

## `maxRequestRetries` (type: `integer`):

Maximum retry attempts for transient failures.

## `maxRunMinutes` (type: `integer`):

Stop gracefully after this many minutes. Use 0 for no custom limit.

## `scrollWaitMillis` (type: `integer`):

Delay after each source-page scroll.

## `maxEmptyScrolls` (type: `integer`):

Stop a source after this many scrolls with no new post candidates.

## `failOnSourceError` (type: `boolean`):

Fail the whole run when any source fails. Disabled by default for partial-result workflows.

## `debugMode` (type: `boolean`):

Save final-failure HTML snapshots to key-value store.

## `sessionCookies` (type: `string`):

Optional cookies for content you are authorized to access. Public-only scraping remains the default.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/cern"
    },
    {
      "url": "https://www.facebook.com/OurWorldinData"
    }
  ],
  "maxPostsPerSource": 50,
  "sortOrder": "latest",
  "postTypes": [
    "text",
    "photo",
    "video",
    "reel",
    "link",
    "shared"
  ],
  "includeTextReferences": true,
  "includeReactionBreakdown": true,
  "includeComments": false,
  "maxCommentsPerPost": 5,
  "includeCommentReplies": false,
  "maxRepliesPerComment": 0,
  "includeMedia": true,
  "downloadMedia": false,
  "blockHeavyResources": true,
  "maxMediaPerPost": 20,
  "includeVideoDetails": false,
  "includeVideoTranscripts": false,
  "includeOcrText": true,
  "includeAdLibraryInfo": false,
  "saveMediaManifest": true,
  "incrementalMode": false,
  "stateStoreName": "facebook-public-posts-state",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxConcurrency": 2,
  "maxRequestRetries": 2,
  "maxRunMinutes": 0,
  "scrollWaitMillis": 1000,
  "maxEmptyScrolls": 3,
  "failOnSourceError": false,
  "debugMode": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Successful public Facebook post records from the default dataset.

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

Aggregate counts, source success/failure totals, and error summary.

## `sourceStatus` (type: `string`):

Per-source status records saved to the default key-value store.

## `mediaManifest` (type: `string`):

Media metadata manifest when saveMediaManifest is enabled.

# 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/cern"
        },
        {
            "url": "https://www.facebook.com/OurWorldinData"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("qaseemiqbal/facebook-public-posts-scraper-ultra-premium").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/cern" },
        { "url": "https://www.facebook.com/OurWorldinData" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("qaseemiqbal/facebook-public-posts-scraper-ultra-premium").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/cern"
    },
    {
      "url": "https://www.facebook.com/OurWorldinData"
    }
  ]
}' |
apify call qaseemiqbal/facebook-public-posts-scraper-ultra-premium --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=qaseemiqbal/facebook-public-posts-scraper-ultra-premium",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Facebook Public Posts Scraper Ultra Premium",
        "description": "Scrape public Facebook page posts with text, timestamps, author details, media, links, and engagement signals. Built for monitoring brands, campaigns, competitors, and public content with clean, structured, analysis-ready data.",
        "version": "0.1",
        "x-build-id": "t71zjFusgduC2ZJUr"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/qaseemiqbal~facebook-public-posts-scraper-ultra-premium/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-qaseemiqbal-facebook-public-posts-scraper-ultra-premium",
                "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/qaseemiqbal~facebook-public-posts-scraper-ultra-premium/runs": {
            "post": {
                "operationId": "runs-sync-qaseemiqbal-facebook-public-posts-scraper-ultra-premium",
                "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/qaseemiqbal~facebook-public-posts-scraper-ultra-premium/run-sync": {
            "post": {
                "operationId": "run-sync-qaseemiqbal-facebook-public-posts-scraper-ultra-premium",
                "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",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Facebook URLs",
                        "type": "array",
                        "description": "Public Facebook page, profile, post, reel, or video URLs to scrape.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxPostsPerSource": {
                        "title": "Maximum posts per source",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Maximum number of posts to extract from each source URL.",
                        "default": 50
                    },
                    "dateFrom": {
                        "title": "Post date from",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Only include posts published on or after this date. Use YYYY-MM-DD."
                    },
                    "dateTo": {
                        "title": "Post date to",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "type": "string",
                        "description": "Only include posts published on or before this date. Use YYYY-MM-DD."
                    },
                    "sortOrder": {
                        "title": "Post order",
                        "enum": [
                            "latest",
                            "top",
                            "native"
                        ],
                        "type": "string",
                        "description": "Preferred crawl order. Facebook availability may vary by source.",
                        "default": "latest"
                    },
                    "postTypes": {
                        "title": "Post types",
                        "type": "array",
                        "description": "Filter by post type when detectable.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "text",
                            "photo",
                            "video",
                            "reel",
                            "link",
                            "shared"
                        ]
                    },
                    "includeTextReferences": {
                        "title": "Include text references",
                        "type": "boolean",
                        "description": "Extract hashtags, mentions, and external links referenced in post text.",
                        "default": true
                    },
                    "includeReactionBreakdown": {
                        "title": "Include reaction breakdown",
                        "type": "boolean",
                        "description": "Extract counts for Like, Love, Care, Haha, Wow, Sad, and Angry when available.",
                        "default": true
                    },
                    "includeComments": {
                        "title": "Include top comments",
                        "type": "boolean",
                        "description": "Extract visible top comments for each post.",
                        "default": false
                    },
                    "maxCommentsPerPost": {
                        "title": "Maximum comments per post",
                        "minimum": 0,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum number of top-level comments to extract per post when comments are enabled.",
                        "default": 5
                    },
                    "includeCommentReplies": {
                        "title": "Include comment replies",
                        "type": "boolean",
                        "description": "Extract visible replies to comments. Increases runtime and cost.",
                        "default": false
                    },
                    "maxRepliesPerComment": {
                        "title": "Maximum replies per comment",
                        "minimum": 0,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum visible replies to extract per comment when replies are enabled.",
                        "default": 0
                    },
                    "includeMedia": {
                        "title": "Include media metadata",
                        "type": "boolean",
                        "description": "Extract media URLs, thumbnails, dimensions, IDs, and OCR/alt text when available.",
                        "default": true
                    },
                    "downloadMedia": {
                        "title": "Download media files",
                        "type": "boolean",
                        "description": "Download media files to key-value store. Disabled by default to reduce cost and storage usage.",
                        "default": false
                    },
                    "blockHeavyResources": {
                        "title": "Block heavy page assets",
                        "type": "boolean",
                        "description": "Block browser loading of images, videos, and fonts to reduce proxy traffic and run cost. Media URLs can still be extracted from the page.",
                        "default": true
                    },
                    "maxMediaPerPost": {
                        "title": "Maximum media items per post",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum number of media items to include for each post.",
                        "default": 20
                    },
                    "includeVideoDetails": {
                        "title": "Include video and reel details",
                        "type": "boolean",
                        "description": "Open visible video/reel permalinks for richer metrics where available.",
                        "default": false
                    },
                    "includeVideoTranscripts": {
                        "title": "Include video transcripts",
                        "type": "boolean",
                        "description": "Extract public captions/transcripts when visible. Increases runtime.",
                        "default": false
                    },
                    "includeOcrText": {
                        "title": "Include OCR or alt text",
                        "type": "boolean",
                        "description": "Capture visible image alt/OCR text when Facebook exposes it.",
                        "default": true
                    },
                    "includeAdLibraryInfo": {
                        "title": "Include ad library info",
                        "type": "boolean",
                        "description": "Collect available public page ad-library identifiers or links when present.",
                        "default": false
                    },
                    "saveMediaManifest": {
                        "title": "Save media manifest",
                        "type": "boolean",
                        "description": "Write MEDIA_MANIFEST.json to key-value store.",
                        "default": true
                    },
                    "incrementalMode": {
                        "title": "Incremental mode",
                        "type": "boolean",
                        "description": "Only return posts not seen in previous runs for the same canonical source URL.",
                        "default": false
                    },
                    "stateStoreName": {
                        "title": "State store name",
                        "type": "string",
                        "description": "Named key-value store used to persist incremental cursors.",
                        "default": "facebook-public-posts-state"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Residential Apify Proxy is recommended for Facebook.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    },
                    "maxConcurrency": {
                        "title": "Maximum concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Maximum number of browser pages to process at once.",
                        "default": 2
                    },
                    "maxRequestRetries": {
                        "title": "Maximum request retries",
                        "minimum": 0,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Maximum retry attempts for transient failures.",
                        "default": 2
                    },
                    "maxRunMinutes": {
                        "title": "Maximum run time in minutes",
                        "minimum": 0,
                        "maximum": 1440,
                        "type": "integer",
                        "description": "Stop gracefully after this many minutes. Use 0 for no custom limit.",
                        "default": 0
                    },
                    "scrollWaitMillis": {
                        "title": "Scroll wait in milliseconds",
                        "minimum": 250,
                        "maximum": 30000,
                        "type": "integer",
                        "description": "Delay after each source-page scroll.",
                        "default": 1000
                    },
                    "maxEmptyScrolls": {
                        "title": "Maximum empty scrolls",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Stop a source after this many scrolls with no new post candidates.",
                        "default": 3
                    },
                    "failOnSourceError": {
                        "title": "Fail on source error",
                        "type": "boolean",
                        "description": "Fail the whole run when any source fails. Disabled by default for partial-result workflows.",
                        "default": false
                    },
                    "debugMode": {
                        "title": "Debug mode",
                        "type": "boolean",
                        "description": "Save final-failure HTML snapshots to key-value store.",
                        "default": false
                    },
                    "sessionCookies": {
                        "title": "Optional session cookies",
                        "type": "string",
                        "description": "Optional cookies for content you are authorized to access. Public-only scraping remains the default."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
