Facebook Photos Scraper + Tagged Photos Extractor
Pricing
Pay per usage
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
Maintained by CommunityActor stats
0
Bookmarked
21
Total users
2
Monthly active users
5 days ago
Last modified
Categories
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 photo —
publishedAt(ISO 8601) andunixTimestampparsed from Facebook's owncreation_time, plus a derivedphotoAgeDays. - Capture-window filtering —
capturedAfter/capturedBeforeaccept an absolute date or a relative value like3 months. - Chronological ordering —
photoOrderset tonewestoroldest. - Real photo IDs and permalinks — the actual numeric Facebook photo ID, not a generated placeholder.
- Real alt text and captions —
accessibilityCaptionandcaptionreturned asnullwhen 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 Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Photo timeline record | id, dataType, publishedAt, unixTimestamp, photoAgeDays, accessibilityCaption, caption, image, url, facebookUrl, facebookId, inputUrl | Chronological archiving, campaign/period capture, dated exports for LLM context |
| Page context | pageAdLibrary (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).
| Feature | Facebook Graph API | Facebook Photos Scraper + Tagged Photos Extractor |
|---|---|---|
| Arbitrary public profile/Page photos | Page photos need only a valid token; user photos require that user's own permission grant | Any public profile or Page URL/handle — no owner permission needed |
| App review / OAuth | Required for user_photos / user_posts scopes | Not required — logged-out extraction |
| Tagged-photo / tag data | Requires user_photos or user_posts, and is still gated by the photo owner's privacy settings | Not extracted by this Actor either — see the FAQ below |
| Upload date per photo | Available via created_time once authorized | Returned as publishedAt / unixTimestamp / photoAgeDays on every row |
| Output shape | Raw, paginated Graph API JSON scoped to your app's access level | Consistent 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?
- Open Facebook Photos Scraper + Tagged Photos Extractor on Apify and start a new run.
- Add one or more targets to
profileTargets— a handle likeIamSRKor a full profile/Page URL. No field is required; the run works with the prefilled default. - Optionally set
photoBudget,capturedAfter/capturedBefore, andphotoOrderto shape the timeline window and sort order. - Start the run.
- 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.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
profileTargets | No | array | One 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"] |
photoBudget | No | integer | Maximum 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 |
capturedAfter | No | string | Keep 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" |
capturedBefore | No | string | Keep only photos uploaded on or before this moment — absolute or relative. Leave empty for no upper bound. | "2024-12-31" |
photoOrder | No | string | Chronological ordering of the delivered archive: newest or oldest. Default is newest. | "newest" |
proxyConfiguration | No | object | Apify 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 usingpublishedAtandimage. - 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
captionandaccessibilityCaptionas grounded context to an agent or RAG pipeline instead of running your own vision model over eachimageURL. - Community and social researchers: capture a bounded slice of a public account's photo history with
capturedAfter/capturedBeforefor 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 requestsresponse = 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.
Is it legal to scrape Facebook photos?
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.
