# Facebook Photo Details Scraper – Captions & Tags (`scrapingmonkey/facebook-photo-details-scraper`) Actor

Extract public Facebook photo details from URLs. Get image links, captions, owner data, engagement, visible tags, album identifiers, and associated post context in one flat record.

- **URL**: https://apify.com/scrapingmonkey/facebook-photo-details-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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

Turn a public Facebook photo URL into a detailed record of the image and its context. **Facebook Photo Details Scraper** returns image URLs, caption, owner, engagement, album identifiers, visible tags, nearby photo links, and associated post data when available.

It is designed for selected photo links that need more context than a Page photo listing provides. Each resolved photo stays in one row, with the same flat fields in the table and JSON. No Facebook login or cookies are required.

| At a glance | Details |
|---|---|
| 📥 Input | Facebook photo URLs containing a photo ID |
| 📤 Output | Image, caption, owner, engagement, tags, album, and post context |
| 🔐 Login required | No |
| 📄 Scope | Selected photos; no album pagination |
| 💾 Delivery | One table, one row per resolved photo |

### What the Facebook photo details scraper extracts 🔎

The Actor resolves a photo and combines its image details with the public context Facebook provides. That can include caption text, reactions and reaction types, comment and share counts, people and product tags, album identifiers, and previous or next photo references.

Associated post fields retain the post message, author, engagement, and media attachments. They provide context for the selected photo; they do not trigger an additional crawl of the album, adjacent photos, or comments.

### How to scrape Facebook photo details 🚀

1. Copy full Facebook photo URLs containing a photo ID.
2. Add the URLs to `inputList`.
3. Run the Actor and filter results by `status`.
4. Export photo records or join them to your existing dataset by ID.

```json
{
  "inputList": [
    "https://www.facebook.com/photo/?fbid=1100421822647027"
  ]
}
```

Use a Facebook photo page URL rather than a direct image CDN link or a bare photo ID.

### Photo details data fields and output 📦

| Field group | Included data |
|---|---|
| Photo and image | ID, URL, image and thumbnail URLs, alternative text, dimensions, publication time |
| Caption and engagement | Caption, post reference, reactions, comments, shares, reaction breakdown |
| Owner and tags | Owner identity, tagged people and positions, product tag references |
| Album navigation | Album ID and type, previous and next photo IDs and URLs |
| Associated post | Message, author, engagement, state flags, reactions, media attachments |

Complete illustrative success row. Harbor Workshop and the media URLs below are examples, not a live run.

```json
{
  "input": "https://www.facebook.com/photo/?fbid=123456789012346",
  "status": "success",
  "id": "123456789012346",
  "url": "https://www.facebook.com/photo/?fbid=123456789012346",
  "type": "photo",
  "image_url": "https://example.com/media/workshop-open-day.jpg",
  "thumbnail_url": "https://example.com/media/workshop-open-day-thumb.jpg",
  "alt_text": "Visitors making a wooden stool at the workshop open day.",
  "width": 1200,
  "height": 800,
  "timestamp": 1788256800,
  "published_at": "2026-09-01T10:00:00Z",
  "owner.id": "100012345678901",
  "owner.page_id": "100012345678901",
  "owner.username": "harborworkshop",
  "owner.name": "Harbor Workshop",
  "owner.url": "https://www.facebook.com/harborworkshop/",
  "owner.profile_picture_url": "https://example.com/media/harbor-workshop.jpg",
  "owner.is_verified": false,
  "caption": "Join our Saturday open day for a tour and a hands-on woodworking session.",
  "post_id": "123456789012345",
  "post_url": "https://www.facebook.com/harborworkshop/posts/123456789012345/",
  "album_id": "123456789012340",
  "album_type": "Album",
  "reactions_count": 24,
  "comments_count": 7,
  "shares_count": 3,
  "reactions.id": [
    "1635855486666999",
    "1678524932434102"
  ],
  "reactions.type": [
    "Like",
    "Love"
  ],
  "reactions.count": [
    18,
    6
  ],
  "tags.id": [
    "100098765432101"
  ],
  "tags.page_id": [
    ""
  ],
  "tags.username": [
    "alex.morgan.example"
  ],
  "tags.name": [
    "Alex Morgan"
  ],
  "tags.url": [
    "https://www.facebook.com/alex.morgan.example/"
  ],
  "tags.profile_picture_url": [
    "https://example.com/media/alex-morgan.jpg"
  ],
  "tags.is_verified": [
    false
  ],
  "tags.x": [
    25
  ],
  "tags.y": [
    50
  ],
  "product_tags.id": [],
  "product_tags.name": [],
  "product_tags.url": [],
  "previous_photo.id": "123456789012344",
  "previous_photo.type": "photo",
  "previous_photo.url": "https://www.facebook.com/photo/?fbid=123456789012344",
  "next_photo.id": "123456789012348",
  "next_photo.type": "photo",
  "next_photo.url": "https://www.facebook.com/photo/?fbid=123456789012348",
  "post.id": "123456789012345",
  "post.story_id": "S:100012345678901:123456789012345",
  "post.url": "https://www.facebook.com/harborworkshop/posts/123456789012345/",
  "post.type": "carousel",
  "post.message": "Join our Saturday open day for a tour and a hands-on woodworking session.",
  "post.timestamp": 1788256800,
  "post.published_at": "2026-09-01T10:00:00Z",
  "post.reactions_count": 24,
  "post.comments_count": 7,
  "post.shares_count": 3,
  "post.views_count": 0,
  "post.image_url": "https://example.com/media/workshop-open-day.jpg",
  "post.thumbnail_url": "https://example.com/media/workshop-open-day-thumb.jpg",
  "post.video_url": "",
  "post.feedback_id": "ZmVlZGJhY2s6MTIzNDU2Nzg5MDEyMzQ1",
  "post.is_sponsored": false,
  "post.is_pinned": true,
  "post.author.id": "100012345678901",
  "post.author.page_id": "100012345678901",
  "post.author.username": "harborworkshop",
  "post.author.name": "Harbor Workshop",
  "post.author.url": "https://www.facebook.com/harborworkshop/",
  "post.author.profile_picture_url": "https://example.com/media/harbor-workshop.jpg",
  "post.author.is_verified": false,
  "post.reactions.id": [
    "1635855486666999",
    "1678524932434102"
  ],
  "post.reactions.type": [
    "Like",
    "Love"
  ],
  "post.reactions.count": [
    18,
    6
  ],
  "post.media.id": [
    "123456789012346",
    "123456789012347"
  ],
  "post.media.type": [
    "photo",
    "video"
  ],
  "post.media.url": [
    "https://www.facebook.com/photo/?fbid=123456789012346",
    "https://www.facebook.com/harborworkshop/videos/123456789012347/"
  ],
  "post.media.image_url": [
    "https://example.com/media/workshop-open-day.jpg",
    "https://example.com/media/workshop-tour-cover.jpg"
  ],
  "post.media.thumbnail_url": [
    "https://example.com/media/workshop-open-day-thumb.jpg",
    "https://example.com/media/workshop-tour-thumb.jpg"
  ],
  "post.media.video_url_hd": [
    "",
    "https://example.com/media/workshop-tour-hd.mp4"
  ],
  "post.media.video_url_sd": [
    "",
    "https://example.com/media/workshop-tour-sd.mp4"
  ],
  "post.media.dash_manifest_url": [
    "",
    ""
  ],
  "post.media.dash_manifest": [
    "",
    ""
  ],
  "post.media.duration_ms": [
    0,
    15000
  ],
  "post.media.width": [
    1200,
    1920
  ],
  "post.media.height": [
    800,
    1080
  ],
  "post.media.alt_text": [
    "Visitors making a wooden stool at the workshop open day.",
    "A short tour of the workshop."
  ],
  "post.media.captions_url": [
    "",
    "https://example.com/media/workshop-tour.vtt"
  ]
}
```

The table and JSON contain identical flat keys, such as `owner.name` and `post.author.name`. Repeated fields use aligned lists: the first values in `tags.id`, `tags.name`, and `tags.x` describe the same tag. Media lists retain attachment order. Nested lists retain their dimensions, and missing positions are not shifted.

Optional data can be empty, zero, false, or null. A failed row retains `input`, sets `status` to `failed`, and sets all photo-data columns to null.

### Input requirements and coverage ⚙️

| Parameter | Type | Required | Rules |
|---|---|---|---|
| `inputList` | Array of strings | Yes | At least one Facebook photo URL containing a photo ID |

Supported inputs include `photo/?fbid=ID`, `photo.php?fbid=ID`, and Facebook photo paths containing a numeric photo ID. Use complete URLs from `facebook.com`, `www.facebook.com`, `m.facebook.com`, or `web.facebook.com`. Bare IDs, direct image links, and unrelated websites are not valid photo inputs.

There is no pagination parameter. Duplicate requests for the same photo ID are deduplicated. An invalid URL can produce a failed row without stopping valid photo inputs in the same run.

### Facebook photo detail use cases 🎯

#### Photo catalog enrichment

Add captions, ownership, publication data, and engagement to photo links discovered in a Page collection.

#### Campaign asset analysis

Connect an image to its parent message and other attachments so the creative can be reviewed in context.

#### Tagged content research

Inspect visible people and product references while retaining their positions and association with the selected photo.

#### Content reference libraries

Store stable IDs and photo links alongside album and adjacent-photo references for later authorized review.

### Pricing and billable photo rows 💰

Check the Actor's **Pricing** tab for the active model and rate. Under dataset-item pricing, each saved success or failed row can be billable. A selected photo produces one result row; tags, post attachments, and adjacent-photo references remain within that row.

Invalid, unavailable, or unresolved inputs can save failed rows. Automatic retries do not independently add rows. Following another photo URL requires another requested photo result.

### Facebook photo details API and integrations 🔌

Replace `$ACTOR_ID` with the ID from the Actor's API tab and `$APIFY_TOKEN` with your Apify token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["https://www.facebook.com/photo/?fbid=1100421822647027"]}'
```

Combine Page Photos Scraper for discovery with this Actor for enrichment. Apify schedules, webhooks, and integrations can deliver records to spreadsheets, Make, Zapier, storage, or a content database.

### Reliability and limits ⚠️

Temporary request failures are retried. Deleted, private, restricted, or login-gated photos may not be retrievable. Facebook may omit tags, album references, counts, or parent-post details even when the image is public.

Direct media URLs can expire. The Actor returns references rather than downloading files. Previous and next photo links are navigation data, not a guarantee that those photos are accessible.

### Frequently asked questions ❓

#### Can I pass a bare photo ID?

No. Submit a Facebook photo URL, such as `https://www.facebook.com/photo/?fbid=1100421822647027`.

#### Does it collect the entire album?

No. It returns the selected photo, available album identifiers, and adjacent-photo references. It does not paginate the album.

#### Does it return the original image file?

It returns the image URL and dimensions exposed by Facebook. It does not download the file or guarantee an original-resolution source.

#### Are people tags separate rows?

No. Tags use aligned lists in the photo row, including names, profile links, and positions when available.

#### How do I collect comments on the photo's post?

Send the photo or associated post URL to Facebook Post Comments Scraper. This Actor includes comment counts, not comment text.

### Support, responsible use, and related actors 🛟

For support, share the run ID, a safe public photo URL, and the field or result that differs from your expectation. Keep credentials private.

Use photo data lawfully and respect privacy, copyright, and applicable platform terms.

# Actor input Schema

## `inputList` (type: `array`):

Add one full Facebook photo URL containing a photo ID per item. Every input produces success or failed output.

## Actor input object example

```json
{
  "inputList": [
    "https://www.facebook.com/photo/?fbid=1100421822647027"
  ]
}
```

# Actor output Schema

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

Actor dataset results with input and status columns.

# 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 = {
    "inputList": [
        "https://www.facebook.com/photo/?fbid=1100421822647027"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/facebook-photo-details-scraper").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 = { "inputList": ["https://www.facebook.com/photo/?fbid=1100421822647027"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/facebook-photo-details-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "inputList": [
    "https://www.facebook.com/photo/?fbid=1100421822647027"
  ]
}' |
apify call scrapingmonkey/facebook-photo-details-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapingmonkey/facebook-photo-details-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/HQRhciWJg7X1t4O8y/builds/A4oZy2Qka2feOnVij/openapi.json
