Facebook Photos Scraper + Tagged Photos Extractor avatar

Facebook Photos Scraper + Tagged Photos Extractor

Pricing

Pay per usage

Go to Apify Store
Facebook Photos Scraper + Tagged Photos Extractor

Facebook Photos Scraper + Tagged Photos Extractor

This Facebook Photos Scraper collects public photos from profiles, pages, posts, and albums. Capture image links, timestamps, captions, and more. Great for digital marketers, analysts, and developers needing structured visual datasets quickly and efficiently.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

21

Total users

2

Monthly active users

5 days ago

Last modified

Share

Facebook Photos Scraper — Dated Timelines, Captions and Image URLs

Facebook Photos Scraper + Tagged Photos Extractor builds a date-ordered photo timeline from any public Facebook profile or Page, returning each photo's real upload date, alt text, caption, and direct image link. Point it at one or more usernames or Page URLs and it delivers a chronological archive — newest or oldest first — restricted to whatever capture window you set. Every response is structured JSON, ready to pass to an LLM, index into a vector store, or feed a monitoring pipeline. No Facebook login is required.

What is Facebook Photos Scraper + Tagged Photos Extractor?

Facebook Photos Scraper + Tagged Photos Extractor is a Scrapier Actor that queries a public Facebook profile or Page and returns its photos as a dated, ordered timeline rather than a flat list of image links. It runs fully logged-out — no Facebook account, cookies, or app review are required — using a guest session warmup and optional Apify Proxy for reliability. Each photo carries its real upload timestamp where Facebook exposes one, so the archive can be filtered to a capture window and sorted newest- or oldest-first.

  • Real upload date per photopublishedAt (ISO 8601) and unixTimestamp parsed from Facebook's own creation_time, plus a derived photoAgeDays.
  • Capture-window filteringcapturedAfter / capturedBefore accept an absolute date or a relative value like 3 months.
  • Chronological orderingphotoOrder set to newest or oldest.
  • Real photo IDs and permalinks — the actual numeric Facebook photo ID, not a generated placeholder.
  • Real alt text and captionsaccessibilityCaption and caption returned as null when Facebook has none, never a filler string.
  • Multi-target batching — one run can process several profiles or Pages, each delivered as its own timeline.

What data can you get with Facebook Photos Scraper + Tagged Photos Extractor?

The Actor returns one result type per row — a dated photo record — with a nested page-context object.

Result TypeExtracted FieldsPrimary Use Case
Photo timeline recordid, dataType, publishedAt, unixTimestamp, photoAgeDays, accessibilityCaption, caption, image, url, facebookUrl, facebookId, inputUrlChronological archiving, campaign/period capture, dated exports for LLM context
Page contextpageAdLibrary (is_business_page_active, id)Flagging whether a source is a business Page and capturing its numeric Page ID

Page context object

Every row nests a pageAdLibrary object with two fields: is_business_page_active (boolean) and id (the source's numeric Facebook Page ID, populated when the scraper can resolve it). It comes from the same response used to fetch photo data, not a separate lookup, so it costs nothing extra to have on every row. Use it to flag which rows came from a business Page versus a personal profile before routing photos into a monitoring or archiving pipeline — without a second request or a separate Page-lookup run.

How does Facebook Photos Scraper + Tagged Photos Extractor differ from the official Facebook API?

Facebook's Graph API can return photo data for a Page with any valid access token, or for a user who has granted your app the user_photos permission — it does not let an arbitrary third party pull a stranger's public photo timeline over a simple HTTP call the way this Actor does (Graph API Photo reference, checked 2026-07-26).

FeatureFacebook Graph APIFacebook Photos Scraper + Tagged Photos Extractor
Arbitrary public profile/Page photosPage photos need only a valid token; user photos require that user's own permission grantAny public profile or Page URL/handle — no owner permission needed
App review / OAuthRequired for user_photos / user_posts scopesNot required — logged-out extraction
Tagged-photo / tag dataRequires user_photos or user_posts, and is still gated by the photo owner's privacy settingsNot extracted by this Actor either — see the FAQ below
Upload date per photoAvailable via created_time once authorizedReturned as publishedAt / unixTimestamp / photoAgeDays on every row
Output shapeRaw, paginated Graph API JSON scoped to your app's access levelConsistent structured JSON, one row per photo, in an Apify dataset

Use the Graph API when you own the Facebook app, the account being queried, and can secure the relevant permissions. Use this Actor when you need a public profile's or Page's photo timeline without building and maintaining that OAuth flow yourself.

How to scrape Facebook with Facebook Photos Scraper + Tagged Photos Extractor?

  1. Open Facebook Photos Scraper + Tagged Photos Extractor on Apify and start a new run.
  2. Add one or more targets to profileTargets — a handle like IamSRK or a full profile/Page URL. No field is required; the run works with the prefilled default.
  3. Optionally set photoBudget, capturedAfter / capturedBefore, and photoOrder to shape the timeline window and sort order.
  4. Start the run.
  5. Once it finishes, download the dataset as JSON, CSV, Excel, or any other format Apify's dataset export supports.
{
"profileTargets": ["IamSRK"],
"photoBudget": 25,
"photoOrder": "newest"
}

How to run multiple queries in one job

List every profile or Page you want covered as its own line in profileTargets — handles and full URLs can be mixed in the same run. Each target is processed independently, gets its own photoBudget allocation and date-window filter, then all rows land in the same dataset tagged with inputUrl so you can split them back out per source. There is no separate "batch" input: the array itself is the batching mechanism, and its length is the only limit on how many timelines one run covers.

⬇️ Input

All six inputs are optional (required: [] in the schema) — a run with the prefilled defaults (profileTargets: ["IamSRK"], photoBudget: 10, photoOrder: "newest") is enough to get a first result.

ParameterRequiredTypeDescriptionExample Value
profileTargetsNoarrayOne public profile or Page per line — full URL or short handle (e.g. IamSRK or https://www.facebook.com/IamSRK). Accepts the legacy startUrls key as a fallback.["IamSRK"]
photoBudgetNointegerMaximum photos to keep per target after date filtering and ordering (1–10,000). Default is 10. Accepts the legacy maxPhotos key as a fallback.25
capturedAfterNostringKeep only photos uploaded on or after this moment — an absolute date (2024-01-01) or relative value (3 months, 1 year). Leave empty for no lower bound."6 months"
capturedBeforeNostringKeep only photos uploaded on or before this moment — absolute or relative. Leave empty for no upper bound."2024-12-31"
photoOrderNostringChronological ordering of the delivered archive: newest or oldest. Default is newest."newest"
proxyConfigurationNoobjectApify Proxy configuration. Facebook intermittently blocks logged-out traffic; residential proxy raises success rates.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
{
"profileTargets": ["IamSRK", "https://www.facebook.com/someotherpage"],
"photoBudget": 25,
"capturedAfter": "2023-01-01",
"capturedBefore": "2024-12-31",
"photoOrder": "newest",
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Pitfall: when capturedAfter or capturedBefore is set, any photo whose upload time Facebook doesn't expose is dropped rather than kept — a small fraction of photos have no resolvable creation_time, and they disappear from filtered runs even though they'd appear in an unfiltered one. proxyConfiguration also defaults to no proxy (useApifyProxy: false); if a run returns fewer rows than expected, re-run with residential Apify Proxy enabled before widening the date window.

⬆️ Output

Results are typed, normalized JSON with a consistent schema across runs, viewable in the dataset and exportable as JSON, CSV, Excel, XML, or RSS.

Scraped results

[
{
"id": "1234567890123456",
"dataType": "photo",
"publishedAt": "2024-03-14T09:21:00.000Z",
"unixTimestamp": 1710407660,
"photoAgeDays": 500,
"accessibilityCaption": "May be an image of 1 person and outdoors",
"caption": null,
"image": "https://scontent.xx.fbcdn.net/v/t39.30808-6/photo1.jpg",
"url": "https://www.facebook.com/photo.php?fbid=1234567890123456",
"facebookUrl": "https://www.facebook.com/IamSRK",
"facebookId": "1234567890123456",
"inputUrl": "https://www.facebook.com/IamSRK",
"pageAdLibrary": { "is_business_page_active": false, "id": "123456789012345" }
},
{
"id": "1234567890123457",
"dataType": "photo",
"publishedAt": "2024-01-02T18:05:12.000Z",
"unixTimestamp": 1704218712,
"photoAgeDays": 571,
"accessibilityCaption": "May be an image of text",
"caption": "Grateful for another year. Thank you all!",
"image": "https://scontent.xx.fbcdn.net/v/t39.30808-6/photo2.jpg",
"url": "https://www.facebook.com/photo.php?fbid=1234567890123457",
"facebookUrl": "https://www.facebook.com/IamSRK",
"facebookId": "1234567890123457",
"inputUrl": "https://www.facebook.com/IamSRK",
"pageAdLibrary": { "is_business_page_active": false, "id": "123456789012345" }
},
{
"id": "9876543210987654",
"dataType": "photo",
"publishedAt": null,
"unixTimestamp": null,
"photoAgeDays": null,
"accessibilityCaption": null,
"caption": null,
"image": "https://scontent.xx.fbcdn.net/v/t39.30808-6/photo3.jpg",
"url": "https://www.facebook.com/photo.php?fbid=9876543210987654",
"facebookUrl": "https://www.facebook.com/someotherpage",
"facebookId": "9876543210987654",
"inputUrl": "https://www.facebook.com/someotherpage",
"pageAdLibrary": { "is_business_page_active": true, "id": "556677889900112" }
}
]

How can I use the data extracted with Facebook Photos Scraper + Tagged Photos Extractor?

  • Visual content research: pull a page's or profile's full dated photo archive, sort oldest-first, and reconstruct a visual timeline of a campaign, event, or account's history using publishedAt and image.
  • Brand monitoring: track how often a Page posts new photos and whether its content is tied to a business (pageAdLibrary.is_business_page_active) as part of a competitive or account-health watch.
  • AI engineers and LLM developers: feed caption and accessibilityCaption as grounded context to an agent or RAG pipeline instead of running your own vision model over each image URL.
  • Community and social researchers: capture a bounded slice of a public account's photo history with capturedAfter / capturedBefore for archival or academic documentation of a specific period.

How do you monitor a Facebook page's photo activity over time?

Monitoring here means re-running the same profileTargets on a schedule and diffing the delivered rows against the previous run's dataset. Because every row carries a real unixTimestamp and photoAgeDays, a new run against the same target will surface photos with id values not seen before, plus a shift in the newest publishedAt if the page has posted since your last check. The fields worth diffing between runs are id (new vs. already-seen photos), publishedAt / unixTimestamp (when the new activity happened), and pageAdLibrary.is_business_page_active (whether the source's business status changed).

A practical loop: schedule a run across your tracked profileTargets with photoOrder: "newest" and a modest photoBudget, store the previous run's id set, and on each new run flag any id that wasn't in the prior set as new activity. Point capturedAfter at the last run's newest timestamp to keep each scheduled run small instead of re-collecting the full history every time. Deliver this through Apify's Scheduler, which can trigger the Actor on a recurring interval and hand results to a webhook or downstream dataset.

Integrate Facebook Photos Scraper + Tagged Photos Extractor and automate your workflow

Facebook Photos Scraper + Tagged Photos Extractor works with any language or tool that can send an HTTP request.

REST API with Python

import requests
response = requests.post(
"https://api.apify.com/v2/acts/Scrapier~facebook-photos-scraper-tagged-photos-extractor/run-sync-get-dataset-items",
params={"token": "YOUR_APIFY_TOKEN"},
json={
"profileTargets": ["IamSRK"],
"photoBudget": 25,
"photoOrder": "newest",
},
)
photos = response.json()
for photo in photos:
print(photo["publishedAt"], photo["url"])

MCP for query-grounded AI agents

This Actor is reachable through Apify's Actors MCP Server, either hosted at https://mcp.apify.com or run locally with npx -y @apify/actors-mcp-server (an APIFY_TOKEN environment variable). An MCP-compatible agent — Claude Desktop, Cursor, or VS Code's Copilot agent mode — can call the Actor as a tool, receive the JSON timeline, and answer a user's question grounded in real, dated photo data instead of guessing.

Scheduled monitoring and delivery

Use Apify's Scheduler to trigger this Actor on a recurring interval against a fixed profileTargets list, and pair it with a webhook or an integration (Zapier, Make, or a direct API poll) to route each run's dataset to wherever you track photo activity.

Scraping publicly visible Facebook photos is generally permissible because this Actor only returns what any logged-out visitor to a public profile or Page can already see — it doesn't bypass a login wall or access private content. That said, photos of identifiable people, along with the alt text and captions attached to them, can constitute personal data under GDPR and CCPA, so storing or reusing this data at scale carries different obligations than a one-off lookup. Facebook's Terms of Service separately restrict automated access regardless of data-protection law. Scraping for one-off research carries a different risk profile than scraping to train a model or build a persistent database of individuals. Consult your legal team before any commercial use involving bulk data storage.

Frequently asked questions

Does Facebook Photos Scraper + Tagged Photos Extractor need a Facebook login?

No. It runs fully logged-out, using a guest session warmup to seed a real-looking datr cookie and human-like request headers. No Facebook account, password, or app review is required to start a run.

How does the "tagged photos extractor" actually work?

It doesn't extract who is tagged in a photo. Despite the name, this Actor returns a dated photo timeline — real upload date, alt text, caption, and image link per photo — but no per-photo list of tagged people's names or profile links. If you need that specific data, verify it against the Actor's output fields above before relying on it; this README states that gap explicitly rather than implying tag data is included.

Which Facebook profiles or Pages can I target?

Any public profile or Page reachable at a /photos URL — supply a short handle (IamSRK) or a full URL in profileTargets. Private profiles and photos restricted to a friends-only audience are not accessible, since the Actor never logs in.

How does the Actor handle Facebook's anti-bot measures?

It rotates human-like browser headers and user agents, seeds a guest datr cookie via a warmup request, and escalates through a no-proxy → datacenter-proxy → residential-proxy ladder with a fresh IP on each 403, 429, or 503 response, retrying up to 3 times per photo request.

How many photos does it return per profile or Page?

photoBudget accepts 1–10,000 per target (default 10) after date filtering and ordering. Internally, the collector caps its raw candidate pool at 1,000 photos per target before that filtering runs, so a photoBudget set well above roughly 1,000 will not return more than what that candidate pool contains.

Can I restrict results to a specific date range?

Yes. Set capturedAfter and/or capturedBefore to an absolute date or a relative value like 3 months. Photos whose upload time Facebook doesn't expose are excluded whenever either bound is set, since they can't be confirmed inside the window.

How do I monitor a page's photo uploads over time?

Schedule repeat runs against the same profileTargets, keep the set of id values from the previous run, and flag any new id in the latest run as new activity — using publishedAt to confirm when it happened. Apify's Scheduler can trigger these runs on a recurring interval.

Does it work with Claude, ChatGPT, and other AI agent frameworks?

Yes. It's reachable through Apify's Actors MCP Server for MCP-compatible clients like Claude Desktop and Cursor, and it's callable as a plain HTTP endpoint by any agent framework that can issue a request and parse JSON.

Can I use it without managing my own proxies or Facebook credentials?

Yes. No Facebook credentials are needed at all, and proxy handling is built in — the Actor works direct by default and falls back through Apify's datacenter and residential proxy tiers automatically on a block. Enabling proxyConfiguration with the residential group up front improves coverage on harder targets.

Your feedback

Found a bug or a field that doesn't match what's documented here? Open an issue on this Actor's Issues tab on Apify, or reach out to Scrapier through the Apify Store listing — reports like this keep the Actor maintained.