Ad API Guide

Field guide

"This ad has multiple versions" in the Meta Ad Library: what it is, and how to read the versions through an API

The label marks a dynamic-creative ad. In an ad-library response it is display_format DCO, with each version in snapshot.cards. Counted on 2,347 ad records from three runs: what the versions vary, how they differ from 'ads use this creative and text', and which route returns them.

By Shirley Lou, ResearchPublished 2026-10-05Facts re-checked 2026-10-05Last material change 2026-10-05

Written for people asking: What does "This ad has multiple versions" mean in the Meta Ad Library?How can I see all versions of a competitor's ad in the Facebook Ad Library?Which Meta Ad Library API returns the versions of a dynamic creative ad?

"This ad has multiple versions" marks an ad the advertiser built with dynamic creative: several images, videos, texts or headlines in one ad, which Meta combines per viewer. In a third-party ad-library response the same ad has `display_format: "DCO"`, and the versions are in `snapshot.cards`, one card per version. Across 2,347 ad records from ten advertisers on 15, 21 and 28 September 2026, all 948 DCO records carried cards, a median of 3. Two things to know before you count them. Cards repeat: on 28 September, 30 of the 119 DCO ads from ScrapeCreators by page name had a card repeated, and the 440 cards held 379 distinct versions. And the versions mostly change the visual: 118 of those 119 ads had more than one image or video, but only 19 had more than one primary text. The label is not the same as "N ads use this creative and text". That count is `collation_count`, which groups separate ad ids that share one creative; 83 of 298 ads carried a count above 1. ScrapeCreators (by page or keyword) and Apify returned the same format and card count on all 198 ad ids that more than one route returned on 28 September. Meta's official API has no format or media fields: it returns the versions' texts as lists, and only for ads that reached the EU or are political.

Two labels, two fields

Two labels in the Meta Ad Library look alike and are different things. Each has its own field in the response every third-party route returns:

In the library What it means In the response
This ad has multiple versions One ad, several creatives: the advertiser supplied more than one image, video, text or headline and Meta combines them per viewer (Meta: about dynamic creative) snapshot.display_format is DCO; each version is an entry in snapshot.cards with its own body, title, image or video URL, and link
N ads use this creative and text Several ad ids, one creative: the same asset and copy running as separate ads, often in separate ad sets collation_count (how many ids) and collation_id (the group), on the ad itself

The mapping of the first label to dynamic creative is how Sprout Social’s support page and the library guides describe it. Meta’s own Archived Ad reference says the same thing from the API side: “Some ads run with multiple ad versions or carousel cards each with their own unique text.”

cards alone does not tell you an ad has versions. Carousel ads (CAROUSEL) and catalogue ads (DPA) carry cards too. On 28 September, 23 of the 298 ads from ScrapeCreators by page name had cards without being DCO. Check the format before you read cards as versions.

What three runs returned

The check reads the raw Meta receipts from the cohort runs: ten advertisers, the first page of active ads each, through three routes on each of three dates. ScrapeCreators by page name and ScrapeCreators by keyword return 30 ads a call; Apify’s Meta Ads Scraper returns 20. It counts each ad id once per route and run.

Run, route Ads DCO Cards on DCO ads Distinct versions DCO ads with a repeated card More than one image or video More than one primary text
28 Sep, ScrapeCreators by page 298 119 440 379 30 118 19
28 Sep, ScrapeCreators by keyword 289 115 514 374 43 115 17
28 Sep, Apify 195 79 311 234 32 79 15
21 Sep, all three 782 302 1,211 948 99 299 49
15 Sep, all three 783 333 1,375 1,029 119 328 55

A distinct version is a distinct combination of primary text, headline and asset id (the file name in the CDN path, which does not change between fetches). Every DCO record on every route and date carried cards: 948 of 948.

Most ads have a handful of versions. On 28 September, through ScrapeCreators by page name, 61 of the 119 DCO ads had two distinct versions and 33 had three; the largest had twelve. The largest anywhere was a monday.com ad with 47 cards. Each card was a different image or video, all with the same text and headline, with 47 cards on each of the three dates.

What the versions vary. Mostly the visual. Of the 119 DCO ads above, 118 varied the image or video, 19 the primary text and 18 the headline. If you are reading a competitor’s versions to see which angles they test, the angles are usually in the creative, not the copy.

How much each advertiser uses it. On the first page through ScrapeCreators by page name on 28 September, DCO ads were 30 of 30 for monday.com, 23 of 30 for Shopify (a median of 8 cards each), 16 for Apollo.io, 14 for Canva, 9 each for HubSpot, Notion and lululemon, 8 for Semrush, 1 for ClickUp and none for Grammarly. An advertiser that uses DCO uses it for most of its ads, and one that does not barely uses it.

The routes agree

For the 198 ad ids that more than one route returned on 28 September, every route gave the same display_format and the same number of cards. The 15 and 21 September runs matched on all 201 and 199 shared ids as well. The collation count agreed on 190 of the 198. Over time the versions stayed fixed: the 212 DCO ads the same route returned on both 15 and 28 September had the same number of cards both times. A version list fetched once remains accurate while the ad runs. In these runs, nobody added versions to a live ad.

Field names differ by route: ScrapeCreators returns display_format, cards, collation_count and collation_id, and Apify returns displayFormat, cards, collationCount and collationId. The field guide has the full mapping.

Collation is a different count, and the group seldom comes back whole

collation_count was above 1 on 83 of 298 ads through ScrapeCreators by page name on 28 September (the highest was 9), on 63 of 289 by keyword and on 46 of 195 through Apify. It was missing altogether on 82, 57 and 34 of them. Of the 83, 42 were DCO ads as well, so an ad can be both: several ids running the same multi-version ad.

The other ids in a collation group are usually not on the same page of results. Only 14 of the 83 came back with all the ids in their group in the same response; 50 came back with none of the others. To count a competitor’s distinct creatives, group by collation_id and do not count the rows. To list every id in a group, you need more pages.

The official API

Meta’s Archived Ad reference lists ad_creative_bodies, ad_creative_link_titles, ad_creative_link_captions and ad_creative_link_descriptions as lists with one entry “for each unique ad card”, so the versions’ texts are there. The reference has no format field, no image or video field and no collation field; the creative is behind ad_snapshot_url. Because most versions in these runs differed only in the visual, a text list would show one entry for most DCO ads. The official API was not run for this page, and for a US-only commercial advertiser it returns nothing; the Meta platform page quotes Meta’s rules on what it covers.

Applying it to your own ads

The Reddit post that prompted this page (r/FacebookAds) also asked how to apply it. In Ads Manager it is the dynamic creative option, or the newer dynamic formats and creative: add several images, videos, texts and headlines to one ad, and Meta tests the combinations. The competitor data above says how many to try. Most of the advertisers here ran two or three versions per ad, varied the visual, and kept the copy the same.

What this run cannot tell you

Ten advertisers, mostly US-targeted B2B software, first page only, three dates over two weeks. The label was not read off the library page itself: two screenshot routes returned a blank page for the library on 5 October, so the label-to-field mapping rests on Meta’s API reference and the support pages cited above, not on a side-by-side capture. The response does not show which version Meta served most, or how impressions split between versions; Meta does not publish that for commercial ads.

How this was measured

  • scripts/check-meta-versions.py reads every meta-*.json receipt in the run folders named. Per run and route, it counts display formats, cards and distinct versions on DCO ads, and collation counts and how much of each group came back. It also compares the same ad id across routes and across runs. It makes no provider call.
  • The receipts are the cohort runs of 15, 21 and 28 September, fetched through Treg’s routes to ScrapeCreators and Apify. Per the Meta platform page, a ScrapeCreators call is $0.0019 for 30 ads, and Apify is $0.10 for 20.
  • Output: summary.json (per run and route, cross-route and across-run comparisons) and ads.csv (one row per ad per run and route: format, cards, distinct texts, headlines, assets and versions, collation count, and how many of the group came back in the same response).

Next step

Pull one advertiser and list its versions. ScrapeCreators by page name, through Treg:

treg auth login
treg call scrapecreators.x.v1-facebook-adlibrary-company-ads --query companyName=HubSpot --query trim=true > hubspot.json
python3 -c 'import json; [print(a["ad_archive_id"], len({(c["body"], c["title"]) for c in a["snapshot"]["cards"]}), "text versions,", len(a["snapshot"]["cards"]), "cards") for a in json.load(open("hubspot.json"))["results"] if a["snapshot"]["display_format"] == "DCO"]'

Or run the full cohort and the check: scripts/run-ads-cohort.py evidence/fixtures/ads-cohort-v1.json evidence/ads-runs/$(date +%F), then scripts/check-meta-versions.py --out evidence/ads-version-checks/$(date +%F) evidence/ads-runs/$(date +%F). Download the checker · the cohort · the runner.

Questions this page answers

What does "This ad has multiple versions" mean in the Meta Ad Library?

The advertiser gave one ad several images, videos, texts or headlines (dynamic creative), and Meta assembles a combination for each viewer. In an API response the ad has display_format DCO and one snapshot card per version; on 2,347 ad records from September 2026, every DCO ad carried its versions as cards, a median of 3.

How can I see all versions of a competitor's ad in the Facebook Ad Library?

In the library, open the ad and step through its versions. Through an API, read snapshot.cards on any ad whose display_format is DCO, and deduplicate on text, headline and asset id first, because cards repeat: 440 cards on 119 ads held 379 distinct versions in the 28 September run.

Is "multiple versions" the same as "ads use this creative and text"?

No. Multiple versions is one ad with several creatives (display_format DCO). "N ads use this creative and text" is several ad ids sharing one creative, which the response gives as collation_count and collation_id. The two overlap: 42 of the 83 ads with a collation count above 1 on 28 September were also DCO.

Relationship: the people who run this site also work on Treg, one of the routes compared on this page. Every Treg figure here is a call we paid for, with the raw response downloadable, and the same fixture is run against the alternatives where their terms allow.


Spotted an error or a changed price? Email corrections@adapiguide.com with the page URL and a source. Corrections are logged on the corrections page.