Search the public Ad Library
Competitor and market research over the public ad archives. 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
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
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.