Facebook Photos Scraper & High-Res Photo Export avatar

Facebook Photos Scraper & High-Res Photo Export

Pricing

$19.99/month + usage

Go to Apify Store
Facebook Photos Scraper & High-Res Photo Export

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

Scraply

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

0

Monthly active users

5 days ago

Last modified

Share

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 fbcdn image URI Facebook returns per photo and labels each by real pixel area (full / medium / thumbnail)
  • Reports real width, height, format, and aspectRatio for the primary asset and every variant β€” never a guessed size
  • Returns Facebook's own auto alt-text (accessibilityCaption), null when 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:

FieldExample ValueUse 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
width1440Pixel width of the primary asset
height1800Pixel height of the primary asset
format"jpeg"File type parsed from the CDN URL
aspectRatio0.8Width Γ· height, pre-computed
variants[{ "uri": "...", "width": 1440, "height": 1800, "format": "jpeg", "aspectRatio": 0.8, "resolution": "full" }, …]Every resolution tier kept after the imageResolutions filter
variantCount3Number 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
downloadedtrueWhether 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").

ParameterRequiredTypeDescriptionExample Value
imageSourcesNoarray (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"]
maxImagesNointegerMax photos to resolve per source (1–10,000). Default 10.25
imageResolutionsNostring (enum: all, full, medium, thumbnail)Which resolution variants to keep in variants[]. Default "all"."full"
downloadImagesNobooleanDownload the full-res image into the run's key-value store. Default false.true
proxyConfigurationNoobjectApify 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 NameWhat it extracts
Facebook Page Posts & Comments ScraperPage posts and their comment threads
Facebook Groups Search Scraper With Group Profile DetailsGroup search results with profile-level group details
Facebook Marketplace : Listing Location Details ScraperMarketplace listings with location details
Facebook Ads Library Scraper: Creative & Ad Text DetailsAd Library creatives and ad text
Instagram Single Reels ScraperSingle Instagram Reel media and metadata
Pinterest Pins Videos Search ScraperPinterest 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 ApifyClient
client = 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.

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.