# Meta Ads

> Search Meta's public Ad Library by keyword, advertiser or Facebook Page, and get each ad's copy, call to action, images and videos as JSON for AI nodes.

Source: https://nodaro.ai/docs/nodes/automate/meta-ads

The **Meta Ads** node searches Meta's public Ad Library and returns the matching Facebook and Instagram ads as a JSON list. Each ad carries the advertiser's Page, the ad copy, headline, call to action, landing link, image and video links, run dates and whether it is still active. Wire the list into a [Generate Text - Any LLM](https://nodaro.ai/docs/nodes/automate/prompt) node for competitive analysis, or into [Extract Field](https://nodaro.ai/docs/nodes/automate/extract-field) to run one generation per ad.

- Found in: Automate › Get Content
- API type: `meta-ads-scrape`

## When to use it
- Research how competitors advertise a product category, with a keyword search.
- Follow the newest creatives of a specific brand, by advertiser or Facebook Page.
- Start a creative workflow from real ad copy and visuals, then remix them.
- Send yourself a recurring digest of new ads, with a [Schedule Trigger](https://nodaro.ai/docs/nodes/automate/schedule-trigger).

## Quick start
### Add the node

Press Tab on the canvas and choose **Automate › Get Content › Meta Ads**.

### Choose what to search

Open the settings panel and choose **Search by**: **Keyword**, **Advertiser** or **Facebook pages**. Fill in the keyword, pick the advertisers, or paste the Page addresses.

### Set the filters

Set **Ads per source**, **Period** and **Ad status**. The **Run** button shows the price of the request.

### Run it and use the ads

Click **Run**. The node card shows one ad at a time, and the **Results** tab lists them all. Connect the **JSON** output to a [Generate Text - Any LLM](https://nodaro.ai/docs/nodes/automate/prompt) node or to [Extract Field](https://nodaro.ai/docs/nodes/automate/extract-field).

Workflow: Every Monday the Schedule Trigger runs the workflow: Meta Ads pulls the new ads of three competitors, a Generate Text - Any LLM node summarizes them, and Telegram Post sends the summary.

- Meta Ads → Generate Text - Any LLM (prompt)
- Generate Text - Any LLM → Telegram Post

## Search by

| Mode | What you give it | What it does |
| --- | --- | --- |
| **Keyword** | A **Keyword**, up to 100 characters | Searches the words inside the ads, not the advertiser's name. |
| **Advertiser** | Up to 5 **Advertisers** | Type an advertiser's name, click **Find** and pick the right Facebook Page from the matches. The verified Page is usually the right one. The run pulls only those advertisers' ads. The lookup costs no credits. |
| **Facebook pages** | Up to 5 **Facebook Page URLs** | One Page address per line, such as `https://www.facebook.com/nike`. `https://` is optional. An advertiser's Ad Library link also works. |

The **Keyword** and **Facebook Page URLs** fields accept `{}`. The text of a node connected to the **Keyword / Page URLs** input replaces `{}`, so a [Text](https://nodaro.ai/docs/nodes/automate/text) or [List](https://nodaro.ai/docs/nodes/automate/list) node can drive the search.

In **Advertiser** mode, you can also connect a Text or List node to the input instead of picking advertisers. Each line is then matched to a Facebook Page when the node runs: the verified match, or else the first match. The result lists the Pages it found in `resolvedAdvertisers`.

## Settings
| Setting | Default | What it does |
| --- | --- | --- |
| **Ads per source** | 20 | How many ads to return for the keyword or for each Page, from 1 to 100. |
| **Period** | **Last 30 days** | **Last 24 hours**, **Last 7 days**, **Last 30 days** or **All time**, by the ad's start date. |
| **Ad status** | **Active** | **Active**, **Inactive** or **All**. |
| **Country** | **All countries** | Or one country, to keep only the ads delivered there. |
| **Platforms** | No filter | Keep only the ads delivered on the platforms you select: Facebook, Instagram, Audience Network, Messenger, WhatsApp and Threads. No selection, or all six, means no filter. |
| **Creative format** | No filter | Keep only the ads whose creative is **Vertical · phone**, **Square** or **Horizontal · web**, measured from the creative's own pixels. Fewer ads than requested may come back. |
| **AI analysis** | Off | Reads every returned ad as an expert ad analyst: asset type, format, visual hooks, audiences, graphic identity, copywriting hooks, selling points, call to action and a summary. Choose the **Analysis model** and an optional **Focus (optional)** line, for example what you sell. |
| **Copy all videos to your library** | Off | Copies the video of every returned ad into your library, not only the featured ad's video. |

## Inputs
| Input | Required | What to connect |
| --- | --- | --- |
| **Keyword / Page URLs** | No | Text: a keyword in **Keyword** mode, Page addresses one per line in **Facebook pages** mode, or advertiser names one per line in **Advertiser** mode. |

## Outputs
| Output | What it carries |
| --- | --- |
| **JSON** | The whole list of ads. Run a node once per ad with a [List](https://nodaro.ai/docs/nodes/automate/list) node or [Extract Field](https://nodaro.ai/docs/nodes/automate/extract-field). |
| **Ad copy** | The featured ad's headline and body copy. |
| **Creative image** | The featured ad's first image, or its video poster. |
| **Creative video** | The featured ad's first video. |

The featured ad is the one shown on the node card. Choose it with the thumbnail strip, the ‹ › arrows or a click on a row in the **Results** tab. A workflow run features the first returned ad.

Each ad in the **JSON** output has these fields:

```json
{
"adArchiveId": "866569929827744",
"adLibraryUrl": "https://www.facebook.com/ads/library/?id=866569929827744",
"pageName": "Nike",
"pageId": "15087023444",
"startDate": "2026-09-01T07:00:00.000Z",
"endDate": null,
"isActive": true,
"platforms": ["FACEBOOK", "INSTAGRAM"],
"text": "Just do it.",
"title": "Air Max",
"caption": "nike.com",
"ctaText": "Shop now",
"linkUrl": "https://nike.com/airmax",
"images": ["https://…/creative.jpg"],
"videos": ["https://…/creative.mp4"],
"videoPreviews": ["https://…/poster.jpg"],
"collationCount": 3
}
```

Each ad also has a `format` and a `creatives` list, with the kind, link, size and format of each creative. When AI analysis is on, each analysed ad has an `analysis` object with the analyst's findings.

## Results

The node card features one ad: its creative, advertiser, headline, copy, format, platforms, run dates and call to action. The **Results** tab of the settings panel lists every ad, in a **List**, **Grid** or **Raw JSON** view, and can filter them by format. Every row links to the ad's own page in the Ad Library.

A run that returns nothing, or fails, keeps the previous good results on the node. When you change an input, those results are marked as stale until the next run.

## Creatives in your library

Meta's image and video links expire within days. After every run, the node copies each returned ad's images and video posters into your library. They count toward your storage, and they stay out of the media picker until you click **Save to library** on an ad.

The featured ad's video is copied only when the **Creative video** output is connected, because videos are large. Turn on **Copy all videos to your library** to copy the video of every returned ad. When your storage is full, the ads keep their original Meta links, which expire, and the run still succeeds. Use those creatives in the same workflow rather than keeping the links.

## Credits
The price depends on the number of ads you request: **Ads per source** times the number of sources, rounded up to the next tier. A keyword search is one source, and each Page or picked advertiser is one source. The **Run** button on the node shows the exact price before you run it.

- **The requested batch is charged.** A narrow period or a quiet keyword may return fewer ads than requested.
- **AI analysis adds a charge for every ad**, by the tier of the analysis model: economy, standard or premium. It is reserved for the whole requested batch and settled for the ads actually analysed. An ad the model failed on, or one that a long run had no time left for, is refunded.
- **Advertisers from the input.** When a Text or List node supplies the advertiser names, the number of sources is known only when the node runs. Until then, the estimate on the node assumes one source.
- **The advertiser lookup is free.**

On a self-hosted install, the Meta Ads node needs the web-scraping key described in [Provider keys](https://nodaro.ai/docs/self-hosting/provider-keys), or a [connection to Nodaro Cloud](https://nodaro.ai/docs/self-hosting/cloud-connect).

## Tips
- **Study retired creatives.** Set **Ad status** to **Inactive** with a long period to see the ads an advertiser has already stopped.
- **Fan out per ad.** Use Extract Field on `images` or `text` before a List node to run one generation per ad.
- **Use the video posters.** The `videoPreviews` of a brand's video ads make good reference frames for new concepts.

## Troubleshooting
| Problem | Cause and fix |
| --- | --- |
| A keyword returns ads from the wrong brands. | **Keyword** searches the words inside the ads, not the advertiser. Use **Advertiser** or **Facebook pages** to follow one brand. |
| **Find** shows no advertiser. | Try the exact name of the brand's Facebook Page. |
| Fewer ads came back than requested. | The period, the status or the **Creative format** filter left fewer matching ads. Widen the period or remove a filter. |
| A creative link stopped working. | It was a Meta link that expired, because the creative could not be copied into your library, for example when your storage was full. Run the node again. |

## From the API
`POST /v1/meta-ads-scrape` runs the node from code. The API has two modes, keyword search and Pages: send a picked advertiser as its Facebook Page address. A run that copies every video and analyses every ad often takes longer than the limit of about 100 seconds on a single HTTP request, so send `"respondAsync": true`. The call then answers at once with a `jobId`, and you read the ads from the completed job with `GET /v1/jobs/:id`.

Without the flag, the request stays open until the run is done. A run that outlasts the request limit is cut off on the way back, although the job completes and is charged. See [Run a single node](https://nodaro.ai/docs/developers/api/nodes) and [Jobs](https://nodaro.ai/docs/developers/api/jobs).

## Frequently asked questions

### What does the Meta Ads node return?

A JSON list of ads from Meta's public Ad Library. Each ad has the advertiser's Page, the ad copy, headline, call to action, landing link, image and video links, run dates and whether it is still active.

### Can I see the ads of one specific brand?

Yes. Set Search by to Advertiser, type the brand's name, click Find and pick its Facebook Page, up to 5 advertisers. Or set Search by to Facebook pages and paste up to 5 Page addresses, one per line.

### How much does the Meta Ads node cost?

The price depends on how many ads you request, Ads per source times the number of sources, rounded up to a tier. AI analysis adds a charge for every ad, by the tier of the analysis model. The Run button shows the exact price.

### Why did I get fewer ads than I asked for?

A narrow period, a quiet keyword or a Creative format filter can find fewer ads than requested. The run is charged for the requested batch.

### Do the image and video links expire?

Meta's own links expire within days. After each run, the node copies each ad's images and video posters into your library, so the links in the result keep working. Videos are copied for the featured ad when the video output is connected, or for every ad when you turn that on.
