# Facebook Photos Scraper - Dates, Captions & Reactions (`parseforge/facebook-photos-scraper`) Actor

Scrape photos from public Facebook pages and profiles: full-size images, upload dates, captions, reactions by type, comments and shares. Export CSV, Excel, JSON or XML.

- **URL**: https://apify.com/parseforge/facebook-photos-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Social media, Automation, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 facebook photos

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

![ParseForge Banner](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v4.webp)

## 📸 Facebook Photos Scraper

> 🚀 **Export every photo of a public Facebook page in seconds, with the date it was posted and how people reacted.** Paste page links and get full-size image URLs, upload dates, post captions, reactions split into Like, Love, Care, Haha, Wow, Sad and Angry, comments and shares. 6 photos from 3 pages, fully enriched, came back in 12 seconds in our cloud test.

This Actor opens the Photos tab that Facebook shows to anyone who visits a page without logging in and walks through it with Facebook's own pagination, 8 photos per request, as deep as the page goes. In our tests it paged through 1,608 photos of Katz's Delicatessen without a block. Then, for every photo, it opens the photo itself and adds what the grid does not show: the exact upload time, the text of the post, the full reaction breakdown, the comment and share counts, the post link and the album.

Every row has 33 fields: the image (full-size URL, width, height, thumbnail, Facebook's automatic description), the page (name, URL, ID, followers), the uploader, the date and caption, the engagement (total reactions, 7 reaction types, comments, shares) and the links (photo, post, album). Filter by date range on Facebook's side, or switch to the photos a page is tagged in. No login, no cookie, no browser.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Social media managers | Find which photos drove the most reactions, comments and shares |
| Marketing agencies | Benchmark a client's visual content against competitors |
| Brand and UGC teams | Collect photos fans posted and tagged the brand in |
| Researchers and journalists | Archive a page's photos with exact dates and captions |
| Data and AI teams | Build labeled image datasets with alt text and engagement |
| Designers and archivists | Download full-size originals of a page's photo history |

### 📋 What the Facebook Photos Scraper does

1. Accepts Facebook page and profile URLs (`facebook.com/humansofnewyork`, `profile.php?id=...`, `/{id}/photos`), plain usernames or numeric IDs, and single photo links (`facebook.com/NASA/photos/1638200237675346/`, `photo/?fbid=...`).
2. Opens the page's **Photos** tab as a logged-out visitor: photos the page uploaded, or, with **Photo tab** set to tagged, photos other people posted and tagged the page in.
3. Pages through the whole tab using the same query the Facebook website uses when you scroll, 8 photos per request.
4. Applies your date window on Facebook's side, so a run for "last 30 days" never downloads older photos.
5. With **Add date, caption and engagement** on (the default), opens each photo and adds upload time, caption, total reactions and the count per reaction type, comments, shares, post link, post ID, album ID and who uploaded it.
6. Writes one row per photo, deduplicated across pages. Pages Facebook hides from logged-out visitors come back as a free error row that says why.

> 💡 **Why it matters:** the Photos tab is the one place where a page's visual history sits in order, without text posts, links and reels in between. With dates and reaction counts on every photo, it becomes a ready content-performance report: what a brand posted, when, and what the audience loved.

### 🎬 Full Demo (🚧 Coming soon)

### 📊 Output

Each dataset row is one Facebook photo. 33 columns per row.

| Field | Type | Description |
|---|---|---|
| 🖼 `imageUrl` | string | Full-size image URL, the largest Facebook serves |
| 🆔 `photoId` | string | Facebook photo ID |
| 🔗 `url` | string | Link to the photo on Facebook |
| 📄 `pageName` | string | Page or profile the photos were taken from |
| 🌐 `pageUrl` | string | Page URL |
| 🔢 `pageId` | string | Numeric page ID |
| 👥 `pageFollowers` | number | Exact follower count of the page |
| 🗂 `photoSource` | string | `Uploaded by the page`, `Tagged photo` or `Single photo` |
| 👤 `uploadedBy` | string | Account that posted the photo |
| 🔢 `uploaderId` | string | Numeric ID of that account |
| 📅 `createdAt` | string | Upload date and time, ISO 8601 UTC |
| 💬 `caption` | string | Text of the post the photo belongs to |
| 🔤 `altText` | string | Facebook's automatic description of the image |
| ↔️ `width` | number | Width in pixels |
| ↕️ `height` | number | Height in pixels |
| ❤️ `reactionsCount` | number | Total reactions |
| 👍 `likeCount` | number | Like reactions |
| 😍 `loveCount` | number | Love reactions |
| 🤗 `careCount` | number | Care reactions |
| 😆 `hahaCount` | number | Haha reactions |
| 😮 `wowCount` | number | Wow reactions |
| 😢 `sadCount` | number | Sad reactions |
| 😠 `angryCount` | number | Angry reactions |
| 💭 `commentsCount` | number | Comments |
| 🔁 `sharesCount` | number | Shares |
| 📰 `postUrl` | string | Link to the post that contains the photo |
| 🧾 `postId` | string | Post ID |
| 📚 `albumId` | string | Album the photo is stored in |
| ✔️ `detailsStatus` | string | `Complete`, or why the per-photo details could not be read |
| 🔍 `thumbnailUrl` | string | Square thumbnail from the photo grid |
| 📥 `inputUrl` | string | The input this row came from |
| 🕒 `scrapedAt` | string | When the row was collected |
| ❌ `error` | string | Populated only on failed rows |

A photo posted without text shows `Not Disclosed` as its caption. With **Add date, caption and engagement** off, the rows keep the 15 image and page fields and skip the rest.

#### Real sample records

```json
{
  "imageUrl": "https://scontent-arn2-1.xx.fbcdn.net/v/t39.99422-6/821656476_1125871713709126_4518785347627209846_n.png?stp=dst-jpg_tt6&cstp=mx2048x1152&ctp=s2048x1152&...",
  "photoId": "1638200237675346",
  "url": "https://www.facebook.com/photo.php?fbid=1638200237675346&set=pb.100044561550831.-2207520000&type=3",
  "pageName": "NASA - National Aeronautics and Space Administration",
  "pageUrl": "https://www.facebook.com/NASA",
  "pageId": "100044561550831",
  "pageFollowers": 28730402,
  "photoSource": "Uploaded by the page",
  "uploadedBy": "NASA - National Aeronautics and Space Administration",
  "uploaderId": "100044561550831",
  "createdAt": "2026-09-24T22:00:52.000Z",
  "caption": "Welcome to the Artemis Accords, Côte d'Ivoire 🇨🇮\n \nCôte d'Ivoire is the 75th country to sign the Artemis Accords. In doing so, they commit to a common set of principles for a safe, peaceful, and prosperous future in space. https://go.nasa.gov/4hqBFjw",
  "altText": "A graphic featuring the names and flags of the countries which have signed the Artemis Accords. \"ARTEMIS ACCORDS\" is written at the top.",
  "width": 2048,
  "height": 1152,
  "reactionsCount": 2615,
  "likeCount": 1824,
  "loveCount": 719,
  "careCount": 53,
  "hahaCount": 5,
  "wowCount": 6,
  "sadCount": 2,
  "angryCount": 6,
  "commentsCount": 142,
  "sharesCount": 187,
  "postUrl": "https://www.facebook.com/NASA/posts/pfbid06dQ3AbwtMVtGMtsaKjTBYgMpdP4KbXapkTPFCuQwVYLeVoCRSgzd3vnfZzR3nkwAl",
  "postId": "1638200251008678",
  "albumId": "416661013162614",
  "detailsStatus": "Complete",
  "thumbnailUrl": "https://scontent-den2-1.xx.fbcdn.net/v/t39.99422-6/821656476_1125871713709126_4518785347627209846_n.png?stp=c448.0.1152.1152a_dst-jpg_tt6&...",
  "inputUrl": "https://www.facebook.com/NASA",
  "scrapedAt": "2026-09-25T17:13:46.261Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://scontent-fra5-1.xx.fbcdn.net/v/t39.99422-6/823993453_1414568233974985_7401910122299642830_n.png?stp=dst-jpg_tt6&cstp=mx2048x1362&ctp=s2048x1362&...",
  "photoId": "1671104567720300",
  "url": "https://www.facebook.com/photo.php?fbid=1671104567720300&set=pb.100044623170418.-2207520000&type=3",
  "pageName": "National Geographic",
  "pageUrl": "https://www.facebook.com/natgeo",
  "pageId": "100044623170418",
  "pageFollowers": 51308163,
  "photoSource": "Uploaded by the page",
  "uploadedBy": "National Geographic",
  "uploaderId": "100044623170418",
  "createdAt": "2026-09-24T22:00:00.000Z",
  "caption": "The northern lights don’t often reach Nebraska’s skies, but strong geomagnetic storms can bring them into view a few times a year. Near Crawford, their colorful glow illuminated the night behind an abandoned homestead. Also known as aurora borealis, the display begins when ions from the sun collide ...",
  "altText": "May be an image of text",
  "width": 2048,
  "height": 1362,
  "reactionsCount": 2108,
  "likeCount": 1554,
  "loveCount": 489,
  "careCount": 21,
  "hahaCount": 5,
  "wowCount": 37,
  "sadCount": 2,
  "angryCount": 0,
  "commentsCount": 101,
  "sharesCount": 175,
  "postUrl": "https://www.facebook.com/natgeo/posts/pfbid0BKYq7ekFrWDqHXusnm2JJsurWfEt8bBkZANyj4NjaYkuMQ4cz6LtLRWkYDBCLJazl",
  "postId": "1671104587720298",
  "albumId": "528642321966536",
  "detailsStatus": "Complete",
  "thumbnailUrl": "https://scontent-sea5-1.xx.fbcdn.net/v/t39.99422-6/823993453_1414568233974985_7401910122299642830_n.png?stp=c343.0.1362.1362a_dst-jpg_tt6&...",
  "inputUrl": "https://www.facebook.com/natgeo",
  "scrapedAt": "2026-09-25T17:13:48.703Z",
  "error": null
}
```

```json
{
  "imageUrl": "https://scontent-dfw6-1.xx.fbcdn.net/v/t51.82787-15/707963999_18587346640053609_8287696446875301011_n.jpg?stp=dst-jpg_tt6&cstp=mx1253x1302&ctp=s1253x1302&...",
  "photoId": "1460169962819874",
  "url": "https://www.facebook.com/photo.php?fbid=1460169962819874&set=pb.100064806517961.-2207520000&type=3",
  "pageName": "Katz's Delicatessen | New York NY",
  "pageUrl": "https://www.facebook.com/katzsdeli",
  "pageId": "100064806517961",
  "pageFollowers": 941140,
  "photoSource": "Uploaded by the page",
  "uploadedBy": "Katz's Delicatessen",
  "uploaderId": "100064806517961",
  "createdAt": "2026-05-25T12:45:43.000Z",
  "caption": "Wishing a reflective and happy Memorial Day to all!",
  "altText": "No photo description available.",
  "width": 1253,
  "height": 1302,
  "reactionsCount": 988,
  "likeCount": 806,
  "loveCount": 164,
  "careCount": 15,
  "hahaCount": 1,
  "wowCount": 1,
  "sadCount": 0,
  "angryCount": 1,
  "commentsCount": 32,
  "sharesCount": 25,
  "postUrl": "https://www.facebook.com/katzsdeli/posts/pfbid0MRgS4c3nFc8dWqWrijNXBNkix5zNV1AKFwWpnNu3c8cXzFUmZWb1Qk3EkbC5UaAVl",
  "postId": "1460170006153203",
  "albumId": "646659574170921",
  "detailsStatus": "Complete",
  "thumbnailUrl": "https://scontent-lga3-2.xx.fbcdn.net/v/t51.82787-15/707963999_18587346640053609_8287696446875301011_n.jpg?stp=c0.16.1253.1253a_dst-jpg_tt6&...",
  "inputUrl": "https://www.facebook.com/katzsdeli",
  "scrapedAt": "2026-09-25T17:13:51.852Z",
  "error": null
}
```

Image URLs are shortened here with `...`. The dataset holds the complete, working links.

### ✨ Why choose this Actor

- **Upload date on every photo.** The exact time each photo was posted, as an ISO timestamp, so you can sort, chart and filter a page's photo history. Photo grids on Facebook show no dates at all.
- **The caption, not just the image.** The text of the post each photo belongs to, so a photo keeps its context: the story, the announcement, the link.
- **Reactions split by type.** Like, Love, Care, Haha, Wow, Sad and Angry as separate columns, plus totals, comments and shares. In our tests the seven types always add up exactly to the total.
- **Date window applied by Facebook.** "Only photos newer than" and "older than" are sent to Facebook's own query, so a 30-day run reads 30 days of photos, not the whole archive.
- **Uploaded or tagged.** Switch to the photos other people posted and tagged the page in, with the uploader's name and ID on every row. That is the page's user-generated content in one export.
- **Full-size originals.** The largest image Facebook serves (2048 px on the long side for most photos), plus a square thumbnail, width, height and Facebook's automatic image description.
- **Deep pagination.** Uses the same query as the website when you scroll, so it keeps going as long as the page has photos: 1,608 photos from one page in a single test.
- **Pay only for photos.** Pages that do not exist or are hidden from logged-out visitors produce a free error row that says why.
- **No credentials, no browser.** Plain HTTP with automatic IP rotation. You never hand over a Facebook login.

### 📈 How it compares to alternatives

| | This Actor | Typical photo scrapers | Cookie based scrapers | Saving photos by hand |
|---|---|---|---|---|
| Requires your Facebook login | No | No | Yes | Yes |
| Full-size image URL | Yes | Yes | Yes | Yes |
| Upload date | Yes, exact timestamp | Rarely | Varies | Hover on each photo |
| Post caption | Yes | Rarely | Varies | Copy by hand |
| Reactions by type, comments, shares | Yes | No | Varies | Count by hand |
| Date range filter | Yes, on Facebook's side | Rarely | Varies | Scroll and look |
| Tagged photos of a page | Yes | Rarely | Yes | Yes |
| Age-restricted or private pages | Not available, see FAQ | Not available | Yes | Yes, when allowed |
| Account risk | None | None | Your account can be flagged | None |

The Actor sees what a logged-out visitor sees. Public pages and public profiles show their photos; private profiles and age-restricted pages (for example businesses that sell alcohol) do not, and return an error row instead of data. Facebook serves 8 photos per request and the Actor opens one more page per photo for the details, so a full-detail run collects about one photo per second; turn the details off for a much faster image-only export.

### 🚀 How to use

1. Create a free Apify account. New accounts include $5 of free platform credit, which is plenty to try this out: [console.apify.com/sign-up](https://console.apify.com/sign-up?fpr=vmoqkp)
2. Open the Actor and go to the Input tab.
3. Paste Facebook page links into **Facebook page, profile or photo URLs**, or usernames and IDs into **Page usernames or IDs**.
4. Set **Max Items** to the total number of photos you want, and optionally **Max photos per page** to spread it across several pages.
5. Pick the **Photo tab** (uploaded by the page, or photos the page is tagged in) and, if you want, a date window.
6. Leave **Add date, caption and engagement** on for the full row, or turn it off for images only.
7. Click **Start**, then open the **Dataset** tab and download as CSV, Excel, JSON or XML, or pull it from the API.

```json
{
  "startUrls": [{ "url": "https://www.facebook.com/natgeo" }],
  "maxItems": 200,
  "photoType": "photos_by",
  "onlyPhotosNewerThan": "3 months",
  "includeDetails": true
}
```

### 💼 Business use cases

#### Content performance reports

Pull a quarter of a brand's photos and sort by `reactionsCount`, `sharesCount` or `loveCount`. You see which visuals worked, which days they were posted and what the caption said, without clicking through a single photo.

#### Competitive benchmarking

Run the same date window across your page and three competitors. Posting frequency comes from `createdAt`, audience response from the reaction split, and `pageFollowers` lets you normalize engagement by audience size.

#### User-generated content collection

Switch to tagged photos to collect what customers, venues and partners posted about a brand, with the uploader's name, ID and caption. It is a ready shortlist for reposting requests and testimonials.

#### Visual datasets for AI and search

Full-size image URLs with Facebook's automatic alt text, captions and dimensions make a labeled image set for classification, captioning or visual search experiments, with engagement as a quality signal.

### 🔌 Automating Facebook Photos Scraper

- **Make** and **Zapier**: run the Actor every week for a list of pages and push new photos into a content calendar or a sheet.
- **Slack**: post a message when a tracked page publishes a photo that passes a reaction threshold.
- **Airbyte**: sync datasets into Snowflake, BigQuery or Postgres to keep a running history of a page's photos and engagement.
- **GitHub**: schedule runs from Actions and keep versioned snapshots of a page's photo archive.
- **Google Drive**: drop a CSV or Google Sheet into a shared folder after every run.
- **API and webhooks**: every run emits a dataset ID; subscribe to the run succeeded webhook and download the images wherever you need them.

### 🌟 Beyond business use cases

- **Research**: study how organizations use images on Facebook, how posting rhythm changes over time and which visuals draw which reactions.
- **Personal**: back up the full-size photos of a public page you follow, with dates and captions kept alongside.
- **Non-profit**: archive the photo history of community pages and local events before it gets buried.
- **Experimentation**: a clean dataset of images, alt text and reaction counts is a good playground for computer vision and analytics projects.

### 🤖 Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant to get help designing your run:

> I am using the ParseForge Facebook Photos Scraper on Apify. It takes Facebook page or profile URLs, usernames, IDs or single photo links and returns one row per photo with 33 fields, including imageUrl, photoId, url, pageName, pageUrl, pageId, pageFollowers, photoSource, uploadedBy, uploaderId, createdAt, caption, altText, width, height, reactionsCount, likeCount, loveCount, careCount, hahaCount, wowCount, sadCount, angryCount, commentsCount, sharesCount, postUrl, postId and albumId. It can read photos uploaded by a page or photos the page is tagged in, filter by upload date, and only sees what a logged-out visitor sees. Help me design a run to answer this question: \[your question here].

### ❓ Frequently Asked Questions

**🔐 Do I need a Facebook account or cookie?**
No. The Actor reads only what Facebook shows to a logged-out visitor. You never supply credentials, so no account of yours is exposed.

**📚 How many photos can I get from one page?**
As many as the page shows publicly. The Actor follows Facebook's own pagination until the tab ends or your limit is reached. In our tests it collected 1,608 photos from a single restaurant page and 648 from Humans of New York without hitting an end.

**📅 How does the date filter work?**
The window is sent to Facebook's photo query, so only photos inside it are returned and nothing older is downloaded. Use a date (YYYY-MM-DD) or a relative value such as `30 days`, `6 months` or `1 year`.

**🏷 What are tagged photos?**
Photos that other people or pages posted and tagged the page in. Select **Photos the page is tagged in** as the photo tab. The `uploadedBy` and `uploaderId` columns tell you who posted each one.

**💬 Why is the caption "Not Disclosed" for some photos?**
The photo was posted without text, which is common for album uploads and profile or cover photo changes. The Actor never makes a caption up.

**🚫 Why did a page return an error row?**
Either the page does not exist, it is a private profile, or Facebook hides it from visitors who are not logged in, which is typical for age-restricted pages of businesses that sell alcohol. Error rows are never charged.

**⏳ Do the image links expire?**
Yes. Facebook signs its image links and they stop working after a few days. Download the images, or rerun the Actor, when you need fresh links. The `photoId` and `url` columns stay valid.

**⚡ How do I make runs faster?**
Turn off **Add date, caption and engagement**. The Actor then reads only the photo grid, 8 photos per request, and skips the extra visit to each photo.

**🎥 Does it return videos?**
No. The Photos tab lists photos. For videos and reels, see the recommended Actors below.

**🌐 Do I need a proxy?**
Keep the default Apify Proxy. Facebook shows a login wall to an IP after a few dozen page views, so the Actor uses a new IP for every attempt and moves to residential IPs by itself when the default IPs get walled.

**⏱ How fast is it?**
With details on, about one photo per second (60 photos from 3 pages took 66 seconds in our test). Image-only runs read 8 photos per request.

**📥 What export formats are supported?**
CSV, Excel, JSON, XML, plus direct API access and integrations with Make, Zapier, Airbyte, Slack, Google Drive and more.

**⚖️ Is this legal?**
The Actor collects photos and counts that pages publish to everyone. You remain responsible for how you use the data, including copyright on the images, privacy law such as GDPR and CCPA, and Facebook's terms.

### 🔌 Integrate with any app

Every run writes to an Apify dataset reachable through a REST API, so the output drops into whatever you already use. Native integrations cover Make, Zapier, Airbyte, Slack, Google Drive, GitHub, Google Sheets and webhooks, and the API covers everything else.

### 🔗 Recommended Actors

- [Facebook Posts Scraper - 33 Fields, Reaction Split](https://apify.com/parseforge/facebook-posts-scraper) - every post of a page, not only the photos.
- [Facebook Reels Scraper - Exact Views, Likes & Shares](https://apify.com/parseforge/facebook-reels-scraper) - the video side of a page.
- [Facebook Comments Scraper - Replies & Reactions](https://apify.com/parseforge/facebook-comments-scraper) - the comments behind `commentsCount`.
- [Facebook Pages Scraper - 30 Fields, Followers & Info](https://apify.com/parseforge/facebook-pages-scraper) - page profiles and About information.
- [Facebook Groups Scraper - Posts & Member Counts](https://apify.com/parseforge/facebook-groups-scraper) - posts from public groups.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** independent tool, not affiliated with Facebook or Meta; only publicly available data.

# Actor input Schema

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

Links to public Facebook pages or profiles (https://www.facebook.com/humansofnewyork, https://www.facebook.com/profile.php?id=100044623170418) or to single photos (https://www.facebook.com/NASA/photos/1638200237675346/).

## `pageNames` (type: `array`):

Page usernames (the part after facebook.com/) or numeric profile IDs. Use this or the URL list, or both.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

## `maxPhotosPerPage` (type: `integer`):

Stop after this many photos from each page, so several pages share the Max Items budget. Leave empty to take everything each page has.

## `photoType` (type: `string`):

Photos uploaded by the page itself, or photos other people posted and tagged the page in.

## `onlyPhotosNewerThan` (type: `string`):

Keep photos uploaded on or after this date (YYYY-MM-DD) or within a relative window such as 30 days, 6 months or 1 year.

## `onlyPhotosOlderThan` (type: `string`):

Keep photos uploaded on or before this date (YYYY-MM-DD) or before a relative point such as 1 year.

## `includeDetails` (type: `boolean`):

Open each photo to add the upload date, the post caption, total reactions and the count per reaction type, comments, shares, the post link and the album ID. Adds one request per photo. Turn it off for the fastest image-only export.

## `proxyConfiguration` (type: `object`):

Facebook shows a login wall to an IP after a few dozen visits. Apify Proxy rotates the IP for every request and switches to residential IPs automatically if the default ones are walled.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/humansofnewyork"
    },
    {
      "url": "https://www.facebook.com/NASA"
    }
  ],
  "maxItems": 10,
  "photoType": "photos_by",
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Image, page, date, caption and engagement

## `fullData` (type: `string`):

Complete dataset with all 33 fields

# 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/humansofnewyork"
        },
        {
            "url": "https://www.facebook.com/NASA"
        }
    ],
    "maxItems": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/facebook-photos-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 = {
    "startUrls": [
        { "url": "https://www.facebook.com/humansofnewyork" },
        { "url": "https://www.facebook.com/NASA" },
    ],
    "maxItems": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/facebook-photos-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 '{
  "startUrls": [
    {
      "url": "https://www.facebook.com/humansofnewyork"
    },
    {
      "url": "https://www.facebook.com/NASA"
    }
  ],
  "maxItems": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parseforge/facebook-photos-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/facebook-photos-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/BdbSBYToSKLj5oWCY/builds/QT5mGHcgrw4n2hLiD/openapi.json
