Facebook Photos Scraper & High-Res Photo Export
Pricing
$19.99/month + usage
Facebook Photos Scraper & High-Res Photo Export
πΈ Facebook Photos Scraper & High-Res Photo Export pulls public photos, albums, captions, timestamps & URLs from Pages, Groups, or profiles you manage. β‘ Fast, reliable, CSV/JSON-ready data for research, UGC tracking, and content audits. β Respects privacy & platform terms.
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
Scraply
Maintained by CommunityActor stats
0
Bookmarked
12
Total users
0
Monthly active users
5 days ago
Last modified
Categories
Share
Facebook Photos Scraper β High-Res Images, Dimensions & Download Links
Facebook Photos Scraper & High-Res Photo Export resolves every resolution variant Facebook serves for a public profile or Page photo β thumbnail, medium, full-size β with real width, height, format, and aspectRatio, plus Facebook's own accessibilityCaption. It reads Facebook's photo-viewer response directly, so image and variants[] carry the largest rendition actually present, not a fixed feed thumbnail. Media archivists, brand-monitoring agencies, and visual researchers use it to pull bulk photo metadata, and optionally download the full-resolution asset, without a Facebook login.
What is Facebook Photos Scraper & High-Res Photo Export?
Facebook Photos Scraper & High-Res Photo Export is an Apify Actor that takes a list of public Facebook profile or Page handles/URLs and returns one structured JSON record per photo, each carrying every resolution variant Facebook's photo viewer serves plus real pixel dimensions and accessibility text. It runs against publicly available photos only β it does not log in, does not use a Facebook API token, and does not access private albums.
- Discovers photos by profile or Page handle/URL (
imageSources) β no category or search-query mode - Resolves every
fbcdnimage URI Facebook returns per photo and labels each by real pixel area (full/medium/thumbnail) - Reports real
width,height,format, andaspectRatiofor the primary asset and every variant β never a guessed size - Returns Facebook's own auto alt-text (
accessibilityCaption),nullwhen Facebook doesn't supply one - Optionally downloads the full-resolution image straight into the run's key-value store (
downloadImages) - Exports through Apify's standard dataset formats β JSON, CSV, Excel, or via API
What data can I extract with Facebook Photos Scraper & High-Res Photo Export?
Each dataset row is one photo and covers identity, media, and provenance data:
| Field | Example Value | Use Case |
|---|---|---|
photoId | "1404942597655241" | Real numeric photo id for deduping and joins |
id | "1404942597655241" | Duplicate of photoId (base-schema compatibility) |
facebookId | "1404942597655241" | The photo's own id as returned by Facebook |
ownerId | "100044334455667" | Real numeric owner/Page id, null if not resolvable |
dataType | "photo" | Row-type flag for mixed-schema pipelines |
image | "https://scontent.xx.fbcdn.net/.../full.jpg" | Direct link to the largest resolved variant |
width | 1440 | Pixel width of the primary asset |
height | 1800 | Pixel height of the primary asset |
format | "jpeg" | File type parsed from the CDN URL |
aspectRatio | 0.8 | Width Γ· height, pre-computed |
variants | [{ "uri": "...", "width": 1440, "height": 1800, "format": "jpeg", "aspectRatio": 0.8, "resolution": "full" }, β¦] | Every resolution tier kept after the imageResolutions filter |
variantCount | 3 | Number of variants kept for this row |
accessibilityCaption | "May be an image of 1 person and outdoors" | Facebook's auto alt-text for accessibility/indexing use |
downloaded | true | Whether the full-res asset was saved to the key-value store |
storedImageKey | "photo_1404942597655241.jpg" | Key-value store key when downloadImages is on |
url | "https://www.facebook.com/photo.php?fbid=1404942597655241" | Permalink to the photo on Facebook |
facebookUrl | "https://www.facebook.com/IamSRK" | Source profile/Page URL |
pageAdLibrary | { "id": "100044334455667" } | Owner id repeated inside a nested object (present in the raw row, not in the default dataset view) |
inputUrl | "https://www.facebook.com/IamSRK" | The normalized source URL this row came from |
scrapedAt | "2026-07-25T00:00:00Z" | UTC timestamp the row was collected |
Resolution and dimension data
The headline data is the variants[] array: every distinct fbcdn image URI found in Facebook's photo-viewer response, each with real width, height, format, and aspectRatio, ranked by pixel area and labeled full, medium, or thumbnail. image/width/height/format/aspectRatio at the row's top level always mirror the largest variant found, so you can filter or sort a whole dataset by resolution without touching the nested array. variantCount tells you how many tiers survived the imageResolutions filter. A media archive team, for example, can keep only rows where width exceeds a minimum threshold before queuing a download.
Targeting and source data
imageSources-derived fields β facebookUrl, inputUrl, and ownerId β identify which profile or Page a row came from, so multi-source runs can be split back out per target after the fact. scrapedAt timestamps each row for freshness checks across repeated runs. There is no location, category, or date-range filter in this schema β targeting happens entirely at the source level (which handles you list) and the resolution/volume controls covered below.
Why not build this yourself?
Meta's Graph API only exposes a Page's own photos to that Page's own access token β there is no endpoint for pulling an arbitrary public profile or Page's photo feed as a third party, which is the whole point of this Actor. Building it yourself means solving three moving problems Facebook doesn't document: the GraphQL doc_id values behind the photo-viewer and pagination queries aren't published and have to be pulled either from the page's inline HTML or by scanning its JS bundles (this Actor scans up to the first 10 composite bundles as a fallback); the media-viewer request itself needs a large, exact set of Relay variables (feedLocation: COMET_MEDIA_VIEWER, renderLocation: comet_media_viewer, nodeID, and a dozen internal flags) that change with Facebook's frontend releases; and logged-out requests get 403/429/503'd, which this Actor handles with a guest-cookie warm-up and a residential-proxy escalation ladder that rotates to a fresh IP on each block (up to 5 rotations).
If you already have Page-admin access and only need that one Page's own photos, the Graph API's /photos edge is the simpler, officially supported path. If you need photos from profiles or Pages you don't administer, or from many sources in one run, that's what this Actor is for.
How to use data extracted from Facebook?
Content archival and media research
Archivists and researchers feed a list of profile/Page handles into imageSources, set maxImages for the sample size they need, and leave imageResolutions on all to capture every rendition Facebook serves. With downloadImages enabled, each full-resolution asset lands in the run's key-value store under storedImageKey, while the dataset row keeps width, height, format, and accessibilityCaption as searchable metadata alongside it β giving a research team a structured, timestamped record of what a public account posted and when it was captured.
Brand monitoring agencies
Agencies tracking a client's or competitor's Facebook presence run the Actor against a fixed list of Page URLs on a schedule, filtering to imageResolutions: "full" to keep only publish-ready assets. Comparing variantCount and width/height across runs flags when a Page starts posting lower-quality or resized images, and accessibilityCaption gives a fast way to audit whether new creative matches expected subject matter without opening every photo manually.
Market research and intelligence
Analysts pull photo sets from multiple Pages in one run and aggregate width, height, and aspectRatio to understand how a category of accounts formats its visual content β square versus portrait posts, typical resolution tiers, and how many distinct variants Facebook serves per photo. ownerId and facebookUrl keep results attributable back to the source Page across a bulk sample.
AI agents and automated pipelines
Agent frameworks call the Actor as a tool to pull image URLs, accessibilityCaption, and dimension fields as structured input for vision-model pipelines or RAG systems that need grounded photo metadata rather than scraped screenshots.
πΌ Input sample
All five inputs are optional β the Actor runs with just its prefilled defaults (imageSources: ["IamSRK"], maxImages: 10, imageResolutions: "all").
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
imageSources | No | array (string list) | Public Facebook profile or Page references, one per line β full URLs or short handles. Legacy startUrls also works. | ["IamSRK", "https://www.facebook.com/natgeo"] |
maxImages | No | integer | Max photos to resolve per source (1β10,000). Default 10. | 25 |
imageResolutions | No | string (enum: all, full, medium, thumbnail) | Which resolution variants to keep in variants[]. Default "all". | "full" |
downloadImages | No | boolean | Download the full-res image into the run's key-value store. Default false. | true |
proxyConfiguration | No | object | Apify Proxy config; Residential recommended for logged-out coverage. | { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] } |
{"imageSources": ["IamSRK", "https://www.facebook.com/natgeo"],"maxImages": 25,"imageResolutions": "all","downloadImages": true,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Common pitfall: don't put a single-photo permalink (like a photo.php?fbid=... link) into imageSources. Each entry is treated as a profile or Page and the Actor appends /photos to build that account's photo-feed URL β a link to one specific photo won't scope the run to just that photo. Use the profile or Page's root URL or handle instead.
π½ Output sample
Output is typed, normalized JSON β one record per photo, exported through Apify's standard dataset formats (JSON, CSV, Excel, or via the API).
{"photoId": "1404942597655241","id": "1404942597655241","facebookId": "1404942597655241","ownerId": "100044334455667","dataType": "photo","image": "https://scontent.xx.fbcdn.net/v/t39.30808-6/589095535_full.jpg","width": 1440,"height": 1800,"format": "jpeg","aspectRatio": 0.8,"variants": [{ "uri": "https://scontent.xx.fbcdn.net/.../full.jpg", "width": 1440, "height": 1800, "format": "jpeg", "aspectRatio": 0.8, "resolution": "full" },{ "uri": "https://scontent.xx.fbcdn.net/.../med.jpg", "width": 720, "height": 900, "format": "jpeg", "aspectRatio": 0.8, "resolution": "medium" },{ "uri": "https://scontent.xx.fbcdn.net/.../thumb.jpg", "width": 320, "height": 400, "format": "jpeg", "aspectRatio": 0.8, "resolution": "thumbnail" }],"variantCount": 3,"accessibilityCaption": "May be an image of 1 person and outdoors","downloaded": true,"storedImageKey": "photo_1404942597655241.jpg","url": "https://www.facebook.com/photo.php?fbid=1404942597655241","facebookUrl": "https://www.facebook.com/IamSRK","pageAdLibrary": { "id": "100044334455667" },"inputUrl": "https://www.facebook.com/IamSRK","scrapedAt": "2026-07-25T00:00:00Z"}
Fields Facebook doesn't return for a given photo are emitted as null (or "" for image when no variant could be parsed at all) β a row is never dropped just because a value is missing.
How do you filter and target specific photos?
This Actor has two real targeting axes rather than a full directory-style filter set: which sources to pull from (imageSources) and which resolution tier to keep (imageResolutions), plus a volume cap (maxImages) and a persistence switch (downloadImages). There's no location, category, or date filter in this schema β Facebook's photo viewer doesn't expose one, and this Actor doesn't fabricate one.
Use imageResolutions: "full" when you only want publish-ready assets and don't need the smaller renditions β this also keeps variants[] to a single entry per row, so datasets stay compact at scale. Use "thumbnail" for fast, low-bandwidth previews when you're indexing many sources and only need to confirm a photo exists. Leave it on "all" (the default) when you need the full resolution ladder for comparison or archival. Combine the resolution filter with downloadImages only when you actually need the binary asset β leaving it off still gives you a direct CDN link in image.
{ "imageSources": ["natgeo", "https://www.facebook.com/nasa"], "maxImages": 100, "imageResolutions": "full", "downloadImages": false }
{ "imageSources": ["natgeo", "nasa", "nationalgeographic"], "maxImages": 15, "imageResolutions": "thumbnail", "downloadImages": false }
{ "imageSources": ["IamSRK"], "maxImages": 30, "imageResolutions": "all", "downloadImages": true, "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] } }
βΆοΈ Want to try other Facebook scrapers?
| Scraper Name | What it extracts |
|---|---|
| Facebook Page Posts & Comments Scraper | Page posts and their comment threads |
| Facebook Groups Search Scraper With Group Profile Details | Group search results with profile-level group details |
| Facebook Marketplace : Listing Location Details Scraper | Marketplace listings with location details |
| Facebook Ads Library Scraper: Creative & Ad Text Details | Ad Library creatives and ad text |
| Instagram Single Reels Scraper | Single Instagram Reel media and metadata |
| Pinterest Pins Videos Search Scraper | Pinterest pins and videos by search |
How to extract Facebook data programmatically
This Actor runs as a standard Apify Actor: one REST call to start a run with your input JSON, authenticated with your Apify API token, and structured JSON results back from the dataset.
Python example
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("SimpleAPI/facebook-photos-scraper-high-res-photo-export").call(run_input={"imageSources": ["natgeo"],"maxImages": 50,"imageResolutions": "full","downloadImages": False,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["image"], item["width"], item["height"])
MCP for AI agents
The Actor is reachable through Apify's Actors MCP Server, which exposes any public Actor as a callable tool by its Actor ID:
npx -y @apify/actors-mcp-server --actors SimpleAPI/facebook-photos-scraper-high-res-photo-export
An agent can use this to pull photo metadata and full-res links for a profile or Page on demand β for example, feeding image and accessibilityCaption into a vision-model or content-review pipeline. Compatible with any MCP-capable client, including Claude Desktop and Claude Code.
Export to spreadsheets or CRM
Apify's dataset view exports directly to CSV or Excel. Map photoId/facebookUrl as the key column, image/storedImageKey as the asset link, and width/height/accessibilityCaption as metadata columns when importing into a spreadsheet or DAM/CRM system.
Is it legal to scrape Facebook photos?
Scraping publicly visible Facebook photos is generally permissible since the data is published without a login wall, but photos and their metadata can still constitute personal data β a photo may depict an identifiable person, and accessibilityCaption can describe one ("May be an image of 1 person"), while ownerId/facebookUrl identify the posting account. Where that's the case, GDPR (EU/UK) and CCPA (California) govern how you may store, process, and reuse it β you need a lawful basis, and data-subject rights (access, deletion) can apply. Purely aggregate, non-personal use (resolution/format research across many sources) carries lower risk than storing identifiable photos at scale. Consult legal counsel for commercial applications involving bulk storage of personal data.
β FAQ
What happens if a photo is deleted or removed from Facebook?
The Actor only returns photos it can fetch at request time; a removed or inaccessible photo simply won't appear in that run's results. There's no separate "removed" flag β a missing photo just means fewer rows than maxImages for that source.
Can I get every resolution variant Facebook serves, not just the largest?
Yes β set imageResolutions to "all" (the default) and each row's variants[] will include every distinct fbcdn image URI found in Facebook's response, labeled full, medium, or thumbnail by real pixel area, with no cap other than however many Facebook actually serves for that photo.
How accurate are the width, height, and caption data?
width, height, format, and aspectRatio are parsed directly from the numeric fields sitting next to each image URI in Facebook's own photo-viewer JSON β not estimated. accessibilityCaption is Facebook's own auto-generated alt text, returned verbatim, and null when Facebook doesn't supply one for that photo.
Does this really get the highest-resolution version of each photo?
It gets the largest rendition present in Facebook's photo-viewer (lightbox) response for that photo β genuinely larger than a feed thumbnail, and ranked by real parsed pixel area, not a guessed size. It is not guaranteed to equal Facebook's original uploaded master file, since Facebook may retain an even higher-resolution copy server-side that isn't exposed through the public viewer for every photo.
How many photos can I get per run?
Up to maxImages per source (1β10,000, default 10), for as many sources as you list in imageSources. There's no additional per-run cap in the input schema beyond that.
Can I download only the full-resolution images without the smaller variants?
Yes β set imageResolutions: "full" to keep just the largest variant per photo, and enable downloadImages to save it into the run's key-value store under storedImageKey.
Does this Actor work with Claude, ChatGPT, and AI agent frameworks?
Yes, two ways: directly as an HTTP/REST endpoint callable by any agent framework via the Apify API, or through Apify's Actors MCP Server (npx -y @apify/actors-mcp-server --actors SimpleAPI/facebook-photos-scraper-high-res-photo-export), which is compatible with MCP clients like Claude Desktop and Claude Code.
How does this compare to other Facebook photo scrapers?
Many basic Facebook image scrapers return a single image URL per photo. This Actor's distinguishing behavior, evidenced in its own output, is returning the full set of resolution variants with real parsed dimensions per variant (variants[], variantCount) plus an optional one-run download of the full-res asset into the key-value store β rather than one link and nothing else.
Can I use this without a Facebook API key or developer account?
Yes. You only need public profile or Page handles/URLs in imageSources; no Facebook login, API key, or developer account is required. An Apify account and API token are needed only to run the Actor itself.
Conclusion
Facebook Photos Scraper & High-Res Photo Export turns a list of public profile or Page handles into structured JSON rows carrying every resolution variant Facebook serves, real pixel dimensions, and Facebook's own accessibility captions β with an optional one-click download of the full-resolution asset. It's built for archivists, brand-monitoring agencies, and researchers who need photo metadata they can filter and sort by resolution, not just a single image link. Add your imageSources, choose an imageResolutions tier, and run it on Apify to start streaming photo data into your dataset.
