{
  "data": {
    "id": "u2lHp8dtmfqrJhygB",
    "actId": "I92O7HOXayugbQ2qm",
    "userId": "9Um4NEFR7z42j35AD",
    "startedAt": "2026-08-16T17:54:22.193Z",
    "finishedAt": "2026-08-16T17:55:11.498Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 49234,
      "runTimeSecs": 49.234,
      "computeUnits": 0.054704444444444444,
      "imageSizeBytes": 528013312
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Facebook Metrics Scraper input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"mode\": {\n      \"title\": \"URL handling\",\n      \"type\": \"string\",\n      \"description\": \"Choose how to use the URLs below. Auto-detect mixed URLs accepts content URLs and profile/page URLs in the same list.\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"auto\",\n        \"knownUrls\",\n        \"profileUrls\"\n      ],\n      \"enumTitles\": [\n        \"Auto-detect mixed URLs\",\n        \"Content URLs only\",\n        \"Profile/page discovery only\"\n      ],\n      \"sectionCaption\": \"Choose URLs\",\n      \"sectionDescription\": \"Paste supported Facebook URLs once. Auto-detect handles post, reel, watch, video, photo, profile, and page URLs. Facebook Stories URLs are not supported.\",\n      \"default\": \"knownUrls\",\n      \"prefill\": \"knownUrls\"\n    },\n    \"startUrls\": {\n      \"title\": \"Facebook URLs\",\n      \"type\": \"array\",\n      \"description\": \"Paste at least one supported Facebook post, reel, watch, video, photo, profile, or page URL. Every direct content URL is processed. Facebook Stories URLs are not accepted.\",\n      \"editor\": \"stringList\",\n      \"minItems\": 0,\n      \"uniqueItems\": true,\n      \"items\": {\n        \"type\": \"string\",\n        \"pattern\": \"^\\\\s*(?:https?:\\\\/\\\\/)?(?:(?:(?:www\\\\.|m\\\\.|mbasic\\\\.)?facebook\\\\.com\\\\/(?!stories(?:[\\\\/?#]|$))\\\\S.*)|(?:fb\\\\.watch\\\\/\\\\S.*))\\\\s*$\"\n      },\n      \"default\": [\n        \"https://www.facebook.com/reel/2645452435840671\"\n      ],\n      \"prefill\": [\n        \"https://www.facebook.com/reel/2645452435840671\"\n      ]\n    },\n    \"urls\": {\n      \"title\": \"Legacy content URLs\",\n      \"type\": \"array\",\n      \"description\": \"Backward-compatible API field for users that still send known content URLs as urls.\",\n      \"editor\": \"hidden\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": []\n    },\n    \"profileUrls\": {\n      \"title\": \"Legacy profile URLs\",\n      \"type\": \"array\",\n      \"description\": \"Backward-compatible API field for users that still send profile/page URLs as profileUrls.\",\n      \"editor\": \"hidden\",\n      \"items\": {\n        \"type\": \"string\"\n      },\n      \"default\": []\n    },\n    \"maxItems\": {\n      \"title\": \"Optional total row cap\",\n      \"type\": \"integer\",\n      \"description\": \"Optional maximum metric rows across direct content and profile/page discovery. Leave blank to process every public item the Actor can find. Large values such as 999999 are accepted.\",\n      \"editor\": \"number\",\n      \"minimum\": 1\n    },\n    \"includePosts\": {\n      \"title\": \"Discover posts\",\n      \"type\": \"boolean\",\n      \"description\": \"Include public post URLs found on profile/page pages.\",\n      \"editor\": \"checkbox\",\n      \"default\": true\n    },\n    \"includeReels\": {\n      \"title\": \"Discover reels\",\n      \"type\": \"boolean\",\n      \"description\": \"Include public reel URLs found on profile/page pages.\",\n      \"editor\": \"checkbox\",\n      \"default\": true\n    },\n    \"includeVideos\": {\n      \"title\": \"Discover videos\",\n      \"type\": \"boolean\",\n      \"description\": \"Include public video URLs found on profile/page pages.\",\n      \"editor\": \"checkbox\",\n      \"default\": true\n    },\n    \"includePhotos\": {\n      \"title\": \"Discover photos\",\n      \"type\": \"boolean\",\n      \"description\": \"Include public photo URLs found on profile/page pages. Direct photo URLs are always accepted when provided as input.\",\n      \"editor\": \"checkbox\",\n      \"default\": false\n    },\n    \"includeAuthorProfileMetrics\": {\n      \"title\": \"Add author/profile metrics\",\n      \"type\": \"boolean\",\n      \"description\": \"Fetch each public author/profile page once per run and add best-effort follower and page-like counts when Facebook exposes them without login.\",\n      \"editor\": \"checkbox\",\n      \"sectionCaption\": \"Enrichment\",\n      \"sectionDescription\": \"Optional per-author profile metrics for both direct content URLs and discovered profile/page content.\",\n      \"default\": true\n    },\n    \"requestTimeoutSecs\": {\n      \"title\": \"Request timeout\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum seconds to wait for each public Facebook request.\",\n      \"editor\": \"number\",\n      \"sectionCaption\": \"Run options\",\n      \"sectionDescription\": \"Tune request behavior. Defaults are recommended for most users.\",\n      \"default\": 20,\n      \"minimum\": 5\n    },\n    \"maxConcurrency\": {\n      \"title\": \"Max concurrency\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum number of URLs to resolve at the same time.\",\n      \"editor\": \"number\",\n      \"default\": 3,\n      \"minimum\": 1\n    },\n    \"requestDelayMillis\": {\n      \"title\": \"Request delay\",\n      \"type\": \"integer\",\n      \"description\": \"Minimum delay between public Facebook requests.\",\n      \"editor\": \"number\",\n      \"default\": 250,\n      \"minimum\": 0,\n      \"maximum\": 10000\n    },\n    \"maxFetchRetries\": {\n      \"title\": \"Fetch retries\",\n      \"type\": \"integer\",\n      \"description\": \"Number of retry attempts for transient public request failures.\",\n      \"editor\": \"number\",\n      \"default\": 3,\n      \"minimum\": 0,\n      \"maximum\": 5\n    },\n    \"includeFailedRows\": {\n      \"title\": \"Output failed rows\",\n      \"type\": \"boolean\",\n      \"description\": \"API option. When false, failed, invalid, and no-public-metric rows are counted in the run summary but not pushed to the dataset.\",\n      \"editor\": \"hidden\",\n      \"default\": false\n    }\n  }\n}",
    "readme": "# Facebook Metrics Scraper\n\n## 📊 What does Facebook Metrics Scraper do?\n\nFacebook Metrics Scraper extracts public engagement metrics from Facebook post,\nreel, watch, video, photo, and profile/page URLs. Paste known Facebook content\nURLs to measure them directly, or paste profile/page URLs to discover recent\npublic content first.\n\nUse it for repeatable public engagement monitoring: views, plays, reactions,\nlikes, comments, shares, author audience counts, content IDs, and clear\navailability statuses in one dataset. Rows can also include public\ncollaboration profile context when available.\n\nThis Actor does not log in, use cookies, scrape private content, collect\ncomments, collect liker identities, or bypass Facebook access controls. It only\nreturns data that is publicly visible without logging in.\n\nWith Facebook Metrics Scraper, you can:\n\n- 📈 Collect public views, plays, reactions, likes, comments, and shares.\n- 🎬 Measure reels, watch URLs, videos, posts, photos, permalink URLs, and pfbid\n  post URLs.\n- 👤 Add best-effort author/profile follower and page-like counts.\n- 🤝 Capture public owner and collaboration profile context when available.\n- 🔎 Discover public content URLs from Facebook profile/page URLs.\n- 🆔 Extract normalized content and profile fields such as `contentUrl`,\n  `contentId`, `contentType`, `profileUsername`, and `profileName`.\n- 🚦 Get structured statuses when a URL resolves but public metrics are not\n  available.\n- 📦 Export results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## 📦 What Facebook metric data can I extract?\n\nEach dataset row represents one Facebook content URL. The row is flattened and\ngrouped for scanning: input, content, profile, media text, metrics,\ncollaboration context, profile metrics, and row status.\n\n| Data group                | Example fields                                                |\n| ------------------------- | ------------------------------------------------------------- |\n| 🔗 Source attempt         | `platform`, `inputUrl`                                        |\n| 🆔 Content entity         | `contentUrl`, `contentId`, `contentType`                      |\n| 👤 Author/profile entity  | `profileUrl`, `profileId`, `profileUsername`, `profileName`   |\n| 🧾 Media details          | `description`                                                 |\n| 📊 Engagement metrics     | `views`, `plays`, `reactions`, `likes`, `comments`, `shares`  |\n| 🎯 Content metric quality | `contentMetricStatus`                                         |\n| 🤝 Collaboration bridge   | `collaborationCount`, `collaborationProfiles`                 |\n| 👥 Author/profile metrics | `profileFollowers`, `profilePageLikes`, `profileMetricStatus` |\n| 🚦 Row status             | `status`, `statusReason`, `scrapedAt`                         |\n\nMetric availability depends on what Facebook exposes publicly for each URL.\nReels, watch URLs, and videos usually provide the strongest metric coverage.\nStatic posts can be partial. URLs with no public content metrics are counted in\n`OUTPUT` and skipped from the dataset by default.\n\n`contentType` describes the kind of Facebook content resolved for the row:\n\nAdditional source-specific IDs can appear in full JSON exports for API users,\nbut they are omitted from the default dataset table view to keep the main output\nfocused.\n\nFacebook Stories URLs, such as `facebook.com/stories/...`, are not supported.\n\n| Content type | Meaning                                      |\n| ------------ | -------------------------------------------- |\n| `reel`       | Reel-style Facebook video content.           |\n| `video`      | Standard Facebook video or watch content.    |\n| `post`       | Static Facebook post, including pfbid posts. |\n| `photo`      | Direct Facebook photo content.               |\n| `unknown`    | The URL resolved, but type was unclear.      |\n\nFor video-like content, `views` represents the public video view counter\nwhen Facebook exposes it. `plays` is a broader public play counter when\navailable, and can be higher than `views`. Keep both when you care about\nvideo measurement details.\n\n`contentMetricStatus` and `profileMetricStatus` include status, precision, and\nsource details for each public metric. The metric values live in the dedicated\nmetric fields, not repeated inside the status arrays. Precision values include:\n\n| Precision value      | Meaning                                                                     |\n| -------------------- | --------------------------------------------------------------------------- |\n| `exact`              | The count was available as a full public number.                            |\n| `exact_or_displayed` | The count appeared as a complete displayed number, such as `31,557 views`.  |\n| `compact_rounded`    | The count came from public shorthand, such as `3.3M views` or `437K plays`. |\n\nFor `compact_rounded` values, the dataset stores the expanded numeric value. For\nexample, `3.3M views` becomes `3300000`. Treat those values as useful\napproximations, not exact counters.\n\nAuthor/profile metrics are separate from content engagement metrics.\n`profileFollowers` and `profilePageLikes` describe the public\nprofile/page audience. `likes`, `comments`, and `shares` describe\nthe individual content row.\n\n`collaborationProfiles` contains public owner/byline profile context when it is\navailable. The first profile is marked `owner`; additional profiles are marked\n`collaborator`.\n\n## ⚙️ Can I use this Actor through an API?\n\nYes. You can run Facebook Metrics Scraper manually in Apify Console\nor use it through:\n\n- Apify API\n- Python SDK\n- Node.js SDK\n- Webhooks\n- Scheduled runs\n- Apify integrations\n\nThis makes it useful for social listening workflows, creator dashboards,\ncompetitive intelligence, campaign reporting, content audits, warehouse loads,\nand automated market research.\n\n## 🎯 Why scrape Facebook post and reel metrics?\n\nFacebook public engagement data helps you understand which posts, reels, and\nvideos are gaining traction across creators, brands, campaigns, and competitors.\n\n| Use case                        | How Facebook metric data helps                                          |\n| ------------------------------- | ----------------------------------------------------------------------- |\n| 📈 Track creator performance    | Monitor public engagement across known creator URLs.                    |\n| 🎬 Compare content formats      | Compare reels, videos, and posts side by side.                          |\n| 📣 Measure campaign activity    | Collect repeatable metrics for known campaign or brand content URLs.    |\n| 🕵️ Run competitive intelligence | Track public engagement on competitor posts and reels you already know. |\n| 📊 Build reporting workflows    | Feed normalized Facebook metrics into dashboards and client reports.    |\n| 🔎 Audit URL availability       | Separate available, partial, unavailable, and failed rows cleanly.      |\n\n## 💵 How much does scraping Facebook metrics cost?\n\nFacebook Metrics Scraper uses Apify Actor pricing. If the Actor is\nmonetized, you are charged according to the current price shown on the\n**Pricing** tab.\n\nStart with a small batch of 3 to 10 URLs when testing. The run summary shows how\nmany URLs resolved, how many dataset rows were produced, how many returned no\npublic metrics, and whether any URLs failed.\n\n## 🚀 How do I use Facebook Metrics Scraper?\n\n1. Create or log in to your Apify account.\n2. Open **Facebook Metrics Scraper**.\n3. Choose **Auto-detect mixed URLs**, **Content URLs only**, or\n   **Profile/page discovery only**.\n4. Paste Facebook content URLs, profile/page URLs, or both.\n5. Leave the default settings for your first run.\n6. Click **Start**.\n7. Open the **Output** tab to inspect the dataset and run summary.\n8. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## ⬇️ Input\n\nThe main input is `startUrls`. Paste at least one supported Facebook URL.\n`https://` is optional, so `www.facebook.com/reel/...` works too. Extra spaces\naround pasted URLs are ignored. In Auto-detect mixed URLs mode, you can paste\ncontent URLs and profile/page URLs into the same list. Facebook Stories URLs are\nrejected by the input form and runtime validation.\n\nEvery direct content URL is processed. `maxItemsPerProfile` applies only to\ncontent discovered from profile or page inputs.\n\n```json\n{\n    \"mode\": \"knownUrls\",\n    \"startUrls\": [\"https://www.facebook.com/reel/2645452435840671\"],\n    \"maxItemsPerProfile\": 20,\n    \"includePosts\": true,\n    \"includeReels\": true,\n    \"includeVideos\": true,\n    \"includePhotos\": false,\n    \"includeAuthorProfileMetrics\": true,\n    \"maxConcurrency\": 3,\n    \"requestDelayMillis\": 250,\n    \"maxFetchRetries\": 3,\n    \"requestTimeoutSecs\": 20\n}\n```\n\n### 🔗 Facebook URLs\n\nSupported content URL shapes include:\n\n```text\nwww.facebook.com/reel/2645452435840671\nhttps://www.facebook.com/reel/2645452435840671\nhttps://www.facebook.com/watch/?v=1203714368298095\nhttps://www.facebook.com/{page}/posts/{post-id-or-pfbid}\nhttps://www.facebook.com/{page}/videos/{video-id}\nhttps://www.facebook.com/{page}/videos/{slug}/{video-id}\nhttps://www.facebook.com/photo?fbid={photo-id}\nhttps://www.facebook.com/photo.php?fbid={photo-id}\nhttps://www.facebook.com/{page}/photos/{photo-id}\nhttps://www.facebook.com/permalink.php?story_fbid={post-id}&id={page-id}\nhttps://fb.watch/{short-code}/\n```\n\nBest results usually come from direct reel, watch, video, and photo URLs that\nopen publicly in a logged-out browser.\n\n`permalink.php?story_fbid=...` is a regular Facebook post permalink shape, not\na Facebook Stories URL.\n\nFacebook Stories URLs such as `facebook.com/stories/...` are not supported.\n\n### 👤 Profile/Page Discovery\n\nUse profile/page discovery when you want the Actor to find public content URLs\nbefore collecting metrics.\n\n```json\n{\n    \"mode\": \"profileUrls\",\n    \"startUrls\": [\"https://www.facebook.com/ThomasSandersOfficial\"],\n    \"maxItemsPerProfile\": 20,\n    \"includePosts\": true,\n    \"includeReels\": true,\n    \"includeVideos\": true,\n    \"includePhotos\": false,\n    \"includeAuthorProfileMetrics\": true,\n    \"maxConcurrency\": 3,\n    \"requestDelayMillis\": 250,\n    \"maxFetchRetries\": 3,\n    \"requestTimeoutSecs\": 20\n}\n```\n\nUse `maxItemsPerProfile` to control how many discovered URLs are resolved from\neach profile/page. The default is conservative for routine runs, and larger\nvalues are accepted for high-volume jobs.\n\n### 🎛️ Settings\n\n| Option                        | What it does                                                                                                 |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------ |\n| `mode`                        | `auto` to detect mixed URLs, `knownUrls` for content URLs only, or `profileUrls` for profile/page discovery. |\n| `startUrls`                   | Facebook content and/or profile/page URLs. Paste at least one URL.                                           |\n| `maxItemsPerProfile`          | Maximum discovered content URLs to resolve per profile/page.                                                 |\n| `includePosts`                | Include discovered post URLs.                                                                                |\n| `includeReels`                | Include discovered reel URLs.                                                                                |\n| `includeVideos`               | Include discovered video URLs.                                                                               |\n| `includePhotos`               | Include public photo URLs found during profile/page discovery. Direct photo URLs are always accepted.        |\n| `includeAuthorProfileMetrics` | Fetch each public author/profile once and add best-effort follower and page-like counts.                     |\n| `maxConcurrency`              | Controls how many URLs are resolved at the same time.                                                        |\n| `requestDelayMillis`          | Adds a minimum delay between public Facebook requests.                                                       |\n| `maxFetchRetries`             | Retries transient public request failures before marking a URL failed.                                       |\n| `requestTimeoutSecs`          | Maximum wait time for each public Facebook request.                                                          |\n\n## ⬆️ Output sample\n\nThe results are stored in the default dataset. Each result is one Facebook\ncontent URL with at least one public content metric.\n\n```json\n{\n    \"platform\": \"facebook\",\n    \"inputUrl\": \"https://www.facebook.com/reel/2098858540985362/\",\n    \"contentUrl\": \"https://www.facebook.com/reel/2098858540985362/\",\n    \"contentId\": \"2098858540985362\",\n    \"contentType\": \"reel\",\n    \"profileUrl\": \"https://www.facebook.com/ExampleCreator\",\n    \"profileId\": \"123456789\",\n    \"profileUsername\": \"ExampleCreator\",\n    \"profileName\": \"Example Creator\",\n    \"description\": \"Example public reel description\",\n    \"views\": 277000,\n    \"plays\": 660000,\n    \"reactions\": 21424,\n    \"likes\": 21424,\n    \"comments\": 267,\n    \"shares\": 553,\n    \"contentMetricStatus\": [\n        {\n            \"metric\": \"views\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"plays\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"reactions\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"likes\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"comments\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"shares\",\n            \"status\": \"present\",\n            \"precision\": \"exact_or_displayed\",\n            \"source\": \"public_content\"\n        }\n    ],\n    \"collaborationCount\": 1,\n    \"collaborationProfiles\": [\n        {\n            \"id\": \"123456789\",\n            \"name\": \"Example Creator\",\n            \"url\": \"https://www.facebook.com/ExampleCreator\",\n            \"role\": \"owner\",\n            \"type\": \"Page\"\n        }\n    ],\n    \"profileFollowers\": 1200000,\n    \"profilePageLikes\": 840000,\n    \"profileMetricStatus\": [\n        {\n            \"metric\": \"profileFollowers\",\n            \"status\": \"present\",\n            \"precision\": \"compact_rounded\",\n            \"source\": \"public_profile\"\n        },\n        {\n            \"metric\": \"profilePageLikes\",\n            \"status\": \"present\",\n            \"precision\": \"compact_rounded\",\n            \"source\": \"public_profile\"\n        }\n    ],\n    \"status\": \"ok\",\n    \"statusReason\": null,\n    \"scrapedAt\": \"2026-06-21T22:15:00.000Z\"\n}\n```\n\n### 📌 Run summary\n\nFacebook Metrics Scraper also saves an `OUTPUT` summary in the\ndefault key-value store.\n\n```json\n{\n    \"actorName\": \"facebook-metrics-scraper\",\n    \"mode\": \"auto\",\n    \"providedUrls\": 3,\n    \"contentUrls\": 2,\n    \"profileUrls\": 1,\n    \"inputUrls\": 22,\n    \"discoveredUrls\": 20,\n    \"resolvedUrls\": 21,\n    \"datasetRows\": 18,\n    \"skippedDatasetRows\": 3,\n    \"skippedFailedRows\": 0,\n    \"skippedInvalidRows\": 0,\n    \"skippedNoPublicMetricRows\": 3,\n    \"metricRows\": 18,\n    \"noPublicMetricRows\": 3,\n    \"failedRows\": 0,\n    \"invalidRows\": 0,\n    \"statusCounts\": {\n        \"ok\": 18,\n        \"resolved_no_public_metrics\": 3\n    },\n    \"postTypeCounts\": {\n        \"reel\": 12,\n        \"video\": 5,\n        \"post\": 4\n    },\n    \"authorProfileMetricsStatusCounts\": {\n        \"ok\": 17,\n        \"no_public_profile_metrics\": 4\n    }\n}\n```\n\n## ❓ Why did I get fewer metrics than expected?\n\nThe Actor returns only metrics that Facebook exposes publicly without login. A\nsuccessful URL resolution does not guarantee that every metric is available.\n\nCommon reasons include:\n\n- Facebook exposed preview-level counts but not richer engagement counters.\n- A static post exposed only partial metrics, such as shares.\n- Some static posts did not expose public counts.\n- The content requires login, is private, removed, region-limited, age-gated, or\n  otherwise unavailable to logged-out users.\n- The rendered Facebook UI rounds or updates counters differently from public\n  data available at collection time.\n\nUse `contentMetricStatus`, `profileMetricStatus`, and `statusReason` to decide\nwhether a row is suitable for your reporting workflow.\n\n## ✅ Tips for scraping Facebook metrics\n\n- Start with a small test run and inspect the dataset before increasing volume.\n- Use direct Facebook content URLs whenever possible.\n- Prefer reel, watch, and video URLs for richer public metric availability.\n- Leave `includeAuthorProfileMetrics` on when you want follower/page-like\n  context.\n- Keep `maxConcurrency` modest for steadier large runs.\n- Leave network and retry settings at their defaults unless you have a specific\n  reason to change them.\n- Failed, invalid, and no-public-metric input rows are counted in `OUTPUT` and\n  `SKIPPED_DATASET_ROWS` but are not pushed to the dataset by default.\n- Treat `resolved_no_public_metrics` as an audit status in `OUTPUT`, not a\n  failed run.\n\n## ⚖️ Is it legal to scrape Facebook post and reel metrics?\n\nThis Actor extracts public Facebook data that is available without login. You\nare responsible for making sure your use case complies with applicable laws,\nplatform terms, and privacy rules.\n\nFacebook content can sometimes include personal data, names, profile details, or\nother sensitive information. Do not scrape, store, or process personal data\nunless you have a legitimate reason and the right legal basis. If you're unsure,\nconsult your lawyers.\n\nFacebook is a trademark of its owner. This Actor is independent and is not\naffiliated with, endorsed by, or sponsored by Facebook or Meta.\n\n## 🛟 Support\n\nIf a run does not return what you expected, open an issue with the run ID and the\ninput URLs you used. Include the dataset row for the affected URL when possible.\nThe row-level `status`, `statusReason`, `contentMetricStatus`, and\n`profileMetricStatus` fields make support specific.\n\nRelated searches: Facebook scraper, Facebook posts scraper, Facebook reels\nscraper, Facebook post metrics scraper, Facebook reel metrics scraper, Facebook\npost engagement scraper, Facebook video metrics scraper, Facebook public metrics,\nFacebook likes scraper, Facebook comments count scraper, Facebook shares\nscraper, Facebook views scraper, no-cookie Facebook scraper.\n\n## 🔗 Related social media scrapers\n\nContinue the same workflow on this platform or compare public data across\nplatforms.\n\n### Continue on Facebook\n\n- [Facebook Page Scraper](https://apify.com/chronometrica/facebook-channel-scraper)\n  — collect public Page details, links, and audience stats.\n- [Facebook Comments Scraper](https://apify.com/chronometrica/facebook-comments-scraper)\n  — collect public comments, replies, authors, dates, and reactions.\n\n### Compare metrics across platforms\n\n- [Instagram Metrics Scraper](https://apify.com/chronometrica/instagram-metrics-scraper)\n  — collect public post, Reel, carousel, profile, and collaboration metrics.\n- [TikTok Metrics Scraper](https://apify.com/chronometrica/tiktok-metrics-scraper)\n  — collect public video, profile, engagement, hashtag, and music data.\n- [YouTube Metrics Scraper](https://apify.com/chronometrica/youtube-metrics-scraper)\n  — collect public video, Short, channel, and engagement metrics.\n- [Snapchat Spotlight Metrics Scraper](https://apify.com/chronometrica/snapchat-metrics-scraper)\n  — collect public Spotlight post views, engagement, creator, and media data.\n- [X Post Metrics Scraper](https://apify.com/chronometrica/x-post-metrics)\n  — collect public post views, engagement, media, and author details.\n",
    "changelog": "# Changelog\n\n## 1.1.13 - 2026-06-25\n\n- Improved reel and video metric accuracy so public reactions, likes, comments,\n  and shares are matched to the requested Facebook content more reliably.\n\n## 1.1.4 - 2026-06-24\n\n- Updated Facebook Metrics Scraper with clearer dataset columns and examples,\n  improved metric coverage for supported posts, reels, videos, photos, watch\n  links, post permalinks, profiles, and pages, clearer availability statuses\n  when public metrics are not available, and validation that rejects unsupported\n  Facebook Stories URLs.\n\n## 1.1.3 - 2026-06-22\n\n- Added collaboration-aware public profile fields.\n- Kept one dataset row per input URL while preserving existing author/profile\n  metric fields.\n- Separated confirmed public owners/collaborators from tagged profile context.\n\n## 1.1.2 - 2026-06-22\n\n- Accepted pasted Facebook and fb.watch URLs without `http://` or `https://`\n  in both the form validator and runtime normalization.\n- Made form URL validation tolerate extra spaces around pasted URLs while\n  keeping detailed URL-kind validation in runtime.\n\n## 1.1.1 - 2026-06-22\n\n- Removed sample Facebook URLs from the visible form and runtime defaults so\n  empty input fails clearly instead of scraping examples.\n- Renamed URL mode labels to clarify mixed URLs, content-only URLs, and\n  profile/page discovery.\n- Reorganized form sections around URL choice, profile/page discovery,\n  enrichment, and run options.\n\n## 1.1.0 - 2026-06-22\n\n- Added Store SEO metadata and category metadata for clearer Facebook posts,\n  reels, videos, photos, profile/page metrics, and engagement-metrics search\n  intent.\n- Updated the public pricing event label to align with the broader Facebook\n  metrics positioning.\n\n## 1.0.0 - 2026-06-22\n\n- Renamed the Actor to `Facebook Metrics Scraper` with the slug\n  `facebook-metrics-scraper` while keeping the public output contract focused\n  on Facebook content and profile/page metrics.\n\n## 0.3.0 - 2026-06-22\n\n- Renamed the public content-type field to `postType` and the run summary count\n  field to `postTypeCounts` for clearer dataset output.\n\n## 0.2.0 - 2026-06-22\n\n- Corrected video metric semantics so `viewsCount` represents the public video\n  view counter and `playsCount` represents the broader public play counter when\n  both are available.\n- Updated the run summary schema version to `2026-06-22` so downstream\n  pipelines can distinguish corrected metric semantics from initial release\n  outputs.\n- Improved public title normalization for cleaner dataset rows.\n- Clarified `metricPrecision` values in the README.\n- Exposed Facebook ID fields in the default dataset table view.\n\n## 0.1.0 - 2026-06-21\n\n- Initial release of public Facebook content and profile/page metric\n  collection.\n- Added public metric collection for Facebook watch, reel, video, post, photo,\n  permalink, and pfbid URLs.\n- Added support for public views, plays, reactions, likes, comments, shares,\n  metric status, metric precision, and metric source types.\n- Added URL normalization for mobile, mbasic, shared, watch, reel, video, post,\n  photo, permalink, and shortlink URL shapes.\n- Added canonical URL handling so URL variants can be measured consistently.\n- Added structured row statuses for unavailable, partial, invalid, and failed\n  URLs.\n- Added form-level validation for Facebook and fb.watch links.\n- Added improved parsing for compact and locale-style public counts such as\n  `31.557 views`.\n- Added stronger reel/video metric recovery across common Facebook URL variants.\n- Added improved static pfbid post metric extraction when public counts are\n  available.\n- Added profile/page discovery mode for finding public post, reel, and video\n  URLs from profile/page inputs.\n- Added optional author/profile audience enrichment with best-effort follower\n  and page-like counts.\n- Added Auto-detect mode with a single visible `startUrls` input. Legacy `urls`\n  and `profileUrls` API inputs remain supported for API compatibility.\n- Added public dataset schema, compact run summary, and Apify Store README.\n",
    "actorDefinition": {
      "$schema": "https://apify.com/schemas/v1/actor.ide.json",
      "actorSpecification": 1,
      "name": "facebook-metrics-scraper",
      "title": "Facebook Metrics Scraper",
      "description": "Collect public Facebook engagement metrics from post, reel, watch, video, photo, and profile/page URLs without login or cookies. Get views, plays, reactions, likes, comments, shares, author follower counts, content IDs, availability statuses, and clean run summaries.",
      "seoTitle": "Facebook Metrics Scraper | Posts, Reels & Profiles",
      "seoDescription": "Collect public Facebook metrics from posts, reels, videos, photos, watch URLs, and profiles. Get views, plays, reactions, likes, comments, shares, followers, IDs, and statuses.",
      "categories": [
        "SOCIAL_MEDIA"
      ],
      "version": "1.1",
      "buildTag": "latest",
      "defaultRunOptions": {
        "build": "latest",
        "timeoutSecs": 3600,
        "memoryMbytes": 1024
      },
      "exampleRunInput": {
        "contentType": "application/json; charset=utf-8",
        "body": "{\n    \"mode\": \"knownUrls\",\n    \"startUrls\": [\n        \"https://www.facebook.com/reel/2645452435840671\"\n    ],\n    \"maxItemsPerProfile\": 20,\n    \"includePosts\": true,\n    \"includeReels\": true,\n    \"includeVideos\": true,\n    \"includePhotos\": false,\n    \"includeAuthorProfileMetrics\": true,\n    \"maxConcurrency\": 3,\n    \"requestDelayMillis\": 250,\n    \"maxFetchRetries\": 3,\n    \"requestTimeoutSecs\": 20\n}"
      },
      "input": {
        "title": "Facebook Metrics Scraper input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "mode": {
            "title": "URL handling",
            "type": "string",
            "description": "Choose how to use the URLs below. Auto-detect mixed URLs accepts content URLs and profile/page URLs in the same list.",
            "editor": "select",
            "enum": [
              "auto",
              "knownUrls",
              "profileUrls"
            ],
            "enumTitles": [
              "Auto-detect mixed URLs",
              "Content URLs only",
              "Profile/page discovery only"
            ],
            "sectionCaption": "Choose URLs",
            "sectionDescription": "Paste supported Facebook URLs once. Auto-detect handles post, reel, watch, video, photo, profile, and page URLs. Facebook Stories URLs are not supported.",
            "default": "knownUrls",
            "prefill": "knownUrls"
          },
          "startUrls": {
            "title": "Facebook URLs",
            "type": "array",
            "description": "Paste at least one supported Facebook post, reel, watch, video, photo, profile, or page URL. Every direct content URL is processed. Facebook Stories URLs are not accepted.",
            "editor": "stringList",
            "minItems": 0,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^\\s*(?:https?:\\/\\/)?(?:(?:(?:www\\.|m\\.|mbasic\\.)?facebook\\.com\\/(?!stories(?:[\\/?#]|$))\\S.*)|(?:fb\\.watch\\/\\S.*))\\s*$"
            },
            "default": [
              "https://www.facebook.com/reel/2645452435840671"
            ],
            "prefill": [
              "https://www.facebook.com/reel/2645452435840671"
            ]
          },
          "urls": {
            "title": "Legacy content URLs",
            "type": "array",
            "description": "Backward-compatible API field for users that still send known content URLs as urls.",
            "editor": "hidden",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "profileUrls": {
            "title": "Legacy profile URLs",
            "type": "array",
            "description": "Backward-compatible API field for users that still send profile/page URLs as profileUrls.",
            "editor": "hidden",
            "items": {
              "type": "string"
            },
            "default": []
          },
          "maxItems": {
            "title": "Optional total row cap",
            "type": "integer",
            "description": "Optional maximum metric rows across direct content and profile/page discovery. Leave blank to process every public item the Actor can find. Large values such as 999999 are accepted.",
            "editor": "number",
            "minimum": 1
          },
          "includePosts": {
            "title": "Discover posts",
            "type": "boolean",
            "description": "Include public post URLs found on profile/page pages.",
            "editor": "checkbox",
            "default": true
          },
          "includeReels": {
            "title": "Discover reels",
            "type": "boolean",
            "description": "Include public reel URLs found on profile/page pages.",
            "editor": "checkbox",
            "default": true
          },
          "includeVideos": {
            "title": "Discover videos",
            "type": "boolean",
            "description": "Include public video URLs found on profile/page pages.",
            "editor": "checkbox",
            "default": true
          },
          "includePhotos": {
            "title": "Discover photos",
            "type": "boolean",
            "description": "Include public photo URLs found on profile/page pages. Direct photo URLs are always accepted when provided as input.",
            "editor": "checkbox",
            "default": false
          },
          "includeAuthorProfileMetrics": {
            "title": "Add author/profile metrics",
            "type": "boolean",
            "description": "Fetch each public author/profile page once per run and add best-effort follower and page-like counts when Facebook exposes them without login.",
            "editor": "checkbox",
            "sectionCaption": "Enrichment",
            "sectionDescription": "Optional per-author profile metrics for both direct content URLs and discovered profile/page content.",
            "default": true
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "type": "integer",
            "description": "Maximum seconds to wait for each public Facebook request.",
            "editor": "number",
            "sectionCaption": "Run options",
            "sectionDescription": "Tune request behavior. Defaults are recommended for most users.",
            "default": 20,
            "minimum": 5
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "type": "integer",
            "description": "Maximum number of URLs to resolve at the same time.",
            "editor": "number",
            "default": 3,
            "minimum": 1
          },
          "requestDelayMillis": {
            "title": "Request delay",
            "type": "integer",
            "description": "Minimum delay between public Facebook requests.",
            "editor": "number",
            "default": 250,
            "minimum": 0,
            "maximum": 10000
          },
          "maxFetchRetries": {
            "title": "Fetch retries",
            "type": "integer",
            "description": "Number of retry attempts for transient public request failures.",
            "editor": "number",
            "default": 3,
            "minimum": 0,
            "maximum": 5
          },
          "includeFailedRows": {
            "title": "Output failed rows",
            "type": "boolean",
            "description": "API option. When false, failed, invalid, and no-public-metric rows are counted in the run summary but not pushed to the dataset.",
            "editor": "hidden",
            "default": false
          }
        }
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "Facebook Metrics Scraper output",
        "description": "Metric rows are stored in the default dataset. OUTPUT contains a compact run summary.",
        "properties": {
          "results": {
            "type": "string",
            "title": "Metric results",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          },
          "output": {
            "type": "string",
            "title": "Run summary",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/OUTPUT"
          }
        }
      },
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "$schema": "http://json-schema.org/draft-07/schema#",
            "type": "object",
            "properties": {
              "platform": {
                "type": "string",
                "title": "Platform"
              },
              "inputUrl": {
                "type": "string",
                "title": "Input URL"
              },
              "contentUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Content URL"
              },
              "contentId": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Content ID"
              },
              "contentType": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Content Type"
              },
              "publishedAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "title": "Published At"
              },
              "profileUrl": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile URL"
              },
              "profileId": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile ID"
              },
              "profileUsername": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile Username"
              },
              "profileName": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Profile Name"
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Description"
              },
              "views": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Views"
              },
              "plays": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Plays"
              },
              "reactions": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Reactions"
              },
              "likes": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Likes"
              },
              "comments": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Comments"
              },
              "shares": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Shares"
              },
              "contentMetricStatus": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "metric": {
                      "type": "string",
                      "enum": [
                        "views",
                        "plays",
                        "reactions",
                        "likes",
                        "comments",
                        "shares"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "present",
                        "unavailable",
                        "not_attempted"
                      ]
                    },
                    "precision": {
                      "type": "string",
                      "enum": [
                        "exact",
                        "compact_rounded",
                        "exact_or_displayed",
                        "display_rounded",
                        "likely_rounded",
                        "unavailable",
                        "unknown"
                      ]
                    },
                    "source": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "statusReason": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "metric",
                    "status",
                    "precision"
                  ]
                },
                "title": "Content Metric Status",
                "description": "Public status, precision, and source metadata for content metrics."
              },
              "collaborationCount": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Collaboration Count"
              },
              "collaborationProfiles": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "url": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "role": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "type": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  }
                },
                "title": "Collaboration Profiles"
              },
              "profileFollowers": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Profile Followers"
              },
              "profilePageLikes": {
                "type": [
                  "integer",
                  "null"
                ],
                "title": "Profile Page Likes"
              },
              "profileMetricStatus": {
                "type": [
                  "array",
                  "null"
                ],
                "items": {
                  "type": "object",
                  "properties": {
                    "metric": {
                      "type": "string",
                      "enum": [
                        "profileFollowers",
                        "profilePageLikes"
                      ]
                    },
                    "status": {
                      "type": "string",
                      "enum": [
                        "present",
                        "unavailable",
                        "not_attempted"
                      ]
                    },
                    "precision": {
                      "type": "string",
                      "enum": [
                        "exact",
                        "compact_rounded",
                        "exact_or_displayed",
                        "display_rounded",
                        "likely_rounded",
                        "unavailable",
                        "unknown"
                      ]
                    },
                    "source": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "statusReason": {
                      "type": [
                        "string",
                        "null"
                      ]
                    }
                  },
                  "required": [
                    "metric",
                    "status",
                    "precision"
                  ]
                },
                "title": "Profile Metric Status",
                "description": "Public status, precision, source, and availability metadata for author/profile metrics."
              },
              "status": {
                "type": "string",
                "title": "Status"
              },
              "statusReason": {
                "type": [
                  "string",
                  "null"
                ],
                "title": "Status Reason"
              },
              "scrapedAt": {
                "type": "string",
                "format": "date-time",
                "title": "Scraped At"
              }
            },
            "required": [
              "platform",
              "inputUrl",
              "status",
              "scrapedAt"
            ]
          },
          "views": {
            "overview": {
              "title": "Facebook metrics",
              "description": "One row per Facebook content URL or profile-discovered content item.",
              "transformation": {
                "fields": [
                  "platform",
                  "inputUrl",
                  "contentUrl",
                  "contentId",
                  "contentType",
                  "publishedAt",
                  "profileUrl",
                  "profileId",
                  "profileUsername",
                  "profileName",
                  "description",
                  "views",
                  "plays",
                  "reactions",
                  "likes",
                  "comments",
                  "shares",
                  "contentMetricStatus",
                  "collaborationCount",
                  "collaborationProfiles",
                  "profileFollowers",
                  "profilePageLikes",
                  "profileMetricStatus",
                  "status",
                  "statusReason",
                  "scrapedAt"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "platform": {
                    "label": "Platform",
                    "format": "text"
                  },
                  "inputUrl": {
                    "label": "Input URL",
                    "format": "link"
                  },
                  "contentUrl": {
                    "label": "Content URL",
                    "format": "link"
                  },
                  "contentId": {
                    "label": "Content ID",
                    "format": "text"
                  },
                  "contentType": {
                    "label": "Content Type",
                    "format": "text"
                  },
                  "publishedAt": {
                    "label": "Published At",
                    "format": "date"
                  },
                  "profileUrl": {
                    "label": "Profile URL",
                    "format": "link"
                  },
                  "profileId": {
                    "label": "Profile ID",
                    "format": "text"
                  },
                  "profileUsername": {
                    "label": "Profile Username",
                    "format": "text"
                  },
                  "profileName": {
                    "label": "Profile Name",
                    "format": "text"
                  },
                  "description": {
                    "label": "Description",
                    "format": "text"
                  },
                  "views": {
                    "label": "Views",
                    "format": "number"
                  },
                  "plays": {
                    "label": "Plays",
                    "format": "number"
                  },
                  "reactions": {
                    "label": "Reactions",
                    "format": "number"
                  },
                  "likes": {
                    "label": "Likes",
                    "format": "number"
                  },
                  "comments": {
                    "label": "Comments",
                    "format": "number"
                  },
                  "shares": {
                    "label": "Shares",
                    "format": "number"
                  },
                  "contentMetricStatus": {
                    "label": "Content Metric Status",
                    "format": "object"
                  },
                  "collaborationCount": {
                    "label": "Collaboration Count",
                    "format": "number"
                  },
                  "collaborationProfiles": {
                    "label": "Collaboration Profiles",
                    "format": "object"
                  },
                  "profileFollowers": {
                    "label": "Profile Followers",
                    "format": "number"
                  },
                  "profilePageLikes": {
                    "label": "Profile Page Likes",
                    "format": "number"
                  },
                  "profileMetricStatus": {
                    "label": "Profile Metric Status",
                    "format": "object"
                  },
                  "status": {
                    "label": "Status",
                    "format": "text"
                  },
                  "statusReason": {
                    "label": "Status Reason",
                    "format": "text"
                  },
                  "scrapedAt": {
                    "label": "Scraped At",
                    "format": "date"
                  }
                }
              }
            }
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "changelog": "# Changelog\n\n## 1.1.13 - 2026-06-25\n\n- Improved reel and video metric accuracy so public reactions, likes, comments,\n  and shares are matched to the requested Facebook content more reliably.\n\n## 1.1.4 - 2026-06-24\n\n- Updated Facebook Metrics Scraper with clearer dataset columns and examples,\n  improved metric coverage for supported posts, reels, videos, photos, watch\n  links, post permalinks, profiles, and pages, clearer availability statuses\n  when public metrics are not available, and validation that rejects unsupported\n  Facebook Stories URLs.\n\n## 1.1.3 - 2026-06-22\n\n- Added collaboration-aware public profile fields.\n- Kept one dataset row per input URL while preserving existing author/profile\n  metric fields.\n- Separated confirmed public owners/collaborators from tagged profile context.\n\n## 1.1.2 - 2026-06-22\n\n- Accepted pasted Facebook and fb.watch URLs without `http://` or `https://`\n  in both the form validator and runtime normalization.\n- Made form URL validation tolerate extra spaces around pasted URLs while\n  keeping detailed URL-kind validation in runtime.\n\n## 1.1.1 - 2026-06-22\n\n- Removed sample Facebook URLs from the visible form and runtime defaults so\n  empty input fails clearly instead of scraping examples.\n- Renamed URL mode labels to clarify mixed URLs, content-only URLs, and\n  profile/page discovery.\n- Reorganized form sections around URL choice, profile/page discovery,\n  enrichment, and run options.\n\n## 1.1.0 - 2026-06-22\n\n- Added Store SEO metadata and category metadata for clearer Facebook posts,\n  reels, videos, photos, profile/page metrics, and engagement-metrics search\n  intent.\n- Updated the public pricing event label to align with the broader Facebook\n  metrics positioning.\n\n## 1.0.0 - 2026-06-22\n\n- Renamed the Actor to `Facebook Metrics Scraper` with the slug\n  `facebook-metrics-scraper` while keeping the public output contract focused\n  on Facebook content and profile/page metrics.\n\n## 0.3.0 - 2026-06-22\n\n- Renamed the public content-type field to `postType` and the run summary count\n  field to `postTypeCounts` for clearer dataset output.\n\n## 0.2.0 - 2026-06-22\n\n- Corrected video metric semantics so `viewsCount` represents the public video\n  view counter and `playsCount` represents the broader public play counter when\n  both are available.\n- Updated the run summary schema version to `2026-06-22` so downstream\n  pipelines can distinguish corrected metric semantics from initial release\n  outputs.\n- Improved public title normalization for cleaner dataset rows.\n- Clarified `metricPrecision` values in the README.\n- Exposed Facebook ID fields in the default dataset table view.\n\n## 0.1.0 - 2026-06-21\n\n- Initial release of public Facebook content and profile/page metric\n  collection.\n- Added public metric collection for Facebook watch, reel, video, post, photo,\n  permalink, and pfbid URLs.\n- Added support for public views, plays, reactions, likes, comments, shares,\n  metric status, metric precision, and metric source types.\n- Added URL normalization for mobile, mbasic, shared, watch, reel, video, post,\n  photo, permalink, and shortlink URL shapes.\n- Added canonical URL handling so URL variants can be measured consistently.\n- Added structured row statuses for unavailable, partial, invalid, and failed\n  URLs.\n- Added form-level validation for Facebook and fb.watch links.\n- Added improved parsing for compact and locale-style public counts such as\n  `31.557 views`.\n- Added stronger reel/video metric recovery across common Facebook URL variants.\n- Added improved static pfbid post metric extraction when public counts are\n  available.\n- Added profile/page discovery mode for finding public post, reel, and video\n  URLs from profile/page inputs.\n- Added optional author/profile audience enrichment with best-effort follower\n  and page-like counts.\n- Added Auto-detect mode with a single visible `startUrls` input. Legacy `urls`\n  and `profileUrls` API inputs remain supported for API compatibility.\n- Added public dataset schema, compact run summary, and Apify Store README.\n",
      "readme": "# Facebook Metrics Scraper\n\n## 📊 What does Facebook Metrics Scraper do?\n\nFacebook Metrics Scraper extracts public engagement metrics from Facebook post,\nreel, watch, video, photo, and profile/page URLs. Paste known Facebook content\nURLs to measure them directly, or paste profile/page URLs to discover recent\npublic content first.\n\nUse it for repeatable public engagement monitoring: views, plays, reactions,\nlikes, comments, shares, author audience counts, content IDs, and clear\navailability statuses in one dataset. Rows can also include public\ncollaboration profile context when available.\n\nThis Actor does not log in, use cookies, scrape private content, collect\ncomments, collect liker identities, or bypass Facebook access controls. It only\nreturns data that is publicly visible without logging in.\n\nWith Facebook Metrics Scraper, you can:\n\n- 📈 Collect public views, plays, reactions, likes, comments, and shares.\n- 🎬 Measure reels, watch URLs, videos, posts, photos, permalink URLs, and pfbid\n  post URLs.\n- 👤 Add best-effort author/profile follower and page-like counts.\n- 🤝 Capture public owner and collaboration profile context when available.\n- 🔎 Discover public content URLs from Facebook profile/page URLs.\n- 🆔 Extract normalized content and profile fields such as `contentUrl`,\n  `contentId`, `contentType`, `profileUsername`, and `profileName`.\n- 🚦 Get structured statuses when a URL resolves but public metrics are not\n  available.\n- 📦 Export results as JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## 📦 What Facebook metric data can I extract?\n\nEach dataset row represents one Facebook content URL. The row is flattened and\ngrouped for scanning: input, content, profile, media text, metrics,\ncollaboration context, profile metrics, and row status.\n\n| Data group                | Example fields                                                |\n| ------------------------- | ------------------------------------------------------------- |\n| 🔗 Source attempt         | `platform`, `inputUrl`                                        |\n| 🆔 Content entity         | `contentUrl`, `contentId`, `contentType`                      |\n| 👤 Author/profile entity  | `profileUrl`, `profileId`, `profileUsername`, `profileName`   |\n| 🧾 Media details          | `description`                                                 |\n| 📊 Engagement metrics     | `views`, `plays`, `reactions`, `likes`, `comments`, `shares`  |\n| 🎯 Content metric quality | `contentMetricStatus`                                         |\n| 🤝 Collaboration bridge   | `collaborationCount`, `collaborationProfiles`                 |\n| 👥 Author/profile metrics | `profileFollowers`, `profilePageLikes`, `profileMetricStatus` |\n| 🚦 Row status             | `status`, `statusReason`, `scrapedAt`                         |\n\nMetric availability depends on what Facebook exposes publicly for each URL.\nReels, watch URLs, and videos usually provide the strongest metric coverage.\nStatic posts can be partial. URLs with no public content metrics are counted in\n`OUTPUT` and skipped from the dataset by default.\n\n`contentType` describes the kind of Facebook content resolved for the row:\n\nAdditional source-specific IDs can appear in full JSON exports for API users,\nbut they are omitted from the default dataset table view to keep the main output\nfocused.\n\nFacebook Stories URLs, such as `facebook.com/stories/...`, are not supported.\n\n| Content type | Meaning                                      |\n| ------------ | -------------------------------------------- |\n| `reel`       | Reel-style Facebook video content.           |\n| `video`      | Standard Facebook video or watch content.    |\n| `post`       | Static Facebook post, including pfbid posts. |\n| `photo`      | Direct Facebook photo content.               |\n| `unknown`    | The URL resolved, but type was unclear.      |\n\nFor video-like content, `views` represents the public video view counter\nwhen Facebook exposes it. `plays` is a broader public play counter when\navailable, and can be higher than `views`. Keep both when you care about\nvideo measurement details.\n\n`contentMetricStatus` and `profileMetricStatus` include status, precision, and\nsource details for each public metric. The metric values live in the dedicated\nmetric fields, not repeated inside the status arrays. Precision values include:\n\n| Precision value      | Meaning                                                                     |\n| -------------------- | --------------------------------------------------------------------------- |\n| `exact`              | The count was available as a full public number.                            |\n| `exact_or_displayed` | The count appeared as a complete displayed number, such as `31,557 views`.  |\n| `compact_rounded`    | The count came from public shorthand, such as `3.3M views` or `437K plays`. |\n\nFor `compact_rounded` values, the dataset stores the expanded numeric value. For\nexample, `3.3M views` becomes `3300000`. Treat those values as useful\napproximations, not exact counters.\n\nAuthor/profile metrics are separate from content engagement metrics.\n`profileFollowers` and `profilePageLikes` describe the public\nprofile/page audience. `likes`, `comments`, and `shares` describe\nthe individual content row.\n\n`collaborationProfiles` contains public owner/byline profile context when it is\navailable. The first profile is marked `owner`; additional profiles are marked\n`collaborator`.\n\n## ⚙️ Can I use this Actor through an API?\n\nYes. You can run Facebook Metrics Scraper manually in Apify Console\nor use it through:\n\n- Apify API\n- Python SDK\n- Node.js SDK\n- Webhooks\n- Scheduled runs\n- Apify integrations\n\nThis makes it useful for social listening workflows, creator dashboards,\ncompetitive intelligence, campaign reporting, content audits, warehouse loads,\nand automated market research.\n\n## 🎯 Why scrape Facebook post and reel metrics?\n\nFacebook public engagement data helps you understand which posts, reels, and\nvideos are gaining traction across creators, brands, campaigns, and competitors.\n\n| Use case                        | How Facebook metric data helps                                          |\n| ------------------------------- | ----------------------------------------------------------------------- |\n| 📈 Track creator performance    | Monitor public engagement across known creator URLs.                    |\n| 🎬 Compare content formats      | Compare reels, videos, and posts side by side.                          |\n| 📣 Measure campaign activity    | Collect repeatable metrics for known campaign or brand content URLs.    |\n| 🕵️ Run competitive intelligence | Track public engagement on competitor posts and reels you already know. |\n| 📊 Build reporting workflows    | Feed normalized Facebook metrics into dashboards and client reports.    |\n| 🔎 Audit URL availability       | Separate available, partial, unavailable, and failed rows cleanly.      |\n\n## 💵 How much does scraping Facebook metrics cost?\n\nFacebook Metrics Scraper uses Apify Actor pricing. If the Actor is\nmonetized, you are charged according to the current price shown on the\n**Pricing** tab.\n\nStart with a small batch of 3 to 10 URLs when testing. The run summary shows how\nmany URLs resolved, how many dataset rows were produced, how many returned no\npublic metrics, and whether any URLs failed.\n\n## 🚀 How do I use Facebook Metrics Scraper?\n\n1. Create or log in to your Apify account.\n2. Open **Facebook Metrics Scraper**.\n3. Choose **Auto-detect mixed URLs**, **Content URLs only**, or\n   **Profile/page discovery only**.\n4. Paste Facebook content URLs, profile/page URLs, or both.\n5. Leave the default settings for your first run.\n6. Click **Start**.\n7. Open the **Output** tab to inspect the dataset and run summary.\n8. Download your data in JSON, JSONL, CSV, Excel, XML, RSS, or HTML.\n\n## ⬇️ Input\n\nThe main input is `startUrls`. Paste at least one supported Facebook URL.\n`https://` is optional, so `www.facebook.com/reel/...` works too. Extra spaces\naround pasted URLs are ignored. In Auto-detect mixed URLs mode, you can paste\ncontent URLs and profile/page URLs into the same list. Facebook Stories URLs are\nrejected by the input form and runtime validation.\n\nEvery direct content URL is processed. `maxItemsPerProfile` applies only to\ncontent discovered from profile or page inputs.\n\n```json\n{\n    \"mode\": \"knownUrls\",\n    \"startUrls\": [\"https://www.facebook.com/reel/2645452435840671\"],\n    \"maxItemsPerProfile\": 20,\n    \"includePosts\": true,\n    \"includeReels\": true,\n    \"includeVideos\": true,\n    \"includePhotos\": false,\n    \"includeAuthorProfileMetrics\": true,\n    \"maxConcurrency\": 3,\n    \"requestDelayMillis\": 250,\n    \"maxFetchRetries\": 3,\n    \"requestTimeoutSecs\": 20\n}\n```\n\n### 🔗 Facebook URLs\n\nSupported content URL shapes include:\n\n```text\nwww.facebook.com/reel/2645452435840671\nhttps://www.facebook.com/reel/2645452435840671\nhttps://www.facebook.com/watch/?v=1203714368298095\nhttps://www.facebook.com/{page}/posts/{post-id-or-pfbid}\nhttps://www.facebook.com/{page}/videos/{video-id}\nhttps://www.facebook.com/{page}/videos/{slug}/{video-id}\nhttps://www.facebook.com/photo?fbid={photo-id}\nhttps://www.facebook.com/photo.php?fbid={photo-id}\nhttps://www.facebook.com/{page}/photos/{photo-id}\nhttps://www.facebook.com/permalink.php?story_fbid={post-id}&id={page-id}\nhttps://fb.watch/{short-code}/\n```\n\nBest results usually come from direct reel, watch, video, and photo URLs that\nopen publicly in a logged-out browser.\n\n`permalink.php?story_fbid=...` is a regular Facebook post permalink shape, not\na Facebook Stories URL.\n\nFacebook Stories URLs such as `facebook.com/stories/...` are not supported.\n\n### 👤 Profile/Page Discovery\n\nUse profile/page discovery when you want the Actor to find public content URLs\nbefore collecting metrics.\n\n```json\n{\n    \"mode\": \"profileUrls\",\n    \"startUrls\": [\"https://www.facebook.com/ThomasSandersOfficial\"],\n    \"maxItemsPerProfile\": 20,\n    \"includePosts\": true,\n    \"includeReels\": true,\n    \"includeVideos\": true,\n    \"includePhotos\": false,\n    \"includeAuthorProfileMetrics\": true,\n    \"maxConcurrency\": 3,\n    \"requestDelayMillis\": 250,\n    \"maxFetchRetries\": 3,\n    \"requestTimeoutSecs\": 20\n}\n```\n\nUse `maxItemsPerProfile` to control how many discovered URLs are resolved from\neach profile/page. The default is conservative for routine runs, and larger\nvalues are accepted for high-volume jobs.\n\n### 🎛️ Settings\n\n| Option                        | What it does                                                                                                 |\n| ----------------------------- | ------------------------------------------------------------------------------------------------------------ |\n| `mode`                        | `auto` to detect mixed URLs, `knownUrls` for content URLs only, or `profileUrls` for profile/page discovery. |\n| `startUrls`                   | Facebook content and/or profile/page URLs. Paste at least one URL.                                           |\n| `maxItemsPerProfile`          | Maximum discovered content URLs to resolve per profile/page.                                                 |\n| `includePosts`                | Include discovered post URLs.                                                                                |\n| `includeReels`                | Include discovered reel URLs.                                                                                |\n| `includeVideos`               | Include discovered video URLs.                                                                               |\n| `includePhotos`               | Include public photo URLs found during profile/page discovery. Direct photo URLs are always accepted.        |\n| `includeAuthorProfileMetrics` | Fetch each public author/profile once and add best-effort follower and page-like counts.                     |\n| `maxConcurrency`              | Controls how many URLs are resolved at the same time.                                                        |\n| `requestDelayMillis`          | Adds a minimum delay between public Facebook requests.                                                       |\n| `maxFetchRetries`             | Retries transient public request failures before marking a URL failed.                                       |\n| `requestTimeoutSecs`          | Maximum wait time for each public Facebook request.                                                          |\n\n## ⬆️ Output sample\n\nThe results are stored in the default dataset. Each result is one Facebook\ncontent URL with at least one public content metric.\n\n```json\n{\n    \"platform\": \"facebook\",\n    \"inputUrl\": \"https://www.facebook.com/reel/2098858540985362/\",\n    \"contentUrl\": \"https://www.facebook.com/reel/2098858540985362/\",\n    \"contentId\": \"2098858540985362\",\n    \"contentType\": \"reel\",\n    \"profileUrl\": \"https://www.facebook.com/ExampleCreator\",\n    \"profileId\": \"123456789\",\n    \"profileUsername\": \"ExampleCreator\",\n    \"profileName\": \"Example Creator\",\n    \"description\": \"Example public reel description\",\n    \"views\": 277000,\n    \"plays\": 660000,\n    \"reactions\": 21424,\n    \"likes\": 21424,\n    \"comments\": 267,\n    \"shares\": 553,\n    \"contentMetricStatus\": [\n        {\n            \"metric\": \"views\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"plays\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"reactions\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"likes\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"comments\",\n            \"status\": \"present\",\n            \"precision\": \"exact\",\n            \"source\": \"public_content\"\n        },\n        {\n            \"metric\": \"shares\",\n            \"status\": \"present\",\n            \"precision\": \"exact_or_displayed\",\n            \"source\": \"public_content\"\n        }\n    ],\n    \"collaborationCount\": 1,\n    \"collaborationProfiles\": [\n        {\n            \"id\": \"123456789\",\n            \"name\": \"Example Creator\",\n            \"url\": \"https://www.facebook.com/ExampleCreator\",\n            \"role\": \"owner\",\n            \"type\": \"Page\"\n        }\n    ],\n    \"profileFollowers\": 1200000,\n    \"profilePageLikes\": 840000,\n    \"profileMetricStatus\": [\n        {\n            \"metric\": \"profileFollowers\",\n            \"status\": \"present\",\n            \"precision\": \"compact_rounded\",\n            \"source\": \"public_profile\"\n        },\n        {\n            \"metric\": \"profilePageLikes\",\n            \"status\": \"present\",\n            \"precision\": \"compact_rounded\",\n            \"source\": \"public_profile\"\n        }\n    ],\n    \"status\": \"ok\",\n    \"statusReason\": null,\n    \"scrapedAt\": \"2026-06-21T22:15:00.000Z\"\n}\n```\n\n### 📌 Run summary\n\nFacebook Metrics Scraper also saves an `OUTPUT` summary in the\ndefault key-value store.\n\n```json\n{\n    \"actorName\": \"facebook-metrics-scraper\",\n    \"mode\": \"auto\",\n    \"providedUrls\": 3,\n    \"contentUrls\": 2,\n    \"profileUrls\": 1,\n    \"inputUrls\": 22,\n    \"discoveredUrls\": 20,\n    \"resolvedUrls\": 21,\n    \"datasetRows\": 18,\n    \"skippedDatasetRows\": 3,\n    \"skippedFailedRows\": 0,\n    \"skippedInvalidRows\": 0,\n    \"skippedNoPublicMetricRows\": 3,\n    \"metricRows\": 18,\n    \"noPublicMetricRows\": 3,\n    \"failedRows\": 0,\n    \"invalidRows\": 0,\n    \"statusCounts\": {\n        \"ok\": 18,\n        \"resolved_no_public_metrics\": 3\n    },\n    \"postTypeCounts\": {\n        \"reel\": 12,\n        \"video\": 5,\n        \"post\": 4\n    },\n    \"authorProfileMetricsStatusCounts\": {\n        \"ok\": 17,\n        \"no_public_profile_metrics\": 4\n    }\n}\n```\n\n## ❓ Why did I get fewer metrics than expected?\n\nThe Actor returns only metrics that Facebook exposes publicly without login. A\nsuccessful URL resolution does not guarantee that every metric is available.\n\nCommon reasons include:\n\n- Facebook exposed preview-level counts but not richer engagement counters.\n- A static post exposed only partial metrics, such as shares.\n- Some static posts did not expose public counts.\n- The content requires login, is private, removed, region-limited, age-gated, or\n  otherwise unavailable to logged-out users.\n- The rendered Facebook UI rounds or updates counters differently from public\n  data available at collection time.\n\nUse `contentMetricStatus`, `profileMetricStatus`, and `statusReason` to decide\nwhether a row is suitable for your reporting workflow.\n\n## ✅ Tips for scraping Facebook metrics\n\n- Start with a small test run and inspect the dataset before increasing volume.\n- Use direct Facebook content URLs whenever possible.\n- Prefer reel, watch, and video URLs for richer public metric availability.\n- Leave `includeAuthorProfileMetrics` on when you want follower/page-like\n  context.\n- Keep `maxConcurrency` modest for steadier large runs.\n- Leave network and retry settings at their defaults unless you have a specific\n  reason to change them.\n- Failed, invalid, and no-public-metric input rows are counted in `OUTPUT` and\n  `SKIPPED_DATASET_ROWS` but are not pushed to the dataset by default.\n- Treat `resolved_no_public_metrics` as an audit status in `OUTPUT`, not a\n  failed run.\n\n## ⚖️ Is it legal to scrape Facebook post and reel metrics?\n\nThis Actor extracts public Facebook data that is available without login. You\nare responsible for making sure your use case complies with applicable laws,\nplatform terms, and privacy rules.\n\nFacebook content can sometimes include personal data, names, profile details, or\nother sensitive information. Do not scrape, store, or process personal data\nunless you have a legitimate reason and the right legal basis. If you're unsure,\nconsult your lawyers.\n\nFacebook is a trademark of its owner. This Actor is independent and is not\naffiliated with, endorsed by, or sponsored by Facebook or Meta.\n\n## 🛟 Support\n\nIf a run does not return what you expected, open an issue with the run ID and the\ninput URLs you used. Include the dataset row for the affected URL when possible.\nThe row-level `status`, `statusReason`, `contentMetricStatus`, and\n`profileMetricStatus` fields make support specific.\n\nRelated searches: Facebook scraper, Facebook posts scraper, Facebook reels\nscraper, Facebook post metrics scraper, Facebook reel metrics scraper, Facebook\npost engagement scraper, Facebook video metrics scraper, Facebook public metrics,\nFacebook likes scraper, Facebook comments count scraper, Facebook shares\nscraper, Facebook views scraper, no-cookie Facebook scraper.\n\n## 🔗 Related social media scrapers\n\nContinue the same workflow on this platform or compare public data across\nplatforms.\n\n### Continue on Facebook\n\n- [Facebook Page Scraper](https://apify.com/chronometrica/facebook-channel-scraper)\n  — collect public Page details, links, and audience stats.\n- [Facebook Comments Scraper](https://apify.com/chronometrica/facebook-comments-scraper)\n  — collect public comments, replies, authors, dates, and reactions.\n\n### Compare metrics across platforms\n\n- [Instagram Metrics Scraper](https://apify.com/chronometrica/instagram-metrics-scraper)\n  — collect public post, Reel, carousel, profile, and collaboration metrics.\n- [TikTok Metrics Scraper](https://apify.com/chronometrica/tiktok-metrics-scraper)\n  — collect public video, profile, engagement, hashtag, and music data.\n- [YouTube Metrics Scraper](https://apify.com/chronometrica/youtube-metrics-scraper)\n  — collect public video, Short, channel, and engagement metrics.\n- [Snapchat Spotlight Metrics Scraper](https://apify.com/chronometrica/snapchat-metrics-scraper)\n  — collect public Spotlight post views, engagement, creator, and media data.\n- [X Post Metrics Scraper](https://apify.com/chronometrica/x-post-metrics)\n  — collect public post views, engagement, media, and author details.\n"
    },
    "buildNumber": "1.1.26",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.054704444444444444
    }
  }
}