Facebook Page Posts Scraper – Export Any Page's Posts
Pricing
from $3.00 / 1,000 post returneds
Facebook Page Posts Scraper – Export Any Page's Posts
Scrape posts from any public Facebook Page by URL. Export post text, timestamp, reactions, comment & share counts, author, images and video links to JSON, CSV or Excel. Fast, synchronous, no login or cookies. Pay only per post returned.
Pricing
from $3.00 / 1,000 post returneds
Rating
0.0
(0)
Developer
EndSpec
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Simple Input-Output Example
Input (paste any public Facebook Page URL):
{"url": "https://www.facebook.com/nasa","limit": 2}
Output (one dataset row per post):
{"post_id": "1122334455667788","type": "post","url": "https://www.facebook.com/nasa/posts/1122334455667788","message": "Webb's latest look at the Pillars of Creation is here.","timestamp": 1783975034,"reactions_count": 18420,"comments_count": 612,"reshare_count": 1503,"author_name": "NASA","image_url": "https://example-cdn.com/photos/pillars.jpg","_query": "{\"url\":\"https://www.facebook.com/nasa\"}"}
Important Notes:
- You get results instantly — the run is synchronous, no job queue to poll
- Pay only per post returned → $0.0035 per post. Failed and empty runs cost nothing
- One Facebook Page URL per run; pagination to your
limit(max 200) is automatic - No Facebook login, cookies, or API key needed
- All data comes from public Facebook Pages only
- Contact: contact@endspec.net
Full Actor Documentation
Facebook Page Posts Scraper
Export the posts of any public Facebook Page by URL. Get post text, publish time, reaction/comment/share counts, author name, and image or video links as JSON, CSV, or Excel.
Overview
The Facebook Page Posts Scraper is an Apify Actor that scrapes posts from any public Facebook Page on facebook.com. You give it a Page URL, it resolves the Page and paginates through its posts, and it writes one clean, flat row per post to the Apify dataset.
It is built for people who need Facebook Page content as structured data — social media managers tracking competitors, analysts measuring engagement, and developers feeding a dashboard or database. There is nothing to install and no Facebook account to connect: paste a URL, press start, get rows.
What this Actor does not do: it does not scrape private Pages, personal profiles, groups, comments, reactions-by-user, or Facebook Ads. It reads posts from public Pages only.
What You Can Do
- Export a Page's posts: Pull the most recent posts from any public Facebook Page as structured rows
- Read post text: Get the full message body of each post
- Measure engagement: Get reaction, comment, and share counts per post
- Collect post media: Get the image URL and video URL attached to a post, when present
- Get direct post links: Every row carries the post's own Facebook URL and post ID
- Track posting cadence: Use the Unix timestamp on each post to analyse frequency and timing
- Feed your stack: Download as JSON, CSV, Excel, HTML, or XML, or pull from the Apify API
Data Availability
All data returned by this Actor is publicly available information. It only reads posts that a Page has published publicly on Facebook — the same content any logged-out visitor can see on the Page. It does not access private Pages, restricted posts, personal profiles, or anything behind a login.
Actor Input Parameters
The Actor accepts the following input parameters:
url
• Type: string
• Required: Yes
• Description: Full URL of the public Facebook Page you want to scrape
e.g., https://www.facebook.com/nasa
limit
• Type: integer
• Required: Optional
• Default: 20
• Minimum: 1 — Maximum: 200
• Description: Maximum number of posts to return. The Actor paginates automatically until it has this many posts or the Page runs out.
e.g., 50
Important Notes:
urlis required — it must be a full Facebook Page URL, includinghttps://www.facebook.com/- One Page per run — the Actor scrapes a single Page URL. To cover several Pages, start one run per Page
limitis a ceiling, not a quota — a Page with fewer posts than yourlimitsimply returns fewer rows. You are never charged for posts that do not exist- Posts come newest-first, in the order the Page publishes them
- Public Pages only — a private Page, a personal profile, a group URL, or a typo'd URL cannot be resolved and returns an error row (see Output Examples)
- No API key or credentials in the input — authentication is handled entirely on our side
Input Examples
Example 1: Default Run (Minimal Input)
{"url": "https://www.facebook.com/nasa"}
When to use: The quickest way to try the Actor. limit defaults to 20, so you get the 20 most recent posts.
Example 2: Larger Export
{"url": "https://www.facebook.com/nasa","limit": 200}
When to use: When you want a Page's recent history in one run. 200 is the maximum accepted value; the Actor paginates to reach it.
Example 3: Small Sample Before a Big Run
{"url": "https://www.facebook.com/BBCNews","limit": 5}
When to use: To check a Page resolves and the fields look right before spending on a 200-post run. This is the recommended first step for any new Page.
Example 4: Unresolvable URL (Will Return an Error Row)
{"url": "https://www.facebook.com/this-page-does-not-exist-12345"}
Result: The Page cannot be resolved, so the Actor writes a single error row (That input could not be found or processed...) and charges nothing. The same happens for private Pages, personal profiles, and group URLs.
Output Structure
The Actor pushes one row per post to the Apify dataset. Rows are flat — no nested objects — so they export cleanly to CSV and Excel.
Successful Output Format
{"post_id": "string","type": "string","url": "string","message": "string","timestamp": 1783975034,"reactions_count": 0,"comments_count": 0,"reshare_count": 0,"author_name": "string","image_url": "string","video_url": "string","_query": "string"}
Field Descriptions:
post_id • Type: string • Description: Facebook's identifier for the post
type
• Type: string
• Description: The kind of post as published, e.g. post
url • Type: string • Description: Direct link to the post on Facebook
message • Type: string • Description: The post's text body
timestamp • Type: number • Description: Publish time as a Unix epoch timestamp in seconds, UTC
reactions_count • Type: number • Description: Total reactions on the post at scrape time
comments_count • Type: number • Description: Number of comments on the post at scrape time
reshare_count • Type: number • Description: Number of shares of the post at scrape time
author_name • Type: string • Description: Display name of the post's author (normally the Page itself)
image_url • Type: string • Description: Link to the post's image, when the post has one
video_url • Type: string • Description: Link to the post's video, when the post has one
_query • Type: string • Description: A JSON string echoing the Page URL you submitted, so rows stay traceable when you merge datasets from several runs
Important: fields with no value are omitted from the row entirely rather than returned as null. A text-only post has no image_url or video_url key at all — check for a key's presence, not for null.
Error Output Format
A failure produces one row in this shape, and no charge:
{"status": "error","_query": "string","error": "string"}
Note that successful post rows have no status field — the presence of status: "error" is what marks a row as an error.
Output Examples
Example 1: Image Post with Full Engagement Data
{"post_id": "1122334455667788","type": "post","url": "https://www.facebook.com/nasa/posts/1122334455667788","message": "Webb's latest look at the Pillars of Creation is here.","timestamp": 1783975034,"reactions_count": 18420,"comments_count": 612,"reshare_count": 1503,"author_name": "NASA","image_url": "https://example-cdn.com/photos/pillars.jpg","_query": "{\"url\":\"https://www.facebook.com/nasa\"}"}
The post has no video, so video_url is absent from the row.
Example 2: Video Post
{"post_id": "9988776655443322","type": "post","url": "https://www.facebook.com/nasa/posts/9988776655443322","message": "Watch the launch, live from Kennedy Space Center.","timestamp": 1783801200,"reactions_count": 7310,"comments_count": 288,"reshare_count": 940,"author_name": "NASA","image_url": "https://example-cdn.com/thumbs/launch.jpg","video_url": "https://example-cdn.com/videos/launch.mp4","_query": "{\"url\":\"https://www.facebook.com/nasa\"}"}
Example 3: Text-Only Post with Low Engagement
{"post_id": "5566778899001122","type": "post","url": "https://www.facebook.com/nasa/posts/5566778899001122","message": "Reminder: applications close Friday.","timestamp": 1783714800,"reactions_count": 42,"comments_count": 3,"reshare_count": 0,"author_name": "NASA","_query": "{\"url\":\"https://www.facebook.com/nasa\"}"}
No media on this post, so both image_url and video_url are absent.
Example 4: Page Found, But No Posts (Empty Result)
If the Page resolves but has published no posts, the run succeeds with an empty dataset — zero rows, no error row, no charge:
[]
An empty dataset therefore means "the Page exists and has nothing to return", which is a different outcome from an error row.
Example 5: Error — Page Could Not Be Resolved
Returned for a Page URL that does not exist, is private, is a personal profile or group, or is malformed:
{"status": "error","_query": "{\"url\":\"https://www.facebook.com/this-page-does-not-exist-12345\"}","error": "That input could not be found or processed. Please check it and try again. You were not charged."}
Example 6: Error — Service Busy
Returned when the Actor is being rate-limited and should be retried:
{"status": "error","_query": "{\"url\":\"https://www.facebook.com/nasa\"}","error": "The service is busy right now — please retry in a moment. You were not charged."}
Example 7: Error — Service Temporarily Unavailable
Returned for a temporary failure while fetching the Page's posts:
{"status": "error","_query": "{\"url\":\"https://www.facebook.com/nasa\"}","error": "The data service is temporarily unavailable — please retry shortly. You were not charged."}
The Complete List of Error Messages
The Actor emits exactly these strings and no others — they are fixed and safe to match on in code:
error value | Meaning |
|---|---|
That input could not be found or processed. Please check it and try again. You were not charged. | The Page URL could not be resolved (non-existent, private, profile/group, or malformed) |
The service is busy right now — please retry in a moment. You were not charged. | Rate-limited — retry in a moment |
The data service is temporarily unavailable — please retry shortly. You were not charged. | Temporary upstream failure — retry shortly |
The request could not be completed right now. Please retry shortly. You were not charged. | Catch-all for any other unexpected failure |
Every error row is unbilled, which is why each message ends with "You were not charged."
Use Cases
For Social Media Managers
Competitor Tracking: Export a competitor Page's posts and see exactly what they publish, how often, and what lands. Reaction, comment, and share counts per post tell you which formats earn engagement.
Example Workflow:
- Collect the Facebook Page URLs of 5–10 competitors
- Run the Actor once per Page with
limit: 100 - Export each dataset to CSV and combine them (use
_queryto tell the Pages apart) - Sort by
reactions_countto find their best-performing posts - Re-run monthly to track how their strategy shifts
For Marketers and Agencies
Content Research and Client Reporting: Build reports on what works in a client's category before pitching a content calendar, and back the pitch with real engagement numbers instead of intuition.
Example Workflow:
- Pick the top Pages in your client's vertical
- Run the Actor with
limit: 200for each - Group posts by
typeand by whetherimage_urlorvideo_urlis present - Compare average
reactions_countper group to see which formats win - Ship the findings as the evidence section of your proposal
For Analysts and Researchers
Engagement and Cadence Analysis: Use timestamp plus the three engagement counts to study posting frequency, best posting times, and how engagement decays or grows over a Page's recent history.
Example Workflow:
- Run the Actor for each Page in your sample
- Convert
timestamp(Unix seconds, UTC) to dates in your analysis tool - Bucket posts by day of week and hour to find cadence patterns
- Correlate posting time and media type against engagement counts
- Repeat on a schedule to build a longitudinal dataset
For Developers
Pipelines and Dashboards: Flat, predictable rows drop straight into a database or BI tool with no unwrapping. Pull the dataset from the Apify API and schedule runs with Apify Schedules.
Example Workflow:
- Trigger a run per Page via the Apify API
- Read rows from the dataset endpoint when the run finishes
- Skip any row where
statusis"error"and retry those Pages later - Upsert the rest on
post_idso re-runs refresh engagement counts without duplicating posts - Schedule daily or weekly runs to keep the table current
Best Practices
Input Selection
- Test with a small
limitfirst — run a new Page withlimit: 5to confirm it resolves and the fields look right before committing to a 200-post run - Use the canonical Page URL — the plain
https://www.facebook.com/<page>form is the most reliable; strip tracking parameters and trailing paths - Check the URL is a Page — personal profiles, groups, and events are not Pages and will not resolve
- Only raise
limitwhen you need the depth — you pay per post returned, solimit: 200on 20 Pages is 4,000 billable posts
Error Handling
- Check for
statusfirst — a row withstatus: "error"carries no post data; every successful post row has nostatusfield at all - Distinguish empty from failed — an empty dataset means the Page had nothing to return; an error row means the request failed. Neither is billed
- Retry the busy and unavailable messages — both are transient. Wait a moment and run again
- Do not retry the "could not be found or processed" message — fix the URL instead; retrying will not help
- Log run IDs — include the Apify run ID when contacting support
Data Usage
- Treat counts as a snapshot —
reactions_count,comments_count, andreshare_countare correct at scrape time and keep moving afterwards. Re-run to refresh them - Deduplicate on
post_id— it is stable across runs, which makes re-runs safe - Keep
_querywhen merging — it is the only field that tells you which Page a row came from once datasets are combined - Cache media links promptly — Facebook's
image_urlandvideo_urllinks can expire; download what you need rather than hotlinking
Cost, Performance, and Limits
Pricing: $0.0035 per post returned. Billing is pay-per-event: the Actor charges one post-returned event for each post it writes to the dataset. No subscription, no minimums, no per-run fee.
You are not charged for:
- Error rows — every failure path pushes an unbilled row
- Empty runs — a Page with no posts returns no rows and costs nothing
- Posts that do not exist —
limit: 200on a Page with 30 posts bills 30 posts, not 200
Performance:
- Synchronous — results land in the dataset during the run; there is no queue to poll
- Optimized for single Pages — one Page per run, paginated automatically until your
limitis met or the Page is exhausted - Fast — a default 20-post run typically finishes in seconds; larger runs take proportionally longer because more pages are fetched
- Lightweight — no browser, no proxies to configure, minimal compute cost on top of the per-post price
Limits:
limitaccepts 1 to 200, default 20- One Page URL per run — run the Actor once per Page, or use Apify Schedules/API to fan out
- Public Pages only — private Pages, profiles, and groups cannot be scraped
- Recent posts only — the Actor walks a Page's post feed newest-first; it is not an archival tool for a Page's entire history
- Available fields depend on the post — a text-only post has no media keys, and any field Facebook does not publish is simply absent from the row
Data Sources and Legality
This Actor accesses only publicly available data. Every post it returns has been published publicly by the Page on Facebook and is visible to any visitor without logging in. The Actor does not bypass a login, does not use your Facebook credentials, and does not access private Pages, restricted posts, personal profiles, or non-public information.
Your responsibilities:
- You are responsible for complying with applicable laws and regulations, including GDPR, CCPA, and local data-protection rules
- You are responsible for complying with Facebook's Terms of Service in your jurisdiction and use case
- Post text and media remain the intellectual property of their authors — respect copyright when republishing
- Use the data for legitimate purposes such as research, analytics, and competitive intelligence
Nothing here is legal advice. If your use case is sensitive or high-volume, take your own legal counsel.
Not affiliated with, endorsed by, or sponsored by Facebook or Meta.
FAQ
Q: Do I need a Facebook account, cookies, or an API key? A: No. Provide a public Page URL and run it — authentication is handled entirely on our side.
Q: Will empty or failed runs cost me anything? A: No. You are charged only for posts actually written to the dataset. Error rows and empty runs are free.
Q: How many posts can I get per run?
A: Up to 200, set via limit (default 20). The Actor paginates automatically. If the Page has fewer posts than your limit, you get — and pay for — only what exists.
Q: Can I scrape several Pages in one run? A: Not in a single run — the Actor takes one Page URL. Start one run per Page, or fan out with the Apify API or Schedules.
Q: Why did my run return zero rows with no error? A: The Page resolved but had no posts to return. That is a successful, unbilled run — different from an error row, which signals a failed request.
Q: Why is image_url (or video_url) missing from some rows?
A: The post has no media of that kind. Fields with no value are omitted from the row rather than set to null, so check whether the key is present.
Q: What format is timestamp?
A: A Unix epoch timestamp in seconds, UTC. Multiply by 1000 for JavaScript Date.
Q: Can I scrape a private Page, a personal profile, or a group? A: No. Only public Facebook Pages. Anything else returns the "could not be found or processed" error row and is not billed.
Q: Can I get comments or the list of people who reacted?
A: No. This Actor returns per-post counts (reactions_count, comments_count, reshare_count), not the comments themselves or user-level reaction data.
Q: Are engagement counts live? A: They are a snapshot from the moment of the run. Re-run the Actor to refresh them.
Q: Can I use this Actor commercially? A: Yes. The data is publicly available, and you are responsible for using it in line with applicable law and platform terms.
Q: In what formats can I download results? A: JSON, CSV, Excel, HTML, or XML from the Apify console, or straight from the Apify API.
Contact & Support
Questions? Need help? We're here for you.
For questions, technical support, feature requests, or general inquiries about the Facebook Page Posts Scraper, reach out:
Email: contact@endspec.net
Response time: We respond within 24 hours during business days.
What to include in your inquiry:
- Your question or a description of the issue
- The Apify run ID, if applicable
- The input you used (the Page URL and
limit) - The
errorvalue from the row, if you got one - Any relevant code snippets or examples
You can also report issues through the Issues tab on this Actor's Apify page.
Related Actors
- Instagram Instant Media Scraper – Export public Instagram profile media and post data.
- YouTube Instant Email Scraper – Find public contact details for YouTube channels.
- LinkedIn Instant Profile Search – Search public LinkedIn profiles by name, job title, or company.
Last updated: July 2026