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.
Query parameters
Which archive to search. meta needs no accountId. Required unless accountId is given.
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.
Meta only. Comma-separated Facebook Page ids (max 10) whose ads to list.
LinkedIn only. Advertiser (Page) name to search.
Comma-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.
Meta only. ACTIVE = eligible for delivery right now.
Meta only. Comma-separated publisher platforms: FACEBOOK, INSTAGRAM, AUDIENCE_NETWORK, MESSENGER, WHATSAPP, OCULUS, THREADS, STREAMING_SERVICES.
Meta only.
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).
Meta only. Latest delivery date (YYYY-MM-DD); a 400 on LinkedIn, see since.
Meta only. Whether q matches words in any order or as an exact phrase (comma-separate phrases to match all of them).
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.
paging.after of the previous page.
Response
Archived ads (raw platform shape)
Changes
Changed in 5 of the 55 revisions of this API.24
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
This revision also has 2 changes that name no endpoint, such as unreferenced schemas being removed. See the revision's changelog
- ○
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
added the optional property
/to the response with the statusresponse-optional-property-added
- ○
- ○
added the media type
application/jsonfor the response with the statusresponse-media-type-added
- ○
added the non-success response with the status
response-non-success-status-added
- ○
- ○
endpoint added
endpoint-added
- ○