# Facebook Ad Details Scraper (by Ad ID) (`sfoln/facebook-ad-lookup`)

Get full details of Facebook and Instagram ads by Ad Library ID or URL: advertiser, dates, platforms, ad text, CTA, landing URL, media, EU reach and targeting, plus an optional video transcript. $5 per 1,000 ads; transcripts $4 per 1,000.

- Family: Ad intelligence
- Categories: Social media, Lead generation, Ecommerce
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: Facebook Ad Details Scraper (by Ad ID) (sfoln/facebook-ad-lookup)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/facebook-ad-lookup.json
- MCP: https://mcp.apify.com?tools=sfoln/facebook-ad-lookup
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~facebook-ad-lookup/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~facebook-ad-lookup/runs

Facebook Ad Details Scraper (by Ad ID) looks up Facebook and Instagram ads by Ad Library ID or URL and returns one clean record per ad: advertiser page, active status, start/end dates, platforms, ad text, headline, call to action, landing URL, media type, image and video URLs, and – for ads shown in the EU or political/issue ads – reach, targeted age/gender/locations, payer/beneficiary and the reach breakdown by country, age and gender. Optionally add a transcript of the ad's video. Built for ad intelligence tools, agencies, researchers and AI agents that already have ad IDs (for example from the Facebook Ads Library Scraper).

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| Facebook ad record (`facebook-ad-looked-up`) | $0.005 | $5 / 1,000 | Charged once per ad whose details were returned from the Meta Ad Library. A not-found ad is not charged unless the provider billed the lookup; invalid inputs and failed requests are not charged. |
| Facebook ad video transcript (`facebook-ad-transcript`) | $0.004 | $4 / 1,000 | Charged once per ad for which a video transcript was requested (includeTranscript, paid plans only) and actually returned. Ads without video or without a transcript are not charged. |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~facebook-ad-lookup/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"adIds":["1185617869915074"]}'
```

MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/facebook-ad-lookup"
    }
  }
}
```

Example prompt: Look up the Facebook ad with Ad Library ID 1185617869915074 and tell me its advertiser, ad text, call to action, landing page and start date.

## Input

Paste Meta Ad Library ad IDs or URLs. Each ad produces one dataset record with a `status` field.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `adIds` (required) | array | — | Ad archive IDs or Ad Library URLs: Ad archive IDs (e.g. 1185617869915074) or Ad Library URLs such as https://www.facebook.com/ads/library/?id=1185617869915074, one per line. Accounts on the Apify free plan can process up to 10 ads per run. |
| `includeTranscript` | boolean | `false` | Include video transcript: Also return a transcript of the ad's video (native captions, or AI transcription for videos up to 2 minutes). Charged separately only when a transcript is returned. |
| `maxItems` | integer | `1000` | Max ads: Safety cap on how many ads are looked up in this run. |
| `concurrency` | integer | `4` | Concurrency: Ads looked up in parallel (1–8). |
| `itemTimeoutSecs` | integer | `240` | Time limit per ad (seconds): Maximum time for one ad lookup, including the optional transcript (60–900). |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach the unmodified upstream payload to each record under `raw` (larger output). |

Example input:

```json
{
  "adIds": [
    "1185617869915074"
  ]
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The input query this record belongs to. |
| `status` | string | Status: ok \| not_found \| error \| skipped_invalid \| skipped_budget \| skipped_free_plan |
| `charged` | boolean | Charged: Whether this record incurred a pay-per-event charge. |
| `chargedEvent` | string | Charged event: Pay-per-event event charged for this record. |
| `source` | string | Source: Upstream data source (scrapecreators = ScrapeCreators API over the public ad library). |
| `fetchedAt` | string | Fetched at: ISO timestamp. |
| `error` | object | Error: code / message when status is not ok. |
| `warnings` | array | Warnings: Non-fatal notes (e.g. stopped early). |
| `adArchiveId` | string | null | Ad archive ID: Meta Ad Library ID of the ad. |
| `adLibraryUrl` | string | null | Ad Library URL: Public Ad Library link to the ad (snapshot). |
| `pageId` | string | null | Page ID: Advertiser's Facebook page ID. |
| `pageName` | string | null | Page name: Advertiser's page name. |
| `pageUrl` | string | null | Page URL: Advertiser's Facebook page. |
| `pageLikeCount` | integer | null | Page likes: Page like count at fetch time. |
| `pageCategories` | array | Page categories: Page categories. |
| `isActive` | boolean | null | Active: Ad is currently running. |
| `startDate` | string | null | Start date: ISO date the ad started running. |
| `endDate` | string | null | End date: ISO date the ad stopped (or last seen) running. |
| `totalActiveTimeSecs` | integer | null | Active time (s): Total active time in seconds when reported. |
| `platforms` | array | Platforms: Publisher platforms: facebook, instagram, audience_network, messenger, threads. |
| `adText` | string | null | Ad text: Primary text (body) of the ad; first card's body for multi-version ads. |
| `headline` | string | null | Headline: Link title / headline. |
| `linkDescription` | string | null | Link description: Text under the headline. |
| `linkUrl` | string | null | Landing URL: Destination link. |
| `displayUrl` | string | null | Display URL: Domain shown on the ad (caption). |
| `ctaText` | string | null | CTA text: Call-to-action button text. |
| `ctaType` | string | null | CTA type: Call-to-action code, e.g. SHOP_NOW, LEARN_MORE. |
| `mediaType` | string | null | Media type: image \| video \| multi_images \| carousel \| dco \| dpa \| text … |
| `imageUrls` | array | Image URLs: Creative images (original resolution where available). |
| `videoUrls` | array | Video URLs: Creative videos (HD where available). |
| `thumbnailUrl` | string | null | Thumbnail: Video preview image or resized first image. |
| `cardCount` | integer | null | Cards: Number of carousel / version cards. |
| `collationCount` | integer | null | Versions: Number of ad versions grouped under this ad (search results only; usually null for a lookup). |
| `languages` | array | Languages: Ad languages when the library reports them. |
| `impressionsText` | string | null | Impressions: Impressions range text when Meta discloses it (political / EU ads). |
| `reachEstimate` | integer | null | Reach estimate: Estimated reach when disclosed. |
| `spendLower` | number | null | Spend (lower): Lower spend bound when disclosed (political ads). |
| `spendUpper` | number | null | Spend (upper): Upper spend bound when disclosed. |
| `currency` | string | null | Currency: Currency of the spend bounds. |
| `targetedCountries` | array | Targeted countries: Targeted / reached or political countries when reported. |
| `targetsEu` | boolean | null | Targets EU: EU transparency data present. |
| `euTotalReach` | integer | null | EU reach: Total EU reach. |
| `audienceAgeMin` | integer | null | Audience age min: Targeted minimum age. |
| `audienceAgeMax` | integer | null | Audience age max: Targeted maximum age. |
| `audienceGender` | string | null | Audience gender: Targeted gender. |
| `audienceLocations` | array | Audience locations: Targeted locations. |
| `payers` | array | Payers: Who paid for the ad (EU transparency; ad details only). |
| `beneficiaries` | array | Beneficiaries: Who benefits from the ad (EU transparency; ad details only). |
| `reachBreakdown` | array | Reach breakdown: EU reach by country / age range / gender. |
| `transcript` | string | null | Transcript: Video transcript (only with includeTranscript; null when none). |
| `transcriptCharged` | boolean | null | Transcript charged: facebook-ad-transcript was charged for this record. |

Example record:

```json
{
  "input": "https://www.facebook.com/ads/library/?id=702369045530963",
  "adArchiveId": "702369045530963",
  "adLibraryUrl": "https://www.facebook.com/ads/library?id=702369045530963",
  "pageId": "166258896830103",
  "pageName": "Porto Montenegro",
  "pageUrl": "https://www.facebook.com/61575286107814/",
  "pageCategories": [
    "Marina"
  ],
  "isActive": false,
  "startDate": "2025-05-22T07:00:00.000Z",
  "endDate": "2025-05-23T07:00:00.000Z",
  "totalActiveTimeSecs": 41782,
  "platforms": [
    "facebook",
    "instagram",
    "audience_network"
  ],
  "adText": "Reflections ripple, light gathers,\nand tomorrow brings a new rhythm to the square.\n\nOne day until the Grand Opening of Boka Place.",
  "headline": null,
  "linkUrl": "https://www.portomontenegro.com/attractions-events/boka-place-grand-opening/",
  "displayUrl": "www.portomontenegro.com",
  "ctaText": "Learn more",
  "ctaType": "LEARN_MORE",
  "mediaType": "video",
  "videoUrls": [
    "https://video.xx.fbcdn.net/…hd.mp4"
  ],
  "thumbnailUrl": "https://scontent.xx.fbcdn.net/…jpg",
  "targetsEu": true,
  "euTotalReach": 1657,
  "audienceAgeMin": 18,
  "audienceAgeMax": 65,
  "audienceGender": "All",
  "audienceLocations": [
    "Dubrovnik, Croatia"
  ],
  "payers": [
    "Porto Montenegro"
  ],
  "beneficiaries": [
    "Porto Montenegro"
  ],
  "reachBreakdown": [
    {
      "country": "HR",
      "ageRange": "25-34",
      "male": 374,
      "female": 238,
      "unknown": 8
    }
  ],
  "transcript": "One day until the grand opening of Boka Place…",
  "transcriptCharged": true,
  "status": "ok",
  "charged": true,
  "chargedEvent": "facebook-ad-looked-up",
  "source": "scrapecreators",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}
```

## Related

- [Ad Library Scraper – Meta, Google & TikTok](https://www.sfoln.com/actors/ad-library-scraper.md) (`sfoln/ad-library-scraper`)
- [Facebook Ads Library Scraper](https://www.sfoln.com/actors/facebook-ads-search.md) (`sfoln/facebook-ads-search`)
- [Google Ads Transparency Scraper](https://www.sfoln.com/actors/google-ads-transparency.md) (`sfoln/google-ads-transparency`)
- [LinkedIn Ads Library Scraper](https://www.sfoln.com/actors/linkedin-ads-search.md) (`sfoln/linkedin-ads-search`)
- [TikTok Ads Library Scraper](https://www.sfoln.com/actors/tiktok-ads-search.md) (`sfoln/tiktok-ads-search`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
