# Facebook Reviews Scraper✨ (`premiumscraper/facebook-reviews-scraper`) Actor

✨ Scrape Facebook reviews from usernames, Page URLs, or direct reviews links. Output includes review ID, permalink, date, recommendation status, review text, tags, likes, comments, reviewer details, nested comments, replies, page URL and ID, and source context ✨ Facebook Reviews Scraper 🔍

- **URL**: https://apify.com/premiumscraper/facebook-reviews-scraper.md
- **Developed by:** [Premium Scraper](https://apify.com/premiumscraper) (community)
- **Categories:** Social media, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 reviews

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

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 Reviews Scraper ✨

Facebook Reviews Scraper collects public Facebook review rows from usernames, page or profile URLs, and direct `/reviews` URLs.

Facebook Reviews Scraper is designed for public data only. Facebook Reviews Scraper resolves inputs to the public reviews tab, paginates the public review feed, enriches each review with optional public comments and replies, and exports a clean structured dataset row with the most important review fields first.

### 📥 Facebook Reviews Scraper Supported Input

- Facebook usernames such as `copperkettleyqr`
- Base page or profile URLs such as `https://www.facebook.com/copperkettleyqr`
- Direct reviews URLs such as `https://www.facebook.com/copperkettleyqr/reviews`
- Public `/people/.../<numeric-id>/` profile URLs

URL-form inputs are normalized to the matching public `/reviews` tab before scraping starts, and exported `inputUrl` values use that resolved `/reviews` URL.

Example input:

```json
{
  "username": ["copperkettleyqr"],
  "facebook_urls": [
    { "url": "https://www.facebook.com/copperkettleyqr" },
    { "url": "https://www.facebook.com/copperkettleyqr/reviews" }
  ],
  "max_reviews": 10,
  "include_review_comments": true,
  "comments_limit": 10,
  "include_comment_replies": true,
  "comment_replies_limit": 10,
  "comment_filter": "most_relevant",
  "proxyCountry": "US"
}
````

### 📦 Facebook Reviews Scraper Output Design

Each dataset row represents one public review.

The export is intentionally split into four parts:

- The input field first: `inputUrl` or `inputUsername`
- A large set of top-level review fields and review detail blocks
- A top-level `comments` block with top-level comments and nested replies
- A final `sourceDetails` block with page and profile context

### 🔝 Facebook Reviews Scraper Top-Level Fields

These are the most important fields promoted to the top level of each row. They are exported first in a stable order so the dataset starts with the review summary before the comment tree and source context.

| Field | Meaning |
|---|---|
| `type` | Constant row type, currently `review` |
| `inputUrl` | Resolved `/reviews` URL when the source started as a URL |
| `inputUsername` | Username input when the source started as a username |
| `facebookUrl` | Resolved public page or profile URL |
| `facebookId` | Public page or profile ID |
| `pageName` | Source username when available, otherwise the public source name |
| `pageAdLibrary` | Public page ad-library block when Facebook exposes it |
| `ratingSignals` | Public rating and review counters when Facebook exposes them |
| `id` | Story-level Facebook identifier for the review payload |
| `legacyId` | Main legacy numeric review identifier |
| `url` | Public permalink of the review story |
| `date` | Review creation timestamp in ISO format with milliseconds |
| `isRecommended` | `true`, `false`, or `null`, derived from Facebook's own public review title statement |
| `text` | Main review text |
| `tags` | Recommendation tags such as `Cosy atmosphere` when present |
| `likesCount` | Total public reaction count for the review when available |
| `commentsCount` | Total public top-level comment count signal |
| `shareCount` | Total public share count for the review when available |
| `reactionCountReduced` | Reduced reaction count text when Facebook exposes shortened notation |
| `shareCountReduced` | Reduced share count text when Facebook exposes shortened notation |
| `matchedFragmentCount` | Number of merged fragments that formed the final review row |
| `reviewType` | Facebook story type, usually `Story` |
| `isFeedUnit` | Feed-unit type marker exposed by Facebook |
| `isTrackableFeedUnit` | Trackable feed-unit type marker exposed by Facebook |
| `canViewerSeeMenu` | Public menu visibility flag when Facebook exposes it |
| `shouldHostActorLinkInWatch` | Story rendering flag when Facebook exposes it |
| `cacheId` | Facebook cache ID exposed with the public review payload |
| `wwwUrl` | Public web URL exposed by Facebook for the review story |
| `attachmentTypes` | Attachment type list detected for the review |
| `attachmentCount` | Total attachment count |
| `photoAttachmentCount` | Photo attachment count |
| `videoAttachmentCount` | Video attachment count |
| `imageUrls` | Main image URLs surfaced from review media payloads |
| `user` | Public author block with `id`, `name`, `profileUrl`, and `profilePic` |
| `reviewEngagement` | Grouped reaction, comment, and share signals |
| `reviewMedia` | Grouped review media summary and full media details |
| `reviewRecommendation` | Recommendation tags and recommendation attachment metadata |
| `reviewAllDetails` | Rich sanitized review-only payload details such as attachments, feedback, actors, sections, and other non-sensitive story fields |
| `source_row_number` | Review position in the collected public reviews sequence for the source |
| `comments` | Top-level comment block with returned comments and nested replies |
| `collection_debug` | Collection metadata such as requested limit, returned count, enabled comment options, and stop reason |
| `sourceDetails` | Final grouped source block with the reviewed page or profile details |

### 🧩 Facebook Reviews Scraper Output Order Walkthrough

Each exported row is intentionally ordered so the most useful review fields appear first.

1. `number`
   Sequential row number added when the actor pushes data.
2. `inputUrl` or `inputUsername`
   The original input field appears first.
3. `type`
   Always `review`.
4. `facebookUrl`, `facebookId`, `pageName`, `pageAdLibrary`, `ratingSignals`, then `id`, `legacyId`, `url`, `date`, `isRecommended`, `text`, `tags`, `likesCount`, `commentsCount`, `shareCount`, `user`
   Main review summary fields.
5. Review detail fields and detail blocks such as `reviewEngagement`, `reviewMedia`, `reviewRecommendation`, and `reviewAllDetails`
   Rich review-only details stay above the comment tree.
6. `source_row_number`
   The review position for the current source.
7. `comments`
   The nested comment and reply tree.
8. `collection_debug`
   Run-level context for the collected review.
9. `sourceDetails`
   Source page or profile details are grouped last.

### 🧷 Facebook Reviews Scraper Compatibility Alias Fields

The actor exports the exact compatibility fields below and places the review-focused aliases near the top of every row.

| Field | Meaning |
|---|---|
| `id` | Story-level review identifier |
| `legacyId` | Main legacy numeric review identifier |
| `user` | Review author block with `id`, `name`, `profileUrl`, and `profilePic` |
| `date` | Review timestamp in ISO format with milliseconds |
| `url` | Public review permalink without a trailing slash |
| `isRecommended` | `true`, `false`, or `null`, derived from Facebook's own public review title statement |
| `text` | Main review text |
| `tags` | Public recommendation tags when Facebook exposes them |
| `likesCount` | Total public reaction count |
| `commentsCount` | Total public top-level comment count signal |
| `inputUrl` | Resolved `/reviews` URL without a trailing slash |

### 📝 Facebook Reviews Scraper Output Field Details

Facebook Reviews Scraper returns a review-first dataset row, and this section explains what each field gives you and how to use it.

#### Input fields

- `inputUrl`: the resolved public `/reviews` URL when the source started as a URL
- `inputUsername`: the original username input when the source started as a username

#### Source alias fields

- `facebookUrl`: resolved public page or profile URL for the reviewed source
- `facebookId`: public page or profile ID for the reviewed source
- `pageName`: source username when available, otherwise the source display name
- `pageAdLibrary`: compact public ad-library block when Facebook exposes it
- `ratingSignals`: public counters such as review count or rating count when Facebook exposes them

#### Review summary fields

- `id`: story-level review ID
- `legacyId`: numeric legacy review ID
- `url`: public review permalink
- `date`: review timestamp in ISO format with milliseconds
- `isRecommended`: `true`, `false`, or `null` from Facebook's own review title wording
- `text`: main review text
- `tags`: recommendation tags such as `Fast delivery` or `Cosy atmosphere`
- `likesCount`: total public reaction count available for the review
- `commentsCount`: total public top-level comment count signal for the review
- `shareCount`: total public share count signal for the review
- `user`: reviewer block with `id`, `name`, `profileUrl`, and `profilePic`

#### Review detail blocks

- `reviewEngagement`: grouped reactions, comments, and shares
- `reviewMedia`: grouped media summary and full media items
- `reviewRecommendation`: recommendation tags plus recommendation attachment details
- `reviewAllDetails`: the rich sanitized review-only payload with extra story sections, actors, attachments, feedback, and other review metadata
- `source_row_number`: review position for that source inside the returned public review sequence

#### Comments and source grouping

- `comments`: public comment collection metadata and nested returned comments
- `collection_debug`: collection metadata such as requested max reviews, returned count, stop reason, and enabled comment settings
- `sourceDetails`: grouped source page or profile details such as page URL, reviews URL, page ID, username, image, description, and ad-library data

### 📚 Facebook Reviews Scraper `reviewAllDetails` Block

`reviewAllDetails` keeps the deeper sanitized review-only payload in one place.

| Field | Meaning |
|---|---|
| `reviewAllDetails.feedback` | Public feedback tree details exposed with the review |
| `reviewAllDetails.attachments` | Full sanitized attachment structures for the review |
| `reviewAllDetails.actors` | Public actor list from the review story |
| `reviewAllDetails.comet_sections` | Rich sanitized story section payloads exposed by Facebook |
| `reviewAllDetails.message` | Additional message structures when Facebook exposes them |
| `reviewAllDetails.future_of_feed_info` | Story rendering metadata when Facebook exposes it |

### 💬 Facebook Reviews Scraper `comments` Block

`comments` keeps the full returned comment tree in one place.

| Field | Meaning |
|---|---|
| `comments.enabled` | Whether comment collection was enabled for this run |
| `comments.collection_status` | Human-readable status of the comment collection step |
| `comments.request` | Requested-versus-returned comment summary |
| `comments.counts` | Visible, hidden, returned, and signaled comment counts |
| `comments.selected_filter` | Active public comment ordering details |
| `comments.top_level_comments` | Returned top-level comments with nested `replies` |

### 🗂️ Facebook Reviews Scraper Comment And Reply Structure

`comments` contains both collection metadata and the actual nested discussion rows.

Main fields inside `comments`:

- `enabled`: whether comment collection was enabled for this run
- `collection_status`: human-readable status of the comment collection step
- `request`: requested-versus-returned summary for comments
- `counts`: visible, hidden, returned, and signaled comment counts
- `selected_filter`: active Facebook comment ordering details
- `top_level_comments`: array of returned top-level comment rows

Each item inside `comments.top_level_comments` can include:

- `comment_id`: comment identifier
- `comment_legacy_fbid`: legacy numeric Facebook comment ID when available
- `parent_comment_id`: present for reply rows
- `depth`: `0` for top-level comments and `1` or more for nested replies
- `created_at`: comment or reply timestamp
- `message_text`: comment or reply text
- `comment_links`: public comment permalink links when available
- `author`: public author details
- `engagement`: reaction and reply-count details for that comment or reply
- `attachments`: media or attachment details for the comment or reply
- `reply_collection`: request-versus-returned metadata for reply collection under that comment
- `replies`: nested reply rows for that comment, always present as a list even when empty

### 🧭 Facebook Reviews Scraper `sourceDetails` Block

`sourceDetails` is placed last in each row and groups all reviewed page or profile details in one place.

| Field | Meaning |
|---|---|
| `sourceDetails.facebookUrl` | Resolved public page or profile URL |
| `sourceDetails.reviewsUrl` | Resolved public `/reviews` URL used by the scraper |
| `sourceDetails.facebookId` | Public page or profile ID |
| `sourceDetails.pageName` | Source username when available, otherwise the source display name |
| `sourceDetails.pageDisplayName` | Source display name |
| `sourceDetails.pageUsername` | Source username from the resolved page URL |
| `sourceDetails.pageImage` | Source profile or page image |
| `sourceDetails.pageDescription` | Source description or bio summary |
| `sourceDetails.pageCategory` | Source page category when Facebook exposes it |
| `sourceDetails.pageAdLibrary` | Public page ad-library block when Facebook exposes it |
| `sourceDetails.ratingSignals` | Public rating signals exposed by Facebook |

### 🌐 Facebook Reviews Scraper Public Availability Limits

Missing fields do not always indicate a parser defect. Facebook can hide or omit public review, comment, or reply data depending on the source page, the specific review, the selected filter, region, and request timing.

Common examples:

- Some pages do not expose a public `/reviews` tab at all and return HTTP 404
- Some pages visibly show a larger overall opinion count than the logged-out public reviews feed will actually paginate through
- Some visible reviews expose zero public comments
- Some comments expose zero public replies even when a reply-count signal exists
- Some source pages expose no public rating signals

### 🧾 Facebook Reviews Scraper Example Output Shape

Facebook Reviews Scraper outputs the input first, then the review fields, then `comments`, and finally `sourceDetails`.

```json
{
    "number": 11,
    "inputUrl": "https://www.facebook.com/copperkettleyqr/reviews",
    "facebookUrl": "https://www.facebook.com/copperkettleyqr",
    "facebookId": "100064027242849",
    "pageName": "copperkettleyqr",
    "pageAdLibrary": {
      "id": "851606664870954",
      "pamv_comms_data": null,
      "is_business_page_active": false
    },
    "type": "review",
    "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg=",
    "legacyId": "10221114610769258",
    "url": "https://www.facebook.com/Mrs.C.75/posts/pfbid02P7EakyKr6qM7rxvq4eQjC99uQEs5SSdFgueAEzhMbU6eBamj13CFSum2NPo8nzsEl",
    "date": "2020-11-20T03:36:56.000Z",
    "isRecommended": true,
    "text": "Today is 19-Nov-2020, this is our Wedding Anniversary. We ordered our supper from Coper Kettle. There was some confusion, as in this crazy new world, nothing is easy anymore. Thank you Anna and staff for a great meal, and fixing the errors, and in the end being great about it. I hope that your restaurant is blessed with lasting longevity through the horrors of this pandemic.",
    "tags": [
      "Fine dining"
    ],
    "likesCount": 1,
    "commentsCount": 1,
    "shareCount": 0,
    "reactionCountReduced": "1",
    "shareCountReduced": "0",
    "matchedFragmentCount": 2,
    "reviewType": "Story",
    "isFeedUnit": "Story",
    "isTrackableFeedUnit": "Story",
    "canViewerSeeMenu": false,
    "shouldHostActorLinkInWatch": false,
    "cacheId": "6639143496316210584",
    "wwwUrl": "https://www.facebook.com/Mrs.C.75/posts/pfbid02P7EakyKr6qM7rxvq4eQjC99uQEs5SSdFgueAEzhMbU6eBamj13CFSum2NPo8nzsEl",
    "attachmentTypes": [
      "TaggableActivityIcon"
    ],
    "attachmentCount": 0,
    "photoAttachmentCount": 0,
    "videoAttachmentCount": 0,
    "imageUrls": [
      "https://static.xx.fbcdn.net/rsrc.php/ys/r/-61vb0CD5jT.webp"
    ],
    "user": {
      "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl",
      "name": "Lois Clark",
      "profilePic": "https://scontent-det1-1.xx.fbcdn.net/v/t39.30808-1/274525438_10223909674684109_5611040046005575179_n.jpg?stp=cp0_dst-jpg_s50x50_tt6&_nc_cat=107&ccb=1-7&_nc_sid=e99d92&_nc_ohc=6PLLe8ADJmoQ7kNvwGN_otw&_nc_oc=AdpX_vGGRTp3y0_zPSBAPw7bnkqmUw6OCYicB6ObvZoN9w4NDW73T3A9huLaIoe5MOk&_nc_zt=24&_nc_ht=scontent-det1-1.xx&_nc_gid=mJQ143NtXSUAjg5tIoKL7g&_nc_ss=7b289&oh=00_Af5EnttWPeb_7s7OmGBWDfNRIDRTIAddIt3sQ-yzGIg2ew&oe=6A04B32B"
    },
    "reviewEngagement": {
      "reactions": {
        "reaction_count_total": 1,
        "reaction_count_reduced": "1"
      },
      "comments": {
        "comment_count_total": 1
      },
      "shares": {
        "share_count_total": 0,
        "share_count_reduced": "0"
      }
    },
    "reviewMedia": {
      "summary": {
        "attachment_types": [
          "TaggableActivityIcon"
        ],
        "attachment_count": 0,
        "photo_attachment_count": 0,
        "video_attachment_count": 0,
        "image_urls": [
          "https://static.xx.fbcdn.net/rsrc.php/ys/r/-61vb0CD5jT.webp"
        ]
      },
      "all_media": [
        {
          "media_id": "1419731201426453",
          "media_type": "TaggableActivityIcon",
          "image_variants": [
            {
              "url": "https://static.xx.fbcdn.net/rsrc.php/ys/r/-61vb0CD5jT.webp",
              "source_field": "image",
              "width": 16,
              "height": 16
            }
          ],
          "image_urls": [
            "https://static.xx.fbcdn.net/rsrc.php/ys/r/-61vb0CD5jT.webp"
          ],
          "thumbnail_variants": [
            {
              "url": "https://static.xx.fbcdn.net/rsrc.php/ys/r/-61vb0CD5jT.webp",
              "source_field": "image",
              "width": 16,
              "height": 16
            }
          ],
          "thumbnail_urls": [
            "https://static.xx.fbcdn.net/rsrc.php/ys/r/-61vb0CD5jT.webp"
          ]
        }
      ]
    },
    "reviewRecommendation": {
      "recommendation_tags": [
        "Fine dining"
      ],
      "style_renderers": [
        "StoryAttachmentPageRecommendationTagsStyleRenderer"
      ]
    },
    "reviewAllDetails": {
      "top_reaction_types": [
        "Love"
      ],
      "top_reaction_labels": [
        "Love ❤️"
      ],
      "top_reactions_breakdown": [
        {
          "reaction_type": "Love",
          "reaction_emoji": "❤️",
          "reaction_label": "Love ❤️",
          "reaction_count": 1,
          "reaction_count_reduced": "1"
        }
      ],
      "feedback": {
        "id": "ZmVlZGJhY2s6MTAyMjExMTQ2MTA3NjkyNTg=",
        "owning_profile": {
          "__typename": "User",
          "name": "Lois Clark",
          "short_name": "Lois",
          "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl"
        }
      },
      "attachments": [
        {
          "styles": {
            "__typename": "StoryAttachmentPageRecommendationTagsStyleRenderer",
            "__isStoryAttachmentStyleRendererUnion": "StoryAttachmentPageRecommendationTagsStyleRenderer",
            "is_prod_eligible": true,
            "attachment": {
              "deduplication_key": "00230759b2b67c47d68dcccf89a4f1d2",
              "tags": [
                "Fine dining"
              ]
            },
            "__module_operation_CometFeedStoryAttachmentMatchRenderer_attachment": {
              "__dr": "CometFeedStoryPageRecommendationTagsAttachmentStyle_styleTypeRenderer$normalization.graphql"
            },
            "__module_component_CometFeedStoryAttachmentMatchRenderer_attachment": {
              "__dr": "CometFeedStoryPageRecommendationTagsAttachmentStyle.react"
            }
          }
        }
      ],
      "future_of_feed_info": {
        "should_reverse_message_and_attachment_position": false,
        "should_overlay_header": false,
        "aspect_ratio_update": -1,
        "web_reshare_variant": "NORMAL"
      },
      "comet_sections": {
        "__typename": "CometStorySections",
        "content": {
          "__typename": "CometFeedStoryDefaultContentStrategy",
          "__isICometStorySection": "CometFeedStoryDefaultContentStrategy",
          "is_prod_eligible": true,
          "story": {
            "feedback": {
              "id": "ZmVlZGJhY2s6MTAyMjExMTQ2MTA3NjkyNTg="
            },
            "comet_sections": {
              "message": {
                "__typename": "CometFeedStoryDefaultMessageRenderingStrategy",
                "__isICometStorySection": "CometFeedStoryDefaultMessageRenderingStrategy",
                "is_prod_eligible": true,
                "story": {
                  "is_text_only_story": false,
                  "message": {
                    "text": "Today is 19-Nov-2020, this is our Wedding Anniversary. We ordered our supper from Coper Kettle. There was some confusion, as in this crazy new world, nothing is easy anymore. Thank you Anna and staff for a great meal, and fixing the errors, and in the end being great about it. I hope that your restaurant is blessed with lasting longevity through the horrors of this pandemic."
                  },
                  "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
                },
                "__module_operation_CometFeedStoryMessageMatchRenderer_story": {
                  "__dr": "CometFeedStoryDefaultMessageRenderingStrategy_message$normalization.graphql"
                },
                "__module_component_CometFeedStoryMessageMatchRenderer_story": {
                  "__dr": "CometFeedStoryDefaultMessageRenderingStrategy.react"
                }
              },
              "message_container": {
                "__typename": "CometFeedStoryMessageContainerRenderingStrategy",
                "__isICometStorySection": "CometFeedStoryMessageContainerRenderingStrategy",
                "is_prod_eligible": true,
                "story": {
                  "message": {
                    "text": "Today is 19-Nov-2020, this is our Wedding Anniversary. We ordered our supper from Coper Kettle. There was some confusion, as in this crazy new world, nothing is easy anymore. Thank you Anna and staff for a great meal, and fixing the errors, and in the end being great about it. I hope that your restaurant is blessed with lasting longevity through the horrors of this pandemic."
                  },
                  "attachments": [
                    {
                      "style_list": [
                        "page_recommendation_v2",
                        "fallback"
                      ]
                    }
                  ],
                  "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
                },
                "__module_operation_CometFeedStoryMessageContainerMatchRenderer_story": {
                  "__dr": "CometFeedStoryMessageContainerRenderingStrategy_messageContainer$normalization.graphql"
                },
                "__module_component_CometFeedStoryMessageContainerMatchRenderer_story": {
                  "__dr": "CometFeedStoryMessageContainerRenderingStrategy.react"
                }
              }
            },
            "attachments": [
              {
                "deduplication_key": "00230759b2b67c47d68dcccf89a4f1d2",
                "target": {
                  "__typename": "PageRecommendationInfo",
                  "id": "10221114610809259"
                },
                "__typename": "StoryAttachment",
                "style_list": [
                  "page_recommendation_v2",
                  "fallback"
                ],
                "styles": {
                  "__typename": "StoryAttachmentPageRecommendationTagsStyleRenderer",
                  "__isStoryAttachmentStyleRendererUnion": "StoryAttachmentPageRecommendationTagsStyleRenderer",
                  "is_prod_eligible": true,
                  "attachment": {
                    "deduplication_key": "00230759b2b67c47d68dcccf89a4f1d2",
                    "tags": [
                      "Fine dining"
                    ]
                  },
                  "__module_operation_CometFeedStoryAttachmentMatchRenderer_attachment": {
                    "__dr": "CometFeedStoryPageRecommendationTagsAttachmentStyle_styleTypeRenderer$normalization.graphql"
                  },
                  "__module_component_CometFeedStoryAttachmentMatchRenderer_attachment": {
                    "__dr": "CometFeedStoryPageRecommendationTagsAttachmentStyle.react"
                  }
                }
              }
            ],
            "post_id": "10221114610769258",
            "actors": [
              {
                "profile_picture": {
                  "uri": "https://scontent-det1-1.xx.fbcdn.net/v/t39.30808-1/274525438_10223909674684109_5611040046005575179_n.jpg?stp=cp0_dst-jpg_s50x50_tt6&_nc_cat=107&ccb=1-7&_nc_sid=e99d92&_nc_ohc=6PLLe8ADJmoQ7kNvwGN_otw&_nc_oc=AdpX_vGGRTp3y0_zPSBAPw7bnkqmUw6OCYicB6ObvZoN9w4NDW73T3A9huLaIoe5MOk&_nc_zt=24&_nc_ht=scontent-det1-1.xx&_nc_gid=mJQ143NtXSUAjg5tIoKL7g&_nc_ss=7b289&oh=00_Af5EnttWPeb_7s7OmGBWDfNRIDRTIAddIt3sQ-yzGIg2ew&oe=6A04B32B"
                },
                "__typename": "User",
                "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl",
                "name": "Lois Clark",
                "__isEntity": "User"
              }
            ],
            "message": {
              "__typename": "TextWithEntities",
              "text": "Today is 19-Nov-2020, this is our Wedding Anniversary. We ordered our supper from Coper Kettle. There was some confusion, as in this crazy new world, nothing is easy anymore. Thank you Anna and staff for a great meal, and fixing the errors, and in the end being great about it. I hope that your restaurant is blessed with lasting longevity through the horrors of this pandemic."
            },
            "wwwURL": "https://www.facebook.com/Mrs.C.75/posts/pfbid02P7EakyKr6qM7rxvq4eQjC99uQEs5SSdFgueAEzhMbU6eBamj13CFSum2NPo8nzsEl",
            "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
          },
          "__module_operation_CometFeedStoryContentMatchRenderer_story": {
            "__dr": "CometFeedStoryDefaultContentStrategy_content$normalization.graphql"
          },
          "__module_component_CometFeedStoryContentMatchRenderer_story": {
            "__dr": "CometFeedStoryDefaultContentStrategy.react"
          }
        },
        "layout": {
          "__typename": "CometStoryDefaultLayoutStrategy",
          "__isICometStorySection": "CometStoryDefaultLayoutStrategy",
          "is_prod_eligible": true,
          "__module_operation_CometFeedStoryLayoutMatchRenderer_story": {
            "__dr": "CometFeedStoryDefaultLayoutStrategy_layout$normalization.graphql"
          },
          "__module_component_CometFeedStoryLayoutMatchRenderer_story": {
            "__dr": "CometFeedStoryDefaultLayoutStrategy.react"
          }
        },
        "context_layout": {
          "__typename": "CometFeedStoryDefaultContextLayoutStrategy",
          "__isICometStorySection": "CometFeedStoryDefaultContextLayoutStrategy",
          "is_prod_eligible": true,
          "story": {
            "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg=",
            "can_viewer_see_menu": false,
            "comet_sections": {
              "actor_photo": {
                "__typename": "CometFeedStoryActorPhotoStrategy",
                "__isICometStorySection": "CometFeedStoryActorPhotoStrategy",
                "is_prod_eligible": true,
                "story": {
                  "actors": [
                    {
                      "__typename": "User",
                      "__isActor": "User",
                      "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl",
                      "__isEntity": "User",
                      "show_promode_badge": false,
                      "name": "Lois Clark",
                      "profile_picture": {
                        "uri": "https://scontent-det1-1.xx.fbcdn.net/v/t39.30808-1/274525438_10223909674684109_5611040046005575179_n.jpg?stp=cp0_dst-jpg_s40x40_tt6&_nc_cat=107&ccb=1-7&_nc_sid=e99d92&_nc_ohc=6PLLe8ADJmoQ7kNvwGN_otw&_nc_oc=AdpX_vGGRTp3y0_zPSBAPw7bnkqmUw6OCYicB6ObvZoN9w4NDW73T3A9huLaIoe5MOk&_nc_zt=24&_nc_ht=scontent-det1-1.xx&_nc_gid=mJQ143NtXSUAjg5tIoKL7g&_nc_ss=7b289&oh=00_Af7fXNjPAwfb0KTR8o8F9i0iG5itN-ZeEqXaunoAex-Lmg&oe=6A04B32B",
                        "width": 40,
                        "height": 40,
                        "scale": 1
                      },
                      "is_additional_profile_plus": false
                    }
                  ],
                  "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
                },
                "has_commerce_attachment": false,
                "__module_operation_CometFeedStoryActorPhotoSectionMatchRenderer_story": {
                  "__dr": "CometFeedStoryActorPhotoStrategy_actorPhoto$normalization.graphql"
                },
                "__module_component_CometFeedStoryActorPhotoSectionMatchRenderer_story": {
                  "__dr": "CometFeedStoryActorPhotoStrategy.react"
                }
              },
              "metadata": [
                {
                  "__typename": "CometFeedStoryMinimizedTimestampStrategy",
                  "__isICometStorySection": "CometFeedStoryMinimizedTimestampStrategy",
                  "is_prod_eligible": true,
                  "story": {
                    "creation_time": 1605843416,
                    "unpublished_content_type": "PUBLISHED",
                    "url": "https://www.facebook.com/Mrs.C.75/posts/pfbid02P7EakyKr6qM7rxvq4eQjC99uQEs5SSdFgueAEzhMbU6eBamj13CFSum2NPo8nzsEl",
                    "actors": [
                      {
                        "__typename": "User",
                        "__isEntity": "User",
                        "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl"
                      }
                    ],
                    "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
                  },
                  "__module_operation_CometFeedStoryMetadataSectionMatchRenderer_story": {
                    "__dr": "CometFeedStoryMinimizedTimestampStrategy_timestamp$normalization.graphql"
                  },
                  "__module_component_CometFeedStoryMetadataSectionMatchRenderer_story": {
                    "__dr": "CometFeedStoryMinimizedTimestampStrategy.react"
                  }
                },
                {
                  "__typename": "CometFeedStoryAudienceStrategy",
                  "__isICometStorySection": "CometFeedStoryAudienceStrategy",
                  "is_prod_eligible": true,
                  "story": {
                    "privacy_scope": {
                      "icon_image": {
                        "name": "everyone"
                      },
                      "description": "Public"
                    },
                    "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
                  },
                  "__module_operation_CometFeedStoryMetadataSectionMatchRenderer_story": {
                    "__dr": "CometFeedStoryAudienceStrategy_audience$normalization.graphql"
                  },
                  "__module_component_CometFeedStoryMetadataSectionMatchRenderer_story": {
                    "__dr": "CometFeedStoryAudienceStrategy.react"
                  }
                }
              ],
              "title": {
                "__typename": "CometFeedStoryTitleWithActorStrategy",
                "__isICometStorySection": "CometFeedStoryTitleWithActorStrategy",
                "is_prod_eligible": true,
                "story": {
                  "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg=",
                  "post_id": "10221114610769258",
                  "actors": [
                    {
                      "__typename": "User",
                      "name": "Lois Clark",
                      "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl",
                      "__isActor": "User",
                      "__isEntity": "User",
                      "show_promode_badge": false
                    }
                  ],
                  "title": {
                    "image_ranges": [
                      {
                        "length": 0,
                        "offset": 11,
                        "entity_with_image": {
                          "__typename": "TaggableActivityIcon",
                          "image": {
                            "height": 16,
                            "scale": 1,
                            "uri": "https://static.xx.fbcdn.net/rsrc.php/ys/r/-61vb0CD5jT.webp",
                            "width": 16
                          },
                          "__isNode": "TaggableActivityIcon",
                          "id": "1419731201426453"
                        }
                      }
                    ],
                    "ranges": [
                      {
                        "entity": {
                          "__typename": "User",
                          "__isEntity": "User",
                          "__isActor": "User",
                          "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl",
                          "short_name": "Lois",
                          "__module_operation_CometTextWithEntitiesRelay_textWithEntities": {
                            "__dr": "ProfileGeminiWeakReferenceLink_user$normalization.graphql"
                          },
                          "__module_component_CometTextWithEntitiesRelay_textWithEntities": {
                            "__dr": "ProfileGeminiWeakReferenceLink.react"
                          },
                          "is_verified": false,
                          "show_promode_badge": false,
                          "__isNode": "User"
                        },
                        "entity_is_weak_reference": false,
                        "length": 10,
                        "offset": 0
                      },
                      {
                        "entity": {
                          "__typename": "User",
                          "__isEntity": "User",
                          "__isActor": "User",
                          "id": "100064027242849",
                          "url": "https://www.facebook.com/copperkettleyqr",
                          "profile_url": "https://www.facebook.com/copperkettleyqr",
                          "short_name": "The Copper Kettle Restaurant",
                          "__module_operation_CometTextWithEntitiesRelay_textWithEntities": {
                            "__dr": "ProfileGeminiWeakReferenceLink_user$normalization.graphql"
                          },
                          "__module_component_CometTextWithEntitiesRelay_textWithEntities": {
                            "__dr": "ProfileGeminiWeakReferenceLink.react"
                          },
                          "is_verified": false,
                          "show_promode_badge": false,
                          "mobileUrl": "https://m.facebook.com/copperkettleyqr/",
                          "__isNode": "User"
                        },
                        "entity_is_weak_reference": false,
                        "length": 28,
                        "offset": 23
                      }
                    ],
                    "text": "Lois Clark  recommends The Copper Kettle Restaurant."
                  }
                },
                "__module_operation_CometFeedStoryTitleSectionMatchRenderer_story": {
                  "__dr": "CometFeedStoryTitleWithActorStrategy_contextTitle$normalization.graphql"
                },
                "__module_component_CometFeedStoryTitleSectionMatchRenderer_story": {
                  "__dr": "CometFeedStoryTitleWithActorStrategy.react"
                }
              }
            }
          },
          "is_regulation_enforced": false,
          "__module_operation_CometFeedStoryContextSectionMatchRenderer_story": {
            "__dr": "CometFeedStoryDefaultContextLayoutStrategy_contextLayout$normalization.graphql"
          },
          "__module_component_CometFeedStoryContextSectionMatchRenderer_story": {
            "__dr": "CometFeedStoryDefaultContextLayoutStrategy.react"
          }
        },
        "feedback": {
          "__typename": "CometStoryFeedbackUFIStrategy",
          "__isICometStorySection": "CometStoryFeedbackUFIStrategy",
          "is_prod_eligible": true,
          "story": {
            "feedback": {
              "id": "ZmVlZGJhY2s6MTAyMjExMTQ2MTA3NjkyNTg="
            },
            "feedback_context": {
              "feedback_target_with_context": {
                "id": "ZmVlZGJhY2s6MTAyMjExMTQ2MTA3NjkyNTg="
              }
            },
            "story_ufi_container": {
              "__typename": "XFBFullUFIContainer",
              "story": {
                "is_text_only_story": false,
                "feedback_context": {
                  "feedback_target_with_context": {
                    "is_eligible_for_real_time_updates": true,
                    "can_viewer_comment": false,
                    "id": "ZmVlZGJhY2s6MTAyMjExMTQ2MTA3NjkyNTg=",
                    "is_eligible_for_enhanced_comment_updates": false,
                    "is_synced_qa_post": false,
                    "subscription_target_id": "10221114610769258",
                    "comet_ufi_summary_and_actions_renderer": {
                      "__typename": "UnauthenticatedUCometUFISummaryAndActionsRenderer",
                      "feedback": {
                        "id": "ZmVlZGJhY2s6MTAyMjExMTQ2MTA3NjkyNTg=",
                        "is_similar_cqa_question": false,
                        "subscription_target_id": "10221114610769258",
                        "i18n_reaction_count": "1",
                        "reaction_count": {
                          "count": 1,
                          "is_empty": false
                        },
                        "cross_universe_feedback_info": {
                          "ig_boosted_reaction_count": 0,
                          "aggregated_reaction_count": 0,
                          "ig_boosted_comment_count": 0
                        },
                        "top_reactions": {
                          "count": 1,
                          "edges": [
                            {
                              "visible_in_bling_bar": true,
                              "node": {
                                "id": "1678524932434102",
                                "localized_name": "Love"
                              },
                              "i18n_reaction_count": "1",
                              "reaction_count": 1
                            }
                          ]
                        },
                        "reaction_display_config": {
                          "reaction_display_strategy": "NONE",
                          "__module_operation_CometUFIReactionsCount_feedback": {
                            "__dr": "CometUFIReactionSentence_reactionDisplayConfig$normalization.graphql"
                          },
                          "__module_component_CometUFIReactionsCount_feedback": {
                            "__dr": "CometUFIReactionSentence.react"
                          }
                        },
                        "can_show_seen_by": false,
                        "if_viewer_cannot_see_seen_by_member_list": {
                          "i18n_reaction_count": "1",
                          "reaction_count": {
                            "count": 1
                          },
                          "reaction_display_config": {
                            "reaction_display_strategy": "NONE"
                          },
                          "seen_by": {
                            "count": 0,
                            "seen_by_everyone": false
                          },
                          "__module_operation_CometUFISeenByCount_feedback__if_viewer_cannot_see_seen_by_member_list": {
                            "__dr": "CometUFISeenByCountText_feedback$normalization.graphql"
                          },
                          "__module_component_CometUFISeenByCount_feedback__if_viewer_cannot_see_seen_by_member_list": {
                            "__dr": "CometUFISeenByCountText.react"
                          },
                          "id": "ZmVlZGJhY2s6MTAyMjExMTQ2MTA3NjkyNTg="
                        },
                        "i18n_share_count": "0",
                        "share_count": {
                          "count": 0,
                          "is_empty": true
                        },
                        "comments_count_summary_renderer": {
                          "__typename": "TotalCommentsCountSummaryRenderer",
                          "feedback": {
                            "id": "ZmVlZGJhY2s6MTAyMjExMTQ2MTA3NjkyNTg=",
                            "cross_universe_feedback_info": {
                              "ig_boosted_comment_count": 0
                            }
                          },
                          "__module_operation_CometUFISummaryBase_feedback": {
                            "__dr": "CometUFICommentsCountRenderer_data$normalization.graphql"
                          },
                          "__module_component_CometUFISummaryBase_feedback": {
                            "__dr": "CometUFICommentsCountRenderer.react"
                          }
                        }
                      },
                      "__module_operation_CometUFISummaryAndActions_feedback": {
                        "__dr": "CometUnauthenticatedUFISummaryAndActionsRenderer_feedback$normalization.graphql"
                      },
                      "__module_component_CometUFISummaryAndActions_feedback": {
                        "__dr": "CometUnauthenticatedUFISummaryAndActionsRenderer.react"
                      }
                    },
                    "owning_profile": {
                      "__typename": "User",
                      "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl"
                    }
                  }
                },
                "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg=",
                "url": "https://www.facebook.com/Mrs.C.75/posts/pfbid02P7EakyKr6qM7rxvq4eQjC99uQEs5SSdFgueAEzhMbU6eBamj13CFSum2NPo8nzsEl",
                "post_id": "10221114610769258",
                "seo_title": "Today is 19-Nov-2020, this is our Wedding Anniversary",
                "message": {
                  "text": "Today is 19-Nov-2020, this is our Wedding Anniversary. We ordered our supper from Coper Kettle. There was some confusion, as in this crazy new world, nothing is easy anymore. Thank you Anna and staff for a great meal, and fixing the errors, and in the end being great about it. I hope that your restaurant is blessed with lasting longevity through the horrors of this pandemic."
                },
                "save_info": {
                  "viewer_save_state": "NOT_SAVED"
                },
                "__module_operation_useCometUFIAdaptivePostActionBar_story": {
                  "__dr": "CometUFIAdaptiveShareActionRenderer_story$normalization.graphql"
                },
                "__module_component_useCometUFIAdaptivePostActionBar_story": {
                  "__dr": "CometUFIAdaptiveShareActionRenderer.react"
                }
              },
              "__module_operation_CometFeedUFIContainer_story": {
                "__dr": "CometFullUFIContainer_renderer$normalization.graphql"
              },
              "__module_component_CometFeedUFIContainer_story": {
                "__dr": "CometFullUFIContainer.react"
              }
            },
            "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
          },
          "__module_operation_CometFeedStoryFeedbackSection_story": {
            "__dr": "CometFeedStoryFeedbackUFIStrategy_feedback$normalization.graphql"
          },
          "__module_component_CometFeedStoryFeedbackSection_story": {
            "__dr": "CometFeedStoryFeedbackUFIStrategy.react"
          }
        },
        "call_to_action": {
          "__typename": "CometStoryDefaultCallToActionStrategy",
          "__isICometStorySection": "CometStoryDefaultCallToActionStrategy",
          "is_prod_eligible": true,
          "story": {
            "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
          },
          "__module_operation_CometFeedStoryCallToActionSection_story": {
            "__dr": "CometFeedStoryDefaultCallToActionStrategy_cta$normalization.graphql"
          },
          "__module_component_CometFeedStoryCallToActionSection_story": {
            "__dr": "CometFeedStoryDefaultCallToActionStrategy.react"
          }
        },
        "timestamp": {
          "__typename": "CometFeedStoryMinimizedTimestampStrategy",
          "__isICometStorySection": "CometFeedStoryMinimizedTimestampStrategy",
          "is_prod_eligible": true,
          "story": {
            "creation_time": 1605843416,
            "unpublished_content_type": "PUBLISHED",
            "url": "https://www.facebook.com/Mrs.C.75/posts/pfbid02P7EakyKr6qM7rxvq4eQjC99uQEs5SSdFgueAEzhMbU6eBamj13CFSum2NPo8nzsEl",
            "actors": [
              {
                "__typename": "User",
                "__isEntity": "User",
                "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl"
              }
            ],
            "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
          },
          "__module_operation_CometFeedStoryTimestampSection_story": {
            "__dr": "CometFeedStoryMinimizedTimestampStrategy_timestamp$normalization.graphql"
          },
          "__module_component_CometFeedStoryTimestampSection_story": {
            "__dr": "CometFeedStoryMinimizedTimestampStrategy.react"
          }
        },
        "message": {
          "__typename": "CometFeedStoryDefaultMessageRenderingStrategy",
          "__isICometStorySection": "CometFeedStoryDefaultMessageRenderingStrategy",
          "is_prod_eligible": true,
          "story": {
            "is_text_only_story": false,
            "message": {
              "text": "Today is 19-Nov-2020, this is our Wedding Anniversary. We ordered our supper from Coper Kettle. There was some confusion, as in this crazy new world, nothing is easy anymore. Thank you Anna and staff for a great meal, and fixing the errors, and in the end being great about it. I hope that your restaurant is blessed with lasting longevity through the horrors of this pandemic."
            },
            "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
          },
          "__module_operation_CometFeedStoryMessageMatchRenderer_story": {
            "__dr": "CometFeedStoryDefaultMessageRenderingStrategy_message$normalization.graphql"
          },
          "__module_component_CometFeedStoryMessageMatchRenderer_story": {
            "__dr": "CometFeedStoryDefaultMessageRenderingStrategy.react"
          }
        },
        "message_container": {
          "__typename": "CometFeedStoryMessageContainerRenderingStrategy",
          "__isICometStorySection": "CometFeedStoryMessageContainerRenderingStrategy",
          "is_prod_eligible": true,
          "story": {
            "message": {
              "text": "Today is 19-Nov-2020, this is our Wedding Anniversary. We ordered our supper from Coper Kettle. There was some confusion, as in this crazy new world, nothing is easy anymore. Thank you Anna and staff for a great meal, and fixing the errors, and in the end being great about it. I hope that your restaurant is blessed with lasting longevity through the horrors of this pandemic."
            },
            "attachments": [
              {
                "style_list": [
                  "page_recommendation_v2",
                  "fallback"
                ]
              }
            ],
            "id": "UzpfSTE2NjM3ODUyMzQ6MTAyMjExMTQ2MTA3NjkyNTg6MTAyMjExMTQ2MTA3NjkyNTg="
          },
          "__module_operation_CometFeedStoryMessageContainerMatchRenderer_story": {
            "__dr": "CometFeedStoryMessageContainerRenderingStrategy_messageContainer$normalization.graphql"
          },
          "__module_component_CometFeedStoryMessageContainerMatchRenderer_story": {
            "__dr": "CometFeedStoryMessageContainerRenderingStrategy.react"
          }
        }
      },
      "actors": [
        {
          "__typename": "User",
          "name": "Lois Clark",
          "id": "pfbid02aX3kZ92624ht94UDVhPXB7L61a77zGw689zd52PmriYEwbdFsia17hgT4EZugrdTl",
          "__isActor": "User",
          "__isEntity": "User",
          "show_promode_badge": false
        }
      ],
      "__module_operation_CometFeedUnitContainerSection_feedUnit": {
        "__dr": "CometFeedUnitStoryStrategy_feedUnit$normalization.graphql"
      },
      "__module_component_CometFeedUnitContainerSection_feedUnit": {
        "__dr": "CometFeedUnitStoryStrategy.react"
      },
      "viewability_config": [
        8,
        5
      ],
      "client_view_config": {
        "can_delay_log_impression": false,
        "use_banzai_signal_imp": true,
        "use_banzai_vital_imp": true
      },
      "message": {
        "__typename": "TextWithEntities",
        "text": "Today is 19-Nov-2020, this is our Wedding Anniversary. We ordered our supper from Coper Kettle. There was some confusion, as in this crazy new world, nothing is easy anymore. Thank you Anna and staff for a great meal, and fixing the errors, and in the end being great about it. I hope that your restaurant is blessed with lasting longevity through the horrors of this pandemic."
      }
    },
    "source_row_number": 11,
    "comments": {
      "enabled": true,
      "collection_status": {
        "state": "enabled",
        "message": "Top-level comment details were collected from Facebook's public comment endpoints.",
        "pagination_policy": "Pagination continues until your requested top-level comment limit is reached or Facebook exposes no more public comments for this post."
      },
      "request": {
        "requested_count": 100,
        "returned_count": 1,
        "available_count_signal": 1,
        "has_more_public_data_signal": false,
        "request_fulfilled": false,
        "requested_more_than_returned": true,
        "availability_state": "requested_more_than_available",
        "message": "You requested 100 top-level comments, but only 1 were available for this post."
      },
      "counts": {
        "total_comment_count": 1,
        "visible_comment_count": 1,
        "hidden_comment_count": 0,
        "returned_comment_count": 1,
        "has_more_comments": false
      },
      "selected_filter": {
        "mode": "All comments",
        "available_modes": [
          {
            "title": "All comments",
            "description": "Show all comments, including potential spam."
          }
        ]
      },
      "top_level_comments": [
        {
          "comment_id": "Y29tbWVudDoxMDIyMTExNDYxMDc2OTI1OF8xMDIyMTExNzAzMzc4OTgzMg==",
          "comment_legacy_fbid": "10221117033789832",
          "depth": 0,
          "created_at": "2020-11-20T15:54:09Z",
          "message_text": "Hello Lois! Wow. Thank you for the fantastic review! We wish you a Happy Wedding Anniversary from all of just here at The Copper Kettle Restaurant. We are delighted to hear about your positive experience with us and that you enjoyed your food! We take great pride in providing exceptional service and strive to go above and beyond for our guests. Have a great weekend!",
          "comment_links": [
            "https://www.facebook.com/Mrs.C.75/posts/pfbid02P7EakyKr6qM7rxvq4eQjC99uQEs5SSdFgueAEzhMbU6eBamj13CFSum2NPo8nzsEl?comment_id=10221117033789832"
          ],
          "author": {
            "profile_name": "The Copper Kettle Restaurant",
            "profile_id": "100064027242849",
            "profile_links": [
              "https://www.facebook.com/copperkettleyqr"
            ],
            "profile_picture_links": [
              "https://scontent-det1-1.xx.fbcdn.net/v/t39.30808-1/298528699_436705561807015_4191178501684731329_n.jpg?stp=cp0_dst-jpg_s24x24_tt6&_nc_cat=101&ccb=1-7&_nc_sid=2d3e12&_nc_ohc=HaRRYBrQbWwQ7kNvwFH7xvu&_nc_oc=Adq40Ztv6kMwSN_BDbOv44gQYYi5LycrZ5BHdsdC0pwdoTQzh-o99jUjsRB2yne1QcQ&_nc_zt=24&_nc_ht=scontent-det1-1.xx&_nc_gid=mJQ143NtXSUAjg5tIoKL7g&_nc_ss=7b289&oh=00_Af5IQ31_IX3YxtRAvlgfYrVwNqz0Toxn37wudd7u1lKZYg&oe=6A04BD1C"
            ],
            "profile_is_verified": false
          },
          "engagement": {
            "reaction_count_reduced": "0",
            "reply_count_total": 0,
            "reply_count_visible": 0,
            "reply_count_hidden": 0,
            "has_more_replies": false
          },
          "attachments": {
            "attachment_count": 0,
            "photo_attachment_count": 0,
            "video_attachment_count": 0
          },
          "reply_collection": {
            "enabled": true,
            "collection_status": {
              "state": "enabled",
              "message": "Reply rows were collected from Facebook's public reply endpoint for this comment.",
              "pagination_policy": "Pagination continues until your requested reply limit is reached or Facebook exposes no more public replies for this comment."
            },
            "request": {
              "requested_count": 100,
              "returned_count": 0,
              "available_count_signal": 0,
              "has_more_public_data_signal": false,
              "request_fulfilled": false,
              "requested_more_than_returned": true,
              "availability_state": "requested_more_than_available",
              "message": "You requested 100 replies, but only 0 were available for this comment."
            },
            "counts": {
              "total_reply_count": 0,
              "visible_reply_count": 0,
              "hidden_reply_count": 0,
              "has_more_replies": false
            }
          },
          "replies": []
        }
      ]
    },
    "collection_debug": {
      "requested_max_reviews": 1000,
      "returned_review_count": 65,
      "stop_reason": "no_more_public_reviews_available",
      "comments_enabled": true,
      "comments_limit": 100,
      "comment_filter": "most_relevant",
      "comment_replies_enabled": true,
      "comment_replies_limit": 100
    },
    "sourceDetails": {
      "facebookUrl": "https://www.facebook.com/copperkettleyqr",
      "reviewsUrl": "https://www.facebook.com/copperkettleyqr/reviews",
      "facebookId": "100064027242849",
      "pageName": "copperkettleyqr",
      "pageDisplayName": "The Copper Kettle Restaurant",
      "pageUsername": "copperkettleyqr",
      "pageImage": "https://scontent-lga3-2.xx.fbcdn.net/v/t39.30808-1/298528699_436705561807015_4191178501684731329_n.jpg?stp=dst-jpg_tt6&cstp=mx320x320&ctp=s320x320&_nc_cat=101&ccb=1-7&_nc_sid=3ab345&_nc_ohc=HaRRYBrQbWwQ7kNvwEVptZ3&_nc_oc=AdqUhjJngd2fjHz16UPvICtrJBcfu8BqYkSbI0a0cHqZgT2qOwM43eObnV0zfrRGuQGVk1lsNVSHYiQIL8LCIhQu&_nc_zt=24&_nc_ht=scontent-lga3-2.xx&_nc_gid=4K4cHIfzFwI2qxHWXHM-Zg&_nc_ss=7b289&oh=00_Af46ECAOJnEof4l0GszuP17_ovn86pu6qDPQeHxT1sMZqw&oe=6A04BD1C",
      "pageDescription": "The Copper Kettle Restaurant, Regina. 3,211 likes · 40 talking about this · 1,136 were here. Longstanding local restaurant. Mediterranean specialties, signature gourmet pizzas (Best of YQR for",
      "pageAdLibrary": {
        "id": "851606664870954",
        "pamv_comms_data": null,
        "is_business_page_active": false
      }
    }
}
```

# Actor input Schema

## `username` (type: `array`):

Enter one or more Facebook usernames such as Cristiano or copperkettleyqr.

## `facebook_urls` (type: `array`):

Public profile/page links, tab links such as /followers or /following, or direct /reviews links. URL inputs are automatically converted to the matching /reviews tab.

## `max_reviews` (type: `integer`):

How many public review rows to export from each resolved /reviews tab.

## `include_review_comments` (type: `boolean`):

When enabled, each review row includes nested public comments when Facebook exposes them.

## `comments_limit` (type: `integer`):

Requested number of top-level comments to collect for each review when review comment collection is enabled.

## `include_comment_replies` (type: `boolean`):

When enabled, each exported review can include nested replies under returned public comments.

## `comment_replies_limit` (type: `integer`):

Requested number of replies to fetch per review comment when reply collection is enabled.

## `comment_filter` (type: `string`):

Comment ordering used while collecting comments and replies for each review. Use all\_comments for maximum reply visibility.

## `proxyCountry` (type: `string`):

Choose the residential proxy exit country for Facebook requests. US is the recommended default for the broadest public review coverage.

## Actor input object example

```json
{
  "username": [
    "copperkettleyqr"
  ],
  "facebook_urls": [
    {
      "url": "https://www.facebook.com/CastleValleyMill"
    },
    {
      "url": "https://www.facebook.com/hotelkavitaha/reviews"
    }
  ],
  "max_reviews": 10,
  "include_review_comments": true,
  "comments_limit": 10,
  "include_comment_replies": true,
  "comment_replies_limit": 10,
  "comment_filter": "most_relevant",
  "proxyCountry": "US"
}
```

# 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 = {
    "username": [
        "copperkettleyqr"
    ],
    "facebook_urls": [
        {
            "url": "https://www.facebook.com/CastleValleyMill"
        },
        {
            "url": "https://www.facebook.com/hotelkavitaha/reviews"
        }
    ],
    "max_reviews": 10,
    "comments_limit": 10,
    "comment_replies_limit": 10,
    "comment_filter": "most_relevant",
    "proxyCountry": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("premiumscraper/facebook-reviews-scraper").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 = {
    "username": ["copperkettleyqr"],
    "facebook_urls": [
        { "url": "https://www.facebook.com/CastleValleyMill" },
        { "url": "https://www.facebook.com/hotelkavitaha/reviews" },
    ],
    "max_reviews": 10,
    "comments_limit": 10,
    "comment_replies_limit": 10,
    "comment_filter": "most_relevant",
    "proxyCountry": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("premiumscraper/facebook-reviews-scraper").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 '{
  "username": [
    "copperkettleyqr"
  ],
  "facebook_urls": [
    {
      "url": "https://www.facebook.com/CastleValleyMill"
    },
    {
      "url": "https://www.facebook.com/hotelkavitaha/reviews"
    }
  ],
  "max_reviews": 10,
  "comments_limit": 10,
  "comment_replies_limit": 10,
  "comment_filter": "most_relevant",
  "proxyCountry": "US"
}' |
apify call premiumscraper/facebook-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Facebook Reviews Scraper✨",
        "description": "✨ Scrape Facebook reviews from usernames, Page URLs, or direct reviews links. Output includes review ID, permalink, date, recommendation status, review text, tags, likes, comments, reviewer details, nested comments, replies, page URL and ID, and source context ✨ Facebook Reviews Scraper 🔍",
        "version": "1.0",
        "x-build-id": "Yl28xivaUf2zL7YHG"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/premiumscraper~facebook-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-premiumscraper-facebook-reviews-scraper",
                "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/premiumscraper~facebook-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-premiumscraper-facebook-reviews-scraper",
                "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/premiumscraper~facebook-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-premiumscraper-facebook-reviews-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "username": {
                        "title": "👤 Facebook Username(s)",
                        "type": "array",
                        "description": "Enter one or more Facebook usernames such as Cristiano or copperkettleyqr.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "facebook_urls": {
                        "title": "🔗 Facebook Profile / Page / Reviews URLs",
                        "type": "array",
                        "description": "Public profile/page links, tab links such as /followers or /following, or direct /reviews links. URL inputs are automatically converted to the matching /reviews tab.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "max_reviews": {
                        "title": "⭐ Maximum Reviews Per Source",
                        "minimum": 1,
                        "type": "integer",
                        "description": "How many public review rows to export from each resolved /reviews tab.",
                        "default": 10
                    },
                    "include_review_comments": {
                        "title": "💬 Include Review Comments",
                        "type": "boolean",
                        "description": "When enabled, each review row includes nested public comments when Facebook exposes them.",
                        "default": true
                    },
                    "comments_limit": {
                        "title": "Top-Level Comments Per Review",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Requested number of top-level comments to collect for each review when review comment collection is enabled.",
                        "default": 10
                    },
                    "include_comment_replies": {
                        "title": "Include Comment Replies",
                        "type": "boolean",
                        "description": "When enabled, each exported review can include nested replies under returned public comments.",
                        "default": true
                    },
                    "comment_replies_limit": {
                        "title": "Replies Per Comment",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Requested number of replies to fetch per review comment when reply collection is enabled.",
                        "default": 10
                    },
                    "comment_filter": {
                        "title": "Comment Ordering",
                        "enum": [
                            "most_relevant",
                            "newest",
                            "all_comments"
                        ],
                        "type": "string",
                        "description": "Comment ordering used while collecting comments and replies for each review. Use all_comments for maximum reply visibility.",
                        "default": "most_relevant"
                    },
                    "proxyCountry": {
                        "title": "🌍 Proxy Country",
                        "enum": [
                            "US",
                            "GB",
                            "AU",
                            "CA",
                            "DE",
                            "FR",
                            "NL",
                            "IT",
                            "ES",
                            "SE",
                            "NO",
                            "DK",
                            "FI",
                            "BE",
                            "AT",
                            "CH",
                            "IE",
                            "PL",
                            "PT",
                            "CZ",
                            "HU",
                            "RO",
                            "GR",
                            "BG",
                            "HR",
                            "SK",
                            "RS",
                            "JP",
                            "KR",
                            "SG",
                            "HK",
                            "TW",
                            "TH",
                            "MY",
                            "ID",
                            "PH",
                            "VN",
                            "IN",
                            "BR",
                            "MX",
                            "AR",
                            "CL",
                            "CO",
                            "PE",
                            "ZA",
                            "NG",
                            "KE",
                            "EG",
                            "SA",
                            "AE",
                            "TR",
                            "IL",
                            "UA",
                            "RU",
                            "BY"
                        ],
                        "type": "string",
                        "description": "Choose the residential proxy exit country for Facebook requests. US is the recommended default for the broadest public review coverage.",
                        "default": "US"
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
