# Facebook Page Photos Scraper – Image Data Export (`scrapingmonkey/facebook-page-photos-scraper`) Actor

Collect public Facebook Page photos with pagination. Export photo and image URLs, dimensions, accessibility text, publication times, owners, and source Page details in one row per photo.

- **URL**: https://apify.com/scrapingmonkey/facebook-page-photos-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

Collect the public photos visible on a Facebook Page and keep each image linked to its source. **Facebook Page Photos Scraper** accepts Page usernames or URLs and returns photo links, image URLs, dimensions, accessibility text, publication time, and owner details.

Use it to discover a Page's visual content before selecting individual photos for deeper analysis. Choose how many result pages to request, then export one photo per row to JSON, CSV, or Excel. No Facebook login or cookies are required.

| At a glance | Details |
|---|---|
| 📥 Input | Facebook Page usernames or Page URLs |
| 📤 Output | Photo, image, owner, and source Page fields |
| 📄 Pagination | 1–100 pages per Page; default `1` |
| 🔐 Login required | No |
| 💾 Delivery | One table, one row per returned photo |

### What the Facebook Page photos scraper collects 📸

The Actor collects photos from the Page's publicly available photo collection. Each result includes the Facebook photo URL and the direct image and thumbnail URLs supplied by Facebook, along with width, height, alternative text, and publication time when available.

Owner fields identify the account attached to the photo. Separate source Page fields retain the Page you queried, which is useful when combining several Pages in one dataset. For captions, reactions, tags, album identifiers, and related post details, follow selected photo URLs with Photo Details Scraper.

### How to scrape photos from Facebook Pages 🚀

1. Add Page usernames or URLs to `inputList`.
2. Set `pagesPerProfile` to the number of photo pages to attempt.
3. Run the Actor and review the returned photo rows.
4. Export the dataset or pass selected photo URLs to another workflow.

```json
{
  "inputList": ["Meta", "https://www.facebook.com/NASA/"],
  "pagesPerProfile": 2
}
```

The page setting limits requests, not the exact number of photos returned.

### Page photo data fields and output 📦

| Field group | Included data |
|---|---|
| Result and identity | Original input, status, photo ID, Facebook URL, type |
| Image | Image and thumbnail URLs, alternative text, dimensions |
| Publication | Unix timestamp and UTC publication time |
| Owner | IDs, username, name, URL, profile picture, verification flag |
| Source Page | Queried Page's identity, URL, picture, and verification flag |

Complete illustrative success row. Harbor Workshop and the media URLs below are examples, not a live run.

```json
{
  "input": "harborworkshop",
  "status": "success",
  "id": "123456789012346",
  "url": "https://www.facebook.com/photo/?fbid=123456789012346",
  "type": "photo",
  "image_url": "https://example.com/media/workshop-open-day.jpg",
  "thumbnail_url": "https://example.com/media/workshop-open-day-thumb.jpg",
  "alt_text": "Visitors making a wooden stool at the workshop open day.",
  "width": 1200,
  "height": 800,
  "timestamp": 1788256800,
  "published_at": "2026-09-01T10:00:00Z",
  "owner.id": "100012345678901",
  "owner.page_id": "100012345678901",
  "owner.username": "harborworkshop",
  "owner.name": "Harbor Workshop",
  "owner.url": "https://www.facebook.com/harborworkshop/",
  "owner.profile_picture_url": "https://example.com/media/harbor-workshop.jpg",
  "owner.is_verified": false,
  "source_profile.id": "100012345678901",
  "source_profile.page_id": "100012345678901",
  "source_profile.username": "harborworkshop",
  "source_profile.name": "Harbor Workshop",
  "source_profile.url": "https://www.facebook.com/harborworkshop/",
  "source_profile.profile_picture_url": "https://example.com/media/harbor-workshop.jpg",
  "source_profile.is_verified": false
}
```

There is one output table, and JSON uses the same flat column names, including `owner.name` and `source_profile.name`. Missing values can be empty strings, `0`, `false`, or `null`, depending on the field. A failed row preserves `input`, sets `status` to `failed`, and makes all photo-data columns null.

### Input requirements and coverage ⚙️

| Parameter | Type | Required | Default | Rules |
|---|---|---|---|---|
| `inputList` | Array of strings | Yes | None | At least one Page username or Page URL |
| `pagesPerProfile` | Integer | No | `1` | From `1` to `100` |

Use a plain Page username without `@`, a Page URL, or a numeric Page ID. URLs using `profile.php?id=...` and older `/pages/NAME/ID` forms are recognized when they contain a valid numeric ID. Individual post, photo, Reel, group, and event links are not Page inputs.

The initial response counts as page 1. Later requests ask for up to 8 photos each and continue while Facebook supplies a usable next page. Duplicate photo IDs are removed within each Page's collection. Not every photo on a Page is necessarily publicly accessible.

### Facebook Page photo use cases 🎯

#### Visual content inventories

Build an index of photo IDs, URLs, dimensions, and publication dates for a set of public Pages.

#### Creative research

Compare visible image formats and accessibility descriptions across campaigns or organizations, then select relevant photos for closer review.

#### Photo enrichment pipelines

Discover photo URLs in bulk and send a subset to Photo Details Scraper for captions, engagement, and tags.

#### Recurring content reports

Schedule repeat runs and compare stable photo IDs to identify newly returned material in your own reporting system.

### Pricing and billable photo rows 💰

Check the Actor's **Pricing** tab for the current model and rate. Under dataset-item pricing, each saved success or failed row can be billable. Each returned photo is one success row; owner and source Page fields do not create extra rows.

Invalid inputs, unavailable Pages, an initial response with no photos, or a page that fails after retries can produce a failed row. Retry attempts do not independently add rows. More requested pages can produce more saved results.

### Facebook Page photos API and integrations 🔌

Replace `$ACTOR_ID` with the ID from the Actor's API tab and `$APIFY_TOKEN` with your Apify token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["Meta"],"pagesPerProfile":2}'
```

Use Apify schedules for recurring discovery, webhooks for completion notifications, and integrations for Google Sheets, Make, Zapier, cloud storage, or your own application.

### Reliability and limits ⚠️

Temporary request failures are retried. Photos already saved remain available if a later page fails. Public coverage can vary by Page, region, age restrictions, or Facebook's access requirements.

The Actor returns media URLs; it does not download image files. These URLs can expire. Missing timestamps or dimensions do not establish that a photo has no publication date or size.

### Frequently asked questions ❓

#### Does it download every image?

It returns image URLs and metadata. Downloading files is a separate step in your authorized workflow.

#### Can I choose an exact photo count?

You choose pages. The unique photo count depends on Facebook's response and where pagination ends.

#### Does it include captions and reactions?

This Actor focuses on image and owner metadata. Use Photo Details Scraper for captions, reactions, tags, and associated post data.

#### Why can owner and source Page fields differ?

The owner belongs to the photo; the source Page is the Page whose collection you requested. Both are retained for context.

#### Why can a public Page return a failed row?

Its photo collection may be empty, restricted, or inaccessible without login. Check the run log and test a currently accessible public Page.

### Support, responsible use, and related actors 🛟

For support, share the run ID, a safe public Page input, the page setting, and your expected result. Keep credentials private.

Collect public data lawfully, respecting privacy, copyright, and applicable platform terms.

# Actor input Schema

## `inputList` (type: `array`):

Add one Facebook Page username or full Page URL per item. Every input produces success or failed output.

## `pagesPerProfile` (type: `integer`):

Maximum number of result pages to request for each input.

## Actor input object example

```json
{
  "inputList": [
    "Meta"
  ],
  "pagesPerProfile": 1
}
```

# Actor output Schema

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

Actor dataset results with input and status columns.

# 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 = {
    "inputList": [
        "Meta"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/facebook-page-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 = { "inputList": ["Meta"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/facebook-page-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 '{
  "inputList": [
    "Meta"
  ]
}' |
apify call scrapingmonkey/facebook-page-photos-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapingmonkey/facebook-page-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/dQKeNC7oWMyCiqL8Y/builds/6iY0lscDDpwcsrWth/openapi.json
