An ad appears from a Page you watch, it does not look like anything that Page has run before, and you go into Meta’s Ad Library to see it properly. The archive tends to get opened that way, one suspicious ad at a time, and it is standing public record for the rest of the week whether anyone looks or not. That is an argument about how the thing gets used rather than a measurement of it, and it leads somewhere more useful than the single ad: what is Meta actually publishing in there, and why is it that and not something else?
The archive is a disclosure obligation, not a research product
The Ad Library is a compliance surface before it is anything else. It exists because Meta is required to disclose certain things about certain ads, and the shape of what you can read follows the shape of the requirement. Nobody sat down to design a useful window into an advertiser’s activity. They designed a record that satisfies a disclosure rule, and the record is public as a consequence.
The clearest evidence of that is not in a policy statement, it is sitting in the API parameters. On the ads_archive reference, ad_reached_countries is marked Required, so no query can be made without naming a country or passing ALL. The same entry carries the note that ads which did not reach any location in the EU will only be returned if they are about social issues, elections or politics. The geography of the disclosure rule is not a footnote in this archive. It is the first thing the endpoint asks you for, and it decides whether an ordinary commercial ad is in scope at all.
So this piece does one narrow thing. It reads the documented field list for an archived ad, at Graph API v26.0, fetched on 15 September 2026, and reports what is in it. It is the same method as separating what a platform has published against what has been attributed to it, applied to a page that happens to settle an argument people have been having from memory.
The fields that come back for any ad
The ArchivedAd reference documents 28 fields. Thirteen of them carry no availability restriction of any kind, which makes them the honest description of what you can read about an ordinary commercial ad.
- id, the Library ID of the ad object, which is the handle for that specific ad rather than the campaign it belonged to.
- ad_creation_time, the UTC date and time when someone created the ad. The page is explicit that this is not the same time as when the ad ran.
- ad_creative_bodies, a list of the text displayed in each unique ad card. Because some ads run with multiple versions or carousel cards, each with its own text, this field exposes every variant of the copy rather than one representative line.
- ad_creative_link_captions, the captions appearing in the call to action section for each unique card.
- ad_creative_link_descriptions, the descriptive text in that same call to action section, per card.
- ad_creative_link_titles, the titles in the call to action section, again per card. Those three together are the link furniture, the part of an ad that is written last and read first.
- ad_delivery_start_time, the time the advertiser wants delivery to begin, in UTC.
- ad_delivery_stop_time, the time the advertiser wants delivery to stop.
- ad_snapshot_url, a URL that displays the archived ad, with uncompressed images and video from it.
- languages, the languages contained in the ad, as ISO 639-1 codes.
- page_id, the ID of the Facebook Page that ran the ad.
- page_name, the name of that Page.
- publisher_platforms, a list of the Meta technologies where the ad appeared, such as Facebook or Instagram.
Read that list plainly and it says: creative text in every variant, link furniture, a start time, a stop time, the Page, the languages, the platforms it ran on, and a picture of the finished thing. Creative and placement. Not money.
One documented caveat on the stop time is worth knowing before you read anything into a blank. The reference states that if ad_delivery_stop_time is blank, the ad will run until the advertiser stops it or they spend their entire campaign budget. An empty value is an open-ended ad, not a data gap.
What is missing, and the exact sentence that says so
Seven of the 28 fields are the ones people actually expect to find, and all seven are restricted to political advertising: bylines, currency, delivery_by_region, demographic_distribution, estimated_audience_size, impressions and spend. Under each of them the page renders the same availability line, and it is worth having verbatim so you can search the page for it yourself: “Available only for POLITICAL_AND_ISSUE_ADS”.
That is the correction, and it is not a matter of interpretation. The claim that the Ad Library shows you what a rival business spent, how many impressions it bought, and which audience it reached is not true of an ordinary commercial ad. The reference says so field by field, seven times, in the same words. Money, audience size, demographic split and regional split are all in the political bucket. The commercial ad you are looking at has none of them, and no amount of better searching will produce them.
It is also worth seeing what the political numbers look like where they do exist, because they are not what most people picture either. Spend is documented as a string reported in ranges, from a lowest bucket of under 100 up to a top bucket of over 1M, with steps such as 500 to 999 and 5K to 10K in between. Impressions are ranges on a similar scale. Demographic distribution is provided as age bands, 18 to 24 through to 65 and over, with gender as one of three string values including Unknown. Even in the case where the disclosure rule does force a figure into the open, the figure is a bucket. Whatever precise spend figure someone quotes for an ordinary ad, it is not coming from the fields this reference documents.
Eight fields where the answer depends on geography
The remaining eight fields are the reason two people can compare notes about the same archive and come away disagreeing. Their availability is conditioned on where the ad was delivered.
| Field | What it contains | Documented availability |
|---|---|---|
| age_country_gender_reach_breakdown | Demographic distribution of accounts in the UK and EU reached by the ad | Available only for ads delivered to the UK and EU, and POLITICAL_AND_ISSUE_ADS delivered to Brazil |
| beneficiary_payers | The reported beneficiaries and payers for the ad | Available only for ads delivered to the EU |
| br_total_reach | Estimated ad reach for Brazil | Available for POLITICAL_AND_ISSUE_ADS delivered to Brazil |
| eu_total_reach | Estimated combined reach for all locations inside the European Union | Available only for ads delivered to the EU |
| target_ages | The age ranges selected for targeting in the UK and EU. The lowest age that can be returned is 13, the highest is 65 and over | Available only for ads delivered to the UK and EU, and POLITICAL_AND_ISSUE_ADS delivered to Brazil |
| target_gender | The genders selected for targeting in the UK and EU, as Women, Men or All | Available only for ads delivered to the UK and EU, and POLITICAL_AND_ISSUE_ADS delivered to Brazil |
| target_locations | The locations included or excluded for targeting in the UK and EU | Available only for ads delivered to the UK and EU, and POLITICAL_AND_ISSUE_ADS delivered to Brazil |
| total_reach_by_location | Estimated combined reach broken down by location | Currently supported locations are EU, BR and UK |
The consequence for anyone reading the archive is worth stating flatly: whether targeting information exists for a given ad is a question about where that ad ran, not about how well you searched. An ad that reached nothing in the UK or EU has no target_ages to read. The same advertiser’s ad delivered in Germany may have one. If a colleague insists they have seen targeting in the Ad Library and you have never found it, you are both probably right, and you are looking at ads that landed in different jurisdictions.
The search itself is narrower than the archive looks
The same restriction reappears one layer up, on what you are allowed to ask. The ads_archive reference documents 16 parameters. Twelve of them shape what any account can retrieve: ad_active_status, ad_delivery_date_min, ad_delivery_date_max, ad_reached_countries, ad_type, languages, media_type, publisher_platforms, search_page_ids, search_terms, search_type and unmask_removed_content.
Several of the documented defaults matter more than they look. ad_active_status defaults to ACTIVE, meaning ads eligible for delivery, with INACTIVE available for ads ineligible for delivery and ALL for both. A default query therefore describes the present tense of an advertiser and not their history, which is a quietly large difference if you are trying to understand a pattern rather than a moment. ad_type defaults to ALL and accepts ALL, EMPLOYMENT_ADS, FINANCIAL_PRODUCTS_AND_SERVICES_ADS, HOUSING_ADS and POLITICAL_AND_ISSUE_ADS, the special ad categories. The page also records that FINANCIAL_PRODUCTS_AND_SERVICES_ADS now replaces CREDIT_ADS, and that continued use of the old value returns the new value’s data, which is the sort of rename that turns a saved query into a wrong answer without ever erroring.
Four of the 16 parameters are marked available only for POLITICAL_AND_ISSUE_ADS: bylines, delivery_by_region, estimated_audience_size_min and estimated_audience_size_max. That is a sharper point than the field restrictions. It is not only that audience size is withheld for a commercial ad, it is that audience size cannot be used as a filter at all. The question is unaskable, not merely unanswered.
Two more parameters decide whether a search of an advertiser’s own wording finds anything. search_type defaults to KEYWORD_UNORDERED, which treats each word in search_terms individually and returns results containing those words in any order, while KEYWORD_EXACT_PHRASE treats them as a single phrase and matches only that. A remembered half sentence will behave very differently under the two. And search_terms is documented with a limit of 100 characters or less, with a blank space treated as a logical AND and no other operators supported, so a long remembered line of copy has to be cut down before it is a query at all. Finally, unmask_removed_content is documented with a default of false, so content removed for violating Meta’s standards is not revealed unless you ask for it. All of this is versioned, which is why it pays to note that the developer documentation changes without announcement, and why a field list is only as good as the version stamped on the page you read it from.
What the documentation does not settle
Two honest gaps. The first is retention. Neither of the two references read here, the ArchivedAd field reference and the ads_archive endpoint reference, states how long an ad stays in the archive. The line that the record is permanent is repeated widely and neither page supports it, so treat it as unverified rather than true. The existence of INACTIVE and ALL on ad_active_status shows that ads no longer eligible for delivery are addressable, and that is all it shows. It says nothing about how far back the archive reaches.
The second is the nature of ad_snapshot_url. It is a link that displays the archived ad, which means what you get is a rendered ad and not a row in a dataset. The reference is explicit that you cannot currently download a batch of archived ads, though creative such as images and text can be downloaded for an individual ad, subject to the data storage terms in Meta’s Terms of Service. That is a meaningful constraint on what anyone can honestly claim to have surveyed here.
It is also worth being clear about what kind of document this is, because it gets confused with the other one. A live ad archive and a periodic transparency report answer different questions. The archive is a record of individual ads, addressable one at a time, current as of now. The periodic report is an aggregate account, published on a schedule, about enforcement and volume. Neither substitutes for the other, and an answer you cannot find in one is not necessarily hidden, it may simply live in a document of the other type.
Which leaves the archive smaller and more useful than the reputation it has acquired. It will tell you every line of copy an advertiser wrote for each card, what they titled the link, when delivery started, whether it has stopped, which platforms carried it, and what the finished ad looked like. That is a real thing to be able to read about a live ad, and it is worth opening on an ordinary week rather than only when something has gone wrong. It is not the place a spend figure is going to appear. If you want to hold the version steady, note the API version and the date at the top of the reference page when you read it, the way you would date any other source.
FAQ
Does the Ad Library show how much was spent on an ordinary commercial ad?
No. The spend, currency and impressions fields all carry the note that they are available only for POLITICAL_AND_ISSUE_ADS, so none of them is returned for a normal commercial ad. Even where they are returned, spend and impressions are documented as ranges rather than exact figures, so the political case gives you a bucket and the commercial case gives you nothing.
Can I see who an ad was targeted at?
Only within the documented conditions. target_ages, target_gender and target_locations are noted as available only for ads delivered to the UK and EU, and for POLITICAL_AND_ISSUE_ADS delivered to Brazil, while delivery_by_region and demographic_distribution are marked political only. If the ad you are looking at did not reach one of those places, the targeting fields do not exist for it.
Sources
- Graph API Reference v26.0: Archived Ad, Meta for Developers. Fetched 15 September 2026. Field list, availability notes, documented ranges.
- Graph API Reference v26.0: Ads Archive, Meta for Developers. Fetched 15 September 2026. Parameter list, defaults, enums and the required country parameter.



