Search Meta Ad Library
adsap_search_ad_librarySearch Meta's public Ad Library for ads (competitor research / ad transparency). Find the ads a competitor page is currently running, or ads matching a keyword, in given countries. Returns each ad's page, creative text, platforms, languages, delivery dates, days_running, eu_total_reach (people reached in the EU: with days_running, the public signal of which ads an advertiser is scaling), a public Ad Library permalink, and a pagination cursor. Filters: media_type (STATIC for image ads only, VIDEO for video only), exact-phrase matching, platform, language, delivery dates. A keyword search also returns data.pages, the distinct advertisers found, so you can re-run on one page_id. Read-only public data (not your own account's ads — use adsap_list_campaigns/adsap_get_insights for that). COVERAGE CEILING (Meta's rule, not ADSAP's): the public Ad Library API returns ordinary commercial ads ONLY where they reached the EU or UK. Ads that never reached the EU/UK are returned only when they are political or social-issue ads. So a US-only (or any non-EU/UK) commercial search returns zero results however it is phrased, and that empty result is NOT evidence the advertiser is inactive. Never promise non-EU/UK competitor research from this tool; point the user at the public Ad Library website for those markets.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Pagination cursor from a previous response's meta.paging_after, to fetch the next page. Re-send the SAME filters with it (a cursor from a media_type STATIC search only works with media_type STATIC). | |
| limit | No | Max ads to return per page. Default 25, max 50 (Meta's cap). Meta can return fewer than asked even when more exist: trust meta.has_next, not the count. | |
| ad_type | No | Category of ads. Default ALL (all commercial ads). Use POLITICAL_AND_ISSUE_ADS etc. for the special transparency categories. CREDIT_ADS is the old name of FINANCIAL_PRODUCTS_AND_SERVICES_ADS and is treated as the same thing. | |
| page_ids | No | Facebook Page IDs to restrict the search to (returns only ads run by these pages; max 10, Meta's limit). Provide this and/or search_terms. No page ID yet? Search the brand name with search_terms first and read data.pages. | |
| countries | Yes | ISO-2 country codes the ads reached, e.g. ["FR"], ["GB","DE"]. Required by Meta (ad_reached_countries). For ordinary commercial ads, only EU/UK countries can return results (see the coverage ceiling in the tool description); a non-EU/UK code returns only the ads that ALSO reached the EU/UK (usually none) unless ad_type is POLITICAL_AND_ISSUE_ADS. | |
| languages | No | Only ads written in these languages, as ISO 639-1 codes, e.g. ["fr"], ["en","de"]. Default: every language. | |
| media_type | No | Filter by the ad's media. STATIC = every still-image ad (use this whenever the user asks for static / image / non-video ads), VIDEO = video ads only. Default ALL. An unfiltered result carries NO per-ad media marker, so this filter is the ONLY way to separate static from video: never return an unfiltered list and call it static. Finer control: Meta splits still images into IMAGE (a plain picture) and MEME (a picture with text laid over it, which is most designed static ads); STATIC is both together, and each returned ad says which in its media_type. NONE = text-only ads. A rare ad with several versions can hold both an image and a video and then shows under both STATIC and VIDEO. | |
| search_type | No | How search_terms is matched. KEYWORD_UNORDERED (default) matches the words in any order, which is broad. KEYWORD_EXACT_PHRASE matches the exact phrase only: use it for a brand or product name to cut unrelated ads. | |
| search_terms | No | Keyword/phrase to match in ad creative text (max 100 characters, Meta's limit). Provide this and/or page_ids. Matching is broad by default: see search_type, and use data.pages in the result to find the advertiser you meant. | |
| ad_account_id | Yes | Your ad account ID (act_xxx). Required — Meta only serves Ad Library results to callers with an active ad account; also anchors the workspace ownership check + Meta budget. | |
| ad_active_status | No | Filter by whether the ad is currently running. Default ACTIVE (what a competitor is running now). Use ALL to include stopped ads. | |
| include_targeting | No | Also return each ad's declared targeting (age range, gender, locations). Default false: it makes every row heavier, so ask for it only when the user wants to know WHO an advertiser targets. | |
| publisher_platforms | No | Only ads that ran on these Meta platforms, e.g. ["INSTAGRAM"]. An ad that ran on Instagram AND elsewhere still matches: this means "appeared on", not "appeared only on". Default: every platform. | |
| ad_delivery_date_max | No | Only ads delivered on or before this date (YYYY-MM-DD). | |
| ad_delivery_date_min | No | Only ads delivered on or after this date (YYYY-MM-DD). Use for 'ads launched since ...'. |