Ad run length performance: what long running ads tell you
Run length is the best public proxy for which competitor ads work. How to compute it from first_shown and last_shown, and the traps that make it mislead.
The AdLib team · · 7 min read
Ad run length is the closest thing to a performance number you can get from public ad libraries. Nobody outside a company sees its CTR or ROAS, but you can see that an ad ran for 86 days, and companies rarely pay for 86 days of an ad that loses money. That makes ad run length performance analysis worth doing, as long as you know where the number lies.
This post covers how we compute it, what Nike's numbers look like, and the traps we hit when we first trusted the number too much.
Ad run length performance: why it works as a signal
Run length works as a signal because of how media buyers behave. Ads that underperform usually get paused; ads that perform get budget and stay on. So across many ads from one advertiser, the long runners are more likely to be the ones that worked.
It is a proxy, not proof. A long run tells you somebody decided to keep paying, and the most common reason is that the ad works. Other reasons exist: nobody checked, the campaign is always-on by design, or the library reports the dates in a way that stretches them. Treat long running ads as a shortlist to look at, then read the creative.
How long do ads run? Nike's numbers
How long ads run depends on the brand and the platform, so here is one real advertiser. In our index, October 2026, Nike's 30 Meta ads delivered in Germany (all ended by 26 Oct 2026) ran between 8 and 86 days. The median was 37 days, and 22 of the 30 ran 30 days or more.
The two ends of that range are useful to look at side by side:
| Ad | Ran | Days |
|---|---|---|
| "Lock in up to 50% off Nike. Valid until 2 Dec 9am CET" | 18 to 26 Nov 2025 | 8 |
| "Get the gear that's up for it all" | 30 Mar to 24 Jun 2026 | 86 |
The short one was not a loser. It was a Black Friday ad, and it stopped because the sale stopped. The long one is evergreen brand copy that Nike kept paying for through spring.
On Google, the numbers look very different. The oldest Nike, Inc. creative in our index ran from 25 Oct 2021 to 25 Oct 2026, which is 1,826 days. Nike Retail BV had 23 creatives, all shown within a day of our capture. Both facts need care, as the next sections show.
How to compute run length from first_shown and last_shown
Run length is last_shown minus first_shown, using the dates the platform publishes. In AdLib those are the fields first_shown and last_shown; our own observation times are separate fields, first_seen_by_us and last_seen_by_us.
We precompute it as derived.days_running. Three details matter:
- We count both the first and the last day, so the 30 Mar to 24 Jun ad shows as 87 in days_running, while the calendar difference is 86.
- For an ad that is still active, the end is today.
- When the platform publishes no start date, days_running is null. We do not fill it from our own dates, because that would be a guess.
derived.is_long_running is true when days_running is over 30. By that rule, 22 of Nike's 30 German Meta ads count as long running.
Here is a short Python example that pulls an advertiser's archived ads sorted by run length and prints the top ones:
import os, requests
API = "https://api.adlibapi.com"
H = {"X-API-Key": os.environ["ADLIB_API_KEY"]}
r = requests.get(f"{API}/v1/search", headers=H, params={
"advertiser": "meta:15087023444", # Nike's Facebook page
"source": "history", # our archive, ended ads included
"sort": "days_running", # longest first
"limit": 10,
})
r.raise_for_status()
for ad in r.json()["data"]:
d = ad["derived"]
text = (ad["creatives"][0].get("text") or "")[:60] if ad["creatives"] else ""
print(d["days_running"], (ad["first_shown"] or "")[:10], (ad["last_shown"] or "")[:10],
d["variant_count"], text)If you only want the summary, GET /v1/advertisers/{id}/stats returns the median, p90 and maximum days running plus the five longest running ads, for 5 credits. History search is billed per ad; the numbers are on pricing.
Pitfall 1: each platform means something different by a date
The dates look the same in our API, but they come from different definitions. Meta gives day precision at midnight Pacific time. TikTok gives days at midnight UTC. Google gives served dates per creative. Pinterest's end dates lag: on 26 Oct 2026, the newest Pinterest end date in our index was 15 Oct.
Two platforms barely have dates. X publishes no first or last shown date at all. LinkedIn shows "Ran from ... to ..." only on the detail page of some ads, and in our index 481 of 487 LinkedIn ads have no run dates. For those, days_running is null and the only time window we can give you is when we saw the ad. The per-platform details are on platforms.
Pitfall 2: evergreen search ads always look like winners
Search and shopping ads behave more like infrastructure than campaigns. Nike Retail BV's Google creatives were mostly text ads with keyword insertion, such as "Entdecke {Keyword:Nike schuhe} online auf Nike.com". All 23 were shown within a day of our capture.
A template like that runs for months because it is the account's plumbing. Its run length tells you Nike bids on its own brand terms. It says little about whether a specific line of copy won. Compare search ads with search ads and social ads with social ads, never across.
Pitfall 3: the library's own date floor
Some first dates mark the edge of what the library reports rather than the start of the ad. Ten of Nike, Inc.'s 25 Google creatives in our index start on the same day, 25 Oct 2021, almost exactly five years before our capture.
We read that as a reporting floor, which would mean these ads started on or before that day. We cannot prove it from the data, so treat 1,826 days as "at least five years". Either way it is a long runner; just do not rank it against a two-year ad as if the dates were exact.
Pitfall 4: variants and A/B tests split one idea into many ads
Advertisers relaunch the same message as new ads, so the run length of one ad id undercounts the life of the idea. Nike's line "Get the gear that's up for it all. Any time. Anywhere." appears in 19 of the 30 German Meta ads.
No single one of those ran longer than 86 days. But they were launched in waves (27 Jan, 30 Mar, 5 May, 29 Jul and 2 Sep 2026), and together they cover every day from 27 Jan to 21 Oct 2026. That is 267 days for the message, which is the stronger signal. Group by copy before you rank: derived.variant_count tells you how many ads from the same advertiser share an ad's primary text.
The waves also show up in Nike's starts per month, October 2025 to October 2026: 2, 5, 0, 3, 1, 5, 2, 3, 0, 5, 0, 4, 0. A month with zero starts is not a month without ads.
Pitfall 5: seasonal sales end on schedule
Short ads are not failed ads when the end date was planned. The Black Friday ad says in its own copy that the offer was valid until 2 Dec, and the creatives ran 8 to 9 days around it.
Before calling a short ad a loser, check the copy for dates, sale words and launch names. A competitor's sale calendar is worth having on its own: it tells you when to expect their discounts next year.
Pitfall 6: our first_seen_by_us is not the start date
We only see an ad from the day we first crawl it, so first_seen_by_us only says when we started knowing about an ad. It is not when the ad started. For the Nike ads in this post, first_seen_by_us is 26 Oct 2026, while Meta says the oldest one started on 14 Oct 2025.
The two pairs answer different questions. Use first_shown and last_shown for "how long did it run". Use the seen-by-us fields for "since when do we have it, and when did we last confirm it", which matters on LinkedIn and X where the platform gives you nothing else. How we keep ads after they end is in why ad libraries forget ended ads.
A method we trust
Our routine for competitor ad analysis is short. Resolve the competitor's domain to its advertiser ids on every platform (see finding advertiser ids from a domain). Pull their history sorted by days_running. Drop search ads, group by copy and mark anything with a date in the text as seasonal. What is left at the top is your shortlist.
To run this on your own competitors, the developer page has the API details, the companies page shows the same work without code, and asking Claude through our MCP server works if you would rather not write the script yourself. If you are starting from scratch, how to see competitors ads covers the six libraries first.
Questions people ask
- Does a long running ad mean it performs well?
- Not on its own. It means the advertiser kept paying for it, which they usually do only when it works, but evergreen search ads, date floors in the library and relaunched variants can all make an ad look long-lived for other reasons.
- How long do ads run on Meta?
- It varies widely. In our index (October 2026), Nike's 30 German Meta ads ran between 8 and 86 days, with a median of 37 days.
- How do you calculate how long an ad ran?
- Subtract the platform's first shown date from its last shown date. AdLib returns this as derived.days_running, counting both the first and the last day, and leaves it empty when the platform publishes no dates.
- Which ad libraries do not publish run dates?
- X publishes no first or last shown dates, and LinkedIn shows them only on the detail page of some ads. In our index, 481 of 487 LinkedIn ads have no run dates.