ParseForge Scrapers

Facebook Photos Scraper - Dates, Captions & Reactions

parseforge/facebook-photos-scraper

Social mediaAutomationLead generation

Scrape photos from public Facebook pages and profiles: full-size images, upload dates, captions, reactions by type, comments and shares. Export CSV, Excel, JSON or XML.

Run this scraper See the API call
Total runs
4
Bookmarked
0
Last modified
2 days ago

This scraper was last updated on .

What does the Facebook Photos Scraper - Dates, Captions & Reactions return?

ParseForge Banner

๐Ÿ“ธ Facebook Photos Scraper

๐Ÿš€ Export every photo of a public Facebook page in seconds, with the date it was posted and how people reacted. Paste page links and get full-size image URLs, upload dates, post captions, reactions split into Like, Love, Care, Haha, Wow, Sad and Angry, comments and shares. 6 photos from 3 pages, fully enriched, came back in 12 seconds in our cloud test.

This Actor opens the Photos tab that Facebook shows to anyone who visits a page without logging in and walks through it with Facebook's own pagination, 8 photos per request, as deep as the page goes. In our tests it paged through 1,608 photos of Katz's Delicatessen without a block. Then, for every photo, it opens the photo itself and adds what the grid does not show: the exact upload time, the text of the post, the full reaction breakdown, the comment and share counts, the post link and the album.

Every row has 33 fields: the image (full-size URL, width, height, thumbnail, Facebook's automatic description), the page (name, URL, ID, followers), the uploader, the date and caption, the engagement (total reactions, 7 reaction types, comments, shares) and the links (photo, post, album). Filter by date range on Facebook's side, or switch to the photos a page is tagged in. No login, no cookie, no browser.

๐ŸŽฏ Target Audience ๐Ÿ’ก Primary Use Cases
Social media managers Find which photos drove the most reactions, comments and shares
Marketing agencies Benchmark a client's visual content against competitors
Brand and UGC teams Collect photos fans posted and tagged the brand in
Researchers and journalists Archive a page's photos with exact dates and captions
Data and AI teams Build labeled image datasets with alt text and engagement
Designers and archivists Download full-size originals of a page's photo history

๐Ÿ“‹ What the Facebook Photos Scraper does

  1. Accepts Facebook page and profile URLs (facebook.com/humansofnewyork, profile.php?id=..., /{id}/photos), plain usernames or numeric IDs, and single photo links (facebook.com/NASA/photos/1638200237675346/, photo/?fbid=...).
  2. Opens the page's Photos tab as a logged-out visitor: photos the page uploaded, or, with Photo tab set to tagged, photos other people posted and tagged the page in.
  3. Pages through the whole tab using the same query the Facebook website uses when you scroll, 8 photos per request.
  4. Applies your date window on Facebook's side, so a run for "last 30 days" never downloads older photos.
  5. With Add date, caption and engagement on (the default), opens each photo and adds upload time, caption, total reactions and the count per reaction type, comments, shares, post link, post ID, album ID and who uploaded it.
  6. Writes one row per photo, deduplicated across pages. Pages Facebook hides from logged-out visitors come back as a free error row that says why.

๐Ÿ’ก Why it matters: the Photos tab is the one place where a page's visual history sits in order, without text posts, links and reels in between. With dates and reaction counts on every photo, it becomes a ready content-performance report: what a brand posted, when, and what the audience loved.

๐ŸŽฌ Full Demo (๐Ÿšง Coming soon)

๐Ÿ“Š Output

Each dataset row is one Facebook photo. 33 columns per row.

Field Type Description
๐Ÿ–ผ imageUrl string Full-size image URL, the largest Facebook serves
๐Ÿ†” photoId string Facebook photo ID
๐Ÿ”— url string Link to the photo on Facebook
๐Ÿ“„ pageName string Page or profile the photos were taken from
๐ŸŒ pageUrl string Page URL
๐Ÿ”ข pageId string Numeric page ID
๐Ÿ‘ฅ pageFollowers number Exact follower count of the page
๐Ÿ—‚ photoSource string Uploaded by the page, Tagged photo or Single photo
๐Ÿ‘ค uploadedBy string Account that posted the photo
๐Ÿ”ข uploaderId string Numeric ID of that account
๐Ÿ“… createdAt string Upload date and time, ISO 8601 UTC
๐Ÿ’ฌ caption string Text of the post the photo belongs to
๐Ÿ”ค altText string Facebook's automatic description of the image
โ†”๏ธ width number Width in pixels
โ†•๏ธ height number Height in pixels
โค๏ธ reactionsCount number Total reactions
๐Ÿ‘ likeCount number Like reactions
๐Ÿ˜ loveCount number Love reactions
๐Ÿค— careCount number Care reactions
๐Ÿ˜† hahaCount number Haha reactions
๐Ÿ˜ฎ wowCount number Wow reactions
๐Ÿ˜ข sadCount number Sad reactions
๐Ÿ˜  angryCount number Angry reactions
๐Ÿ’ญ commentsCount number Comments
๐Ÿ” sharesCount number Shares
๐Ÿ“ฐ postUrl string Link to the post that contains the photo
๐Ÿงพ postId string Post ID
๐Ÿ“š albumId string Album the photo is stored in
โœ”๏ธ detailsStatus string Complete, or why the per-photo details could not be read
๐Ÿ” thumbnailUrl string Square thumbnail from the photo grid
๐Ÿ“ฅ inputUrl string The input this row came from
๐Ÿ•’ scrapedAt string When the row was collected
โŒ error string Populated only on failed rows

A photo posted without text shows Not Disclosed as its caption. With Add date, caption and engagement off, the rows keep the 15 image and page fields and skip the rest.

Real sample records
{
  "imageUrl": "https://scontent-arn2-1.xx.fbcdn.net/v/t39.99422-6/821656476_1125871713709126_4518785347627209846_n.png?stp=dst-jpg_tt6&cstp=mx2048x1152&ctp=s2048x1152&...",
  "photoId": "1638200237675346",
  "url": "https://www.facebook.com/photo.php?fbid=1638200237675346&set=pb.100044561550831.-2207520000&type=3",
  "pageName": "NASA - National Aeronautics and Space Administration",
  "pageUrl": "https://www.facebook.com/NASA",
  "pageId": "100044561550831",
  "pageFollowers": 28730402,
  "photoSource": "Uploaded by the page",
  "uploadedBy": "NASA - National Aeronautics and Space Administration",
  "uploaderId": "100044561550831",
  "createdAt": "2026-09-24T22:00:52.000Z",
  "caption": "Welcome to the Artemis Accords, Cรดte d'Ivoire ๐Ÿ‡จ๐Ÿ‡ฎ\n \nCรดte d'Ivoire is the 75th country to sign the Artemis Accords. In doing so, they commit to a common set of principles for a safe, peaceful, and prosperous future in space. https://go.nasa.gov/4hqBFjw",
  "altText": "A graphic featuring the names and flags of the countries which have signed the Artemis Accords. \"ARTEMIS ACCORDS\" is written at the top.",
  "width": 2048,
  "height": 1152,
  "reactionsCount": 2615,
  "likeCount": 1824,
  "loveCount": 719,
  "careCount": 53,
  "hahaCount": 5,
  "wowCount": 6,
  "sadCount": 2,
  "angryCount": 6,
  "commentsCount": 142,
  "sharesCount": 187,
  "postUrl": "https://www.facebook.com/NASA/posts/pfbid06dQ3AbwtMVtGMtsaKjTBYgMpdP4KbXapkTPFCuQwVYLeVoCRSgzd3vnfZzR3nkwAl",
  "postId": "1638200251008678",
  "albumId": "416661013162614",
  "detailsStatus": "Complete",
  "thumbnailUrl": "https://scontent-den2-1.xx.fbcdn.net/v/t39.99422-6/821656476_1125871713709126_4518785347627209846_n.png?stp=c448.0.1152.1152a_dst-jpg_tt6&...",
  "inputUrl": "https://www.facebook.com/NASA",
  "scrapedAt": "2026-09-25T17:13:46.261Z",
  "error": null
}
{
  "imageUrl": "https://scontent-fra5-1.xx.fbcdn.net/v/t39.99422-6/823993453_1414568233974985_7401910122299642830_n.png?stp=dst-jpg_tt6&cstp=mx2048x1362&ctp=s2048x1362&...",
  "photoId": "1671104567720300",
  "url": "https://www.facebook.com/photo.php?fbid=1671104567720300&set=pb.100044623170418.-2207520000&type=3",
  "pageName": "National Geographic",
  "pageUrl": "https://www.facebook.com/natgeo",
  "pageId": "100044623170418",
  "pageFollowers": 51308163,
  "photoSource": "Uploaded by the page",
  "uploadedBy": "National Geographic",
  "uploaderId": "100044623170418",
  "createdAt": "2026-09-24T22:00:00.000Z",
  "caption": "The northern lights donโ€™t often reach Nebraskaโ€™s skies, but strong geomagnetic storms can bring them into view a few times a year. Near Crawford, their colorful glow illuminated the night behind an abandoned homestead. Also known as aurora borealis, the display begins when ions from the sun collide ...",
  "altText": "May be an image of text",
  "width": 2048,
  "height": 1362,
  "reactionsCount": 2108,
  "likeCount": 1554,
  "loveCount": 489,
  "careCount": 21,
  "hahaCount": 5,
  "wowCount": 37,
  "sadCount": 2,
  "angryCount": 0,
  "commentsCount": 101,
  "sharesCount": 175,
  "postUrl": "https://www.facebook.com/natgeo/posts/pfbid0BKYq7ekFrWDqHXusnm2JJsurWfEt8bBkZANyj4NjaYkuMQ4cz6LtLRWkYDBCLJazl",
  "postId": "1671104587720298",
  "albumId": "528642321966536",
  "detailsStatus": "Complete",
  "thumbnailUrl": "https://scontent-sea5-1.xx.fbcdn.net/v/t39.99422-6/823993453_1414568233974985_7401910122299642830_n.png?stp=c343.0.1362.1362a_dst-jpg_tt6&...",
  "inputUrl": "https://www.facebook.com/natgeo",
  "scrapedAt": "2026-09-25T17:13:48.703Z",
  "error": null
}
{
  "imageUrl": "https://scontent-dfw6-1.xx.fbcdn.net/v/t51.82787-15/707963999_18587346640053609_8287696446875301011_n.jpg?stp=dst-jpg_tt6&cstp=mx1253x1302&ctp=s1253x1302&...",
  "photoId": "1460169962819874",
  "url": "https://www.facebook.com/photo.php?fbid=1460169962819874&set=pb.100064806517961.-2207520000&type=3",
  "pageName": "Katz's Delicatessen | New York NY",
  "pageUrl": "https://www.facebook.com/katzsdeli",
  "pageId": "100064806517961",
  "pageFollowers": 941140,
  "photoSource": "Uploaded by the page",
  "uploadedBy": "Katz's Delicatessen",
  "uploaderId": "100064806517961",
  "createdAt": "2026-05-25T12:45:43.000Z",
  "caption": "Wishing a reflective and happy Memorial Day to all!",
  "altText": "No photo description available.",
  "width": 1253,
  "height": 1302,
  "reactionsCount": 988,
  "likeCount": 806,
  "loveCount": 164,
  "careCount": 15,
  "hahaCount": 1,
  "wowCount": 1,
  "sadCount": 0,
  "angryCount": 1,
  "commentsCount": 32,
  "sharesCount": 25,
  "postUrl": "https://www.facebook.com/katzsdeli/posts/pfbid0MRgS4c3nFc8dWqWrijNXBNkix5zNV1AKFwWpnNu3c8cXzFUmZWb1Qk3EkbC5UaAVl",
  "postId": "1460170006153203",
  "albumId": "646659574170921",
  "detailsStatus": "Complete",
  "thumbnailUrl": "https://scontent-lga3-2.xx.fbcdn.net/v/t51.82787-15/707963999_18587346640053609_8287696446875301011_n.jpg?stp=c0.16.1253.1253a_dst-jpg_tt6&...",
  "inputUrl": "https://www.facebook.com/katzsdeli",
  "scrapedAt": "2026-09-25T17:13:51.852Z",
  "error": null
}

Image URLs are shortened here with .... The dataset holds the complete, working links.

โœจ Why choose this Actor

  • Upload date on every photo. The exact time each photo was posted, as an ISO timestamp, so you can sort, chart and filter a page's photo history. Photo grids on Facebook show no dates at all.
  • The caption, not just the image. The text of the post each photo belongs to, so a photo keeps its context: the story, the announcement, the link.
  • Reactions split by type. Like, Love, Care, Haha, Wow, Sad and Angry as separate columns, plus totals, comments and shares. In our tests the seven types always add up exactly to the total.
  • Date window applied by Facebook. "Only photos newer than" and "older than" are sent to Facebook's own query, so a 30-day run reads 30 days of photos, not the whole archive.
  • Uploaded or tagged. Switch to the photos other people posted and tagged the page in, with the uploader's name and ID on every row. That is the page's user-generated content in one export.
  • Full-size originals. The largest image Facebook serves (2048 px on the long side for most photos), plus a square thumbnail, width, height and Facebook's automatic image description.
  • Deep pagination. Uses the same query as the website when you scroll, so it keeps going as long as the page has photos: 1,608 photos from one page in a single test.
  • Pay only for photos. Pages that do not exist or are hidden from logged-out visitors produce a free error row that says why.
  • No credentials, no browser. Plain HTTP with automatic IP rotation. You never hand over a Facebook login.

๐Ÿ“ˆ How it compares to alternatives

This Actor Typical photo scrapers Cookie based scrapers Saving photos by hand
Requires your Facebook login No No Yes Yes
Full-size image URL Yes Yes Yes Yes
Upload date Yes, exact timestamp Rarely Varies Hover on each photo
Post caption Yes Rarely Varies Copy by hand
Reactions by type, comments, shares Yes No Varies Count by hand
Date range filter Yes, on Facebook's side Rarely Varies Scroll and look
Tagged photos of a page Yes Rarely Yes Yes
Age-restricted or private pages Not available, see FAQ Not available Yes Yes, when allowed
Account risk None None Your account can be flagged None

The Actor sees what a logged-out visitor sees. Public pages and public profiles show their photos; private profiles and age-restricted pages (for example businesses that sell alcohol) do not, and return an error row instead of data. Facebook serves 8 photos per request and the Actor opens one more page per photo for the details, so a full-detail run collects about one photo per second; turn the details off for a much faster image-only export.

๐Ÿš€ How to use

  1. Create a free Apify account. New accounts include $5 of free platform credit, which is plenty to try this out: console.apify.com/sign-up
  2. Open the Actor and go to the Input tab.
  3. Paste Facebook page links into Facebook page, profile or photo URLs, or usernames and IDs into Page usernames or IDs.
  4. Set Max Items to the total number of photos you want, and optionally Max photos per page to spread it across several pages.
  5. Pick the Photo tab (uploaded by the page, or photos the page is tagged in) and, if you want, a date window.
  6. Leave Add date, caption and engagement on for the full row, or turn it off for images only.
  7. Click Start, then open the Dataset tab and download as CSV, Excel, JSON or XML, or pull it from the API.
{
  "startUrls": [{ "url": "https://www.facebook.com/natgeo" }],
  "maxItems": 200,
  "photoType": "photos_by",
  "onlyPhotosNewerThan": "3 months",
  "includeDetails": true
}

๐Ÿ’ผ Business use cases

Content performance reports

Pull a quarter of a brand's photos and sort by reactionsCount, sharesCount or loveCount. You see which visuals worked, which days they were posted and what the caption said, without clicking through a single photo.

Competitive benchmarking

Run the same date window across your page and three competitors. Posting frequency comes from createdAt, audience response from the reaction split, and pageFollowers lets you normalize engagement by audience size.

User-generated content collection

Switch to tagged photos to collect what customers, venues and partners posted about a brand, with the uploader's name, ID and caption. It is a ready shortlist for reposting requests and testimonials.

Visual datasets for AI and search

Full-size image URLs with Facebook's automatic alt text, captions and dimensions make a labeled image set for classification, captioning or visual search experiments, with engagement as a quality signal.

๐Ÿ”Œ Automating Facebook Photos Scraper

  • Make and Zapier: run the Actor every week for a list of pages and push new photos into a content calendar or a sheet.
  • Slack: post a message when a tracked page publishes a photo that passes a reaction threshold.
  • Airbyte: sync datasets into Snowflake, BigQuery or Postgres to keep a running history of a page's photos and engagement.
  • GitHub: schedule runs from Actions and keep versioned snapshots of a page's photo archive.
  • Google Drive: drop a CSV or Google Sheet into a shared folder after every run.
  • API and webhooks: every run emits a dataset ID; subscribe to the run succeeded webhook and download the images wherever you need them.

๐ŸŒŸ Beyond business use cases

  • Research: study how organizations use images on Facebook, how posting rhythm changes over time and which visuals draw which reactions.
  • Personal: back up the full-size photos of a public page you follow, with dates and captions kept alongside.
  • Non-profit: archive the photo history of community pages and local events before it gets buried.
  • Experimentation: a clean dataset of images, alt text and reaction counts is a good playground for computer vision and analytics projects.

๐Ÿค– Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant to get help designing your run:

I am using the ParseForge Facebook Photos Scraper on Apify. It takes Facebook page or profile URLs, usernames, IDs or single photo links and returns one row per photo with 33 fields, including imageUrl, photoId, url, pageName, pageUrl, pageId, pageFollowers, photoSource, uploadedBy, uploaderId, createdAt, caption, altText, width, height, reactionsCount, likeCount, loveCount, careCount, hahaCount, wowCount, sadCount, angryCount, commentsCount, sharesCount, postUrl, postId and albumId. It can read photos uploaded by a page or photos the page is tagged in, filter by upload date, and only sees what a logged-out visitor sees. Help me design a run to answer this question: [your question here].

โ“ Frequently Asked Questions

๐Ÿ” Do I need a Facebook account or cookie? No. The Actor reads only what Facebook shows to a logged-out visitor. You never supply credentials, so no account of yours is exposed.

๐Ÿ“š How many photos can I get from one page? As many as the page shows publicly. The Actor follows Facebook's own pagination until the tab ends or your limit is reached. In our tests it collected 1,608 photos from a single restaurant page and 648 from Humans of New York without hitting an end.

๐Ÿ“… How does the date filter work? The window is sent to Facebook's photo query, so only photos inside it are returned and nothing older is downloaded. Use a date (YYYY-MM-DD) or a relative value such as 30 days, 6 months or 1 year.

๐Ÿท What are tagged photos? Photos that other people or pages posted and tagged the page in. Select Photos the page is tagged in as the photo tab. The uploadedBy and uploaderId columns tell you who posted each one.

๐Ÿ’ฌ Why is the caption "Not Disclosed" for some photos? The photo was posted without text, which is common for album uploads and profile or cover photo changes. The Actor never makes a caption up.

๐Ÿšซ Why did a page return an error row? Either the page does not exist, it is a private profile, or Facebook hides it from visitors who are not logged in, which is typical for age-restricted pages of businesses that sell alcohol. Error rows are never charged.

โณ Do the image links expire? Yes. Facebook signs its image links and they stop working after a few days. Download the images, or rerun the Actor, when you need fresh links. The photoId and url columns stay valid.

โšก How do I make runs faster? Turn off Add date, caption and engagement. The Actor then reads only the photo grid, 8 photos per request, and skips the extra visit to each photo.

๐ŸŽฅ Does it return videos? No. The Photos tab lists photos. For videos and reels, see the recommended Actors below.

๐ŸŒ Do I need a proxy? Keep the default Apify Proxy. Facebook shows a login wall to an IP after a few dozen page views, so the Actor uses a new IP for every attempt and moves to residential IPs by itself when the default IPs get walled.

โฑ How fast is it? With details on, about one photo per second (60 photos from 3 pages took 66 seconds in our test). Image-only runs read 8 photos per request.

๐Ÿ“ฅ What export formats are supported? CSV, Excel, JSON, XML, plus direct API access and integrations with Make, Zapier, Airbyte, Slack, Google Drive and more.

โš–๏ธ Is this legal? The Actor collects photos and counts that pages publish to everyone. You remain responsible for how you use the data, including copyright on the images, privacy law such as GDPR and CCPA, and Facebook's terms.

๐Ÿ”Œ Integrate with any app

Every run writes to an Apify dataset reachable through a REST API, so the output drops into whatever you already use. Native integrations cover Make, Zapier, Airbyte, Slack, Google Drive, GitHub, Google Sheets and webhooks, and the API covers everything else.

๐Ÿ”— Recommended Actors

๐Ÿ’ก Pro Tip: browse the complete ParseForge collection.

๐Ÿ†˜ Need Help? Open our contact form

โš ๏ธ Disclaimer: independent tool, not affiliated with Facebook or Meta; only publicly available data.

What input does the Facebook Photos Scraper - Dates, Captions & Reactions accept?

FieldTypeWhat it doesDefault
startUrls array Links to public Facebook pages or profiles (https://www.facebook.com/humansofnewyork, https://www.facebook.com/profile.php?id=100044623170418) or to single photos (https://www.facebook.com/NASA/photos/1638200237675346/). [{"url":"https://www.facebook.com/humans
pageNames array Page usernames (the part after facebook.com/) or numeric profile IDs. Use this or the URL list, or both. not set
maxItems integer Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000 10
maxPhotosPerPage integer Stop after this many photos from each page, so several pages share the Max Items budget. Leave empty to take everything each page has. not set
photoType string (2 options) Photos uploaded by the page itself, or photos other people posted and tagged the page in. photos_by
onlyPhotosNewerThan string Keep photos uploaded on or after this date (YYYY-MM-DD) or within a relative window such as 30 days, 6 months or 1 year. not set
onlyPhotosOlderThan string Keep photos uploaded on or before this date (YYYY-MM-DD) or before a relative point such as 1 year. not set
includeDetails boolean Open each photo to add the upload date, the post caption, total reactions and the count per reaction type, comments, shares, the post link and the album ID. Adds one request per photo. Turn it off for the fastest image-only export. true
proxyConfiguration object Facebook shows a login wall to an IP after a few dozen visits. Apify Proxy rotates the IP for every request and switches to residential IPs automatically if the default ones are walled. {"useApifyProxy":true}

How much does the Facebook Photos Scraper - Dates, Captions & Reactions cost?

from $1.50 per 1,000 results

Charged forWhat it isPrice each
Facebook photo Charged once per photo returned, with its image, date, caption and engagement. Error rows are free. $0.0015 to $0.003

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

How do I call the Facebook Photos Scraper - Dates, Captions & Reactions API?

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST ยท run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~facebook-photos-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [
      {
        "url": "https://www.facebook.com/humansofnewyork"
      },
      {
        "url": "https://www.facebook.com/NASA"
      }
    ],
    "maxItems": 10,
    "photoType": "photos_by",
    "includeDetails": true,
    "proxyConfiguration": {
      "useApifyProxy": true
    }
  }'

What example inputs can I use?

Use these inputs to see how a run is configured.

input.json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/humansofnewyork"
    },
    {
      "url": "https://www.facebook.com/NASA"
    }
  ],
  "maxItems": 10,
  "photoType": "photos_by",
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}

What do users say about the Facebook Photos Scraper - Dates, Captions & Reactions?

No reviews yet. Be the first.

How do I report an issue with the Facebook Photos Scraper - Dates, Captions & Reactions?

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

What related scrapers can I use?

Run Facebook Photos Scraper - Dates, Captions & Reactions on Apify All scrapers