Searching the library
/library is one search over every ad in the corpus. Free
text and facets run in the same query, so narrowing by archive or format costs
nothing extra, and the result grid is the same set of cards your own AI gets
back from search_library over MCP.
Every result carries the coverage warning for the archives it drew from. Read it before you read a count.
The filter set
| Filter | What it matches |
|---|---|
| Search | Free text over the ad's headline (every headline, where the archive rotates them), body, description and call to action, the advertiser's name, and Tempio's derived reading — hook, offer, angle and audience |
| Archive | Which public archive the ad came from. Not a connection — these are transparency archives, not your platforms |
| Status | active, inactive (a run no longer returns it; nothing is deleted) or unknown (the archive publishes no status) |
| Format | text, image, video or carousel, derived from what the archive actually returned |
| Language | A language code the archive published on the ad, such as en |
| Advertiser | One advertiser, or a name prefix. The advertiser page's own link fills this in |
| Days live, at least / at most | Days live, computed from the archive's dates |
| Longevity, at least | The score below |
| Published spend, at least | The lower bound of a published range, in whole units of that range's own currency |
Free text accepts quoted phrases, or, and a leading - to exclude a word.
The dictionary is English and only English: the Language filter narrows
which rows come back, it does not switch the dictionary the text is matched
with.
Two filters exclude rather than zero-fill, and this is the same rule Tempio follows everywhere. A minimum on days live excludes ads whose archive published no start date; a minimum on published spend excludes ads with no published range. Those facts are absent, not zero, and treating an absence as a zero would put every unknown ad at the bottom of a spend filter as though somebody had checked.
Over MCP the same call also takes ids — a batch get by Tempio ad id, capped
at 100 — and returns a page of 25 by default, 100 at most. minSpend there is
in minor units of the range's own currency — 500 in the app is 50000 over
MCP.
Sorting and paging
| Sort | Orders by |
|---|---|
| Newest / Oldest | The archive's own delivery start date; ads with none come last |
| Longest running | Days live |
| Longevity | The score, with unscored ads last |
| Published spend | The published lower bound, with unpublished last |
| Most reused creative | How many ads share this ad's creative |
| Random | A shuffle that stays consistent while you page |
Paging is by cursor, not by page number. The corpus is written to continuously, so a page number over a million rows would show you a row twice and skip another while the ingest ran underneath. Each page hands back the cursor for the next one; a cursor belongs to the sort it was made for and is refused by any other.
The two saved views
Two filter sets are worth a name, and both are ordinary links into the same search — a saved view here is a URL, so it is shareable, bookmarkable and nothing is stored:
- Proven — still running, live for at least 90 days, longest first. An advertiser who has kept an ad up for a quarter is telling you something.
- Testing now — still running, started inside the last fortnight, newest first. This is what they are trying at the moment.
The longevity score
Every ad carries a longevity score from 0 to 100. It measures how long an ad has run, not how well it performed, and that sentence is printed beside the number everywhere the number appears — in the app, in a tool result and in the weekly digest.
The formula is published because a score nobody can check is a number to
distrust. Formula v1 is:
score = 55 × min(days live / 180, 1) how long it has run
+ 25 × (still running ? 1 : 0) whether it is still running
+ 20 × min(sibling ads on the same
landing page / 10, 1) how much of this advertiser's
effort points at one pageDays live is (stop date, or the day the ad was last seen) − start date,
computed at read time from the archive's own dates and never stored. Sibling
ads are the advertiser's other ads pointing at the same landing page, so an
ad alone on its page scores nothing on that term. Every format is scored, text
ads included.
An ad whose archive published no start date has no days live, so it has no score: the app shows not published, and a score sort puts it last. It is never rendered as 0, for the same reason a click-through rate with no impressions is blank rather than zero.
The version the number was computed under is stored beside it and shown with it. A change to the formula is a re-score of the corpus, not a quiet reinterpretation of numbers that are already there.
What the score is not. No platform publishes how an ad it does not own performed, so nothing here is a performance figure, a quality rating or a prediction. Two ads at 80 have both run a long time and are both still running. That is the whole claim.
How a spend range is derived
Spend on somebody else's ad is never something Tempio knows. What it has is what the platform published, and there are exactly two ways a range appears:
- The platform published the range itself. Meta publishes spend on political and issue ads. The numbers are the platform's own, stored untouched, and the sentence under them reads: This range is the one the platform published for this ad, not a figure from the advertiser's account.
- The platform published an impression range, and the range is derived from it. Multiplying a published impression range by a cost per thousand impressions gives a spend range, and the sentence under it says so: A range derived from the impressions this platform published, not from the advertiser's account. The row records which cost band did the arithmetic.
There is no third way. A cost band must cite a published figure for its archive and region to exist at all, and the band table holds no rows today, because no published figure for any of these four archives is sourced. So an ad whose archive published only impressions currently shows not published for spend, and the first sourced figure is a band, a version bump and a re-derivation.
Wherever a range does appear it is labelled Estimated and carries a warning in the same words as the line under the number: the platform-published sentence on a platform-published range, the derived sentence on a derived one. An answer holding both kinds carries both sentences, once each, so an agent reading it is never told something that is true of only half the ranges in front of it.
An ad with no published range reads not published. Never zero — zero is a claim that an advertiser spent nothing, and nothing here supports it.
Impressions and unique reach are shown separately from spend, as the platform published them, with no arithmetic on top. They are different quantities: how many times an ad was shown and how many people saw it are not interchangeable, and Tempio never turns one into the other.
Derived by Tempio
Hook, offer, angle and audience are a model's reading of the ad's own copy —
one pass over the text the archive published, on anthropic/claude-haiku-4.5,
with the prompt version stored on the row. They are shown under a Derived by
Tempio label with the model and prompt version beside them, and a tool result
carries the same statement as a warning. They are Tempio's reading, never
something the advertiser or the platform said, and an ad with no reading shows
no panel rather than an empty one.
All four are searched along with the ad's own copy, which is what makes "free shipping offer" find an ad that never uses those words.
Library sources
The four public transparency archives the ad library reads, what each one publishes, which regions it covers, and why an advertiser shows fewer ads here than on the platform's own site.
Advertisers
Adding an advertiser by website, name or a pasted library URL, what per-archive ingest status means, and reading the landing-page rollup with its UTM column.