Facebook Posts Scraper
Pricing
from $1.95 / 1,000 post scrapeds
Facebook Posts Scraper
Scrape public Facebook page posts — extract text, timestamps, likes, comments, shares, images, and video URLs. No login required. 40% cheaper than Apify's own actor.
Pricing
from $1.95 / 1,000 post scrapeds
Rating
0.0
(0)
Developer
Stas Persiianenko
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
Extract public posts from any Facebook page — get post text, timestamps, engagement metrics (likes, comments, shares), images, video URLs, hashtags, and more. No login or Facebook account required.
🚀 What does it do?
Facebook Posts Scraper loads public Facebook pages and extracts the most recent visible posts. For each post it captures:
- Post content: full text, hashtags, @mentions
- Timestamps: ISO 8601 date, Unix milliseconds
- Engagement: like/reaction count, comment count, share count
- Media: image URLs (CDN), video URL, video thumbnail
- Links: external links embedded in the post
- Author info: page name, page ID, page URL
- Post metadata: post URL, post ID, whether it's a video or shared post
- Comments: top comments with author, text, and like count (optional)
👥 Who is it for?
Social media researchers
Track what major brands, news outlets, and organizations are posting on Facebook. Monitor content strategy and messaging trends across multiple pages simultaneously.
PR and communications teams
Monitor competitor Facebook pages, track brand mentions, and keep tabs on public-facing messaging without needing a Facebook account.
Data analysts & BI teams
Build datasets of Facebook post engagement — which content resonates, what posting cadences look like, how engagement correlates with post type.
Marketing agencies
Audit client competitors, benchmark engagement rates, and analyze content formats that drive the most reactions and shares.
Journalists and researchers
Gather public social media data for reporting or academic research without needing platform API access.
Brand monitoring tools
Feed real-time post data into dashboards, alert systems, or sentiment analysis pipelines.
💡 Why use this scraper?
Facebook's Graph API has been severely restricted since 2018-2019. Public page posts are no longer accessible via API without app review and special permissions. The only way to get public post data programmatically today is through scraping.
This actor:
- ✅ Requires no Facebook account — works with fully public pages
- ✅ Uses residential proxy — bypasses Facebook's datacenter IP blocks
- ✅ Returns structured JSON — text, timestamps, engagement counts, image URLs
- ✅ Supports 100+ pages per run — bulk processing with per-page limits
- ✅ Date filtering — collect only posts within your time range
- ✅ Comment extraction — optionally scrape top comments per post
📊 What data do you get?
| Field | Type | Description |
|---|---|---|
postUrl | string | Canonical post URL |
postId | string | Facebook post ID |
text | string | Full post caption / text |
timestamp | string | ISO 8601 publish date |
timestampMs | number | Unix timestamp in milliseconds |
likesCount | number | Total like/reaction count |
commentsCount | number | Number of comments |
sharesCount | number | Number of shares |
isVideo | boolean | Whether the post contains a video |
isShared | boolean | Whether this is a reshared post |
images | array | Array of image CDN URLs |
videoUrl | string | Video URL (if video post) |
videoThumbnailUrl | string | Video thumbnail URL |
externalLinks | array | External links within the post |
hashtags | array | Hashtags extracted from post text |
mentions | array | @mentions extracted from post text |
authorName | string | Page display name |
authorUrl | string | Page URL |
pageId | string | Facebook page numeric ID |
pageName | string | Page URL slug (username) |
topComments | array | Top visible comments (if enabled) |
scrapedAt | string | ISO timestamp when scraped |
💰 How much does it cost to scrape Facebook posts?
This actor uses Pay Per Event (PPE) pricing — you only pay for posts you extract.
| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
|---|---|---|---|---|---|---|
| Run start | $0.01 | $0.0095 | $0.0085 | $0.0075 | $0.006 | $0.005 |
| Per post | $0.003 | $0.0027 | $0.0024 | $0.00195 | $0.0015 | $0.0012 |
Example costs (FREE tier):
- 10 posts (1 page) → ~$0.04 (start + 10 × $0.003)
- 50 posts (10 pages) → ~$0.16
- 500 posts (100 pages) → ~$1.51
💡 Why use residential proxy? Facebook blocks datacenter IPs. Residential proxies route your requests through real ISP connections, bypassing these blocks. Proxy bandwidth is included in the above pricing.
Compare to competitor: Apify's own facebook-posts-scraper charges $0.005/post (FREE tier) — 40% more per post. Same data, lower price.
🔧 How to scrape Facebook posts
Step 1: Find the page URLs you want to scrape
Collect the Facebook page URLs:
- Named pages:
https://www.facebook.com/cocacola - Page ID format:
https://www.facebook.com/profile.php?id=100064277875532 - Short username: just enter
cocacola— the actor will normalize it
Step 2: Configure the actor
In the Pages to scrape section, add your page URLs. In Settings, configure:
- Max posts per page — how many recent posts to scrape per page (default: 20)
- From date / To date — filter to a specific date range (optional)
- Include top comments — also extract top visible comments (optional)
Step 3: Run and export
Click Start and wait. When finished, export results as JSON, CSV, or connect to your downstream tools via API or webhooks.
⚙️ Input configuration
| Parameter | Type | Default | Description |
|---|---|---|---|
pageUrls | array | required | Facebook page URLs to scrape |
maxPostsPerPage | number | 20 | Max posts per page |
fromDate | string | — | Only posts on/after this date (YYYY-MM-DD) |
toDate | string | — | Only posts on/before this date (YYYY-MM-DD) |
includeComments | boolean | false | Extract top comments per post |
proxyCountry | string | US | Residential proxy country code |
📤 Output format
Each post is stored as a separate item in the dataset:
{"postUrl": "https://www.facebook.com/nasa/posts/pfbid0...","postId": "pfbid0...","text": "One last look at Earth before we reach the Moon.","timestamp": "2026-04-05T18:30:00.000Z","timestampMs": 1743879000000,"likesCount": 52300,"commentsCount": 847,"sharesCount": 1200,"isVideo": false,"isShared": false,"images": ["https://scontent.xx.fbcdn.net/v/..."],"videoUrl": null,"hashtags": [],"mentions": [],"authorName": "NASA","authorUrl": "https://www.facebook.com/nasa","pageId": "100044561550831","pageName": "nasa","topComments": [],"scrapedAt": "2026-04-06T01:55:00.000Z"}
💡 Tips for best results
Use multiple page URLs in one run
The actor processes pages sequentially. Add 10, 50, or 100+ page URLs in a single run — each will be scraped for its most recent posts.
Set appropriate post limits
Facebook loads posts progressively. maxPostsPerPage: 5 is good for monitoring recent activity. For historical analysis, try maxPostsPerPage: 50 with a fromDate filter.
Use date filtering for efficiency
If you only need posts from the last 7 days, set fromDate to avoid scraping older posts. This saves time and reduces costs.
Choose the right proxy country
Use the country that matches your target audience. For US-based pages, US proxy gives the most accurate engagement numbers. For European pages, try GB or DE.
High-traffic pages vs. niche pages
Major brand pages (Coca-Cola, NYT, NASA) may show only their most recent 1-3 posts to non-logged-in visitors — this is Facebook's standard behavior for large public pages. Niche pages with smaller followings often expose more posts.
🔗 Integrations
Send new posts to Slack
Connect Facebook Posts Scraper to Zapier or Make, and automatically post new scraped Facebook posts to a Slack channel for your team. Set up a recurring schedule (hourly, daily) to keep your team informed.
Feed data to sentiment analysis
Export posts to Google Sheets or BigQuery, then run sentiment analysis to track brand perception over time. Combine with engagement metrics to understand which sentiments resonate most.
Build a social listening dashboard
Use the Apify Scheduled Actors feature to run this scraper daily, storing results in a dataset. Connect Apify datasets to Tableau, Looker, or Power BI for a live social media dashboard.
Monitor competitor content
Set up recurring runs for your top competitors' Facebook pages. Get daily email alerts when they publish new posts, and track engagement trends over time.
Archive public posts for research
For academic research on social media trends, use this actor to build large-scale datasets of public Facebook posts. Export to CSV and analyze with Python or R.
🤖 API usage
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });const run = await client.actor('automation-lab/facebook-posts-scraper').call({pageUrls: ['https://www.facebook.com/nasa', 'https://www.facebook.com/nytimes'],maxPostsPerPage: 10,fromDate: '2026-01-01',});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Scraped ${items.length} posts`);for (const post of items) {console.log(`${post.authorName}: ${post.text?.substring(0, 100)}`);}
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("automation-lab/facebook-posts-scraper").call(run_input={"pageUrls": ["https://www.facebook.com/nasa", "https://www.facebook.com/nytimes"],"maxPostsPerPage": 10,"fromDate": "2026-01-01",})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(f"Scraped {len(items)} posts")for post in items:print(f"{post['authorName']}: {(post.get('text') or '')[:100]}")
cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~facebook-posts-scraper/runs?token=YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"pageUrls": ["https://www.facebook.com/nasa"],"maxPostsPerPage": 10}'
🧠 Use with AI assistants (MCP)
You can use this actor directly from Claude, Cursor, or any MCP-compatible AI assistant:
Claude Code setup:
$claude mcp add --transport sse https://mcp.apify.com/sse?tools=automation-lab/facebook-posts-scraper
Claude Desktop — add to claude_desktop_config.json:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/sse?tools=automation-lab/facebook-posts-scraper","type": "sse"}}}
Example prompts:
- "Scrape the last 5 posts from facebook.com/nasa and summarize the topics"
- "Get the most recent posts from facebook.com/nytimes and facebook.com/bbcnews"
- "Scrape Facebook posts from @cocacola from the last 30 days"
- "Monitor these 10 brand pages and tell me which has the most engagement this week"
⚖️ Is scraping Facebook posts legal?
This actor only scrapes publicly visible content — posts that any person can view without logging in. Facebook's own robots.txt and public pages are designed for public access.
Key points:
- ✅ Only scrapes public pages — no private profiles, no friends-only content
- ✅ No login required — reads only what's publicly visible
- ✅ No bypassing authentication — uses standard browser requests
- ✅ Complies with Apify's Terms of Service
- ⚠️ Do not use for spam, harassment, or building competitor contact lists
- ⚠️ Respect GDPR/CCPA — personal data in posts may have additional restrictions
- ⚠️ Review Facebook's Terms of Service for your specific use case
For legal guidance specific to your use case, consult with a qualified attorney.
❓ FAQ
How many posts can I scrape per page?
You can set maxPostsPerPage up to 500. Facebook's new layout shows 1–5 posts initially per page visit, and the actor scrolls to load more. The exact number depends on the page's posting frequency and Facebook's current rendering behavior for non-logged-in visitors.
Does it require a Facebook account or login?
No. This actor scrapes only publicly visible posts — no credentials needed. If a post requires login to view, it will not be scraped.
Why do some pages return fewer posts than the limit?
Facebook controls how many posts it shows to non-logged-in visitors. Very popular pages (millions of followers) often show only their most recent 1–3 posts. Less-trafficked pages may show more. This is Facebook's behavior — not a scraper limitation.
Does the scraper work for Facebook profiles vs. pages?
It works best with Facebook Pages (brands, organizations, public figures). Personal profiles with privacy settings will not be accessible.
Can I scrape posts from a specific date range?
Yes — use fromDate and toDate parameters (YYYY-MM-DD format). The actor will stop scrolling once it reaches posts older than fromDate.
What happens if a page is blocked or private?
The actor will log a warning and move to the next page, returning 0 posts for that URL.
Why do images have long CDN URLs?
Facebook images are served from their CDN with authentication tokens in the URL. These URLs expire after some time — download and store images if you need permanent copies.
How often should I run this for monitoring?
For active pages: daily runs with fromDate set to yesterday work well for continuous monitoring. For brand monitoring dashboards, hourly runs on key competitor pages is a common pattern.
🔗 Related scrapers
Looking for more Facebook and social media data? Check out our other automation-lab scrapers:
- Facebook Pages Scraper — Extract page info: followers, contact details, category, hours
- Facebook Ad Library Scraper — Scrape active Facebook ads and creative assets
- Instagram Scraper — Extract Instagram posts, reels, and profile data
- TikTok Scraper — Scrape TikTok videos and engagement data
- Twitter/X Scraper — Extract tweets and Twitter profile data