# Facebook User Posts Scraper (`maximedupre/facebook-user-posts-scraper`) Actor

Collect public posts from Facebook profiles, Pages, and known post URLs. Get post text, URLs, author details, dates, engagement counts, reactions, media, and links when Facebook exposes them.

- **URL**: https://apify.com/maximedupre/facebook-user-posts-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Marketing, Developer tools
- **Features:** Limited permissions
- **Stats:** 92 total users, 14 monthly users, 96.4% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$19.80 / 1,000 public posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 📘 Facebook user posts for public profile and Page research

Researchers, social media teams, and developers can collect public [Facebook](https://www.facebook.com/) posts from profiles and Pages in one run. The Actor returns structured rows with the submitted target, post text and URL, plus profile and author details, dates, engagement counts, reactions, media, attachments, and links when Facebook exposes them. This gives you structured data for research and reporting, so you can review public posts without copying them by hand.

- Run a **[Facebook post scraper](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-post-scraper)** to save one known public entry as a structured row.
- Use the **[Facebook timeline scraper](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-timeline-scraper)** to export posts from a profile or Page feed.
- Use a **[Facebook Page posts scraper](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-page-posts-scraper)** to collect Page updates with text and engagement data.
- Use a **[Facebook profile posts scraper](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-profile-posts-scraper)** to collect profile updates with dates and author details.
- Use the **[Facebook posts scraper](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-posts-scraper)** to export post URLs, text, media, and engagement fields.
- Run the **[Facebook user posts scraper](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-user-posts-scraper)** to collect posts from profile or Page targets or known public post URLs.
- Review a set time range with **[Facebook posts by date](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-posts-by-date)**.
- Read known public reel posts with a **[Facebook reels scraper](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-reels-scraper)**.
- Collect a known public photo post with a **[Facebook photo post scraper](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-photo-post-scraper)**.
- Collect posts from several Pages for a **[Facebook Page comparison](https://apify.com/maximedupre/facebook-user-posts-scraper/examples/facebook-page-comparison)**.

#### 📦 Facebook post data

**What you get**

Each successful public post is one dataset row. Fields Facebook does not expose are omitted. Empty arrays and objects are omitted when they have no source-backed values. Meaningful numeric zero and boolean false values stay in the row. If the same post is found through another submitted target or URL, the Actor keeps the first eligible saved match and ignores later matches.

- **Source trace:** `matchedInput`, `postId`, and `postUrl` show which submitted value first found the post and identify the source post.
- **Post details:** `postType`, `text`, `transcript`, and `createdAt` describe the public post when Facebook exposes them.
- **People and pages:** `profile` and `author` hold public IDs, names, URLs, and picture URLs when available.
- **Engagement:** `engagement` holds public comment, reaction, share, and video view counts; `reactions` holds the visible reaction breakdown.
- **Media and links:** `media`, `attachments`, `externalLinks`, and `textReferences` hold source-visible media, attachment, link, and referenced profile or Page data.
- **Extra labels:** `paidPartnership` and `adLibraryId` are returned when Facebook exposes them.

#### 🚀 Run Facebook timeline and post exports

**How to run**

1. Open the Actor input tab.
2. Choose **Profile or Page timeline** in **Find posts by**, then add public profile or Page targets in **Profile or Page targets**.
3. Or choose **Known post URLs** in **Find posts by**, then add known public post URLs in **Known post URLs**.
4. Set **Maximum posts per profile or Page** for each timeline. If you leave it empty, the Actor returns all available posts until Facebook has no more public posts.
5. Add optional `Start date` and `End date` values in `YYYY-MM-DD` format.
6. Start the Actor and open the dataset.

For a first run, keep the prefilled public target and default settings. Replace it after you confirm the output shape.

#### ⚙️ Input

**Input fields**

Choose one source method in **Find posts by**. Timeline limits and dates apply only to profile or Page targets. Direct post URLs use the links you submit.

| Field | Type | What it does |
|---|---|---|
| `findPostsBy` | string | Chooses Profile or Page timeline for profile or Page feeds, or Known post URLs for direct public post links. |
| `targets` | array of strings | Accepts handles, `@handles`, full profile or Page URLs, or numeric IDs for profile or Page timelines. |
| `postUrls` | array of strings | Accepts direct public Facebook post, reel, photo, video, or supported permalink URLs. |
| `maxPostsPerTarget` | integer | Sets an optional limit for each profile or Page timeline. If left empty, the Actor returns all available posts until Facebook has no more public posts. |
| `startDate` | string | Keeps timeline posts on or after this `YYYY-MM-DD` date when Facebook shows a publish date. |
| `endDate` | string | Keeps timeline posts on or before this `YYYY-MM-DD` date when Facebook shows a publish date. |

**Successful run input**

This example is copied from the successful current-beta default-input run:

```json
{
  "findPostsBy": "timeline",
  "targets": [
    "NASA"
  ],
  "maxPostsPerTarget": 1
}
```

#### 🧾 Output

**Output shape**

The default dataset has one successful-post shape. The table includes every public field in the dataset schema. Fields Facebook does not expose are omitted from the row. Empty arrays are omitted when no source items are available, while meaningful numeric zero and boolean false values are kept.

The `results` output field is a string link to the default dataset overview. Each item in it is one successful public post row.

**Run output link**

| Field | Type | What it does |
|---|---|---|
| `results` | string | Links to the default dataset overview with saved public post rows. |

| Field | Type | What it does |
|---|---|---|
| matchedInput | string | Shows the submitted target or known post URL that first found this row. |
| profile | object (optional) | Holds the public profile or Page linked to the post. |
| profile.id | string (optional) | Gives the Facebook profile or Page ID when shown. |
| profile.name | string (optional) | Gives the public profile or Page name when shown. |
| profile.url | string (optional) | Gives the public profile or Page URL when shown. |
| profile.pictureUrl | string (optional) | Gives the profile picture URL when shown. |
| postId | string | Gives the stable Facebook ID for the post, reel, video, photo, or story. |
| postUrl | string | Gives the Facebook URL for opening the post. |
| postType | string (optional) | Gives the post kind, such as a photo, video, or reel, when shown. |
| text | string (optional) | Gives the post text or caption when available. |
| transcript | string (optional) | Gives spoken captions or a transcript when available for a video or reel. |
| createdAt | string (optional) | Gives the post time as an ISO timestamp when Facebook shows it. |
| author | object (optional) | Holds public author details for the post. |
| author.id | string (optional) | Gives the Facebook author ID when shown. |
| author.name | string (optional) | Gives the public author name when shown. |
| author.url | string (optional) | Gives the public author URL when shown. |
| author.pictureUrl | string (optional) | Gives the author's profile picture URL when shown. |
| engagement | object (optional) | Holds public comment, reaction, share, and video view counts when shown. |
| engagement.commentCount | integer (optional) | Gives the public comment count when shown. |
| engagement.reactionCount | integer (optional) | Gives the total public reaction count when shown. |
| engagement.shareCount | integer (optional) | Gives the public share count when shown. |
| engagement.viewCount | integer (optional) | Gives the public video or reel view count when shown. |
| reactions | object of integer counts | Gives the count for each reaction type when Facebook shows the breakdown. |
| media | array of objects (optional) | Lists images, thumbnails, and direct video URLs found in the post. |
| media\[].type | string (optional) | Gives the media kind, such as image or video, when known. |
| media\[].url | string | Gives the direct URL for the media item. |
| media\[].thumbnailUrl | string (optional) | Gives the media thumbnail URL when available. |
| media\[].width | integer (optional) | Gives the media width in pixels when known. |
| media\[].height | integer (optional) | Gives the media height in pixels when known. |
| attachments | array of objects (optional) | Lists links and other attachments found with the post. |
| attachments\[].type | string (optional) | Gives the attachment kind when known. |
| attachments\[].url | string (optional) | Gives the attachment URL when available. |
| attachments\[].title | string (optional) | Gives the attachment title when shown. |
| attachments\[].event | object (optional) | Holds public details for an attached Facebook event. |
| attachments\[].event.description | string (optional) | Gives the public event description when shown. |
| externalLinks | array of strings (optional) | Lists non-Facebook links found in the post. |
| textReferences | array of objects (optional) | Lists public profiles, Pages, or links named in the post text. |
| textReferences\[].id | string (optional) | Gives the reference ID when shown. |
| textReferences\[].name | string (optional) | Gives the referenced profile, Page, or link name when shown. |
| textReferences\[].url | string (optional) | Gives the URL for the referenced profile, Page, or link when shown. |
| textReferences\[].verified | boolean (optional) | Says whether Facebook marks the referenced profile or Page as verified. |
| paidPartnership | boolean (optional) | Says whether Facebook marks the post as a paid partnership. |
| adLibraryId | string (optional) | Gives the Facebook Ad Library Page ID when shown for the post or Page. |
| comments | array of objects (optional) | Lists available sample public comments, not a full list. |
| comments\[].text | string (optional) | Gives the public comment text when shown. |
| comments\[].author | object (optional) | Holds public comment author details. |
| comments\[].author.id | string (optional) | Gives the Facebook comment author ID when shown. |
| comments\[].author.name | string (optional) | Gives the public comment author name when shown. |
| comments\[].author.url | string (optional) | Gives the public comment author URL when shown. |
| comments\[].author.pictureUrl | string (optional) | Gives the comment author picture URL when shown. |
| comments\[].createdAt | string (optional) | Gives the comment time as an ISO timestamp when shown. |

**Example Facebook post**

This row is genuine output from the successful current-beta run with the default input. Fields that Facebook did not expose are omitted.

```json
{
  "matchedInput": "NASA",
  "profile": {
    "id": "100044561550831",
    "name": "NASA - National Aeronautics and Space Administration",
    "url": "https://www.facebook.com/NASA/",
    "pictureUrl": "https://scontent.fclo1-3.fna.fbcdn.net/v/t39.30808-1/243095782_416661036495945_3843362260429099279_n.png?stp=cp0_dst-png&cstp=mx800x800&ctp=s50x50&_nc_cat=1&ccb=1-7&_nc_sid=2d3e12&_nc_ohc=nV2Uf3NeHP8Q7kNvwGJMsAy&_nc_oc=AdqYsegRNGzNHYfU4858cJ9xdFWgepfUM7uRfrqViaWYdJ0IM99IDRCjFURofMjEOqc&_nc_zt=24&_nc_ht=scontent.fclo1-3.fna&_nc_gid=t8VvymScUd2J8I_nfNzofA&_nc_ss=70180&oh=00_AQMJcvffeKGaddd5pKWzcFNHQSCMpRfHlpre9sHjk9ihNA&oe=6ADE0255"
  },
  "postId": "1662401645255205",
  "postUrl": "https://www.facebook.com/reel/1863947697952668/",
  "postType": "story",
  "text": "There's a lot of ground to cover when you're building a Moon Base.\n\nDuring the first phase of Moon Base development, robotic rovers will gather new details about the lunar South Pole region, while lunar terrain vehicles will extend the reach of each Artemis mission.  \n\nTake a look at some of the vehicles helping pave the way for an enduring human presence on the Moon: https://go.nasa.gov/47xjWT5",
  "transcript": "Think about hundreds of square miles where we have different assets. Definitely mobility systems. There's a lot of people who spent a lot of time making sure every detail is right and it's really specific to the job it needs to do. VIPER very much acts as a scout for Moon Base. we've already ticked through a couple of important milestones. We've already built three mockups. Actually, two of them within three weeks. This is really about going to stay to learn how to live on the Moon. There are a lot of steps. It has to launch. We have to land. But I'm certainly most interested in seeing the rover explore and understand all the secrets about the South pole of the Moon. Our goal is to enable humans to be operating on the surface of the Moon on a permanent basis.",
  "createdAt": "2026-10-20T15:06:10.000Z",
  "author": {
    "id": "100044561550831",
    "name": "NASA - National Aeronautics and Space Administration",
    "url": "https://www.facebook.com/NASA",
    "pictureUrl": "https://scontent.fclo1-3.fna.fbcdn.net/v/t39.30808-1/243095782_416661036495945_3843362260429099279_n.png?stp=cp0_dst-png&cstp=mx800x800&ctp=s50x50&_nc_cat=1&ccb=1-7&_nc_sid=2d3e12&_nc_ohc=nV2Uf3NeHP8Q7kNvwGJMsAy&_nc_oc=AdqYsegRNGzNHYfU4858cJ9xdFWgepfUM7uRfrqViaWYdJ0IM99IDRCjFURofMjEOqc&_nc_zt=24&_nc_ht=scontent.fclo1-3.fna&_nc_gid=t8VvymScUd2J8I_nfNzofA&_nc_ss=70180&oh=00_AQMJcvffeKGaddd5pKWzcFNHQSCMpRfHlpre9sHjk9ihNA&oe=6ADE0255"
  },
  "engagement": {
    "commentCount": 34,
    "reactionCount": 612,
    "shareCount": 64,
    "viewCount": 8249
  },
  "reactions": {
    "like": 517,
    "love": 75,
    "care": 7,
    "wow": 5,
    "haha": 4,
    "angry": 3,
    "sad": 1
  },
  "media": [
    {
      "type": "image",
      "url": "https://scontent.fclo1-3.fna.fbcdn.net/v/t15.5256-10/857935274_1703618614664971_2123049601516622236_n.jpg?stp=dst-jpg_tt6&cstp=mx405x720&ctp=s405x720&_nc_cat=102&_nc_map=urlgen_bucketless&ccb=1-7&_nc_sid=d2b52d&_nc_ohc=8-UZQqnyY74Q7kNvwHYhvML&_nc_oc=AdrW3S7KauC-FmFVT-QMUiOMXIVN5bDTsXCBmVFffY5eH5krh7FMZY8qUaA9zpj961o&_nc_zt=23&_nc_ht=scontent.fclo1-3.fna&_nc_gid=t8VvymScUd2J8I_nfNzofA&_nc_ss=70180&oh=00_AQPJP4euopzcW_3CB7YQy-cvXCCcxCePfuXCFmAcjM1P7g&oe=6ADDDB36"
    },
    {
      "type": "video",
      "url": "https://video.fclo1-4.fna.fbcdn.net/o1/v/t2/f2/m366/AQPDABB61tywhgHQPIZOAnaWTBKnZUc-7u5xaHF64k_8PaU1n3w99vuSarjngzBP6xj3z0ISexYFcq1kjXzzAcswwbvjkhGDaSLzDmVl8yHBmw.mp4?_nc_cat=100&_nc_oc=AdpBMpVDo6gEsRqCPmeThqyOu8fmJcGQKnZ55BqtsyRavD-Ksmp8lqZ9ggtgsRFZKWY&_nc_sid=5e9851&_nc_ht=video.fclo1-4.fna.fbcdn.net&_nc_ohc=9AROZXEUxFQQ7kNvwGA3dH2&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5GQUNFQk9PSy4uQzMuNzIwLmRhc2hfaDI2NC1iYXNpYy1nZW4yXzcyMHAiLCJ4cHZfYXNzZXRfaWQiOjEwMDE5NjMyNDI5NDc3NzAsImFzc2V0X2FnZV9kYXlzIjowLCJ2aV91c2VjYXNlX2lkIjoxMDEyMiwiZHVyYXRpb25fcyI6NDUsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=98afaa2d29305136&_nc_vs=HBksFQIYRWZiX2VwaGVtZXJhbC9FNkVEQkQ1Mjc5RjY0QzQ2QTc5NTZDQjgyM0Y0MkNEQV9tdF8xX3ZpZGVvX2Rhc2hpbml0Lm1wNBUAAsgBEgAVAhhAZmJfcGVybWFuZW50L0U5QTY2Rjk4QkRBQTQwMjA4QUUyRUNCRDI1NzI3RDQwX2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACb0kuTy99HHAxUCKAJDMywXQEbn752yLQ4YGWRhc2hfaDI2NC1iYXNpYy1nZW4yXzcyMHARAHUCZZSeAQA&_nc_gid=t8VvymScUd2J8I_nfNzofA&_nc_ss=70180&_nc_map=urlgen_bucketless&_nc_zt=28&oh=00_AQMW671qTxASvPlYMMxR1UvBDBoPH82BnAd__dMfdzlnng&oe=6ADDE6A0&bitrate=1380179&tag=dash_h264-basic-gen2_720p"
    },
    {
      "type": "video",
      "url": "https://video.fclo1-3.fna.fbcdn.net/o1/v/t2/f2/m412/AQOMMDE6SI_dJ2CqQ0lkQWbSqM-6XXaj3Jw9YD2F7nMpUmWl-B_3LKf24cpghD25dvdiECUfz6Dp6h35EP8HqReq563bTLQRKOyxImZdyA.mp4?_nc_cat=111&_nc_oc=AdrC81pkAplJTNijX6f15fZo-KtGhTC6wcb1eLqNJU-GUgzjdpKkYusdYRRnr7Mg6Yk&_nc_sid=8bf8fe&_nc_ht=video.fclo1-3.fna.fbcdn.net&_nc_ohc=5RnoxBdKwP4Q7kNvwENEOlm&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5GQUNFQk9PSy4uQzMuMzYwLnN2ZV9zZCIsInhwdl9hc3NldF9pZCI6MTAwMTk2MzI0Mjk0Nzc3MCwiYXNzZXRfYWdlX2RheXMiOjAsInZpX3VzZWNhc2VfaWQiOjEwMTIyLCJkdXJhdGlvbl9zIjo0NSwidXJsZ2VuX3NvdXJjZSI6Ind3dyJ9&ccb=17-1&_nc_gid=t8VvymScUd2J8I_nfNzofA&_nc_ss=70180&_nc_map=urlgen_bucketless&_nc_zt=28&oh=00_AQMMnUk7bniFSwfo7ASyWkAU7zhC_4rLMLo6_mKNEbLYaw&oe=6ADDF68F&bitrate=377488&tag=sve_sd"
    },
    {
      "type": "image",
      "url": "https://scontent.fclo1-3.fna.fbcdn.net/v/t15.5256-10/857935274_1703618614664971_2123049601516622236_n.jpg?stp=dst-jpg_tt6&cstp=mx405x720&ctp=s405x720&_nc_cat=102&_nc_map=urlgen_bucketless&ccb=1-7&_nc_sid=be8305&_nc_ohc=8-UZQqnyY74Q7kNvwHYhvML&_nc_oc=AdrW3S7KauC-FmFVT-QMUiOMXIVN5bDTsXCBmVFffY5eH5krh7FMZY8qUaA9zpj961o&_nc_zt=23&_nc_ht=scontent.fclo1-3.fna&_nc_gid=t8VvymScUd2J8I_nfNzofA&_nc_ss=70180&oh=00_AQPJP4euopzcW_3CB7YQy-cvXCCcxCePfuXCFmAcjM1P7g&oe=6ADDDB36"
    },
    {
      "type": "image",
      "url": "https://scontent.fclo1-3.fna.fbcdn.net/v/t15.5256-10/857935274_1703618614664971_2123049601516622236_n.jpg?stp=dst-jpg_tt6&cstp=mx405x720&ctp=p296x100&_nc_cat=102&_nc_map=urlgen_bucketless&ccb=1-7&_nc_sid=d2b52d&_nc_ohc=8-UZQqnyY74Q7kNvwHYhvML&_nc_oc=AdrW3S7KauC-FmFVT-QMUiOMXIVN5bDTsXCBmVFffY5eH5krh7FMZY8qUaA9zpj961o&_nc_zt=23&_nc_ht=scontent.fclo1-3.fna&_nc_gid=t8VvymScUd2J8I_nfNzofA&_nc_ss=70180&oh=00_AQPJP4euopzcW_3CB7YQy-cvXCCcxCePfuXCFmAcjM1P7g&oe=6ADDDB36"
    },
    {
      "type": "image",
      "url": "https://scontent.fclo1-3.fna.fbcdn.net/v/t39.30808-1/243095782_416661036495945_3843362260429099279_n.png?stp=cp0_dst-png&cstp=mx800x800&ctp=s50x50&_nc_cat=1&ccb=1-7&_nc_sid=2d3e12&_nc_ohc=nV2Uf3NeHP8Q7kNvwGJMsAy&_nc_oc=AdqYsegRNGzNHYfU4858cJ9xdFWgepfUM7uRfrqViaWYdJ0IM99IDRCjFURofMjEOqc&_nc_zt=24&_nc_ht=scontent.fclo1-3.fna&_nc_gid=t8VvymScUd2J8I_nfNzofA&_nc_ss=70180&oh=00_AQMJcvffeKGaddd5pKWzcFNHQSCMpRfHlpre9sHjk9ihNA&oe=6ADE0255"
    },
    {
      "type": "video",
      "url": "https://video-lga3-2.xx.fbcdn.net/o1/v/t2/f2/m366/AQPDABB61tywhgHQPIZOAnaWTBKnZUc-7u5xaHF64k_8PaU1n3w99vuSarjngzBP6xj3z0ISexYFcq1kjXzzAcswwbvjkhGDaSLzDmVl8yHBmw.mp4?_nc_cat=100&_nc_sid=5e9851&_nc_ht=video-lga3-2.xx.fbcdn.net&_nc_ohc=9AROZXEUxFQQ7kNvwGp4cL9&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5GQUNFQk9PSy4uQzMuNzIwLmRhc2hfaDI2NC1iYXNpYy1nZW4yXzcyMHAiLCJ4cHZfYXNzZXRfaWQiOjEwMDE5NjMyNDI5NDc3NzAsImFzc2V0X2FnZV9kYXlzIjowLCJ2aV91c2VjYXNlX2lkIjoxMDEyMiwiZHVyYXRpb25fcyI6NDUsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&vs=98afaa2d29305136&_nc_vs=HBksFQIYRWZiX2VwaGVtZXJhbC9FNkVEQkQ1Mjc5RjY0QzQ2QTc5NTZDQjgyM0Y0MkNEQV9tdF8xX3ZpZGVvX2Rhc2hpbml0Lm1wNBUAAsgBEgAVAhhAZmJfcGVybWFuZW50L0U5QTY2Rjk4QkRBQTQwMjA4QUUyRUNCRDI1NzI3RDQwX2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACb0kuTy99HHAxUCKAJDMywXQEbn752yLQ4YGWRhc2hfaDI2NC1iYXNpYy1nZW4yXzcyMHARAHUCZZSeAQA&_nc_gid=LmQoCTicTxoT0lGN58Sovw&_nc_ss=70289&_nc_zt=28&oh=00_AQOK9vcnCRi8M1Uw9tQoWehRbwdLb1Tp2hQwd_GjArZC8Q&oe=6ADDE6A0&bitrate=1380179&tag=dash_h264-basic-gen2_720p",
      "thumbnailUrl": "https://scontent-lga3-3.xx.fbcdn.net/v/t15.5256-10/857935274_1703618614664971_2123049601516622236_n.jpg?stp=dst-jpg_tt6&cstp=mx405x720&ctp=s405x720&_nc_cat=102&ccb=1-7&_nc_sid=d2b52d&_nc_ohc=8-UZQqnyY74Q7kNvwH6LZkS&_nc_oc=Ado48w9nwjmAYZj6CVuuVLXyNJFvamJSdTbhwq2YWpsLyeXjqC1srNf1ByAM5Chc3pg&_nc_zt=23&_nc_ht=scontent-lga3-3.xx&_nc_gid=LmQoCTicTxoT0lGN58Sovw&_nc_ss=70289&oh=00_AQPk8Rr5OIm_tZt_vHlO-ATGU9T5VchX-rAK78YkWpO-mQ&oe=6ADDDB36",
      "width": 1080,
      "height": 1920
    }
  ],
  "attachments": [
    {
      "type": "Video",
      "url": "https://www.facebook.com/reel/1863947697952668/"
    }
  ],
  "externalLinks": [
    "https://go.nasa.gov/47xjWT5"
  ],
  "textReferences": [
    {
      "id": "NjQyMTgzOTU5MjA4MTA3Omh0dHBzXGEvL2dvLm5hc2EuZ292LzQ3eGpXVDU6OkRlZmF1bHQ6OjoxNjYyNDAxNjQ1MjU1MjA1Og==",
      "url": "https://go.nasa.gov/47xjWT5"
    }
  ],
  "adLibraryId": "54971236771"
}
```

#### 💳 Pricing

**How charges work**

This Actor uses pay-per-event pricing. The buyer-facing event is one public post saved to the dataset. Skipped, private, unavailable, and duplicate posts are not saved as public post rows.

#### 🔌 Integrations

**Connect your results**

Use the Apify API to start runs and read dataset items. Schedule recurring runs, send finished runs to webhooks, or connect the dataset to supported Apify integrations. Export the dataset as JSON, CSV, Excel, XML, RSS, or HTML.

https://www.youtube.com/watch?v=bNACk1_S_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

**Limits and caveats**

This Actor only collects public Facebook data that is visible without a user-provided Facebook account. It does not bypass privacy controls, collect private profile content, scrape groups, scrape Marketplace, or import your Facebook session. Private, unavailable, or unsupported targets are skipped without creating placeholder rows.

Facebook may expose fewer timeline posts than your requested limit for some public profiles or Pages. Date filters apply to the rows that Facebook exposes to the Actor. If a profile has no public posts available, the Actor skips that target and continues with the rest of your input list.

Use the exported data responsibly and follow Facebook's terms, Apify's terms, and applicable privacy, data protection, and platform rules.

#### ❓ FAQ

##### Can I collect posts from profiles and Pages in one run?

Yes. Add multiple profile or Page handles, full URLs, or numeric IDs when you choose **Profile or Page timeline**. To collect direct post links, choose **Known post URLs** and add the URLs you submit.

##### Can I use a direct Facebook post URL without a timeline target?

Yes. Add known public post, reel, photo, video, or supported permalink URLs in **Known post URLs**. Timeline limits and dates do not change those direct URLs.

##### What happens when the same post is found through two inputs?

The Actor saves the first eligible occurrence and ignores later matches for that source post. The row shows the first submitted value that found it; it does not combine later matches into that row.

##### Why did I get fewer posts than my limit?

The limit is a maximum, not a promise. Facebook may expose fewer public posts for a profile or Page, or a date filter may remove posts after they are found.

##### Are comments returned as separate dataset rows?

No. The Actor returns post rows. It can include public comment counts in `engagement` and sample comments in `comments` when Facebook exposes them. These are not a full comment list or separate rows.

##### Can video and reel posts include transcripts?

Yes. The `transcript` field can include spoken captions when Facebook makes them available. Not every video or reel has a transcript.

##### Does the Actor download Facebook media files?

No. It returns media and thumbnail URLs when Facebook exposes them. It does not mirror or download the source files.

##### Can it collect private profiles, groups, or Marketplace content?

No. It collects public posts from profiles, Pages, and supported direct post URLs. Private, friends-only, login-only, deleted, unavailable, group, and Marketplace content is outside its scope.

##### Do I need Facebook cookies, a login, or a Meta API key?

No. The Actor reads public Facebook post data and does not ask for user-provided cookies, login details, or a Meta API key.

### 📝 Changelog

**v1.3** (21-10-2026)

- Added sample public comments when Facebook exposes them.
- Added descriptions for attached Facebook events when available.
- Available video and reel transcripts are now read automatically.
- Fixed `textReferences` to include only profiles, Pages, and links in the post text.

**v1.2** (25-09-2026)

- Added support for Facebook profile ID inputs such as `profile.php?id=...`.
- Unavailable post fields are now left out of saved rows, while real zero and false values stay available.

**v1.1**

- Added optional video transcript enrichment for video and reel posts when Facebook exposes them.
- Added transcript results and a readable table view for researching saved posts.

**v1.0**

- Added the stable public post row format with profile, author, engagement, reactions, media, attachment, link, and reference data.

**v0.1**

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~facebook-user-posts-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Facebook Media Downloader](https://apify.com/maximedupre/facebook-media-downloader): Get direct source-hosted links from known public Facebook videos, reels, and photos.
- [Facebook Page Video Downloader](https://apify.com/maximedupre/facebook-page-video-downloader): Export public Page video metadata and playable URLs from Page video libraries.
- [Facebook Page Transparency Scraper](https://apify.com/maximedupre/facebook-page-transparency-scraper): Add public Page name history, management countries, and ad details to your Page research.
- [Facebook Reviews Scraper](https://apify.com/maximedupre/facebook-reviews-scraper): Read public Page recommendations and reviewer details alongside Page posts.
- [Facebook Business Page Lead Scraper](https://apify.com/maximedupre/facebook-page-lead-scraper): Find public business Pages by keyword before collecting their posts.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `findPostsBy` (type: `string`):

Choose Profile or Page timeline for profile or Page feeds, or Known post URLs for direct public post links. Use one method in each run.

## `targets` (type: `array`):

Enter one or more handles, @handles, full profile or Page URLs, or numeric IDs for profile or Page timelines.

## `maxPostsPerTarget` (type: `integer`):

Optional limit for each profile or Page timeline. Leave it empty to return all available posts until Facebook has no more public posts.

## `startDate` (type: `string`):

For profile or Page timelines, keep posts on or after this date when Facebook shows the publish date. Use YYYY-MM-DD.

## `endDate` (type: `string`):

For profile or Page timelines, keep posts on or before this date when Facebook shows the publish date. Use YYYY-MM-DD.

## `postUrls` (type: `array`):

Enter one or more public Facebook URLs for posts, reels, photos, videos, or supported post permalinks.

## Actor input object example

```json
{
  "findPostsBy": "timeline",
  "targets": [
    "NASA"
  ],
  "maxPostsPerTarget": 1
}
```

# Actor output Schema

## `results` (type: `string`):

Saved rows with post, profile, author, text, engagement, media, and link data.

# 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 = {
    "findPostsBy": "timeline",
    "targets": [
        "NASA"
    ],
    "maxPostsPerTarget": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/facebook-user-posts-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 = {
    "findPostsBy": "timeline",
    "targets": ["NASA"],
    "maxPostsPerTarget": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/facebook-user-posts-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "findPostsBy": "timeline",
  "targets": [
    "NASA"
  ],
  "maxPostsPerTarget": 1
}' |
apify call maximedupre/facebook-user-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/facebook-user-posts-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/BZIYezDzV4jhxE3ph/builds/oOXdJkH3RePawlyXb/openapi.json
