To export Meta Ads Library ads to CSV, open the Facebook Ads Library Scraper, enter a keyword, advertiser Page ID or Ad Library search URL, and choose a country and total ad limit. Run the Actor, inspect its coverage report, then download the flat CSV. The same Actor can compare later collections and report creative changes.
Start with one advertiser and a small collection. This makes it easier to confirm that the ads belong to the business you intended before collecting several advertisers or scheduling repeat checks.
The practical workflow: identify the advertiser → collect its available public ads → review source coverage → export CSV for a spreadsheet or JSON for creative variants. Monitoring adds a complete baseline and repeat checks with the same search.
Choose a keyword search or one specific advertiser
Open the public Meta Ads Library and find the business. Review the Page name and linked website. For a repeatable competitor report, copy the advertiser's numeric Facebook Page ID or its library search URL containing view_all_page_id.
| Input | What it selects | What to check |
|---|---|---|
| Keyword, such as running shoes | Ads matching that search | Several unrelated advertisers can match. |
| Numeric Page ID | A specific advertiser Page | Use the Page ID, not an individual ad archive ID. |
| Ad Library search URL | The supported search encoded in the URL | Its supported filters override the form for that target. |
A business domain is not a verified domain-to-advertiser lookup. If you search a name as a keyword, review the returned pageId and pageName before treating the results as that company's advertising.
Run the Actor from Apify Console
- Open the Actor, choose Try for free, sign in to Apify and open its editable Input form.
- In Keywords, advertiser IDs or Ad Library URLs, replace the example with your target. Enter one target per entry.
- Choose Search country and Ad status. Keep active ads for a first current-creative collection.
- Set Maximum ads in this run to 25. This is one total cap, shared across every target.
- Keep Collect ads selected, check the current Pricing tab and set a spending limit in Run options.
- Start the run. Open the ad results and Results and issues by search before downloading.

The image shows the public read-only field reference. Enter values in the Console form reached through Try for free. The equivalent JSON below uses an example advertiser Page ID from the Actor documentation; replace it with your confirmed target.
{
"searchTerms": ["15087023444"],
"country": "US",
"activeStatus": "active",
"maxResults": 25,
"collectionMode": "collect",
"collectionStrategy": "round_robin"
}Country is the requested search scope. It does not establish actual audience reach. Historical availability depends on Meta, country and category. Use the current active/all/inactive selector rather than assuming the library provides every commercial ad ever run.
Understand the CSV and preserve creative variants
Each dataset row represents one unique ad ID in this collection. Overlapping targets do not create another row for an already saved ID. The first search that delivered it supplies searchTerm and searchTargetIndex, so attribution is not a complete list of every matching search.
| Purpose | Keep these fields |
|---|---|
| Stable identity | adId, adUrl, pageId, pageName |
| Creative review | adText, headline, description, callToAction |
| Destinations and media | landingPageUrl, imageUrl, videoUrl |
| Observation context | requestedCountry, observedAt, isActive, source dates |
| Full returned creative structure | creativeVariants, imageUrls, videoUrls in JSON |
Choose Download flat CSV for spreadsheet-friendly scalar columns. Use JSON when an ad has multiple cards, images or videos. Primary copy can come from the first returned creative card when top-level text is absent or templated. Returned variant counts describe what was supplied, not every creative variation in existence.
Keep ad and Page IDs as text when importing into Excel or Sheets. Media are source links, not downloaded files or permanent hosting. Missing spend or reach values remain missing; the Actor does not infer conversions, ROAS or private campaign metrics.
Collect several targets and continue unfinished batches
The Actor accepts up to 50 unique targets. The default round-robin strategy takes one page per unfinished target in turn. Sequential mode finishes earlier targets first. Neither guarantees equal ad counts: overlapping IDs, source page sizes and the shared cap all affect delivery.
- Read
TARGET_REPORTfor each target's status, delivered IDs, duplicates and stop reason. - Read
RUN_SUMMARYfor overall completion and budget or resource limits. - Open Continue collecting: next input. If unfinished work remains, copy
PAGINATION.nextInputinto a new run after the previous one finishes. - Keep targets and filters unchanged. Adjust the supported result cap, collection strategy or safeguards if necessary.
- Combine each batch's dataset. Later batches contain newly delivered ads, rather than copies of previous rows.
Paid input allows up to 100,000 ads per run, subject to spending and source limits. Free accounts have a 100-ad ceiling across the continuation chain. These are ceilings, not a guarantee that the source has that many ads. A retry cannot guarantee recovery from source restrictions or an expired cursor.
Monitor the same advertiser over time
Switch Collection mode to Monitor advertiser or search changes. Save a Task and schedule it in Apify. A saved Task supplies a stable identity; for manual or API checks, set a stable monitorKey. Keep searches and filters fixed, and avoid overlapping runs of one monitor.
The first complete collection establishes BASELINE. Later observations can be NEW, UPDATED or UNCHANGED. The separate CHANGES record includes the comparison. Only a complete collection replaces the baseline; a partial check must be completed through continuation.
For example, Monday's complete snapshot contains ads A and B. Friday's complete snapshot contains A and C. C is newly observed, while B may be NOT_OBSERVED. That means B was absent from this completed search. It does not prove the ad ended. A capped Friday collection cannot establish the same comparison.
Current monitor observations, including unchanged ads, are billed as saved ads. Changes and diagnostic records are separate. Check the live pricing before choosing a schedule, especially when collecting the same large advertiser repeatedly.
Run Meta ad research through Apify MCP and your AI agent
Add https://mcp.apify.com as a remote MCP connection in a compatible agent and authorize your Apify account. Follow the Apify MCP setup guide for your client. Then give the agent the specific Actor, confirmed advertiser and a small spending cap.
Use Apify MCP and inspect the schema for
x_guru/facebook-ads-library-monitor.
Collect 25 active US ads for Page ID
15087023444, which I have reviewed.
Use collect mode. Set
callOptions.maxTotalChargeUsd to 0.25.
Read RUN_SUMMARY and TARGET_REPORT.
Export all saved rows to CSV; preserve
creative variants in a separate JSON.
Report incomplete targets and nextInput.
Do not start another paid batch or
schedule monitoring automatically.Replace the example Page ID. The agent should inspect with fetch-actor-details, start with call-actor, check unfinished runs with get-actor-run, and page through get-dataset-items. Read reports using get-key-value-store-record. A run ID alone is not an exported result.
Resolve empty results and choose the next step
- Wrong advertiser: review the Page ID and source URL; keywords can match other businesses.
- Few ads: inspect target completion and the stop reason before raising the limit.
- Missing copy or media: inspect JSON variants and the source ad. Source fields and signed links may be unavailable.
- Unsupported pasted filters: use supported form controls. Direct single-ad URLs and unsupported URL parameters are rejected.
- Need official API access: review Meta's Ad Library API for its supported scope.
For another advertising source, see Google Ads Transparency export and monitoring. To build your own export integration, use the Actor run and Dataset guide. The Actor directory keeps each source and workflow separate.



