Skip to content

Facebook Posts Scraper

Try for free

Scrape posts from public Facebook pages and profiles: text, timestamps, reactions, comments and shares counts, media, and links for brand monitoring and research.

📰 Facebook Posts Scraper

Public Facebook posts, reactions, and media — from the page itself, without opening a browser.

Built for social teams, analysts, and agencies who need a repeatable feed of public page and profile posts in one dataset.

✨ Features

  • 🔗 Accepts public page and profile URLs, plus a direct post or reel URL
  • 📝 Post text, permalink, publish time, and author name, id, and profile picture when Facebook sends them
  • 👍 Total reactions, comment count, share count, and the Like, Love, Haha, Wow, Sad, Angry, and Care counts that are actually on the post
  • 🖼 Photo and video attachments, with thumbnail, image size, and accessibility text when Facebook includes them
  • 🔗 Link previews and external links when the post has them
  • 💬 Top comments already returned with the post
  • 🎥 Video view counts, and a transcript only when that text is already on the post and captionText is on
  • 🤝 Collaborators and the original shared post when Facebook includes them
  • 🏷 Ads Library page id when the page payload includes it
  • 📅 Optional newer-than and older-than window
  • ⚠️ A page that only returns a login page fails the run. No error row is written

🚀 Why teams use this

The actor talks to Facebook over HTTP. There is no browser to start, so a page of posts does not pay for a render.

It is meant to run on Scrapely. A residential proxy is attached inside the run. You do not paste a session cookie.

A page that only returns a login page fails the run. Other pages in that run are still stored when Facebook sent them. The dataset does not get an error row, and the missing page is not treated as delivered.

Empty fields stay off the item. A real 0 or false stays. Nothing is filled in to make a post look complete.

💡 Use cases

  • Monitor posts from public Facebook pages with reactions, comments, and shares.
  • Track competitors' and brands' posting activity.
  • Collect public posts for social listening and media research.

🧪 Example input

{
  "resultsLimit": 20,
  "startUrls": [
    {
      "url": "https://www.facebook.com/humansofnewyork/"
    }
  ]
}

🧾 Sample output

One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.

{
  "facebookUrl": "https://www.facebook.com/humansofnewyork",
  "postId": "1652080019816314",
  "url": "https://www.facebook.com/reel/2141054613462232/",
  "inputUrl": "https://www.facebook.com/humansofnewyork/",
  "pageName": "humansofnewyork",
  "timestamp": 1789849138,
  "time": "2026-09-19T20:18:58.000Z",
  "text": "Henry might be the nicest shopkeeper in NYC. You can visit his Army and Navy Bags store at 177 E Houston.",
  "user": {
    "id": "100050429952420",
    "name": "Humans of New York",
    "profileUrl": "https://www.facebook.com/humansofnewyork",
    "profilePic": "https://scontent.fhan19-1.fna.fbcdn.net/…"
  },
  "facebookId": "100050429952420",
  "topLevelUrl": "https://www.facebook.com/100050429952420/posts/1652080019816314",
  "likes": 19467,
  "comments": 788,
  "shares": 702,
  "reactionLikeCount": 12756,
  "reactionLoveCount": 6271,
  "reactionCareCount": 426,
  "reactionHahaCount": 8,
  "reactionWowCount": 3,
  "reactionSadCount": 3,
  "topReactionsCount": 6,
  "feedbackId": "ZmVlZGJhY2s6MTY1MjA4MDAxOTgxNjMxNA==",
  "viewsCount": 361894,
  "videoPostViewCount": 361894,
  "media": [
    {
      "__typename": "Video",
      "thumbnail": "https://scontent.fhan19-1.fna.fbcdn.net/…",
      "accent_color": "FF79092A",
      "photo_image": {
        "uri": "…"
      },
      "url": "https://www.facebook.com/reel/2141054613462232/",
      "id": "2141054613462232",
      "liveViewerCount": 0
    }
  ]
}

📥 Input

FieldWhat it does
startUrlsRequired. Public Facebook page, profile, post, or reel URLs.
resultsLimitMaximum posts to keep per page. Ignored for a direct post URL. Default 20.
captionTextWhen true, include transcript text if Facebook already sent it with the post. Default false.
onlyPostsNewerThanKeep posts from this time forward. YYYY-MM-DD, a partial ISO timestamp, or a relative value such as 1 day or 2 months.
onlyPostsOlderThanKeep posts from this time backward. Same date formats.
{
  "startUrls": [{ "url": "https://www.facebook.com/humansofnewyork/" }],
  "resultsLimit": 20
}

Personal profiles that are not public, and pages that answer with a login wall, do not return posts.

📤 Output

Each post is one dataset item. Fields appear only when the page payload had them.

FieldWhat it is
facebookUrlPage or profile the post came from
inputUrlURL you submitted
pageNamePage slug
postIdPost id
urlPermalink
topLevelUrlfacebook.com/{id}/posts/{postId} when both ids exist
time, timestampPublish time, ISO and Unix
timeCreated, timestampCreatedBackdated creation time, when it differs
text, textReferencesCaption and the entities Facebook attached to it
userid, name, profileUrl, profilePic
facebookIdAuthor id
collaboratorsTagged collaborators, when the list is not empty
likes, comments, sharesReaction total, comment count, share count
topReactionsCountHow many reaction types Facebook listed
reactionLikeCount, reactionLoveCount, reactionHahaCount, reactionWowCount, reactionSadCount, reactionAngryCount, reactionCareCountCounts for the reaction types present on the post
mediathumbnail, __typename, photo_image, url, id, ocrText when present
link, previewTitle, previewDescription, previewSource, previewTargetExternal link preview
actionLinkCall-to-action link_display, title, url
isVideoTrue when an attachment is a video
viewsCount, videoPostViewCount, liveViewerCountVideo and live counts Facebook sent
feedbackIdFeedback id
sharedPostThe original post, mapped the same way, when this post is a share
paidPartnershipBoolean, only when Facebook sent one
pageAdLibraryid and is_business_page_active from the page
topCommentsComments already included with the post: text and author
captionTextTranscript text, only when captionText was requested and Facebook sent it

A page that only returns a login page does not add a row, and the run fails. Nothing is invented in its place.

💰 Pricing

Pay per result, plus platform usage (compute and proxy traffic) at the normal rates.

EventWhen it is chargedPrice
PostEach post saved to the dataset$0.0045 ($4.50 per 1,000 posts)
Date filter appliedEach saved post, only when onlyPostsNewerThan or onlyPostsOlderThan is set$0.0008

Example: 1,000 posts ≈ $4.50 in event fees plus platform usage; with a date filter ≈ $5.30. In our tests a 20-post run used about $0.005 of platform usage. If you set a maximum charge for the run, the scraper stops cleanly when it is reached and keeps every post it already saved.

Related actors

G2
4.7/5
Excellent
Trustpilot

The internet is full of data.
Start owning yours.

Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.

No credit card. No setup calls.