Facebook Page Photos Scraper avatar

Facebook Page Photos Scraper

Pricing

from $1.04 / 1,000 photo extracteds

Go to Apify Store
Facebook Page Photos Scraper

Facebook Page Photos Scraper

Export public Facebook Page photo grids with photo and album IDs, canonical links, CDN image URLs, captions, and media types.

Pricing

from $1.04 / 1,000 photo extracteds

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Export photo records from anonymously visible public Facebook Page photo grids.

The Actor opens each Page's Photos grid in a real browser and saves one typed dataset row per unique photo. Each row can include the Facebook photo ID, album/set ID, canonical photo link, rendered CDN image URL, accessibility caption, media type, Page title, and extraction time.

Use it for public Page monitoring, creative research, media archives, and image-dataset preparation without manually copying links from Facebook.

Scope: public Facebook Pages only. Personal profiles, private or login-only albums, groups, stories, comments, reactions, and image-file downloads are not supported.

What does Facebook Page Photos Scraper do?

  1. Accepts one or more Facebook Page home or /photos URLs.
  2. Normalizes each input to the Page's public Photos grid.
  3. Renders the grid in Chromium.
  4. Scrolls until it reaches your limit or no more photos load.
  5. Extracts photo and album identifiers from canonical Facebook links.
  6. Preserves rendered accessibility captions and CDN image URLs when available.
  7. Deduplicates records by Facebook photo ID.
  8. Saves clean JSON-compatible rows to the default Apify dataset.

It does not log in to Facebook and does not ask users for cookies or passwords.

Who is it for?

  • Social-media monitoring teams can snapshot public brand photo libraries on a schedule.
  • Brand and creative researchers can collect captions, IDs, and image links for comparison.
  • Archivists and journalists can preserve a timestamped index of public Page media.
  • Media-dataset builders can prepare structured manifests before separate, compliant asset processing.
  • Developers and analysts can feed public Page photo metadata into databases, spreadsheets, and alerts.

Choose a general Facebook Pages scraper when you need Page identity, contact, profile, or cover data rather than the Page's photo grid.

Why use this Actor?

  • It targets the photo-grid workflow rather than generic Page profile fields.
  • It works with normal Page URLs; users do not need to find album IDs first.
  • It returns stable Facebook fbid values for deduplication and monitoring.
  • It captures rich image alt captions when Facebook exposes them.
  • It stops predictably on a global record limit and bounded scroll count.
  • It fails visibly on login walls or invalid inputs instead of returning a misleading empty success.
  • It uses the run's default dataset, so every run has isolated results.

What Facebook Page photo data can I extract?

FieldTypeMeaning
pageTitlestringRendered title of the source public Page
pageUrlstringNormalized Facebook Page Photos URL
photoIdstringFacebook fbid for the photo
albumIdstring or nullAlbum/set identifier when the grid exposes one
photoUrlstringCanonical Facebook photo URL
imageUrlstring or nullRendered Facebook CDN image URL
captionstring or nullAccessibility caption/description from the image
mediaTypephoto or videoMedia type detected in the grid item
scrapedAtISO timestampTime the Actor extracted the row

Facebook CDN links are temporary delivery URLs. Store the canonical photoUrl and photoId as durable references; do not assume an imageUrl remains valid forever.

Get started

  1. Open the Actor in Apify Console.
  2. Add one or more public Facebook Page URLs.
  3. Set Maximum photos to a small test value such as 20.
  4. Click Start.
  5. Check the Photos output table.
  6. Export the dataset as JSON, CSV, Excel, XML, or another supported Apify format.
  7. Increase the limit or schedule the Actor only after the Page works anonymously.

The default prefill uses NASA's public Page because it exposes real photo records and descriptive captions without login.

Input parameters

Facebook Page URLs (startUrls)

Required array of public Facebook Page URLs. Both forms below are accepted:

  • https://www.facebook.com/NASA
  • https://www.facebook.com/NASA/photos

The Actor rejects non-Facebook domains, non-HTTPS URLs, Facebook home-page URLs, and direct photo URLs. A URL being syntactically valid does not guarantee Facebook exposes its Photos grid anonymously.

Maximum photos (maxItems)

Maximum unique photo rows across all input Pages.

  • Default: 50
  • Minimum: 1
  • Maximum: 10,000

The limit is global, not per Page. If the first Page fills the limit, later Pages are not opened.

Maximum scrolls per Page (maxScrolls)

Safety limit for incremental grid loading.

  • Default: 30
  • Minimum: 1
  • Maximum: 200

The Actor also stops after three scrolls add no new rendered photo anchors. A higher value permits more loading attempts but can increase runtime.

Example input

{
"startUrls": [
{ "url": "https://www.facebook.com/NASA" }
],
"maxItems": 5,
"maxScrolls": 5
}

This is a real input used during local validation. It returned five unique public photo records from the NASA Page.

Example output

{
"pageTitle": "NASA - National Aeronautics and Space Administration",
"pageUrl": "https://www.facebook.com/NASA/photos",
"photoId": "1585138822981488",
"albumId": "100044561550831",
"photoUrl": "https://www.facebook.com/photo.php?fbid=1585138822981488&set=pb.100044561550831",
"imageUrl": "https://scontent.example.fbcdn.net/v/sample/photo.jpg",
"caption": "The scene is cloaked in a cool, blue haze, decorated with the warm light of galaxies and stars.",
"mediaType": "photo",
"scrapedAt": "2026-07-26T03:50:22.388Z"
}

The example CDN hostname is redacted because CDN URLs are transient. Actual runs contain the current rendered Facebook CDN URL. Null captions or album IDs are normal when Facebook does not expose those fields on a grid card.

How much does it cost to export Facebook Page photos?

The Actor uses pay-per-event pricing: a $0.0035 start fee per valid run plus a charge for each unique photo row saved to the dataset.

Apify plan tierPrice per photo
Free$0.0020016
Bronze$0.0017405
Silver$0.0013576
Gold$0.0010443
Platinum$0.0006962
Diamond$0.00048734

At the Free-tier event price, including the start fee:

  • 20 photos cost about $0.044.
  • 100 photos cost about $0.204.
  • 1,000 photos cost about $2.005.

At the Bronze event price, 1,000 photos cost about $1.744, including the start fee. Apify platform compute may be shown separately according to your Apify plan and the active Store pricing configuration. The Actor never charges twice for the same photoId within one run.

Tips for reliable runs

  • Test a Page with maxItems: 10 before scheduling a larger export.
  • Use the canonical Page URL visible in the browser, not a search-result redirect.
  • Keep maxScrolls near the default unless the logs show the run stopped before your item limit.
  • Treat photoId as the primary deduplication key in downstream systems.
  • Store photoUrl alongside imageUrl, because CDN URLs expire.
  • Schedule moderate snapshots instead of repeatedly scraping the same large grid in short intervals.
  • Inspect a Page anonymously in a private browser window if the Actor reports a login wall.

Limitations and failure behavior

Facebook can change DOM structure, anonymous visibility, rate limits, and regional behavior without notice. The Actor deliberately supports only records visible on the public rendered Page photo grid. It does not bypass privacy controls or login requirements.

A run fails with a clear error when:

  • no start URL is supplied;
  • an input URL is malformed or outside supported Facebook hosts;
  • Facebook returns an HTTP error;
  • the rendered page is a login wall with no photo records;
  • all processed Pages yield zero public photo records.

Some grid tiles may have no accessibility caption. A Page may expose fewer photos anonymously than a logged-in visitor sees. The Actor does not claim complete historical album coverage.

Use Facebook photo data in monitoring workflows

Public brand creative monitor

Run the Actor daily or weekly for selected public brand Pages. Upsert records by photoId, then alert when unseen IDs appear. Use caption and scrapedAt for searchable change reports.

Public-media archive manifest

Export photoId, photoUrl, imageUrl, caption, and scrapedAt to a controlled archive manifest. Apply your own retention, copyright, and privacy policy before storing image files.

Creative research dataset

Combine photo rows from several public Pages. Use captions for text search and canonical links for source attribution. Do not infer endorsement, ownership, or licensing from public visibility.

Integrations

Apify datasets connect to:

  • Google Sheets for analyst review;
  • Make and Zapier for no-code automation;
  • webhooks for run-completion alerts;
  • cloud storage or databases through the Apify API;
  • Python, JavaScript, and command-line data pipelines;
  • Apify Schedules for repeat Page snapshots.

For monitoring, compare the latest dataset to your stored set of photoId values rather than comparing temporary CDN URLs.

Run with the Apify API using cURL

Replace YOUR_TOKEN with an Apify API token.

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~facebook-page-photos-scraper/runs?token=YOUR_TOKEN&waitForFinish=120" \
-H "Content-Type: application/json" \
-d '{
"startUrls": [{"url": "https://www.facebook.com/NASA"}],
"maxItems": 20,
"maxScrolls": 10
}'

Read results from the run's defaultDatasetId after completion. Avoid putting long-lived tokens in shared scripts or logs.

Run with JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/facebook-page-photos-scraper').call({
startUrls: [{ url: 'https://www.facebook.com/NASA' }],
maxItems: 20,
maxScrolls: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Use environment variables or a secrets manager for the token.

Run with Python

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("automation-lab/facebook-page-photos-scraper").call(run_input={
"startUrls": [{"url": "https://www.facebook.com/NASA"}],
"maxItems": 20,
"maxScrolls": 10,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

The Python client can also start asynchronous runs for scheduled processing.

Use with Apify MCP

Add the Actor to Claude Code:

claude mcp add --transport http apify \
"https://mcp.apify.com?tools=automation-lab/facebook-page-photos-scraper"

Claude Desktop, Cursor, and VS Code can use this MCP configuration:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/facebook-page-photos-scraper"
}
}
}

Example prompts:

  • “Export 20 public photos from the NASA Facebook Page and summarize their captions.”
  • “Run the Facebook Page Photos Scraper for these brand Page URLs and return new photo IDs.”
  • “Create a CSV manifest with Page title, canonical photo URL, caption, and scrape time.”

MCP calls use your configured Apify authentication and active Actor pricing.

Responsible use and legality

Scrape only public data you are legally permitted to process. Follow Facebook's terms, applicable copyright rules, privacy laws, database rights, and your organization's retention policy. Do not use this Actor to identify sensitive traits, harass people, evade access controls, or collect private/login-only media.

Public accessibility does not grant a license to republish an image. Keep source links and attribution where required. For regulated or high-risk use cases, obtain legal advice appropriate to your jurisdiction.

Troubleshooting

“No public Page photos were found”

Open the Page URL in a private browser window while logged out. Confirm it is a public Page, has a visible Photos grid, and is not a personal profile or group. Then retry with a small limit.

Facebook showed a login wall

The selected Page or your current region may not expose its grid anonymously. The Actor does not accept user cookies and will not bypass the wall. Try another public Page or retry later if the restriction appears temporary.

The Actor returned fewer rows than maxItems

maxItems is a ceiling, not a guaranteed count. The public grid may be smaller, stop loading, or expose only part of the Page history. Increase maxScrolls gradually if logs indicate the safety limit was reached.

An image URL stopped working

Facebook CDN URLs are temporary. Use photoUrl and photoId as durable references and refresh the public grid when a current delivery URL is needed.

Captions are null

Facebook does not expose accessibility text for every grid tile. The Actor preserves null rather than inventing a description.

These products are complementary. Use this Actor when the required entity is a public Page photo record.

FAQ

Does this Actor need a Facebook account?

No. It is intentionally limited to public Page photo grids visible without login.

Can it scrape personal profile photos?

No. Personal profiles are outside the supported scope even when individual content appears public.

Can it download the original image files?

No. It returns the rendered CDN URL and source metadata; file downloading and rights management belong in a separate controlled workflow.

Can I scrape albums by album ID?

Not in v1. Start from a public Page URL; the Actor extracts album/set IDs when the Page grid exposes them.

Does it return comments, likes, or reactions?

No. The output contract is one record per public Page photo grid item.

Can I schedule recurring exports?

Yes. Use Apify Schedules, then deduplicate downstream by photoId.

Are results guaranteed to be complete?

No. Results reflect what Facebook renders anonymously during that run and may differ by time or region.