LurkAPI
Docs · Ad Library ad details

Ad Library ad details

Full detail for one ad from Meta's Ad Library, by its id or URL.

1 credit per callFresh within 6 hoursMCP tool: facebook_ad
GEThttps://api.lurkapi.com/v1/facebook/adLibrary/ad

Example response

When to use this

Use it to get one ad in full after a search: its copy, every image and video, landing page, platforms and run dates. Pass its ad_archive_id as id, or an Ad Library link as url. Top-level keys here are camelCase (adArchiveID, isActive).

Two more differences from the list endpoints: publisherPlatform values are lowercase, and snapshot.body is a plain string. Ads with several versions keep their creative in snapshot.cards.

Returns 404 not_found if the ad doesn't exist.

Example request

Copy one and replace YOUR_API_KEY with your API key (get one free). The code versions read the key from the LURKAPI_API_KEY environment variable instead.

Language

Parameters

Add them to the URL after a ?, as in ?id=2763572613808775. Join several with &.

ParameterDescription
id
stringoptional
The ad's Ad Library id (ad_archive_id), e.g. 2763572613808775. Required unless you pass url.
Example
2763572613808775
url
stringoptional
An Ad Library link containing ?id=…, e.g. https://www.facebook.com/ads/library/?id=2763572613808775.
trim
booleanoptional
true drops image and video URLs (inside snapshot.cards too). All text is kept.
One of
truefalse
Default
false

Example response

A real response, captured from the live API. Lists are trimmed to a couple of items, and long text such as media links is cut short with ….

Show the example response (6 KB)
{
  "success": true,
  "credits_remaining": 997,
  "credits_charged": 1,
  "adArchiveID": "2763572613808775",
  "adid": null,
  "categories": [
    "POLITICAL"
  ],
  "collationCount": null,
  "collationID": null,
  "containsDigitallyCreatedMedia": false,
  "containsSensitiveContent": false,
  "currency": "EUR",
  "endDate": 1715670000,
  "endDateString": null,
  "fevInfo": {
    "authorized_entity_text": "This information was provided to Meta.",
    "submitted_on": "Submitted Nov 27, 2019",
    "phone": "+3222834602",
    "email": "epfacebook@europarl.europa.eu",
    "website": "https://europarl.europa.eu/",
    "address": "rue Wiertz 60, Brussels 1047, BE",
    "page_admin_additional_info": null,
    "free_form_additional_info": {
      "treasurer_name": null,
      "cnpj_or_cpf": null,
      "committee_id": null,
      "point_of_contact": null,
      "director_name": null,
      "corporate_purpose": null,
      "promoter_name": null,
      "agent_name": null,
      "gst_number": null,
      "ec_certificates": []
    },
    "page_name_additional_info": null,
    "fec_additional_info": null,
    "learn_more_content": {
      "help_center_text": "Visit the Help Center to learn about what we require from advertisers to…",
      "help_center_url": "https://www.facebook.com/help/180607332665293?ref=infosheet"
    }
  },
  "gatedType": "eligible",
  "hasUserReported": false,
  "hideDataStatus": "NONE",
  "impressionsWithIndex": {
    "impressionsText": "45K - 50K",
    "impressionsIndex": -1
  },
  "isAAAEligible": false,
  "isActive": false,
  "menuItems": [],
  "pageID": "178362315106",
  "pageIsDeleted": false,
  "pageName": "European Parliament",
  "publisherPlatform": [
    "instagram"
  ],
  "reachEstimate": "500K - 1M",
  "regionalRegulationData": {
    "finserv": {
      "is_deemed_finserv": false,
      "is_limited_delivery": false
    },
    "tw_anti_scam": {
      "is_limited_delivery": false
    }
  },
  "reportCount": null,
  "snapshot": {
    "additional_info": null,
    "branded_content": null,
    "brazil_tax_id": "",
    "byline": "European Parliament",
    "caption": "europarl.europa.eu",
    "cards": [
      {
        "body": "🗳️ Do you know which day you’ll be voting? Check this map to see when y…",
        "caption": "",
        "cta_text": "Learn More",
        "cta_type": "LEARN_MORE",
        "image_crops": [],
        "link_description": null,
        "link_url": "https://www.europarl.europa.eu/topics/en/article/20240429STO20939/voting…",
        "original_image_url": null,
        "resized_image_url": null,
        "title": null,
        "video_hd_url": "https://video.ffcm1-1.fna.fbcdn.net/o1/v/t2/f2/m412/AQP5D0FnYXk6fnmJ18R4…",
        "video_preview_image_url": "https://scontent.ffcm1-1.fna.fbcdn.net/v/t39.35426-6/440941922_819247863…",
        "video_sd_url": "https://video.ffcm1-1.fna.fbcdn.net/o1/v/t2/f2/m412/AQNM-RLmoUEb6Au9EgSG…",
        "watermarked_resized_image_url": "",
        "watermarked_video_hd_url": "",
        "watermarked_video_sd_url": ""
      },
      {
        "body": "🗳️ Do you know which day you’ll be voting? Check this map to see when y…",
        "caption": "",
        "cta_text": "Learn More",
        "cta_type": "LEARN_MORE",
        "image_crops": [],
        "link_description": null,
        "link_url": "https://www.europarl.europa.eu/topics/en/article/20240429STO20939/voting…",
        "original_image_url": "https://scontent.ffcm1-1.fna.fbcdn.net/v/t39.35426-6/438242108_969883858…",
        "resized_image_url": "https://scontent.ffcm1-2.fna.fbcdn.net/v/t39.35426-6/438196942_117125097…",
        "title": null,
        "video_hd_url": "https://video.ffcm1-1.fna.fbcdn.net/o1/v/t2/f2/m412/AQP5D0FnYXk6fnmJ18R4…",
        "video_preview_image_url": "https://scontent.ffcm1-1.fna.fbcdn.net/v/t39.35426-6/440941922_819247863…",
        "video_sd_url": "https://video.ffcm1-1.fna.fbcdn.net/o1/v/t2/f2/m412/AQNM-RLmoUEb6Au9EgSG…",
        "watermarked_resized_image_url": "",
        "watermarked_video_hd_url": "",
        "watermarked_video_sd_url": ""
      }
    ],
    "country_iso_code": "BE",
    "cta_text": "Learn more",
    "cta_type": "LEARN_MORE",
    "disclaimer_label": "PAID_FOR_BY",
    "display_format": "DCO",
    "ec_certificates": [],
    "event": null,
    "extra_images": [],
    "extra_links": [],
    "extra_texts": [],
    "extra_videos": [],
    "images": [],
    "is_reshared": false,
    "link_description": null,
    "link_url": "https://www.europarl.europa.eu/topics/en/article/20240429STO20939/voting…",
    "page_categories": [
      "Organization"
    ],
    "page_id": "178362315106",
    "page_is_deleted": false,
    "page_like_count": 2804395,
    "page_name": "European Parliament",
    "page_profile_picture_url": "https://scontent.ffcm1-1.fna.fbcdn.net/v/t39.35426-6/438222673_409122951…",
    "page_profile_uri": "https://facebook.com/europeanparliament",
    "root_reshared_post": null,
    "title": null,
    "videos": [],
    "body": "🗳️ Do you know which day you’ll be voting? Check this map to see when y…",
    "final_url": null
  },
  "spend": "<€100",
  "startDate": 1715324400,
  "startDateString": null,
  "stateMediaRunLabel": null,
  "totalActiveTime": null,
  "url": null,
  "aaa_info": null
}

Response fields

Every field in a successful response, and what it means. A name with [] belongs to each item of a list: snapshot.images[].original_image_url is the original_image_url of every item in snapshot.images. null means there's no value.

Show all 101 fields
FieldTypeDescription
successtrueAlways true here; errors have success: false.
credits_remainingnumberYour balance after this call. On anonymous playground calls: free tries left today.
credits_chargednumberCredits this call cost; 0 on free endpoints. On anonymous playground calls: tries used (1).
adArchiveIDstringcan be nullThe Ad Library id. Pass it as id to the ad details endpoint.
adidstringcan be nullMeta's internal ad id. null in every response we've seen; use the Ad Library id.
pageIDstringcan be nullThe advertiser's Facebook page id. Pass it as pageId to the company ads endpoint.
pageNamestringcan be nullThe advertiser's page name.
isActivebooleanWhether the ad is running now.
startDatenumbercan be nullThe day the ad started running, as Unix seconds at midnight Pacific time.
endDatenumbercan be nullThe day the ad stopped, or its latest delivery day if still running, as Unix seconds at midnight Pacific time.
startDateStringstringcan be nullThe same date as ISO 8601 text when Facebook includes it; null in every response we've seen, so use the Unix seconds field.
endDateStringstringcan be nullThe same date as ISO 8601 text when Facebook includes it; null in every response we've seen, so use the Unix seconds field.
totalActiveTimenumbercan be nullSeconds the ad has run, when Facebook reports it; usually null.
publisherPlatformstring[]Where it ran, lowercase: facebook, instagram, audience_network, messenger, threads.
collationCountnumbercan be nullHow many near-identical versions are grouped under this ad. A high count means the advertiser is scaling it; null for a single version.
collationIDstringcan be nullId shared by the grouped versions of this ad; null for a single version.
snapshotobjectThe creative: copy, media, landing page and advertiser details (snake_case inside).
snapshot.page_idstringcan be nullThe advertiser's page id (same as the ad's).
snapshot.page_namestringcan be nullThe advertiser's page name as shown on the ad.
snapshot.page_profile_uristringcan be nullThe advertiser's Facebook page URL.
snapshot.page_profile_picture_urlstringcan be nullThe advertiser's profile picture, 60×60 px.
snapshot.page_like_countnumbercan be nullFollowers of the advertiser's page.
snapshot.page_categoriesstring[]Page categories, e.g. ["Outdoor & Sporting Goods Company"].
snapshot.page_is_deletedbooleanWhether the advertiser's page has been deleted.
snapshot.titlestringcan be nullHeadline under the creative; null when there is none.
snapshot.captionstringcan be nullDisplay link under the creative, usually the domain (e.g. HOKA.com).
snapshot.link_urlstringcan be nullLanding page the ad sends people to, UTM tags included.
snapshot.link_descriptionstringcan be nullText under the headline; null when there is none.
snapshot.cta_textstringcan be nullButton label, e.g. "Shop now".
snapshot.cta_typestringcan be nullButton type, e.g. SHOP_NOW, LEARN_MORE, NO_BUTTON.
snapshot.display_formatstringcan be nullCreative format, e.g. IMAGE, VIDEO, DCO (dynamic creative), DPA (dynamic product ad) or MULTI_IMAGES. For DCO and DPA ads the creative is in cards.
snapshot.imagesobject[]Image creatives. Empty for video and card-based ads, and with trim=true.
snapshot.images[].original_image_urlstringcan be nullFull-size image URL. Facebook's links expire after a few days, so download what you need.
snapshot.images[].resized_image_urlstringcan be null600 px image URL, good for thumbnails.
snapshot.images[].watermarked_resized_image_urlstringWatermarked copy; empty or null in every response we've seen.
snapshot.images[].image_cropsany[]Facebook internal field; an empty array in every response we've seen. Crop hints for the image.
snapshot.videosobject[]Video creatives. Empty for image and card-based ads, and with trim=true.
snapshot.videos[].video_hd_urlstringcan be nullHD video file URL; null if Facebook has no HD version.
snapshot.videos[].video_sd_urlstringcan be nullSD video file URL.
snapshot.videos[].video_preview_image_urlstringcan be nullPoster frame (still image) URL.
snapshot.videos[].watermarked_video_hd_urlstringcan be nullWatermarked copy; empty or null in every response we've seen.
snapshot.videos[].watermarked_video_sd_urlstringcan be nullWatermarked copy; empty or null in every response we've seen.
snapshot.cardsobject[]Carousel, dynamic-creative and product versions, each with its own copy and media. With trim=true the text stays and media URLs are null.
snapshot.cards[].titlestringcan be nullThis version's headline.
snapshot.cards[].bodystringcan be nullThis version's primary text.
snapshot.cards[].captionstringcan be nullThis version's display link, usually the domain.
snapshot.cards[].cta_textstringcan be nullButton label, e.g. "Shop now".
snapshot.cards[].cta_typestringcan be nullButton type, e.g. SHOP_NOW, LEARN_MORE.
snapshot.cards[].link_urlstringcan be nullThis version's landing page URL.
snapshot.cards[].link_descriptionstringcan be nullText under the headline; null when there is none.
snapshot.cards[].original_image_urlstringcan be nullFull-size image URL; null for video versions.
snapshot.cards[].resized_image_urlstringcan be null600 px image URL; null for video versions.
snapshot.cards[].watermarked_resized_image_urlstringWatermarked copy; empty or null in every response we've seen.
snapshot.cards[].image_cropsany[]Facebook internal field; an empty array in every response we've seen. Crop hints for the image.
snapshot.cards[].video_hd_urlstringcan be nullHD video file URL; null for image versions.
snapshot.cards[].video_sd_urlstringcan be nullSD video file URL; null for image versions.
snapshot.cards[].video_preview_image_urlstringcan be nullPoster frame URL; null for image versions.
snapshot.cards[].watermarked_video_hd_urlstringcan be nullWatermarked copy; empty or null in every response we've seen.
snapshot.cards[].watermarked_video_sd_urlstringcan be nullWatermarked copy; empty or null in every response we've seen.
snapshot.bylinestringcan be nullWho paid for the ad (the "Paid for by" name) on political and issue ads; null on most others.
snapshot.disclaimer_labelstringcan be nullThe disclaimer kind on political and issue ads, e.g. PAID_FOR_BY (the name is in byline); null otherwise.
snapshot.country_iso_codestringcan be nullFacebook internal field; null in every response we've seen. A country code on some ads.
snapshot.is_resharedbooleanWhether the ad reshares an existing post (see root_reshared_post).
snapshot.root_reshared_postanyThe original post when is_reshared is true; null otherwise.
snapshot.branded_contentanyPaid partnership details when the ad is branded content; null otherwise.
snapshot.additional_infoanyFacebook internal field; null in every response we've seen.
snapshot.brazil_tax_idanyAdvertiser tax id shown on ads under Brazil's rules; null otherwise.
snapshot.ec_certificatesany[]Facebook internal field; an empty array in every response we've seen.
snapshot.eventanyEvent details on event ads; null otherwise.
snapshot.extra_imagesany[]More images from dynamic creative; usually empty.
snapshot.extra_linksany[]More landing page URLs from dynamic creative; usually empty.
snapshot.extra_textsany[]More text variations from dynamic creative; usually empty.
snapshot.extra_videosany[]More videos from dynamic creative; usually empty.
snapshot.bodystringcan be nullThe ad's primary text as a plain string; null when the copy is only in cards.
snapshot.final_urlstringcan be nullFinal landing URL after redirects, when Facebook reports it; usually null.
categoriesstring[]Special ad categories Facebook assigned. ["UNKNOWN"] for ordinary ads.
currencystringCurrency code of spend (e.g. USD) when spend is reported; an empty string otherwise.
spendanySpend range as Facebook shows it, e.g. "$600K - $700K" or ">$1M" (see currency). Political and issue ads only; null otherwise.
impressionsWithIndexobjectImpressions range, reported for political and issue ads only.
impressionsWithIndex.impressionsTextstringcan be nullThe range as Facebook shows it; null when not reported.
impressionsWithIndex.impressionsIndexnumberFacebook's bucket number for the range; -1 when not reported. Ad details usually omit it.
reachEstimateanyEstimated reach as Facebook shows it, e.g. ">1M", on political and issue ads and some EU-delivered ads; null otherwise.
urlstringcan be nullAd Library link for this ad. null in every response we've seen; build it as https://www.facebook.com/ads/library/?id=<Ad Library id>.
containsDigitallyCreatedMediabooleanWhether Facebook labels the creative as AI-generated or digitally altered.
containsSensitiveContentbooleanFacebook internal field; false in every response we've seen. Facebook's sensitive-content flag.
gatedTypestringFacebook internal field; ELIGIBLE (lowercase in ad details) in every response we've seen.
hasUserReportedbooleanWhether the viewer reported the ad. Always false, since we read the Ad Library logged out.
hideDataStatusstringFacebook internal field; NONE in every response we've seen.
isAAAEligiblebooleanFacebook flag, true on a few ads; meaning undocumented. Ad details' aaa_info holds the related data when present.
menuItemsany[]Facebook internal field; an empty array in every response we've seen.
pageIsDeletedbooleanWhether the advertiser's page has been deleted.
regionalRegulationDataobjectDelivery limits under regional ad rules.
regionalRegulationData.finservobjectFinancial-services ad rules.
regionalRegulationData.finserv.is_deemed_finservbooleanFacebook treats the ad as a financial-services ad.
regionalRegulationData.finserv.is_limited_deliverybooleanDelivery is limited under financial-services rules.
regionalRegulationData.tw_anti_scamobjectTaiwan's anti-scam ad rules.
regionalRegulationData.tw_anti_scam.is_limited_deliverybooleanDelivery is limited under Taiwan's anti-scam rules.
reportCountnumbercan be nullTimes the ad was reported, when disclosed; null in every response we've seen.
fevInfoanyFacebook internal field; null in every response we've seen.
stateMediaRunLabelanyLabel for ads run by state-controlled media; null otherwise.
aaa_infoanyExtra transparency data on some ads (see isAAAEligible); null in every response we've seen.

Cost and freshness

Each call costs 1 credit. Calls turned away before they reach the platform (invalid parameters, a key or balance problem, a rate limit) are free, and so are 5xx errors. A not_found is charged, since the platform was checked. How charging works.

Answers are cached for up to 6 hours. A repeat call within that time can return the same data, and costs the same.

Errors

A failed call returns success: false, an error message, a code your program can check, and a docs link. These are the errors this endpoint can return. All error codes.

StatusCodeMeaning
401missing_api_keyNo API key was sent. Put it in the x-api-key header.
401invalid_api_keyThis key doesn't exist or was revoked.
402insufficient_creditsNot enough credits for this call. Buy a pack, or wait for tomorrow's free top-up.
402over_max_creditsThis call would cost more than the max_credits you set. The error says what it needs; raise max_credits to allow it. Not charged.
403account_suspendedThis account is suspended. Email support@lurkapi.com. Not charged.
404not_foundWhat you asked for (a post, an ad, a subreddit) doesn't exist, or there's no endpoint at that path. Charged if the platform was checked.
405method_not_allowedEndpoints only take GET, with parameters in the URL.
429rate_limitedToo many calls in a short time. Wait as many seconds as the retry-after header says, then retry.
500internal_errorSomething broke on our side. Retry. Not charged.
502upstream_errorThe platform didn't send a usable answer. Retry. Not charged.
503upstream_busyAll our connections to the platform are busy. Retry in a few seconds. Not charged.
504upstream_timeoutThe platform took over 30 seconds to answer (90 for web pages). Retry. Not charged.

Use it in Claude

Connect LurkAPI to Claude and ask in plain English. This endpoint is the facebook_ad tool. For example:

Ask Claude
Use LurkAPI's facebook_ad tool with id "2763572613808775", then summarize what you find.

Claude calls facebook_ad with arguments like these, and each call costs 1 credit:

Tool arguments
{"id": "2763572613808775"}

To save tokens, tool results leave out empty fields, keep one URL per image or video, and give transcripts as plain text unless you pass timestamps=true. A result over 45,000 characters comes in parts. Its _note gives the offset for the next part, and later parts are free for 15 minutes. Pass trim=false for the full response.

From the blog

All posts