Mining the Meta Ad Library with Wireflow: Ninety Days Means It Works
Run duration is the profitability signal competitors publish by accident. How to read it, when it lies, and how to turn a long runner into creative.

Every competitor tells you which of their ads is making money. Not on purpose, and not in any dashboard you can log into. They tell you by leaving it running.
An ad that has been live for ninety days survived ninety days of somebody watching its cost per acquisition. Nobody keeps paying for a creative that loses money, and nobody has the patience to keep a mediocre one in rotation when the account is being managed at all. Run duration is the closest thing to a profitability disclosure that paid social produces, and Meta publishes it for every commercial ad, on a line that reads "Started running on".
Fair disclosure: you are on the Monid blog, and the data layer under all of this is ours. The section on when this signal lies is the one worth reading first, because run duration fools people constantly.
Why does a ninety day old ad beat a clever one?
Because it has been graded, and the clever one has not.
Creative in a managed account lives under constant pressure. Frequency climbs, click through rate decays, and the media buyer rotates out what stops working. Anything still on after a quarter has been re-approved implicitly, over and over, by somebody with a spend report open. That is a harsher review than any awards jury.
It helps to know why the rotation happens, because it is what makes the signal trustworthy. A creative shown repeatedly to the same audience decays: frequency climbs, the people most likely to convert have already converted, and cost per acquisition drifts up week over week. The buyer notices in the report before they notice in the creative, and the fix is always the same, swap it out. That decay curve is the machine grading every ad in the account continuously, and it does not care whether the agency liked the concept.
This flips how you read a competitor's library. A brand running forty ads is not showing you forty ideas of equal weight. It is showing you a distribution: a long tail launched in the last two weeks that is still being tested, and a small set of survivors carrying the account. The survivors are the only ones with information in them. Sorting by start date is what separates the two, and it costs nothing to do.

How do you get the run dates out in the first place?
Through a scraper, because the official route does not cover you.
Meta's Ad Library API is scoped to political and issue ads behind identity verification, so for ordinary commercial creative there is no supported bulk feed. The web UI has the dates but fights you with infinite scroll and no export.
We have written this part three times already and will not repeat it here. The Facebook Ad Library as a clean JSON feed is the field by field version, the API versus rolling your own scraper weighs the three ways to do it, and turning a brand name into a competitor ad archive is the copy and paste recipe. The short version is one endpoint:
monid inspect -p apify -e /curious_coder/facebook-ads-library-scraper
Inspection is free and shows the schema and the billing shape before you spend anything. It bills per result, so a bounded limitPerSource is the whole cost control. Current prices sit on monid.ai/tools, and the provider page is /tools/facebook.
The rest of this article assumes you have the JSON in front of you.
When does run duration lie?
Often enough that you have to check, and this is the section most teardowns skip.
Always-on brand budget. A large advertiser keeps brand creative live for reasons that have nothing to do with direct response. Ninety days of a brand film means the brand team has a budget line, not that the ad converts. Tell them apart by intent: a hard offer, a price, a CTA to buy means somebody is measuring it. A mood piece means nobody is.
The reset trap. Editing an ad can restart its clock, and a duplicated ad set starts a new one entirely. So a genuine two year winner can show as thirty days old because it was rebuilt in a new campaign. Duration is a floor on how long the creative has worked, never a ceiling.
Regional skew. The library is per country. The same creative can be a survivor in one market and absent in another, and if you pull one country you are reading one market's verdict.
Nobody is home. Small advertisers set campaigns live and forget them. An ad running six months on an unmanaged account proves inattention, not performance. The tell is the rest of the library: if nothing has launched in months, there is no optimisation happening, and the survivor is a survivor by neglect.
Scale is invisible. Duration tells you an ad works. It says nothing about whether it spent fifty dollars or five million. Reach and spend bands exist only for political and issue ads, so for commercial creative the honest position is that you know direction and not magnitude.
The workable rule: a long runner plus a recently launched cluster of variations on the same hook. Duration says it works, iteration says somebody is paying attention. Together they are a strong signal. Either one alone is a hypothesis.
What do you actually take from a long runner?
Structure, not pixels.
Copying a competitor's ad is both legally stupid and strategically useless, since their creative is tuned to their product and their audience. What transfers is the skeleton underneath:
- The hook, and where it lands. Most survivors state a problem out loud inside the first two seconds. Note the words and the timestamp.
- The beat order. Problem, proof, offer, ask is the common one. What changes between winners is which beat gets the most time.
- The shot list. Count the cuts and what each one shows. Six shots with cuts at two, four and seven seconds is a reusable template.
- The proof type. Testimonial, demo, before and after, or a number on screen. This is usually the load bearing element and the one people fail to notice.
- The format spread. If the same hook is running as UGC, static and carousel, the hook itself is what tested well, not the production.
Worked through on a real shape: a survivor for a coffee brand opens on a person saying "cafe espresso without the cafe" at 0:02, cuts to a pack shot at 0:04, a pour at 0:06, a first sip at 0:08, then a price card. The transferable brief is problem stated aloud in under two seconds, product on screen by four, proof of use before eight, offer last. None of that is about coffee. Point it at a running shoe and the beats hold; only the shots change. That is the difference between taking structure and taking pixels, and it is also why a teardown of one survivor is worth more than a swipe file of fifty ads nobody graded.

How do you get from a teardown to finished creative?
This is the step where most competitor research dies, and it is worth being honest about why: the analysis is the easy half. You now have a brief that says six shots, hook at two seconds, testimonial proof, three formats. Producing that is a shoot, an editor, a UGC creator and a week.
Wireflow is built for exactly this gap. It pulls the Meta Ad Library sorted by run duration, breaks the winner into hook and shot list, then rebuilds the structure around your product, and returns the batch as UGC, statics and carousels ready for the feed. It runs on generation models underneath and publishes to the channels on a schedule.
The two halves fit cleanly. The endpoint above is the raw signal, queryable by an agent and billed per result, which is what you want when the job is monitoring a category week over week. A composed pipeline is what you want when the job is producing next week's slate. An agent that has both can go from "what has been running longest in this category" to finished variants without a person in the middle, and neither half does that alone.
Give this to your agent![]()
Set up https://monid.ai/SKILL.md, and then use Monid to pull the ads a competitor Page has been running longest and summarise the hooks.Does the same signal exist on TikTok?
Partly, and it is worth knowing where the analogy breaks.
TikTok surfaces top performing ads with engagement indicators directly, and the endpoints for it sit in the same catalogue: search_ads, get_top_ads_spotlight and get_ad_interactive_analysis, all under /tools/tiktok. We compared the providers for this surface in the best social media scraping API, and Apify versus TikHub for TikTok scraping covers the tradeoff between them.
The difference that matters: TikTok hands you performance rather than making you infer it from duration, but its window is shorter and skewed to what is spiking now. Meta rewards patience and shows you what has been quietly working for a quarter. Reading both is how you tell a durable hook from a trend, and that distinction is usually the whole question. If organic signal is what you are after rather than paid, wiring up TikTok trend tracking is the neighbouring job.
There is a practical reason to read the paid surface first even when organic looks richer. An organic hit tells you a piece of content earned attention once. A paid survivor tells you somebody kept choosing to buy that attention after seeing what it returned. Those are different claims, and only the second one has money behind it. Organic is where hooks are discovered; paid is where they are confirmed.
When is this not worth doing?
When you have no creative capacity to act on what you find.
A competitor teardown that produces a document nobody makes ads from is a waste of a good afternoon. If your bottleneck is production rather than ideas, fix production first and come back to research after.
It is also weak in categories where nobody advertises much. Ad Library mining works because competitors are spending; in a thin category you will find three ads and learn nothing. And in regulated categories, the survivors you find may be running under compliance constraints you do not share, or the reverse, which makes the structure less transferable than it looks.
One more thing worth sitting with: the arrow points both ways. Your own long runners are in the same public archive, sorted by the same date, readable by anyone who thinks to look. A competitor watching you learns which of your creatives you cannot afford to turn off, and if you run a narrow set of survivors you are broadcasting exactly where your acquisition comes from. There is no opting out, the archive is public by design. The only real answer is to keep enough live variation that the pattern is harder to read, which happens to be good practice for the account anyway.
FAQ
Is scraping the Meta Ad Library allowed?
The archive is deliberately public, published under Meta's ad transparency commitments, and the data is available to anyone without a login. That is different from a licence to do anything you like with it, and your own terms of service and jurisdiction still govern what you collect and store. The endpoint reads public pages only.
Why not just use the official Ad Library API?
Because it is scoped to political and issue ads and gated behind identity verification. For ordinary commercial creative, which is what almost everyone is researching, it returns nothing useful. The API versus rolling your own works through the three options in detail.
How far back does run duration go?
The library shows a start date for currently running ads and retains political and issue ads for seven years. Commercial ads that have stopped drop out, so you are reading a live snapshot rather than a history. This is why a weekly diff is worth more than a single pull: the ad that disappears this week just told you something too.
Can an agent do this on a schedule without me?
Yes, and this is the shape most people end up wanting. The endpoint is callable from an agent with the price visible before it commits, so a weekly sweep of a competitor set, a diff against last week, and a summary of what changed is a standing job rather than a task. Turning a brand name into a competitor ad archive is the mechanical version of that loop.
Last updated August 2026.


