Search the public Ad Library
Searches Meta's or LinkedIn's public Ad Library to see what ads other advertisers run, for competitor and market research.
Meta's Ad Library
(GET /ads_archive) is searched with Zernio's own developer access, so platform=meta needs
no connected account at all. LinkedIn's Ad Library (GET /rest/adLibrary) runs on a connected
linkedin / linkedinads account, passed as accountId. Passing a Meta account as accountId
also selects Meta. Rows are returned in the platform's raw shape under data; paging.after
is an opaque cursor on both (null when exhausted).
Meta coverage. Political and social-issue ads are searchable worldwide. Every other ad is
in the archive only if it was delivered to the EU or UK within the last year, so a US-only
commercial advertiser is invisible. Spend, impressions and demographics are political-only
fields and are left out of the default projection; request them via fields. All customers
share Zernio's Meta quota, so a 429 means back off for a minute.
LinkedIn coverage. Ads served after June 1 2023, worldwide, kept for a year after their
last impression. EU-delivered ads carry impression ranges and the disclosed targeting facets.
Pages are capped at 25 ads (limit > 25 is a 400); after is the next offset.
Which params apply: q, countries, limit, after on both; pageIds, adType, status,
platforms, mediaType, languages, searchType, fields, since, until are Meta-only;
advertiser is LinkedIn-only. Passing a param the account's platform does not support is a 400
naming the param.
Authorization
bearerAuth API key authentication: send your Zernio API key in the Authorization header, prefixed with Bearer.
In: header
Query Parameters
Which archive to search. meta needs no accountId. Required unless accountId is given.
Value in
- "meta"
- "linkedin"
Zernio SocialAccount id. Required for LinkedIn (linkedin / linkedinads: its token searches). Optional for Meta, where any facebook / instagram / metaads account only selects the platform.
Keyword search. Meta does not translate it, so write it in the ads' language. Required unless pageIds (Meta) or advertiser (LinkedIn) is given.
length <= 100Meta only. Comma-separated Facebook Page ids (max 10) whose ads to list.
LinkedIn only. Advertiser (Page) name to search.
length <= 100Comma-separated ISO 3166-1 alpha-2 codes the ads reached. Meta defaults to ALL (an explicit ALL is Meta-only); LinkedIn searches every market when omitted.
Meta only.
"ALL"Value in
- "ALL"
- "POLITICAL_AND_ISSUE_ADS"
- "HOUSING_ADS"
- "EMPLOYMENT_ADS"
- "FINANCIAL_PRODUCTS_AND_SERVICES_ADS"
Meta only. ACTIVE = eligible for delivery right now.
"ACTIVE"Value in
- "ACTIVE"
- "INACTIVE"
- "ALL"
Meta only. Comma-separated publisher platforms: FACEBOOK, INSTAGRAM, AUDIENCE_NETWORK, MESSENGER, WHATSAPP, OCULUS, THREADS, STREAMING_SERVICES.
Meta only.
Value in
- "ALL"
- "IMAGE"
- "MEME"
- "VIDEO"
- "NONE"
Meta only. Comma-separated ISO 639-1 codes of the ad text.
Meta only. Earliest delivery date (YYYY-MM-DD). LinkedIn's archive does not filter by date, so it is a 400 there: filter on details.adStatistics.firstImpressionAt / latestImpressionAt instead (EU-delivered ads only).
dateMeta only. Latest delivery date (YYYY-MM-DD); a 400 on LinkedIn, see since.
dateMeta only. Whether q matches words in any order or as an exact phrase (comma-separate phrases to match all of them).
"KEYWORD_UNORDERED"Value in
- "KEYWORD_UNORDERED"
- "KEYWORD_EXACT_PHRASE"
Meta only. Comma-separated Graph field override. Supports nested {} projections and Graph field modifiers, so a nested edge can be paged explicitly: without a .limit() modifier the expansion runs at the Meta default page size and the tail is dropped silently.
Rows per page. LinkedIn accepts at most 25.
1 <= value <= 10025paging.after of the previous page.
Response Body
application/json
application/json
application/json
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.adlibrary.searchAdLibrary();console.log(data);{ "platform": "meta", "data": [ { "id": "1234567890", "page_id": "811889972008357", "page_name": "Zernio", "ad_creation_time": "2026-08-02", "ad_delivery_start_time": "2026-08-03", "ad_creative_bodies": [ "Schedule posts and run ads from one API." ], "ad_creative_link_titles": [ "Zernio for developers" ], "ad_snapshot_url": "https://www.facebook.com/ads/archive/render_ad/?id=1234567890", "ad_library_url": "https://www.facebook.com/ads/library/?id=1234567890", "publisher_platforms": [ "facebook", "instagram" ], "languages": [ "en" ], "eu_total_reach": 18400, "target_ages": [ "25", "54" ], "target_gender": "All" } ], "paging": { "after": "QVFIUm..." }}Estimate audience reach
Estimates how many people a targeting setup would reach before you create a campaign. Returns a normalized pre-flight audience-size estimate for a targeting spec, before any campaign is created. Backed by each platform's native reach API (Meta `delivery_estimate`, LinkedIn `audienceCounts`, X `audience_summary`, Pinterest `audience_sizing`). Platforms without a usable pre-flight reach API (Google Search/Display, TikTok) return `available: false` with no bounds, so clients can hide or grey out the estimate rather than treat the absence as an error.
List lead conversations
Shows the calls (with recordings) and messages exchanged with one Google Local Services lead, oldest first. Conversation entries of one Local Services lead: phone calls (duration, recording URL) and messages (text, attachment URLs), oldest first. Read live from `local_services_lead_conversation`, always scoped to a single lead. Call-recording URLs require read access on the Google Ads account. Draws on the shared Google Ads operations budget.