Facebook Photos Scraper
Pricing
$19.99/month + usage
Facebook Photos Scraper
Scrape public Facebook images at scale from albums, pages, events, and timelines. Perfect for building datasets, analyzing trends, or backing up visual content. Fast, stable, and metadata-rich output makes it ideal for SEO, research, and automation tools.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
0
Bookmarked
28
Total users
2
Monthly active users
13 days ago
Last modified
Categories
Share
Facebook Photos Scraper — Extract Images, IDs and Captions as JSON
Facebook Photos Scraper extracts public photos from any Facebook profile or page, returning each photo's direct CDN image URL, permalink, real numeric Facebook photo ID, and Facebook's own accessibility caption. It reads public photo galleries only, needs no Facebook login, and returns typed, normalized JSON — no HTML, no selectors, no manual parsing. Point it at a profile or page and you can feed image URLs, IDs, and captions straight into a dataset, a vision pipeline, or an archive without writing a scraper yourself.
What is Facebook Photos Scraper?
Facebook Photos Scraper is an Apify Actor that collects publicly visible photos from Facebook profiles and pages. It does not require a Facebook account, login, or cookies — it reads only the photo gallery a logged-out visitor could already see. Give it one or more profile/page URLs or handles, and it returns each photo's real Facebook photo ID, direct CDN image URL, public permalink, and Facebook's own accessibility caption when one exists.
- Scrape public photo galleries from profiles and Pages, one or many in a single run
- Collect direct
fbcdn.netimage URLs, ready to download or embed - Extract the real numeric Facebook photo ID and permalink for every photo
- Capture Facebook's auto-generated accessibility captions where present,
nullwhen they aren't - Export results as JSON, CSV, or Excel straight from the Apify dataset
What data does Facebook Photos Scraper collect?
Every run returns one row per photo. The fields break down into three groups:
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Photo identifiers | Real Facebook photo ID, the target's base URL, the original input value | id, facebookId, facebookUrl, inputUrl |
| Image & link data | Full-resolution CDN image URL, public photo permalink | image, url |
| Photo metadata | Record type flag, Facebook's accessibility caption, the owning page's numeric ID | dataType, accessibilityCaption, pageAdLibrary |
Need more Facebook data?
Facebook Photos Scraper is purpose-built for photo galleries, so it doesn't touch post text or video. If you also need what a Page is publishing — post copy, reactions, and comment counts — pair it with Facebook Page Posts Scraper, which collects public posts per Page. For creator video content, Facebook Reels Scraper With Creator Insights pulls public Reels alongside per-creator follower counts and view roll-ups.
How does Facebook Photos Scraper differ from the official Facebook API?
Meta's Graph API lets a registered app read Page data, including photos, but only for Pages and assets that app has already been granted access to. Facebook Photos Scraper instead reads the public photo gallery of any profile or Page you point it at, with no app registration step.
| Feature | Facebook Graph API | Facebook Photos Scraper |
|---|---|---|
| Access scope | Limited to Pages/assets the authenticated app has been granted | Any public profile or Page's visible photo gallery |
| Setup | Registered Meta app, permission scopes (e.g. pages_read_engagement), and App Review for most Page-content access | Add a URL or handle and start the run |
| Fetching someone else's public photos | No general endpoint for reading photos from a Page/profile your app doesn't manage | This is exactly what the Actor is built to do |
| Credentials | OAuth access token tied to an approved app | None — no login, no token |
| Output | Graph objects, structured per Meta's schema, for authorized assets only | Stable JSON schema for any public target, same fields every run |
The Graph API is the right choice when you administer the Page yourself and need authenticated access inside your own app. Facebook Photos Scraper is the right choice when you need the public photo gallery of profiles or Pages you do not manage, without an App Review cycle.
Per Meta's Permissions Reference and Pages API docs, checked 2026-07-25.
Why do developers and teams scrape Facebook photos?
For AI engineers and agent builders
Facebook Photos Scraper pairs every image URL (image) with Facebook's own accessibility caption (accessibilityCaption) — real alt-text describing the photo's contents, generated by Facebook rather than a third-party model. That pairing is useful for building small labeled image sets, evaluating vision-language models, or indexing a brand's or creator's visual history into a RAG pipeline where the caption doubles as searchable text. Because every row is keyed by the real facebookId, agents can dedupe and re-check photos across repeated runs without re-parsing anything.
For marketers and brand teams
Marketing teams use the scraper to audit what a Page or profile has actually posted visually — pulling every public photo's image URL and permalink (url) to review creative history, spot outdated brand assets, or compare a competitor's recent photo activity. Because pageAdLibrary.id surfaces the owning Page's numeric ID, results from several Pages can be grouped and compared in one run. This replaces manually scrolling a Page's photo tab, and the output drops straight into a spreadsheet or dashboard for a creative review.
For researchers and archivists
Researchers and archivists use the scraper to preserve a record of what a public profile or Page has shared — capturing the real photo ID, image URL, and permalink (id, image, url) before a photo is deleted or a profile changes. Because only publicly accessible galleries are read, this stays within already-visible public content. The stable JSON schema makes it straightforward to snapshot the same target repeatedly and compare results over time, which matters for tracking how an organization's or public figure's visual presence evolves.
For developers building data products
Developers building image-driven products — a monitoring dashboard, a media catalog, an internal search tool — use Facebook Photos Scraper as the ingestion step: point it at a list of Pages or profiles and get typed JSON back with facebookId, image, url, and accessibilityCaption ready to load into a database or search index. Because it runs on Apify, the Actor can be scheduled on a fixed interval and its dataset pulled afterward, so a product keeps a photo catalog current without maintaining its own scraping or proxy infrastructure.
How to scrape Facebook photos (step by step)
- Open Facebook Photos Scraper on its Apify Store page and click Try for free (or Start, if you already have it saved).
- Add one or more targets to
startUrls— a full profile/page URL or a short handle, one per line. This is the only required input. - Optionally set
maxPhotosto cap how many photos to collect per target (1–10,000, default 20), and adjustproxyConfigurationif you need a specific proxy setup — Apify residential proxy is used by default. - Start the run. The Actor fetches each target's photo ID list, then pulls full photo details in the background.
- Download results as JSON, CSV, or Excel from the run's dataset, or read them via the Apify API.
What to do when Facebook changes its structure
Facebook periodically changes the internal GraphQL document IDs and page markup the scraper depends on. Facebook Photos Scraper is actively maintained against these changes, and the output schema — the same field names and types documented above — stays stable on your end even when the underlying fetch method is updated. No fixed turnaround time is promised for any given break.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array | One public Facebook profile or page per line — a full URL (https://www.facebook.com/NASA) or a short handle (NASA). | ["IamSRK", "https://www.facebook.com/NASA"] |
maxPhotos | No | integer | Upper limit of photos to collect per target (1–10,000). Default 20. | 20 |
proxyConfiguration | No | object | Apify Proxy settings. Residential is recommended for Facebook and used by default. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
Example JSON input
{"startUrls": ["IamSRK","https://www.facebook.com/NASA"],"maxPhotos": 20,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
The most common input mistake is treating maxPhotos as a total across all startUrls — it's a per-target cap, so five targets with maxPhotos: 20 can return up to 100 photos, not 20.
⬆️ Output
Facebook Photos Scraper returns typed, normalized JSON with a stable set of fields — no HTML, no selectors. Results are exportable as JSON, CSV, or Excel from the Apify dataset.
Scraped photo
{"facebookUrl": "https://www.facebook.com/IamSRK","id": "1404942597655241","facebookId": "1404942597655241","image": "https://scontent-iad3-1.xx.fbcdn.net/v/t39.30808-6/589095535_1404942600988574_6104989753335553615_n.jpg?_nc_cat=1&ccb=1-7&oh=00_AfjExe6aLNN7&oe=692CE2D2","url": "https://www.facebook.com/photo.php?fbid=1404942597655241","dataType": "photo","accessibilityCaption": "May be an image of 1 person and text","pageAdLibrary": {"id": "1635855486666999"},"inputUrl": "https://www.facebook.com/IamSRK"}
Every row that's successfully written to the dataset is billed under the row_result pay-per-event: there are no separate uncharged error or accounting rows pushed by the Actor — a target that yields no photos simply contributes no rows.
How many results can you scrape with Facebook Photos Scraper?
maxPhotos caps collection at 1 to 10,000 photos per target, with a default of 20 — there's no separate overall cap across the run, so ten targets at maxPhotos: 500 can return up to 5,000 photos total. Internally, the Actor first collects the target's photo ID list using Facebook's own cursor-based pagination, then fetches full details for those IDs in concurrent batches until it reaches maxPhotos or runs out of IDs to fetch. The real ceiling on any given run is however many public photos Facebook actually serves for that target — a profile or Page with fewer photos than your maxPhotos setting simply returns everything it has.
Integrate Facebook Photos Scraper and automate your workflow
Facebook Photos Scraper works with any language or tool that can send an HTTP request, since it runs as a standard Apify Actor with a REST API and dataset endpoints.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<YOUR_USERNAME>/facebook-photos-scraper").call(run_input={"startUrls": ["IamSRK", "https://www.facebook.com/NASA"],"maxPhotos": 20,})for photo in client.dataset(run["defaultDatasetId"]).iterate_items():print(photo["image"], photo["accessibilityCaption"])
Works in Python, Node.js, Go, Ruby, cURL — any client that can call the Apify API with your token.
MCP for AI agents
Facebook Photos Scraper is reachable through Apify's official MCP server, which exposes Apify Actors as callable tools to any MCP-compatible client (e.g. Claude Desktop, Cursor). Register it with npx @apify/actors-mcp-server, an APIFY_TOKEN environment variable, and either pass --actors <owner>/facebook-photos-scraper or let the agent find it at runtime via the server's built-in search-actors and call-actor tools.
Automation platforms (n8n, Make)
Apify publishes an official Apify node for n8n and an official Apify module for Make. Both let you select "Run Actor and get dataset" (n8n) or the equivalent "Run Actor" action (Make), point it at this Actor's ID, pass the same startUrls/maxPhotos input shown above, and wire the returned dataset items into the rest of your workflow — no custom code required on either platform.
Is it legal to scrape Facebook?
Yes — Facebook Photos Scraper only collects photos, image URLs, and captions that are already publicly visible on a profile or Page's photo gallery; it does not log in, bypass any access wall, or read content restricted to friends or group members. Because the output identifies the target Page or profile (via facebookUrl and pageAdLibrary.id) rather than individual commenters or authors, it generally falls under a Terms-of-Service and public-content framing rather than bulk personal-data processing — though if a target is a personal profile, the photos themselves may depict identifiable people. Consult legal counsel for any commercial use case involving bulk personal data.
Frequently asked questions
Does Facebook Photos Scraper work without a Facebook account?
Yes. It runs as a logged-out visitor would, using no Facebook account, cookies, or password — only a lightweight guest session cookie the Actor primes itself.
How often is the scraped data updated?
Every run fetches live from Facebook at the time it executes; nothing is served from a cache. Run it again whenever you need current results.
What happens if a target has no public photos, or the page has changed?
If a target's photo gallery yields no photo IDs, or Facebook's page structure has changed enough that the Actor can't locate the required GraphQL document ID, that target simply returns zero rows and a warning is logged — it does not stop the rest of the run. Re-running later, or checking that the URL/handle is correct and public, usually resolves it.
Can I scrape private or restricted Facebook content?
No. Only photos visible on a public profile or Page gallery are returned. Private profiles, friends-only photos, and any content behind a login wall are not accessible to this Actor, since it never authenticates as a Facebook user.
How is Facebook Photos Scraper billed?
It uses Apify's pay-per-event pricing: you're billed for each row_result event, which fires once per photo actually written to the dataset. A target that returns no photos doesn't generate a charge for that target.
Does Facebook Photos Scraper work for AI agent workflows and LLM pipelines?
Yes. It's callable as a standard HTTP endpoint from any agent framework, and it's also reachable through Apify's MCP server for MCP-compatible clients. Every response is typed JSON — image, accessibilityCaption, and the rest — with no HTML or parsing step needed before passing it to an LLM.
How does Facebook Photos Scraper handle Facebook's anti-bot system?
It starts on Apify's residential proxies by default, primes a guest datr session cookie before making requests, and automatically retries (up to 3 attempts) and rotates to a fresh residential proxy session whenever Facebook responds with a 403, 429, or 503.
Does Facebook Photos Scraper return data in a format LLMs can use directly?
Yes. Typed, normalized JSON with stable field names — no HTML, no selectors. Pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool.
Can I use Facebook Photos Scraper without managing proxies?
Yes. Apify residential proxy is configured by default, and the Actor handles session rotation and retry logic on blocks automatically — you don't need your own proxy pool to run it.
What happens when Facebook changes its structure or blocks the scraper?
The Actor is maintained against Facebook's changes, and the output schema — field names and types — stays stable on your end even when the underlying fetch method needs an update. No numeric turnaround time is promised.
Your feedback
Found a bug, or a field that doesn't match what Facebook actually returns? We want to know — open an issue on the Actor's Apify Store page or reach out through Apify's support channel. Reports like this are how the scraper stays accurate as Facebook's own structure keeps changing.

