# Facebook Photos Scraper - Bulk Page Images \[NO COOKIES] ✅ (`unseenuser/fb-photos`) Actor

Bulk-scrape every public photo on a Facebook page. Full-res URLs, thumbnails and Facebook's native alt-text captions. 99.8% success rate, no cookies.

- **URL**: https://apify.com/unseenuser/fb-photos.md
- **Developed by:** [Unseen User](https://apify.com/unseenuser) (community)
- **Categories:** Social media, Automation, Integrations
- **Stats:** 45 total users, 20 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$3.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Facebook Photos Scraper - Bulk Page Images \[NO COOKIES]

> Scrape public Facebook page photos in bulk - full-resolution image URLs, thumbnails, photo IDs and Facebook's own alt-text captions on every photo. Built-in image descriptions, no separate OCR step or cost. No login, no cookies. JSON, CSV, Excel.

***

### Why this Actor

**Facebook's own alt-text on every photo - built-in image descriptions, no separate OCR step or cost.** The `accessibility_caption` field is the scene description Facebook generates for accessibility, returned natively for every photo. That is the "OCR text" other tools charge extra for, delivered free in every row.

**Full-res image URLs, not just thumbnails.** Both are returned, but `viewer_image` is the full-resolution CDN link.

Single-purpose atomic core with an opt-in page-context add-on: input a public Facebook page URL, get every public photo. Paginate as deep as the page goes. No login, no cookies, public pages only.

### Reliability and trust

- **0.20% failure rate across 176,512 runs** in the unseenuser scraper portfolio. Portfolio-verified, not marketing.
- **No cookies. No Facebook session. No login of any kind.** Nothing about your Facebook account touches this Actor.
- **Deep pagination, verified.** The Actor carries both Facebook pagination tokens forward on every loop and stops only when Facebook stops handing them out. It does not silently cap coverage at a round number.
- **Per-URL error isolation.** If one URL in a batch fails, the run continues and the failure is emitted as its own dataset row with an `error` field. Everything else is unaffected.
- **Free plan behaviour is spelled out.** On the free plan the Actor completes with a clear status message when it hits the cap. No cryptic errors.
- **Terms of Service are in this README.** Full published terms are below, including permitted uses, prohibited uses, and the Addendum specific to photo data.

### Free plan limit

Free Apify users get up to **50 results per run**. Paying users are not affected and receive results normally.

This limit was set by the Actor developer, not by Apify. To remove it and receive unlimited results, upgrade to any paid Apify plan: https://apify.com/pricing

When a free plan run hits the cap, the Actor finishes successfully (status `SUCCEEDED`) and the run's status message explains what happened. No error is raised, so the first 50 results are fully usable as normal.

### Use cases

- **Vision and AI training sets** - bulk full-resolution image URLs with native captions (subject to the Terms of Service, see below)
- **Brand imagery audits** - review the photos a page is publishing
- **Visual content backup** - archive a page's public photo set
- **Competitive creative research** - study a competitor's published imagery
- **Image dataset building** - structured rows with captions, dimensions and URLs
- **Accessibility tooling** - use the native alt-text captions downstream
- **Bulk photo download for downstream apps** - turn any public Facebook page into a bulk source of full-resolution images your product or workflow can consume, without a browser extension or manual save-image-as loop.
- **Facebook photos API integration** - call this Actor from your own code via Apify's REST API to pull public Facebook page images into your app, ETL pipeline or research notebook.

### Quick start

1. Click **Try for free** on this Actor's page.
2. Enter one or more public Facebook page URLs (for example `https://www.facebook.com/Spurs`).
3. Run the Actor.
4. Download results as JSON, CSV, or XLSX, or pull via Apify API.

### Inputs

| Input | Type | Required | Description | Example |
|---|---|---|---|---|
| `startUrls` | array of strings | yes | One or more public Facebook page URLs | `https://www.facebook.com/Spurs` |
| `maxPhotos` | integer | no | Stop after this many photos per page. Set to `0` for every public photo the page exposes. Default `0` (everything). | `0` |
| `includeCaptions` | boolean | no | Facebook's native accessibility caption per photo. Included free. Default `true` | `true` |
| `includePageContext` | boolean | no | Adds page name, category and follower/like counts. Uses one extra request per page URL. Default `false`. | `false` |
| `dateFrom` | string | no | Only include photos on or after this date. ISO format like `2026-01-15` or `2026-01-15T00:00:00Z`. Leave empty to keep every photo. Photos without a detectable timestamp are dropped when this filter is on. | `2026-01-15` |
| `dateTo` | string | no | Only include photos on or before this date. ISO format. Combine with `dateFrom` for a range. | `2026-03-31` |
| `enableOcr` | boolean | no | Advanced cloud enrichment. Adds `enrichment.ocr_text` per photo via Google Cloud Vision. Requires the `gcpVisionKey` field (or `GCP_VISION_KEY` env var) to be set. Default `false`. | `false` |
| `enableClassification` | boolean | no | Advanced cloud enrichment. Adds `enrichment.labels` (classification labels) per photo. Requires a Vision key. Default `false`. | `false` |
| `enableLogoDetection` | boolean | no | Advanced cloud enrichment. Adds `enrichment.logos` (brand-logo detection). Requires a Vision key. Default `false`. | `false` |
| `visionBudgetUsd` | integer | no | Hard spend cap for cloud vision this run (USD). When projected spend would exceed this cap, enrichment stops for remaining photos; base scraping continues. Default `10`. | `10` |
| `gcpVisionKey` | string (secret) | no | Google Cloud Vision API key. Only needed when one of the enrichment toggles is on. Encrypted at rest by Apify, redacted in run logs. If left blank, the Actor falls back to reading the `GCP_VISION_KEY` environment variable. | (paste key) |

### Sample output

A single photo row with the native caption populated next to the full-res `viewer_image_uri`:

```json
{
  "photo_id": "1428106402020495",
  "url": "https://www.facebook.com/photo.php?fbid=1428106402020495&set=pb...&type=3",
  "viewer_image_uri": "https://scontent-.../full-res.jpg",
  "viewer_image_width": 1440,
  "viewer_image_height": 1800,
  "thumbnail": "https://scontent-.../s206x206.jpg",
  "accessibility_caption": "May be an image of basketball and text",
  "source_url": "https://www.facebook.com/Spurs",
  "_metadata": {
    "fetched_at": "2026-06-03T12:34:56.000Z",
    "source_url": "https://www.facebook.com/Spurs",
    "page": 1,
    "page_context_fetched": false
  }
}
```

When `includePageContext=true`, each row is also enriched with `page_name`, `page_category`, `follower_count`, `like_count`.

Failed URLs land in the same dataset with an `error` field explaining the cause, so a run over many pages never loses partial results.

### Filtering by date (optional)

Set `dateFrom` and/or `dateTo` in ISO format (`2026-01-15` or `2026-01-15T00:00:00Z`) to restrict results to photos published inside the range. Either field can be used on its own.

The filter runs client-side after each page is fetched. If the upstream response does not include a creation timestamp for a photo, that photo is dropped when the filter is active. If you leave both fields blank the Actor behaves exactly as before.

Set `maxPhotos` to `0` and combine with a date filter to grab all photos in a fixed window without a manual cap.

### Coverage and pagination

Coverage is the top of every complaint list on Facebook photo scrapers. Here is how this one handles it.

The Actor uses Facebook's own next-page tokens. Two tokens (`next_page_id` and `cursor`) travel with each request. Both are carried forward on every loop. The run stops in exactly three cases:

1. Facebook stops returning pagination tokens.
2. The tokens stop changing between calls (loop safety, extremely rare).
3. Your configured `maxPhotos` value is reached.

There is no silent cap at 1,000 or 5,000 photos. Setting `maxPhotos: 0` means every photo the page exposes to a signed-out browser. If you configured a cap and the run stops at exactly that number, that is the cap. If Facebook stops returning tokens, the last dataset row is the last photo Facebook is currently exposing on that page.

### What "public" means

Some pages restrict their photo tab or hide it behind a login. If Facebook does not show the photos to a signed-out browser, this Actor cannot show them to you. It does not bypass login walls, it does not use cookies, and it does not simulate a signed-in session.

Quick check before running: open the page in a private browser window with no Facebook session. If the Photos tab loads and shows images, this Actor can scrape them. If the tab is missing, redirects to a login form, or shows zero photos, the page is private in Facebook's eyes and this Actor will faithfully return zero photos too.

### Limitations

Being explicit about limits is a differentiator, not a weakness.

- **Facebook CDN URLs expire.** Every `viewer_image_uri` and `thumbnail` is a signed CDN URL. Facebook typically invalidates these signatures after ~24 to 48 hours. If you need long-term storage, download the images within that window and host them yourself. This is Facebook's rule, not the Actor's.
- **Public pages only.** This Actor cannot access photos on private pages, groups behind a login wall, personal profiles, or restricted regions from where the run is executed.
- **No tagged-photos enumeration.** The Actor returns the photos the page itself has published. Photos on which the page is merely tagged by other users are not enumerated separately.
- **No keyword search across Facebook.** Input is one or more known page URLs. There is no discovery of pages by keyword.
- **No comment bodies.** The Actor returns photos, not the comment threads under them.
- **No login-gated content.** Any photo Facebook shows only to logged-in viewers of a specific age, region, or friend circle is out of scope by design.

### Cloud enrichments (opt-in, bring your own Google Vision key)

Three optional enrichment layers are available on every photo row. All three are opt-in per-toggle, default off. When enabled they add an `enrichment` object to each row with the extra fields; when off, the row shape is identical to the baseline output above.

Available layers:

- **OCR in-image text** (`enableOcr`). Adds `enrichment.ocr_text` with any text detected inside the image. Useful for meme text, poster copy and ad creative extraction.
- **Image classification labels** (`enableClassification`). Adds `enrichment.labels`, an array of `{ description, score }` entries with the top classification labels for the image.
- **Brand-logo detection** (`enableLogoDetection`). Adds `enrichment.logos`, an array of detected brand marks with confidence scores.

#### How the cost model works

These layers call Google Cloud Vision, which costs approximately **$1.50 per 1,000 photos per layer** at the time of writing. The Actor uses a bring-your-own-key model: you provide your own Google Cloud Vision API key on each run, Google bills your Google Cloud account directly, and this Actor charges you nothing extra for the enrichment fields.

The `visionBudgetUsd` input caps how much this run can spend on Vision. When projected spend would push over the cap, enrichment stops for remaining photos and base scraping continues. Photos past the cap get `enrichment.budget_exceeded: true` so you can see where the cap hit.

#### 5-minute Google Vision credential setup

Google no longer accepts plain API keys for the Vision `images:annotate` endpoint. You need either a service-account JSON (recommended, one-time setup) or a short-lived OAuth2 access token.

**Service-account JSON path (recommended)**:

1. Go to the Google Cloud Console at `https://console.cloud.google.com` and create a project (or pick an existing one).
2. Enable the **Cloud Vision API** for that project: **APIs & Services** → **Library** → search "Cloud Vision API" → **Enable**.
3. Create a service account: **IAM & Admin** → **Service accounts** → **Create service account**. Any name works. Grant it the **Cloud Vision AI Service Agent** role (or the broader **Editor** role if you prefer simple setup).
4. Open the created service account → **Keys** tab → **Add key** → **Create new key** → **JSON**. A file downloads to your machine.
5. Open the downloaded JSON file in a text editor and copy its ENTIRE contents (starts with `{ "type": "service_account", ...`).
6. On your Actor run form: scroll to the **Advanced: Cloud vision enrichments** section. Paste the full JSON blob into the **Google Cloud Vision credential (service-account JSON)** field at the bottom of that section. The field is a secret input; Apify encrypts it at rest and redacts it in run logs.
7. In the same section, flip on `enableOcr` (or `enableClassification`, or `enableLogoDetection`, or any combination). Leave `visionBudgetUsd` at its default of `10` on the first run.
8. Run. Every photo row now carries an `enrichment` object with the enabled layers' output.

**OAuth2 access token path (advanced, short-lived)**: run `gcloud auth print-access-token` on your machine, paste the resulting `ya29....` token into the same field. Tokens expire in ~1 hour; only useful for one-off runs.

**Environment-variable fallback** (for CI/automation): set `GCP_VISION_KEY` as an env var on the run, holding the same service-account JSON string. The Actor uses the input field first and falls back to the env var when the input field is blank.

If you turn on any enrichment toggle without providing a credential by either path, the run fails immediately with an explicit "no Vision credential" error before any photo is fetched. No partial charges, no confusion.

#### Enriched row shape (sample)

```json
{
  "photo_id": "1428106402020495",
  "viewer_image_uri": "https://scontent-.../full-res.jpg",
  "accessibility_caption": "May be an image of basketball and text",
  "source_url": "https://www.facebook.com/Spurs",
  "enrichment": {
    "ocr_text": "SPURS 118 - LAKERS 104\nFINAL",
    "labels": [
      { "description": "Basketball", "score": 0.97 },
      { "description": "Sport venue", "score": 0.92 },
      { "description": "Fan", "score": 0.88 }
    ],
    "logos": [
      { "description": "San Antonio Spurs", "score": 0.94 }
    ]
  },
  "_metadata": { "fetched_at": "2026-06-03T12:34:56.000Z", "page": 1, "page_context_fetched": false, "source_url": "https://www.facebook.com/Spurs" }
}
```

#### Terms note

Enrichment output (OCR text, classification labels, detected logos) is derived analytical data for aggregate use. It is not authorisation to republish the source photos or to detach the enrichment from your own downstream ToS obligations. All prohibitions in the master ToS and Addendum below still apply to the enrichment fields.

#### For the Actor operator: custom pricing per enrichment layer

The Actor emits a Pay-Per-Event billing event every time an enrichment field is successfully written to a row. If you (as the Actor operator) want to charge buyers a custom price per layer on top of their own Google Vision spend, add the following events to your Actor's pricing configuration on Apify Console (Actor page → Pricing → Pay per event) and set any price per unit you want. Prices are entirely your choice; the code just fires the events.

| Event slug | Fires when | Suggested price / unit |
|---|---|---|
| `photo_ocr_extracted` | `enrichment.ocr_text` was written for a photo | your choice (roadmap doc suggests $0.006) |
| `photo_classified` | `enrichment.labels` was written for a photo | your choice (roadmap doc suggests $0.005) |
| `photo_logo_detected` | `enrichment.logos` was written for a photo | your choice (roadmap doc suggests $0.006) |

If you leave the Actor on its current pricing model without adding these events, the `Actor.charge()` calls are silently no-op and buyers see no extra charges. Adding events on Apify Console is a one-time click-through and does not require a code change or new build.

Events do NOT fire when:

- The enrichment call failed (`enrichment.vision_error` populated).
- The per-run budget cap was hit (`enrichment.budget_exceeded: true`).
- The buyer did not enable the corresponding toggle.

That way buyers only see charges for enrichments that actually delivered value.

### Enrichments (roadmap)

Additional layers are staged as future add-ons, additive to the current schema, no breaking changes:

- **Perceptual hash + duplicate flag** for cross-run and within-page deduplication.
- **Dominant colour palette** for brand-palette analysis.
- **AI scene description** as a richer alternative to Facebook's native alt-text.

Each future layer will land behind its own input toggle defaulting to false. Existing schema and existing pricing are not affected when they ship.

### FAQ

**Does this include cover and profile photos?** Yes. Every public photo the page exposes appears in the dataset, including cover and profile images when they are publicly visible.

**Full resolution or thumbnails?** Both. `viewer_image_uri` is the full-resolution URL with `viewer_image_width` and `viewer_image_height`. `thumbnail` is the small version.

**What is the caption field?** `accessibility_caption` is Facebook's own auto-generated description of the image - effectively native alt-text or scene description. It is returned free on every row, so there is no need for a separate OCR step.

**How many photos per page?** As many as the page exposes publicly. Use `maxPhotos` to cap the run. The Actor paginates until it runs out of photos or hits the cap.

**Why did the run return zero photos?** The most common cause is a page that is not actually public. See the section above titled **What "public" means** for a 30-second check. The second most common cause is a page whose Photos tab has been renamed or restricted region-by-region.

**Tagged or album photos?** This Actor focuses on a page's published photos. It does not separately enumerate tagged photos or per-album splits.

**Can it search photos by keyword?** No. It extracts a known page's photos. There is no keyword photo-search.

**Do I need a separate account?** No. You only need an Apify account.

**Do I need to supply cookies or a Facebook session?** No. This Actor never uses cookies or a signed-in session.

**Do the image URLs stay valid forever?** No. Facebook signs the CDN URLs and invalidates the signatures after roughly 24 to 48 hours. Download images within that window if you need durable storage.

**Is this legal?** This Actor accesses publicly visible photo data. Your downstream use of the data is your responsibility - see the Terms of Service section below.

**What about Facebook's anti-scraping enforcement?** Meta's Terms restrict automated extraction. Your downstream use must comply with Meta's Terms. See the Addendum.

**What if Meta sends a cease-and-desist?** Notify UnseenUser within 48 hours via the Apify profile contact form (https://apify.com/UnseenUser) and cease using this Actor immediately.

**Can I use this data to train AI?** NO. Meta's Terms prohibit AI training on Facebook data, and the images are copyrighted by their creators. See the Addendum, Section G.

**What about minors?** Facebook has many under-18 users, and photos may depict minors. This Actor's Terms strictly prohibit using data of users you know or suspect are minors. See the Addendum, Section I.

**How do I download all photos from a Facebook page at once?** Set `startUrls` to the page and leave `maxPhotos` at `0` (the default). The Actor paginates through every photo Facebook exposes publicly until it runs out of tokens or hits your cap. See Coverage and pagination above for exactly when it stops.

**Can I download Facebook page photos in HD quality?** Yes. The `viewer_image_uri` field on every row is the full-resolution Facebook CDN link with its native width and height. Note that Facebook CDN URLs expire in roughly 24 to 48 hours (see Limitations above), so download images within that window if you need durable storage.

**Is there a way to back up all Facebook page photos?** Yes. Point the Actor at the page URL, set `maxPhotos: 0`, and export the dataset as JSON, CSV, or XLSX. The dataset carries the full-resolution URL, thumbnail, dimensions and native alt-text for every photo. Combine with a scheduled run (see Demo video below) for periodic backups.

**Can I use an API for Facebook image scraping?** Yes. This Actor is callable via Apify's REST API and SDKs (Python, Node.js, TypeScript). Trigger runs, pull dataset items, and integrate the output into your own pipeline. See the Apify integrations video below for the overview.

**Which Facebook image scraper is best in 2026?** Different tools fit different jobs. This Actor's specific angles: 99.8% success rate across 176,512 portfolio runs, works with no cookies and no Facebook login, returns Facebook's native alt-text captions on every row for free, supports optional Google Cloud Vision OCR, classification and logo enrichments, has a documented pricing model and Terms of Service. Compare on the differentiators you care about.

**Are there Chrome extensions for downloading Facebook page photos?** Yes, browser extensions exist, but they work one browser session at a time, do not scale to bulk, and do not expose an API for downstream automation. This Actor is the bulk and API path: run it on Apify's platform, get every public photo, integrate the dataset into your own workflow.

### Technical details

- Output: streamed via Apify dataset (JSON, CSV, XLSX, or via Apify API)
- Retries: 3 with exponential backoff on transient errors (429, 502, 503, 504)
- Pagination: deep, with both pagination tokens carried forward each loop, hard stop on `maxPhotos` and on missing tokens
- Per-page error isolation: a failed source URL never crashes the whole run; failures are emitted as dataset rows with an `error` field
- Image URLs are Facebook CDN links
- Live view: while a run is in progress, the Actor exposes a small live-view server with `/`, `/status` and `/healthz` endpoints (see the Actor's live view tab)

### Example tasks

Ready-to-run workflows for the most common use cases. Click any task to open it with sample inputs pre-filled.

- [Build a Facebook image dataset with native captions](https://apify.com/unseenuser/fb-photos/examples/fbp-build-image-dataset) - bulk full-resolution photos with Facebook's own alt-text, ready for vision and ML pipelines.
- [Audit Facebook photo creative from a competitor page](https://apify.com/unseenuser/fb-photos/examples/fbp-competitor-creative-audit) - see every image a competitor publishes alongside their page category and follower counts.
- [Archive a Facebook Page's photo gallery in bulk](https://apify.com/unseenuser/fb-photos/examples/fbp-archive-page-photos) - back up the full public photo set of any page in one run.
- [Extract Facebook photo alt-text captions in bulk](https://apify.com/unseenuser/fb-photos/examples/fbp-alt-text-captions) - pull Facebook's native scene descriptions, no separate OCR step.
- [Bulk Facebook photo downloader from any public page](https://apify.com/unseenuser/fb-photos/examples/fbp-bulk-download-page-photos) - grab every public photo from a Facebook page in one run, full-resolution URLs, thumbnails and native captions.
- [Facebook page photo OCR - extract in-image text](https://apify.com/unseenuser/fb-photos/examples/fbp-ocr-extract-in-image-text) - scrape Facebook page photos and OCR-extract every letter of overlay text for ad copy, meme text and creative research.
- [Facebook page photos by date range](https://apify.com/unseenuser/fb-photos/examples/fbp-photos-by-date-range) - filter by dateFrom and dateTo to slice a page's public photos into a chosen window.

### Demo video

Two short walkthroughs from the Apify team cover the two things buyers most often ask about after their first run: how to schedule this Actor and how to plug it into an existing stack.

**Schedule this Actor to run automatically** - watch the [Apify scheduling guide on YouTube](https://www.youtube.com/watch?v=GRFW_Loo2dk).

[![Apify scheduling guide thumbnail](https://img.youtube.com/vi/GRFW_Loo2dk/hqdefault.jpg)](https://www.youtube.com/watch?v=GRFW_Loo2dk)

**Connect this Actor to your existing tools** - watch the [Apify integrations overview on YouTube](https://www.youtube.com/watch?v=bNACk1_S_6w).

[![Apify integrations overview thumbnail](https://img.youtube.com/vi/bNACk1_S_6w/hqdefault.jpg)](https://www.youtube.com/watch?v=bNACk1_S_6w)

### Changelog

- **Jul 2026** (later): Google Vision API key now accepts an in-form secret input `gcpVisionKey` in the Advanced section, with the environment-variable path preserved as a fallback. Optional `dateFrom` / `dateTo` filter added at the top level. Pay-Per-Event billing events (`photo_ocr_extracted`, `photo_classified`, `photo_logo_detected`) now fire per successful enrichment; operator sets per-layer prices on Apify Console. All fields fully optional; existing runs behave identically without any input changes.
- **Jul 2026** (later): three opt-in cloud vision enrichments shipped (`enableOcr`, `enableClassification`, `enableLogoDetection`). Bring-your-own-key model with `GCP_VISION_KEY` and a per-run `visionBudgetUsd` spend cap. Additive `enrichment` object per row; baseline output shape unchanged when toggles are off.
- **Jul 2026**: coverage messaging refresh, reliability and trust section added, coverage-and-pagination and public-page explanation added, honest CDN-expiry limitation surfaced, FAQ expanded with public-page eligibility, cover-photo coverage, cookies posture and CDN expiry, enrichments roadmap published.
- **Jun 2026**: `maxPhotos=0` treated as unlimited by default, aligning UX with buyer expectation.
- **May 2026**: per-page error isolation, dataset schema views published.

### Related scrapers

Round out your Facebook content extraction:

- [Facebook Pages Scraper](https://apify.com/unseenuser/fb-pages) - the page these photos belong to
- [Facebook Reels Scraper](https://apify.com/unseenuser/fb-reels) - the page's video content
- [Facebook Page Posts & Comments Scraper](https://apify.com/unseenuser/fb-posts) - the page's post and comment stream (photos are only part of what a page publishes)
- [Facebook Reel Transcript Scraper](https://apify.com/unseenuser/fb-transcript) - the words spoken in a page's reel videos, useful alongside the photos for full context

[See all 24 scrapers by unseenuser](https://apify.com/unseenuser)

***

## Apify Actor - Terms of Service

**Version:** 4.0
**Effective Date:** May 5, 2026

***

### 0. ACCEPTANCE BY USE - IMPORTANT

**Read this section first.**

These Terms of Service ("Terms") form a binding legal agreement between you ("User," "you," "your") and UnseenUser, the Publisher of this Apify actor ("UnseenUser," "the Publisher," "we," "us," "our").

#### 0.1 How You Accept These Terms

You accept these Terms by **any of the following actions**, each of which constitutes a clear, affirmative act of acceptance:

- (a) **Running the Actor** - Initiating any execution of the Actor on the Apify platform
- (b) **Using any output** returned by the Actor for any purpose
- (c) **Continuing to access** the Actor's listing or documentation after these Terms are visible

#### 0.2 Continuing Acceptance

Each time you run the Actor or use its outputs, you reaffirm your acceptance of the then-current Terms. If you do not agree to these Terms or any subsequent update, you must stop using the Actor immediately.

#### 0.3 No Anonymous Acceptance

You cannot disclaim acceptance by:

- Failing to read these Terms before running the Actor
- Running the Actor through automated systems
- Sharing your Apify account with others who may not have read these Terms

By the act of running the Actor on Apify, you bind yourself, your organization (if applicable), and any individuals or systems acting on your behalf or under your authority.

#### 0.4 If You Do Not Accept

**If you do not agree to these Terms, you must not run the Actor.** No use is authorized without acceptance.

***

### PREAMBLE - UNDERSTANDING THE ARCHITECTURE

Before using the Actor, please understand the technical architecture of the service.

#### What Each Party Does

- **You (the User):** Run the Actor on the Apify platform with input parameters you choose.
- **Apify:** Operates the cloud infrastructure that hosts and executes Actors. Apify is a Czech-incorporated company (Apify Technologies s.r.o.) governed by its own Terms of Service.
- **The Publisher (us):** Publishes software code (the Actor) on Apify's platform. The Actor is a thin wrapper that translates your input into requests to upstream infrastructure and returns the responses to you. **The Publisher does not operate scraping infrastructure. The Publisher does not store or retain data returned by the Actor. The Publisher does not see, log, or process the personal data of any individuals returned in the Actor's outputs beyond what is incidental to passing the data through.**
- **Source Platform:** Facebook (Meta). The platform whose publicly visible data is accessed.

#### Why This Matters

Your relationship with the Publisher is that of a **software user** to a **software vendor**. The Publisher has the responsibilities of a software vendor (functional code, accurate documentation) and the limits of one (the Publisher is not responsible for how you use the data you obtain).

***

These Terms operate alongside but do not replace:

- Apify's Terms of Service and Acceptable Use Policy (governing your relationship with Apify)
- Source Platform terms (Meta / Facebook) governing the public data accessed
- Applicable law in your jurisdiction and the jurisdictions of data subjects

These Terms incorporate the actor-specific addendum below ("Addendum"). In the event of a conflict, the more restrictive provision applies.

***

### 1. NATURE OF THE SERVICE

#### 1.1 What the Actor Is

The Actor is a software program published on the Apify platform. It accepts structured input from you on the Apify platform, returns response data to you in a structured format on the Apify platform, and runs in Apify's cloud, not on the Publisher's servers. The Publisher operates no servers running the Actor.

#### 1.2 What the Actor Is Not

The Actor is **not**:

- (a) A scraping tool operated by the Publisher - the Publisher does not operate scraping infrastructure, proxies, headless browsers, or fake accounts
- (b) A data storage or data retention service - the Publisher does not maintain a database of any data the Actor returns
- (c) A licensed access channel to Facebook or any other source platform
- (d) Affiliated with, endorsed by, sponsored by, or authorized by any source platform

#### 1.3 The Publisher's Limited Role

The Publisher's role is limited to:

- (a) Designing and writing the Actor's source code
- (b) Publishing the Actor on the Apify Store
- (c) Maintaining the Actor
- (d) Providing documentation and customer support via Apify's contact mechanism

The Publisher is a software vendor, similar to a developer who publishes an app on an app store. The Publisher is not a data provider, data broker, data processor, or data controller for purposes of GDPR, CCPA, Israel's Privacy Protection Law, or equivalent.

***

### 2. WHO MAY USE THE ACTOR

#### 2.1 Eligibility

You may use the Actor only if you are at least 18 years old or the age of majority in your jurisdiction, have legal capacity to enter into binding contracts, are not located in or resident of a country subject to comprehensive sanctions by the United States, European Union, United Kingdom, or Israel, and are not on any prohibited persons list.

#### 2.2 User Representations

By using the Actor, you represent and warrant that information you provide about your identity and intended use is accurate, your intended use complies with applicable law in your jurisdiction, you will independently comply with the Terms of Service of the source platform, where Actor outputs include personal data you will respect data subject rights under applicable law, and you will not use the Actor for any of the purposes prohibited in Section 4.

***

### 3. PERMITTED USES

The Actor may be used for any lawful purpose, including market research and competitive analysis, academic research, journalism and investigative reporting, internal business intelligence, brand monitoring, and building products that further process publicly available information lawfully.

***

### 4. PROHIBITED USES

You may not use the Actor for any of the following:

#### 4.1 Illegal Activity

Activity illegal under the law of your jurisdiction, the User's jurisdiction, or the jurisdiction of any data subjects.

#### 4.2 Harassment, Stalking, and Personal Targeting

Compiling profiles for harassment, stalking, or doxxing; tracking individuals' movements or activities without their knowledge; building profiles of journalists, activists, dissidents, or vulnerable populations for retaliatory purposes.

#### 4.3 Discrimination

Using outputs for discriminatory employment, lending, housing, or insurance decisions based on protected characteristics; building lists for discriminatory purposes.

#### 4.4 Spam and Unsolicited Commercial Communication

Sending unsolicited marketing in violation of CAN-SPAM, CASL, GDPR, PECR, Israeli Anti-Spam Law (Section 30A of the Communications Law), or equivalent laws; building "lead lists" from scraped contacts without proper consent infrastructure; reselling contact data for spam purposes.

#### 4.5 Fraud and Deception

Identity theft or impersonation; generation of fake reviews, testimonials, or coordinated inauthentic behavior; election interference or political disinformation; securities fraud.

#### 4.6 Source Platform Abuse

Using outputs to circumvent technical protection measures of source platforms; creating fake accounts on source platforms based on Actor outputs; vote manipulation, engagement manipulation, or platform algorithm gaming; building services that competitively substitute for source platforms.

#### 4.7 Reselling the Actor's Service

Reselling raw Actor outputs as your own data product or scraping-as-a-service; sharing your Apify credentials to provide third parties indirect access; building competing API services using Actor outputs.

#### 4.8 AI Training Without Authorization

Using Actor outputs as training data for commercial AI/ML models without separate licensing authority from the source platform.

#### 4.9 Sensitive Targeting

Specifically targeting or profiling based on health conditions, sexual orientation, religious beliefs, political opinions, or other sensitive characteristics; targeting children under 16 (or local age of consent for data processing).

#### 4.10 Privacy Law Violations

Processing personal data of EU/UK/California/Israeli residents without complying with applicable privacy law; failing to honor data subject access, deletion, or objection requests; processing data for purposes incompatible with its publication context.

***

### 5. SOURCE PLATFORM TERMS - YOUR RESPONSIBILITY

#### 5.1 Acknowledgment

The Actor accesses publicly visible data on Facebook ("Source Platform"). You acknowledge that you are solely responsible for ensuring your downstream use of data obtained through the Actor complies with the Source Platform's Terms of Service. The Publisher makes no representation that any specific use is permitted under the Source Platform's terms.

#### 5.2 Review Source Platform Terms

You should review the source platform terms before commercial use:

- Meta / Facebook: https://www.facebook.com/legal/terms

#### 5.3 Cease-and-Desist Compliance

If you receive a cease-and-desist letter or other legal demand from the Source Platform regarding your use of Actor outputs, you must cease the contested use immediately, notify UnseenUser within 48 hours via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser), cooperate with the Publisher as needed to mitigate, and not assert against the Publisher any claim arising from your inability to use the Actor.

***

### 6. DATA PROTECTION

#### 6.1 Roles Under Privacy Law

For purposes of GDPR, UK GDPR, CCPA, Israel's Privacy Protection Law (PPL) including Amendment 13, and equivalents, **you (the User) are the Data Controller** of any personal data you obtain through the Actor and subsequently process for your own purposes. **The Publisher acts solely as a software vendor**, not as a data controller or processor, because the Publisher does not store, retain, or substantively process personal data.

#### 6.2 No Data Retention by the Publisher

The Publisher does not maintain a database of personal data obtained through the Actor. The Actor passes data directly to you on the Apify platform; data does not flow through the Publisher's infrastructure. Apify's standard execution and operational logging may include limited information about Actor runs, governed by Apify's own privacy practices.

#### 6.3 Your Obligations as Data Controller

Where your use of the Actor involves processing personal data, you are responsible for establishing a lawful basis, providing transparent notice, honoring data subject requests, implementing appropriate security measures, conducting DPIAs where required, appointing a DPO if your operations require one, registering databases with applicable supervisory authorities, honoring opt-out requests, and observing cross-border transfer safeguards.

#### 6.4 Israel's Amendment 13

If your use of the Actor involves Israeli residents' personal data, you must comply with the Privacy Protection Law as amended (Amendment 13, effective August 14, 2025).

#### 6.5 Sensitive Data Targeting Restrictions

You will not use the Actor to specifically target, profile, or build datasets focused on health or medical conditions, religious beliefs, political opinions, sexual orientation or gender identity, genetic or biometric data, criminal history, or children under 16.

***

### 7. INTELLECTUAL PROPERTY

#### 7.1 Actor Code

The Actor's source code, schemas, documentation, and branding are owned by the Publisher. You receive a limited, non-exclusive, non-transferable, revocable license to use the Actor for permitted purposes.

#### 7.2 Output Data

The Publisher claims no ownership over the public data the Actor returns. Source Platforms may have copyright, database rights, or other rights in their data; data subjects may have copyright in user-generated content. Your use of output data must respect these rights independently.

#### 7.3 Restrictions

You may not reverse engineer, decompile, or reuse the Actor's code in a competing actor.

#### 7.4 Feedback

Feedback you provide may be used by the Publisher to improve products without compensation to you.

***

### 8. PRICING AND PAYMENT

Pricing is administered through Apify's pricing models. Apify processes all payments. Apify's payment terms govern refunds and disputes. The Publisher may change Actor pricing with at least 14 days' notice via the Actor's Apify listing. If your access is suspended or terminated for breach of these Terms, you forfeit any unused balance and are not entitled to refunds.

***

### 9. SERVICE AVAILABILITY AND CHANGES

The Actor depends on the Apify platform and on the Source Platform's continued public accessibility. Either may change behavior, restrict access, or become unavailable without notice. The Publisher makes no uptime guarantees. The Publisher may discontinue any Actor at any time. Reasonable notice will be provided when feasible.

***

### 10. DISCLAIMERS

#### 10.1 "AS IS" Service

THE ACTOR IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTIES OF ANY KIND, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR PURPOSE, NON-INFRINGEMENT, OR ACCURACY OF DATA.

#### 10.2 No Representation of Lawfulness

The Publisher makes no representation that your specific use of the Actor or the data it returns is lawful in your jurisdiction or under any Source Platform's terms. The burden of determining lawfulness for your use case is yours.

#### 10.3 No Endorsement of Source Content

Content returned by the Actor was created by third parties. The Publisher does not endorse, verify, or take responsibility for it.

***

### 11. LIMITATION OF LIABILITY

#### 11.1 Aggregate Liability Cap

TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE AGGREGATE LIABILITY OF THE PUBLISHER FOR ALL CLAIMS RELATING TO THE ACTOR EXCEED THE GREATER OF ONE HUNDRED U.S. DOLLARS (US $100), OR THE AMOUNTS YOU PAID THROUGH APIFY FOR USE OF THE ACTOR IN THE THREE (3) MONTHS IMMEDIATELY PRECEDING THE EVENT.

#### 11.2 Excluded Damages

THE PUBLISHER IS NOT LIABLE FOR INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR FOR LOSS OF PROFITS, REVENUE, OR DATA, EVEN IF ADVISED OF THE POSSIBILITY.

#### 11.3 Time Limit

Any claim must be brought within one (1) year of the event.

***

### 12. INDEMNIFICATION

You agree to defend, indemnify, and hold harmless the Publisher from any claims arising from your use of the Actor, your violation of these Terms, your violation of any law (including privacy law), your violation of any Source Platform's Terms of Service, your processing of personal data obtained through the Actor, and reasonable attorneys' fees and costs of defending such claims. The Publisher may assume defense at your expense; you will cooperate with the Publisher's defense. The indemnification covers reasonable, foreseeable third-party claims arising from your use; it does not extend to claims arising from the Publisher's gross negligence or willful misconduct, or to claims regarding the Actor's source code itself.

***

### 13. SUSPENSION AND TERMINATION

The Publisher may terminate your access for material breach, illegal use, breach of warranty, or upon credible legal demand. Your license ends, you must cease use, and applicable provisions survive. You may stop using the Actor at any time on Apify.

***

### 14. DISPUTE RESOLUTION

#### 14.1 Informal Resolution First

Send a detailed written description of the dispute via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser) and wait 60 days for resolution attempt before any formal claim.

#### 14.2 Governing Law

These Terms are governed by the substantive laws of the State of Israel, without regard to conflict of law principles.

#### 14.3 Exclusive Jurisdiction

Any dispute shall be brought exclusively in the competent civil courts of Tel Aviv-Jaffa, Israel.

#### 14.4 No Class Actions

You agree to bring claims only in your individual capacity.

#### 14.5 Attorneys' Fees

The prevailing party recovers reasonable attorneys' fees.

***

### 15. MISCELLANEOUS

These Terms (with Addendum and incorporated documents) are the entire agreement. Unenforceable provisions are reformed to the minimum extent or severed. You may not assign without the Publisher's consent; the Publisher may assign to affiliates, successors, or acquirers. Neither party is liable for failure due to events beyond reasonable control. Apify is an intended third-party beneficiary of Sections 4, 5, and 12. Sections 0, 4, 5, 6, 7, 10, 11, 12, 14, and 15 survive termination. English controls; translations are for convenience only.

The Publisher operates on the Apify platform under the username **UnseenUser** (https://apify.com/UnseenUser). The Publisher is a registered legal entity. Upon receipt of valid legal process directed through Apify's official channels, the Publisher's full legal identity may be disclosed as required by law.

***

### 16. ACKNOWLEDGMENT

By using the Actor, you acknowledge that you have read these Terms, you understand the architecture, you accept responsibility for your use, your indemnification obligations cover third-party claims arising from your use, disputes are resolved in Israeli courts, and the Publisher's identity can be obtained through valid legal process via Apify.

For questions, use UnseenUser's Apify profile contact form (https://apify.com/UnseenUser) before running the Actor.

***

## Actor-Specific Terms of Service Addendum - Facebook Photos Scraper

This addendum supplements the Master Terms of Service V4.0 above. By running this Actor, you accept both the Master ToS and this addendum.

#### A. Architectural Disclosure

This Actor is a software wrapper. It accepts your input parameters and returns the response data to you on the Apify platform. UnseenUser does not store, log, or substantively process the data returned.

#### B. Nature of Data Returned

This Actor returns Facebook page photo data: full-resolution image URLs, thumbnails, photo IDs, the photo page URL, and Facebook's native accessibility captions. When page context is enabled it adds page name, category and follower/like counts. Photos frequently depict identifiable people. Images of identifiable individuals are **personal data** subject to GDPR, CCPA, Israeli Privacy Protection Law (including Amendment 13), and equivalent privacy laws in your downstream processing - but **only in your hands as the data controller**, not in UnseenUser's hands as the software vendor. Facial images processed for the purpose of uniquely identifying a person can constitute biometric data under GDPR Article 9.

#### C. Permitted Use Cases

- Image dataset building - full-resolution URLs with native captions
- Visual content backup - archive a page's public photo set
- Brand imagery audit - review a page's published photos
- Vision/AI pipelines - feed images and captions into your pipelines, subject to Section G
- Competitor visual research - study published imagery
- Accessibility tooling - use native alt-text captions downstream

#### D. Specifically Prohibited Uses

In addition to Master ToS Section 4 prohibitions, you may NOT:

- Republish full-resolution images as your own (basic copyright infringement)
- Strip creator attribution before redistributing images
- Use images to build a competing image platform or stock library
- Process facial images to uniquely identify individuals (facial recognition) without a valid Article 9 lawful basis
- Train commercial AI/ML or vision models on these images without separate licensing authority
- Use images to create deepfakes or non-consensual depictions of identifiable people

#### E. Platform Terms of Service Considerations

Meta's Terms of Service prohibit automated extraction. Meta has aggressively litigated against scrapers. Your downstream use must independently comply with Meta's Terms of Service. If Meta issues a cease-and-desist regarding data obtained via this Actor, notify UnseenUser within 48 hours via the Apify profile contact form (https://apify.com/UnseenUser) and cease your use immediately.

#### F. Image Copyright - Full-Resolution Photos

Each photo is copyrighted by its creator. You may analyze images and quote/display thumbnails with attribution in limited, fair-use contexts, and use aggregated metadata (counts, captions as facts). You may NOT republish full-resolution images as your own, strip attribution, build competing image libraries, or use the images beyond analysis without explicit licensing from the rights holder. The native caption is descriptive metadata, but the image itself is a protected work.

#### G. AI Training and Vision Pipelines - Special Notice

Meta's Terms of Service prohibit using Facebook data to train AI/ML models without authorization. Images are no exception. The Publisher (UnseenUser) does NOT authorize, and has no ability to authorize, AI/vision training use. Recent litigation (Andersen v. Stability AI, Getty Images v. Stability AI, NYT v. OpenAI) shows training image and vision models on scraped content is heavily contested. Get proper licensing or do not train on these images. Your AI training use is your own legal exposure.

#### H. Images of Identifiable People - Personal Data and Biometric Caution

Page photos commonly show identifiable individuals. Treat such images as personal data: establish a lawful basis, apply data minimization (store only what you need), and set retention limits. Crucially, processing facial images for the purpose of uniquely identifying a person is biometric processing under GDPR Article 9 and requires a specific Article 9 lawful basis (and triggers heightened obligations under Israeli Amendment 13). Do not run facial recognition over these images without that basis.

#### I. Minor Protection - CRITICAL

Facebook has a significant under-18 user population, and photos may depict minors. You MUST:

- NOT use this Actor to scrape or process photos of users you know or suspect are minors
- NOT use this Actor for any product or service targeted at minors without parental-consent mechanisms compliant with COPPA (US), GDPR Article 8 (EU), and Israeli Privacy Law
- DELETE any image you discover depicts a minor unless you have valid parental consent
- NEVER use images of minors in any sexualized or exploitative context - this is illegal everywhere and strictly prohibited

If a photo or its page context suggests a subject is under 18, treat the image as depicting a minor by default. This restriction is non-negotiable.

#### J. Data Subject Rights and Cease-and-Desist Protocol

Individuals depicted in photos have rights under GDPR / CCPA / Israeli Privacy Law: access, deletion, objection, rectification, and portability. Honor these with a typical 30-day SLA. If a data subject contacts YOU directly demanding deletion of an image of them, honor it promptly, do NOT route them to UnseenUser, you may suggest they contact Meta directly since the data originates there, and document the request and your response. If Meta or a regulator contacts UnseenUser regarding your use, UnseenUser may suspend access pending investigation, and you agree to provide documentation of your lawful basis on reasonable request.

***

**Document Version:** 4.0
**Master ToS Version:** 4.0
**Last Updated:** May 5, 2026

Target keywords: facebook photos scraper, scrape facebook photos, facebook image scraper, facebook page photos, facebook photo urls, facebook alt text, facebook image dataset, bulk facebook photos.

# Actor input Schema

## `startUrls` (type: `array`):

One or more public Facebook page URLs to pull photos from. Example: https://www.facebook.com/Spurs

## `maxPhotos` (type: `integer`):

Stop after this many photos per page URL. Set to 0 to scrape every public photo the page exposes, with no upper limit. Default 0 (everything).

## `includeCaptions` (type: `boolean`):

Include Facebook's native accessibility caption (alt-text) per photo. Included free. Default true.

## `includePageContext` (type: `boolean`):

Adds page name, category and follower/like counts via the page profile lookup. Uses one extra request per page URL. Default false.

## `dateFrom` (type: `string`):

Optional. Drops photos published before this date. Leave empty to keep every photo. Filtering works only when the upstream response includes a photo creation timestamp; photos without a detectable date are dropped when this filter is on.

## `dateTo` (type: `string`):

Optional. Drops photos published after this date. Leave empty to keep every photo. Combine with dateFrom to define a range.

## `enableOcr` (type: `boolean`):

Adds enrichment.ocr\_text to every row using Google Cloud Vision. Requires the Google Cloud Vision credential field below to be filled (or the GCP\_VISION\_KEY environment variable set on the run). Google Vision costs about $1.50 per 1,000 photos and is billed to your Google Cloud account, not through Apify.

## `enableClassification` (type: `boolean`):

Adds enrichment.labels (classification labels per photo) using Google Cloud Vision. Requires GCP\_VISION\_KEY. About $1.50 per 1,000 photos, billed to your Google Cloud account.

## `enableLogoDetection` (type: `boolean`):

Adds enrichment.logos (detected brand marks per photo) using Google Cloud Vision. Requires GCP\_VISION\_KEY. About $1.50 per 1,000 photos, billed to your Google Cloud account.

## `visionBudgetUsd` (type: `integer`):

Hard ceiling on Google Cloud Vision spend for this run. When projected spend would exceed this cap, enrichment stops for remaining photos and base scraping continues. Default 10. Only matters if you turned on one of the enrichment toggles above.

## `gcpVisionKey` (type: `string`):

Paste the ENTIRE contents of your Google Cloud service-account JSON key file here (starts with an opening brace and "type": "service\_account", ends with the closing brace). Required only if you turned on any enrichment toggle above. Plain API keys DO NOT work: Google no longer accepts them for the Vision annotate endpoint. If you have a short-lived OAuth2 access token (starts with ya29.) that works too. Value is encrypted at rest by Apify and redacted in run logs. Falls back to the GCP\_VISION\_KEY environment variable when left blank. Setup steps for the service-account JSON are printed in the section description at the top of this Advanced block, and in the README under "Cloud enrichments".

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/Spurs"
  ],
  "maxPhotos": 0,
  "includeCaptions": true,
  "includePageContext": false,
  "enableOcr": false,
  "enableClassification": false,
  "enableLogoDetection": false,
  "visionBudgetUsd": 10
}
```

# Actor output Schema

## `results` (type: `string`):

One row per photo: photo\_id, full-resolution URL, thumbnail, dimensions, Facebook's native alt-text caption, and optional page-context or cloud-enrichment fields.

## `runSummary` (type: `string`):

Per-URL counts, run timing, cloud vision spend and Pay-Per-Event charge totals for this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.facebook.com/Spurs"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("unseenuser/fb-photos").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": ["https://www.facebook.com/Spurs"] }

# Run the Actor and wait for it to finish
run = client.actor("unseenuser/fb-photos").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.facebook.com/Spurs"
  ]
}' |
apify call unseenuser/fb-photos --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unseenuser/fb-photos",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/QyJaLhktZEvjnrsmA/builds/M8Zrh0uNKncKBfQD8/openapi.json
