Facebook Comments Scraper avatar

Facebook Comments Scraper

Pricing

from $0.30 / 1,000 result items

Go to Apify Store
Facebook Comments Scraper

Facebook Comments Scraper

Extract comments from Facebook posts provided as input URLs. Retrieve comment text, authors, timestamps, reactions, and more. Ideal for social media monitoring, sentiment analysis, and engagement tracking. 🚀

Pricing

from $0.30 / 1,000 result items

Rating

5.0

(5)

Developer

Scraper One

Scraper One

Maintained by Community

Actor stats

21

Bookmarked

876

Total users

66

Monthly active users

0.82 hours

Issues response

13 hours ago

Last modified

Share

Apify Actor

This Apify Actor extracts comments from Facebook posts provided as input URLs. It retrieves comment text, authors, timestamps, reactions, and more. This tool is ideal for social media monitoring, sentiment analysis, and engagement tracking. 🚀


Features

  • 🔍 Scrape comments from multiple posts
  • 👥 Extract author details and profile URLs
  • 📅 Retrieve timestamps and reactions
  • 🔢 Limit the number of comments per post

Input Parameters

ParameterTypeRequiredDescription
postUrlsstring[]✅Array of Facebook post URLs to extract comments from.
resultsLimitnumber❌Maximum number of results per post, including the original post when enabled (optional). If not set, only a few of the first comments will be returned.
commentsSortTypestring❌Type of comments (sorting) to fetch: "relevant" (most relevant), "newest" or "all". If omitted, uses the sorting initially selected by Facebook for each post.
includeOriginalPostboolean❌If true, the original post will be included as a first reply. False by default.

Example Inputs

Default sorting

Omit commentsSortType to use the sorting initially selected by Facebook for each post.

{
"postUrls": [
"https://www.facebook.com/fanpage.TECHART/posts/pfbid0ZYMHCBMGHHQ9W98d9goZ4VpxTeLJSxsZGLfa2V2qbdH6jUyLEUubNTtU7joTi2vVl"
],
"resultsLimit": 50
}

Newest comments first

Set commentsSortType to "newest" to request comments sorted from newest to oldest.

{
"postUrls": [
"https://www.facebook.com/fanpage.TECHART/posts/pfbid0ZYMHCBMGHHQ9W98d9goZ4VpxTeLJSxsZGLfa2V2qbdH6jUyLEUubNTtU7joTi2vVl"
],
"resultsLimit": 50,
"commentsSortType": "newest"
}

You can also set commentsSortType to "relevant" for the most relevant comments or "all" for all comments, still subject to resultsLimit. If Facebook does not offer selectable sorting for a post, the actor uses Facebook's default sorting.

Include the original post

{
"postUrls": [
"https://www.facebook.com/fanpage.TECHART/posts/pfbid0ZYMHCBMGHHQ9W98d9goZ4VpxTeLJSxsZGLfa2V2qbdH6jUyLEUubNTtU7joTi2vVl"
],
"resultsLimit": 20,
"includeOriginalPost": true
}

The original post counts toward resultsLimit: 20 results means the post plus up to 19 comments. If the original post cannot be extracted, the actor continues collecting comments.

Output Data

The actor returns an array of JSON objects with extracted comments data and, when requested, the original post.

inputUrl identifies the original input URL that produced each comment, original post or error record, including share links. Leading and trailing whitespace is trimmed. For comments, url is the comment URL returned by Facebook. For the optional original post record, url equals the input URL.

Backward compatibility: postUrl retains its existing value (the input URL). Use inputUrl to associate results with input URLs consistently across Facebook Comments Scraper and Facebook Posts Scraper.

attachments is included for comments with supported media. Each attachment contains a type (photo, gif, or sticker) and a url. commentText contains only the comment's text and may be absent for media-only comments.

Example Output

[
{
"inputUrl": "https://www.facebook.com/NFL/posts/pfbid023uiL1TJbp9QxWuCXSR3JamtrXev9LGDNHnpQAuf1dr6kU7Em8hU3oLms5mb4KZQhl",
"commentText": "George Kittle must've had a word with the GM",
"attachments": [
{
"type": "sticker",
"url": "https://example.com/sticker.webp"
}
],
"id": "Y29tbWVudDoxMTg2ODEyNDY5NDgyMjc1XzY2ODE2MzY0NTU0NjI3Mg==",
"legacyId": 668163645546272,
"timestamp": 1742045152000,
"url": "https://www.facebook.com/NFL/posts/pfbid023uiL1TJbp9QxWuCXSR3JamtrXev9LGDNHnpQAuf1dr6kU7Em8hU3oLms5mb4KZQhl?comment_id=668163645546272",
"author": {
"id": "pfbid027qk7JdC2FUy2SHN9PQ1uQrPUAwaSaKVCTNFD6KeN9GRfdw7n4C5k3w6naCtYseQZl",
"profilePictureUrl": "https://scontent.fpoz3-1.fna.fbcdn.net/v/t39.30808-1/484832087_2619507948255427_8811130316462776878_n.jpg?stp=cp6_dst-jpg_s50x50_tt6&_nc_cat=107&ccb=1-7&_nc_sid=e99d92&_nc_ohc=8WugMfDPwGAQ7kNvgFARVYa&_nc_oc=Adk98TB_DjhE7FBLYrhYQSa1s9-iOs0bcnRyTpUO3H0SMbziMMFJu-GYw9xqkuy1ZFE&_nc_zt=24&_nc_ht=scontent.fpoz3-1.fna&_nc_gid=bRJ5zIIdp6dC4pjPIysFaA&oh=00_AYEDOB5Oa9JFPYnAZ2uN6tk-WjfJ34PmbS1pY4e13oWLbw&oe=67E0EC7E",
"name": "Zack Crouch"
},
"postUrl": "https://www.facebook.com/NFL/posts/pfbid023uiL1TJbp9QxWuCXSR3JamtrXev9LGDNHnpQAuf1dr6kU7Em8hU3oLms5mb4KZQhl",
"reactions": {
"like": 178,
"love": 8,
"haha": 4,
"support": 1
},
"reactionsCount": "191"
},
{
"inputUrl": "https://www.facebook.com/NFL/posts/pfbid023uiL1TJbp9QxWuCXSR3JamtrXev9LGDNHnpQAuf1dr6kU7Em8hU3oLms5mb4KZQhl",
"commentText": "A photo from the game.",
"attachments": [
{
"type": "photo",
"url": "https://example.com/comment-photo.jpg"
}
],
"id": "Y29tbWVudDoxMTg2ODEyNDY5NDgyMjc1XzY2ODE2MzY0NTU0NjI3Mw==",
"legacyId": 668163645546273,
"timestamp": 1742045162000,
"url": "https://www.facebook.com/NFL/posts/pfbid023uiL1TJbp9QxWuCXSR3JamtrXev9LGDNHnpQAuf1dr6kU7Em8hU3oLms5mb4KZQhl?comment_id=668163645546273",
"author": {
"id": "100000000000001",
"profilePictureUrl": "https://example.com/avatar.jpg",
"name": "Example Author"
},
"postUrl": "https://www.facebook.com/NFL/posts/pfbid023uiL1TJbp9QxWuCXSR3JamtrXev9LGDNHnpQAuf1dr6kU7Em8hU3oLms5mb4KZQhl",
"reactions": {
"like": 2
},
"reactionsCount": "2"
},
{
"inputUrl": "https://www.facebook.com/NFL/posts/pfbid023uiL1TJbp9QxWuCXSR3JamtrXev9LGDNHnpQAuf1dr6kU7Em8hU3oLms5mb4KZQhl",
"attachments": [
{
"type": "gif",
"url": "https://example.com/animation.gif"
}
],
"id": "Y29tbWVudDoxMTg2ODEyNDY5NDgyMjc1XzY2ODE2MzY0NTU0NjI3NA==",
"legacyId": 668163645546274,
"timestamp": 1742045172000,
"url": "https://www.facebook.com/NFL/posts/pfbid023uiL1TJbp9QxWuCXSR3JamtrXev9LGDNHnpQAuf1dr6kU7Em8hU3oLms5mb4KZQhl?comment_id=668163645546274",
"author": {
"id": "100000000000002",
"profilePictureUrl": "https://example.com/another-avatar.jpg",
"name": "Another Example Author"
},
"postUrl": "https://www.facebook.com/NFL/posts/pfbid023uiL1TJbp9QxWuCXSR3JamtrXev9LGDNHnpQAuf1dr6kU7Em8hU3oLms5mb4KZQhl",
"reactions": {
"like": 1
},
"reactionsCount": "1"
}
]

URL errors

Errors are saved as separate dataset rows with one of two codes:

  • INVALID_URL: invalid or unsupported URL. Recognized before a browser is started and not cached.
  • PAGE_UNAVAILABLE: content confirmed unavailable by an HTTP 404/410 navigation response or a visible Facebook unavailability message, or remembered from a previous confirmed detection.

Example error record

{
"inputUrl": "https://www.facebook.com/example/posts/123",
"error": "PAGE_UNAVAILABLE"
}

Successful records do not include error. Error rows are not billed as scraped results and do not consume resultsLimit; the run initialization charge still applies. The actor continues processing the other input URLs.

Example dataset with results and an error record

One complete comment record from a share link and one complete error record for another input:

[
{
"inputUrl": "https://www.facebook.com/share/p/example/",
"commentText": "First example comment.",
"id": "Y29tbWVudDoxMjNfNDU2",
"legacyId": 456,
"timestamp": 1742045152000,
"url": "https://www.facebook.com/example/posts/123?comment_id=456",
"author": {
"id": "100000000000001",
"profilePictureUrl": "https://example.com/avatar.jpg",
"name": "Example Author"
},
"postUrl": "https://www.facebook.com/share/p/example/",
"reactions": {
"like": 2,
"love": 1
},
"reactionsCount": "3"
},
{
"inputUrl": "https://www.facebook.com/example/posts/999",
"error": "PAGE_UNAVAILABLE"
}
]

Confirmed unavailability is remembered in a cache shared with Facebook Posts Scraper, with a default expiry of six hours. A matching URL produces the same free error record without opening a browser. If the cache is unavailable, the actor checks the URL normally.

Zero comments, disabled comments, login/checkpoint redirects and technical failures do not mark a post as unavailable and are not stored in this cache. An accessible post with no comments can return no rows, or just the original post when includeOriginalPost is enabled.

Usage

  1. Create an Apify account and navigate to the actor.
  2. Configure input parameters in the Apify UI or via API.
  3. Run the actor and monitor execution logs.
  4. Download extracted comments as JSON, CSV, or Excel.

Limitations & Notes

  • Supply individual post, group post, photo, reel, video or share URLs. Profile and group feeds, login, Ads Library and sharing-dialog URLs are unsupported and produce INVALID_URL records.
  • Duplicate input URLs are processed once after URL normalization; results retain the first input URL (with surrounding whitespace trimmed).
  • Scraping Facebook data must comply with their Terms of Service.
  • Avoid excessive scraping to prevent IP bans.
  • The accuracy of data depends on Facebook’s page structure and visibility settings.
  • Free users can process up to 5 post URLs per run and retrieve up to 100 results per post URL, including the original post when enabled.
  • Free users are rate-limited to a certain number of actually processed post URLs per day.
  • For higher usage limits, upgrade to a paid Apify plan.

Works Best With

For the best results, use this scraper alongside Facebook Posts Search.

Before extracting comments, you can use the Facebook Posts Search actor to gather post URLs based on specific keywords. Then, pass those URLs into this Facebook Comments Scraper to collect comments associated with those posts. ✅ Best Use Case Scenario

  • Run Facebook Posts Search Scraper → Collect posts based on your search criteria.
  • Feed post URLs into Facebook Comments Scraper → Extract comments for each post.
  • Gain complete insights → Combine posts and comments for a full dataset, useful for engagement analysis, sentiment tracking, and social media monitoring.

This combination provides a powerful way to analyze conversations happening around specific posts! 🚀

If you're working with multiple platforms or want additional data sources, check out these scrapers:

Support & Contact

✉️ If you encounter issues or need help, feel free to open an issue or contact us at scraper1one@gmail.com.