Search the public Ad Library
Competitor and market research over the platform's public ad archive, searched with the
customer's own connected token (no extra scope): Meta's Ad Library (GET /ads_archive) for
a facebook / instagram / metaads account, LinkedIn's Ad Library (GET /rest/adLibrary)
for a linkedin / linkedinads account. 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. Meta serves the
archive only to people who confirmed their identity and location at facebook.com/ID: until the
Facebook user behind the connection has done so, the call fails with
meta_identity_confirmation_required (403).
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, since, until, limit, after on both; pageIds,
adType, status, platforms, mediaType, languages, searchType, fields are Meta-only;
advertiser is LinkedIn-only. Passing a param the account's platform does not support is a 400
naming the param.
API key authentication - use your Zernio API key as a Bearer token
In: header
Query Parameters
Zernio SocialAccount id (facebook / instagram / metaads for Meta, linkedin / linkedinads for LinkedIn). Its token is the one that searches.
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""ALL" | "POLITICAL_AND_ISSUE_ADS" | "HOUSING_ADS" | "EMPLOYMENT_ADS" | "FINANCIAL_PRODUCTS_AND_SERVICES_ADS"Meta only. ACTIVE = eligible for delivery right now.
"ACTIVE""ACTIVE" | "INACTIVE" | "ALL"Meta only. Comma-separated publisher platforms: FACEBOOK, INSTAGRAM, AUDIENCE_NETWORK, MESSENGER, WHATSAPP, OCULUS, THREADS, STREAMING_SERVICES.
Meta only.
"ALL" | "IMAGE" | "MEME" | "VIDEO" | "NONE"Meta only. Comma-separated ISO 639-1 codes of the ad text.
Earliest delivery date (YYYY-MM-DD).
dateLatest delivery date (YYYY-MM-DD).
dateMeta only. Whether q matches words in any order or as an exact phrase (comma-separate phrases to match all of them).
"KEYWORD_UNORDERED""KEYWORD_UNORDERED" | "KEYWORD_EXACT_PHRASE"Meta only. Raw Graph projection override, e.g. add spend,impressions,demographic_distribution for political ads.
Rows per page. LinkedIn accepts at most 25.
251 <= value <= 100paging.after of the previous page.
Response Body
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({ query: { accountId: 'account_abc123', },});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&access_token=...",
"publisher_platforms": [
"facebook",
"instagram"
],
"languages": [
"en"
],
"eu_total_reach": 18400,
"target_ages": [
"25",
"54"
],
"target_gender": "All"
}
],
"paging": {
"after": "QVFIUm..."
}
}{
"error": "string",
"type": "invalid_request_error",
"code": "string",
"param": "string",
"platform": "string",
"platformError": {},
"details": {}
}{
"error": "Unauthorized"
}Estimate audience reach POST
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.
Conversations of a Local Services lead GET
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.