# Facebook Timeline Posts & Reel Transcript Extractor (`nimbryxo-studio/facebook-timeline-posts-and-reel-transcript`) Actor

Pull recent posts and Reels from a public Facebook Page or Profile, or fetch one post by its link, with text, reaction breakdown, comments, media, and real auto-generated video captions. No login or cookies required.

- **URL**: https://apify.com/nimbryxo-studio/facebook-timeline-posts-and-reel-transcript.md
- **Developed by:** [Nimbryxo-studio](https://apify.com/nimbryxo-studio) (community)
- **Categories:** Social media, Videos, Automation
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Timeline Posts & Reel Transcript Extractor

Turn any public Facebook Page or Profile into a clean, spreadsheet-ready feed of its posts, or look up individual posts, reels and videos straight from their links. Every record carries the post text, the author, reaction counts split by type, comment and share totals, play counts for videos and reels, photo and video files, link-card details, and, when you ask for them, the full comment threads and Facebook's own reel and video captions. You don't need a Facebook account, cookies or any proxy setup.

### What this actor does

- **Reads whole timelines, not only the first screen.** Collect a few posts or thousands from each Page or Profile, newest first. Narrow them down with a date window, content types (reels, albums, links, shared posts and more), or minimum reactions and comments.
- **Opens almost any Facebook link.** Post, reel, video, watch, photo, `permalink.php`, `story.php`, mobile, public group post and share links (`facebook.com/share/…`, `fb.watch/…`) each return that one post, so a list of links you collected elsewhere can be enriched in one run.
- **Counts and conversations, included.** Video and reel records include the play count Facebook displays plus its two other view metrics; reactions come per type (Like, Love, Care, Haha, Wow, Sad, Angry and seasonal ones) next to the total. Pick the comment order (most relevant, newest or unfiltered) and optionally include each comment's reply thread, with its author, profile picture, time, reaction count and direct link.
- **Keeps the media usable.** Every photo of an album, link-preview cards, the shared post behind a re-share, and permanent copies of images (videos optional), because Facebook's own media links expire after a few days.
- **Empty fields are omitted.** Fields Facebook doesn't show for a post are left out instead of filled with blanks.

### Output per post

| Field | Description |
|---|---|
| `postId` | Facebook's numeric post ID |
| `permalinkUrl` | Direct link to the post, reel or video |
| `postType` | `photo`, `video`, `reel` or `text` (from the first photo/video; link shares and re-shares are `text`) |
| `contentType` | Finer type: `text`, `photo`, `album`, `video`, `reel`, `link`, `share` or `live` |
| `text` | Full post text |
| `hashtags` | Hashtags in the text |
| `mentions` | Tagged people and Pages: `{id, name, url}` |
| `externalLinks` | Links in the text, as their real destination (not a tracking redirect) |
| `creationTime` / `creationTimeIso` | Publication time as a Unix timestamp and as ISO 8601 (UTC) |
| `backdatedTime` / `backdatedTimeIso` / `backdatedTimeGranularity` | The date the author set for a backdated post (for example a life event in 1985) and how precise it is (`DAY`, `MONTH`, `YEAR`) |
| `author` | `{id, name, url, profilePictureUrl, profileUrlIsFallback}`; the flag is `true` only when Facebook gave no profile link and one was built from the numeric ID |
| `collaborators` | Co-authors of a joint post: `{id, name, url}` |
| `attachments` | Photos (`id`, `url`, `width`, `height`, `accessibilityCaption`) and videos (`videoUrlHd`, `videoUrlSd`, `thumbnailUrl`, `durationMs`, `width`, `height`, `isReel`, `isLive`, `captionsAvailable`, plus `videoTranscript`, `videoTranscriptText`, `videoTranscriptLocale` and `videoTranscriptFormat` when transcripts are requested) |
| `albumPhotoCount` | Total photos in an album post |
| `linkPreview` | Link card: `{url, title, description, source, domain, imageUrl}` |
| `sharedPost` | The original post behind a re-share: `{postId, url, author, creationTime, creationTimeIso, text}`, plus `contentType`, `reactionsTotal`, `commentsCount`, `sharesCount` and `viewsCount` with "Original text of shared posts" |
| `reelAudio` / `remix` | Reels with "Reel audio and remix details": `{title, type, id, albumArtUrl, isOriginalAudio}` and `{isRemixable, status}` |
| `musicTitle` | Song used in a reel or video |
| `location` | Place the post was checked in at: `{id, name, url}` |
| `taggedProfiles` | People or Pages tagged with "is with": `{id, name, url}` |
| `reactionsTotal` / `reactionBreakdown` | Total reactions and `[{type, count}]` per reaction type |
| `commentsCount` / `sharesCount` | Totals as shown by Facebook |
| `viewsCount` | Plays shown on the video or reel (the "views" number on Facebook) |
| `videoViewCount` / `videoPostViewCount` | Facebook's two other view metrics for videos and reels |
| `feedbackId` | Facebook's engagement ID for the post, handy for joining with other comment datasets |
| `isAd` | `true` when Facebook marks the post as sponsored |
| `topComments` | Comments shown under the post |
| `allComments` | Full comment list when "Fetch all comments" is on |
| `inputUrl` | The link from your input, normalized |
| `scrapedAt` | When the record was collected (ISO 8601) |
| `recordType` | Always `post` |

**Comment fields** (in `topComments`, `allComments` and `replies`): `commentId`, `commentUrl`, `text`, `author {id, name, url, profilePictureUrl}`, `createdTime`, `createdTimeIso`, `reactionsTotal` (or `reactionsCountText` such as "1.2K" when Facebook only shows a rounded figure), `reactionBreakdown` (per type, exact, with "Reactions by type on comments"), `replyCount`, `depth`, `parentCommentId`, `imageUrl` and `replies`.

**Media copies:** when a file is copied into the run's storage, the field holds the permanent copy and `<field>Original` keeps Facebook's link (for example `url` and `urlOriginal`). Links left on Facebook's servers get `<field>ExpiresAt`, the moment they stop working.

Fields with no value for a given post are left out rather than filled with empty values.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `startUrls` | array | – | **Required.** Page, Profile, post, reel, video, photo, watch or share links, in any mix |
| `maxItems` | integer | `20` | Posts per Page or Profile (1-10,000) |
| `onlyPostsNewerThan` | string | – | Keep timeline posts after a date (`2026-01-01`), ISO timestamp, or period (`7 days`, `3 months`) |
| `onlyPostsOlderThan` | string | – | Keep timeline posts before a date; combine both for a window |
| `contentTypes` | array | all | Keep only `text`, `photo`, `album`, `video`, `reel`, `link`, `share` and/or `live` posts |
| `minReactions` / `minComments` | integer | – | Skip timeline posts below these engagement levels |
| `includeTopComments` | boolean | `true` | Comments shown under each post |
| `fetchAllComments` | boolean | `false` | Full comment lists into `allComments` |
| `maxCommentsPerPost` | integer | `100` | Limit for `allComments` (1-5,000); replies count toward it |
| `commentsSortOrder` | select | `mostRelevant` | `mostRelevant`, `newest` or `all` (unfiltered), in Facebook's own ordering |
| `onlyCommentsNewerThan` | string | – | Keep only comments after a date or period (`1 day`); read newest first |
| `includeCommentReplies` | boolean | `false` | Reply threads inside each comment |
| `includeCommentReactions` | boolean | `false` | Each comment's reactions by type with exact totals |
| `fetchVideoCaptions` | boolean | `false` | Facebook's caption files as transcripts |
| `fetchReelDetails` | boolean | `false` | Reel audio track and remix setting |
| `fetchSharedPostDetails` | boolean | `false` | Text and counters of the original behind each re-share |
| `fetchAllAlbumPhotos` | boolean | `false` | Every photo of album posts (the timeline shows up to five) |
| `rehostMedia` | select | `images` | `images`, `imagesAndVideos` or `none` |

Date, content-type and engagement filters apply to Page and Profile links. A direct post link always returns its post.

#### Example: last 30 days of a brand's reels, with transcripts

```json
{
  "startUrls": [{ "url": "https://www.facebook.com/nike" }],
  "maxItems": 100,
  "onlyPostsNewerThan": "30 days",
  "contentTypes": ["reel"],
  "fetchVideoCaptions": true
}
```

#### Example: a news Page's most discussed posts in a fixed window

```json
{
  "startUrls": [{ "url": "https://www.facebook.com/nytimes" }],
  "maxItems": 50,
  "onlyPostsNewerThan": "2026-09-01",
  "onlyPostsOlderThan": "2026-10-01",
  "minComments": 500
}
```

#### Example: enrich a list of post and reel links with full, newest-first comment threads

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/pepsi/posts/1054998311204476" },
    { "url": "https://www.facebook.com/reel/2995026330636892/" },
    { "url": "https://fb.watch/72TEK5emY-/" }
  ],
  "fetchAllComments": true,
  "commentsSortOrder": "newest",
  "includeCommentReplies": true,
  "maxCommentsPerPost": 500
}
```

#### Example: archive a club's photo albums with permanent image copies

```json
{
  "startUrls": [{ "url": "https://www.facebook.com/fcbarcelona" }],
  "maxItems": 40,
  "contentTypes": ["album", "photo"],
  "fetchAllAlbumPhotos": true,
  "rehostMedia": "images"
}
```

### Use cases

- **Competitor and brand tracking:** chart posting cadence, formats and reactions by type for any set of Pages.
- **Reel and video performance reports:** compare play counts across creators, and read what was said through the caption transcripts.
- **Audience research:** collect entire comment threads, replies included, for sentiment or topic analysis.
- **Newsroom and fact-check work:** freeze a viral post's text, media, counters and discussion at a known moment.
- **Content archiving:** keep album photos and media copies that still open after Facebook's links expire.
- **Lead and partner discovery:** find who comments on, collaborates with, or is re-shared by a Page.

### FAQ

**Do I need a Facebook login, cookies or a proxy?**
No. The actor reads only what Facebook shows to logged-out visitors and picks its connection method automatically. There is nothing to configure.

**How many posts can I get from one Page?**
As many as Facebook publicly lists, up to 10,000 per link per run. Some Pages and personal profiles show only a handful of posts to everyone, logged in or not. In that case the run stops when the timeline ends and the status message says so.

**Why did a link return no post?**
The status message names every link that produced nothing and why: removed or private content (including videos Facebook hides from logged-out visitors), links that aren't posts or Pages (group feeds, events, Marketplace), or a page that Facebook restricts in some countries. Region-restricted pages show "not available in <country>" and are reported as such instead of being retried.

**Are video view counts exact?**
Yes. `viewsCount` is the full integer behind the rounded number Facebook displays (for example 422,708 behind "422K"). Photo, text and link posts have no public view count, so the field is left out for them.

**Is the transcript AI-generated?**
No. It is the caption file Facebook created or the uploader added. Roughly a third of videos have one, in many languages, and English is preferred when available. Videos without captions simply have no transcript.

**Why do some comment reactions read "1.2K"?**
Next to each comment, Facebook only shows a rounded figure for busy comments, and that is what `reactionsCountText` keeps. Turn on "Reactions by type on comments" to get the exact total and the split by reaction type for every comment.

**Do the photo and video links keep working?**
Facebook's media links expire after one to five days. By default every post image (photos, video thumbnails, link pictures and the author's picture) is copied into the run's storage and the copy is what you receive, with Facebook's original kept beside it. Choose `imagesAndVideos` to copy videos too, or `none` to keep only Facebook's links, each with its expiry time. Profile pictures inside comments always stay on Facebook's servers, so download them soon after the run if you need them.

**Can I monitor a Page on a schedule?**
Yes. Schedule the actor with "Only posts newer than" set to the schedule interval (for example `1 day`) to receive only the new posts each time.

**What can't this actor collect?**
These limits come from what Facebook shows to logged-out visitors:

- Some Pages and personal profiles show only a few posts to everyone, logged in or not. The run stops when that public timeline ends.
- Pages restricted in the country of the connection are reported as "not available in <country>".
- Videos hidden from logged-out visitors are reported as unavailable.
- Live viewer counts and a post's edit history aren't shown to logged-out visitors.
- Authors of group posts and some commenters appear with a masked ID and no profile link, because Facebook hides them from the public.
- Some link previews carry no description, because the linked site doesn't provide one.
- Album videos beyond the first five are listed with their ID and thumbnail. Open the video's own link for the playable file.
- Reels come from the Page's timeline, which includes the reels a Page posts; filter them with "Content types: Reel".
- A post that Facebook adds to a timeline after your run, with an earlier timestamp, appears only in the next run. When scheduling, let "Only posts newer than" overlap the previous run a little (for example `2 days` for a daily schedule).
- Facebook shows slightly different posts to different visitors and connections. A run can occasionally omit a post that another visitor sees at the same moment, most often near the top of a timeline; a later run usually returns it. The run stays newest-first and reports exactly what its connection was shown.

**Is this affiliated with Facebook or Meta?**
No. It is an independent tool that reads publicly available Facebook pages. It is not endorsed by or connected to Meta Platforms, Inc.

# Actor input Schema

## `startUrls` (type: `array`):

Mix any public Facebook links. A Page or Profile link (facebook.com/nike, profile.php?id=…, /people/…/…) returns its timeline posts. A post, reel, video, photo, watch, share (facebook.com/share/…, fb.watch/…), permalink.php, story.php or public group post link returns that single post. Group feeds, events, Marketplace and search pages are not supported.

## `maxItems` (type: `integer`):

How many posts to collect from each Page or Profile link, newest first. Posts removed by the filters below don't count. Single post links always return one post.

## `onlyPostsNewerThan` (type: `string`):

Page and Profile links only: keep posts published after this moment. Accepts a date (2026-01-01), a full ISO 8601 timestamp, or a relative period such as "7 days", "2 weeks", "3 months" or "1 year".

## `onlyPostsOlderThan` (type: `string`):

Page and Profile links only: keep posts published before this moment. Same formats as "Only posts newer than". Combine both for a date window.

## `contentTypes` (type: `array`):

Page and Profile links only: keep only these kinds of posts. Leave empty to keep everything. When matching posts are rare, the timeline scan stops after 20 × the post limit (at least 50) scanned posts and the run status says so.

## `minReactions` (type: `integer`):

Page and Profile links only: skip posts with fewer reactions than this.

## `minComments` (type: `integer`):

Page and Profile links only: skip posts with fewer comments than this.

## `includeTopComments` (type: `boolean`):

Attach the comments Facebook shows under each post (about 1-10 per post) at no extra cost.

## `fetchAllComments` (type: `boolean`):

Collect the full comment list of every post into allComments, up to the limit below. Adds a few requests per post.

## `maxCommentsPerPost` (type: `integer`):

Upper limit for allComments on each post. Replies count toward this limit when replies are included.

## `commentsSortOrder` (type: `string`):

Order in which allComments are collected. "Newest first" is the best choice for monitoring recent discussion.

## `onlyCommentsNewerThan` (type: `string`):

Keep only comments posted after this moment in allComments: a date (2026-01-01), ISO timestamp, or period such as "1 day" or "2 weeks". Comments are then read newest first.

## `includeCommentReplies` (type: `boolean`):

Add each comment's reply thread (including replies to replies) as a replies list inside the comment.

## `includeCommentReactions` (type: `boolean`):

Add each comment's reactions split by type (Like, Love, Haha, …) with exact totals, also for busy comments Facebook shows as "1.2K". Adds one request per comment that has reactions.

## `fetchVideoCaptions` (type: `boolean`):

For videos and reels that have captions, download Facebook's own caption file and add it as a transcript (SRT text plus plain text). These are Facebook's captions, not independent speech-to-text.

## `fetchReelDetails` (type: `boolean`):

For reels, add the audio track (title, original audio or song, album art) and whether the reel can be remixed. Adds one request per reel.

## `fetchSharedPostDetails` (type: `boolean`):

For posts that re-share another post, add the original post's text, type and counters to sharedPost. Adds one request per shared post.

## `fetchAllAlbumPhotos` (type: `boolean`):

The timeline shows at most five photos of an album post. Turn this on to list every photo of the album.

## `rehostMedia` (type: `string`):

Facebook's media links stop working after a few days. Copies are stored with this run and keep working; the original link stays in the matching …Original field.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/nike"
    },
    {
      "url": "https://www.facebook.com/reel/2995026330636892/"
    }
  ],
  "maxItems": 1,
  "contentTypes": [],
  "includeTopComments": true,
  "fetchAllComments": false,
  "maxCommentsPerPost": 100,
  "commentsSortOrder": "mostRelevant",
  "includeCommentReplies": false,
  "includeCommentReactions": false,
  "fetchVideoCaptions": false,
  "fetchReelDetails": false,
  "fetchSharedPostDetails": false,
  "fetchAllAlbumPhotos": false,
  "rehostMedia": "none"
}
```

# Actor output Schema

## `posts` (type: `string`):

Dataset containing all scraped Facebook posts.

# 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 = {
    "startUrls": [
        {
            "url": "https://www.facebook.com/pepsi/posts/1054998311204476"
        }
    ],
    "maxItems": 1,
    "includeTopComments": false,
    "fetchAllComments": false,
    "includeCommentReplies": false,
    "includeCommentReactions": false,
    "fetchVideoCaptions": false,
    "fetchReelDetails": false,
    "fetchSharedPostDetails": false,
    "fetchAllAlbumPhotos": false,
    "rehostMedia": "none"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nimbryxo-studio/facebook-timeline-posts-and-reel-transcript").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 = {
    "startUrls": [{ "url": "https://www.facebook.com/pepsi/posts/1054998311204476" }],
    "maxItems": 1,
    "includeTopComments": False,
    "fetchAllComments": False,
    "includeCommentReplies": False,
    "includeCommentReactions": False,
    "fetchVideoCaptions": False,
    "fetchReelDetails": False,
    "fetchSharedPostDetails": False,
    "fetchAllAlbumPhotos": False,
    "rehostMedia": "none",
}

# Run the Actor and wait for it to finish
run = client.actor("nimbryxo-studio/facebook-timeline-posts-and-reel-transcript").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 '{
  "startUrls": [
    {
      "url": "https://www.facebook.com/pepsi/posts/1054998311204476"
    }
  ],
  "maxItems": 1,
  "includeTopComments": false,
  "fetchAllComments": false,
  "includeCommentReplies": false,
  "includeCommentReactions": false,
  "fetchVideoCaptions": false,
  "fetchReelDetails": false,
  "fetchSharedPostDetails": false,
  "fetchAllAlbumPhotos": false,
  "rehostMedia": "none"
}' |
apify call nimbryxo-studio/facebook-timeline-posts-and-reel-transcript --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nimbryxo-studio/facebook-timeline-posts-and-reel-transcript"
        }
    }
}
```

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/xDhqAyk88by2eLk0v/builds/2UujWfpn7EOKxWDbO/openapi.json
