How to Find UGC Ads Programmatically: A Filter-Stack Workflow for DTC Briefs
Find UGC ads programmatically with a four-layer filter stack: video, 9:16, 90-day longevity, niche keyword. Verify real creators, extract briefs via API.

Sections
How to Find UGC Ads Programmatically: A Filter-Stack Workflow for DTC Briefs
Every DTC marketer has burned an afternoon scrolling an ad library for inspiration. You want to find UGC ads that actually worked, the creator-style videos a competitor kept funding for 90 days straight — and instead you get an endless feed of week-old tests nobody will remember by Friday. The problem isn't your eye. It's the method. Scrolling is sampling. Filtering is measurement.
TL;DR: The best UGC brief is a winning UGC ad that already ran for 90 days. Stack four filters through the AdLibrary API (video format, 9:16 aspect ratio, longevity sort, and a niche keyword) to find UGC ads programmatically, verify each one is genuinely creator-made with AI enrichment, file the survivors into a swipe corpus, and extract creator briefs from the proven winners. One credit per search, ten searches a minute, zero scrolling.
This guide walks the full workflow for a DTC marketer who briefs UGC creators: what marks creator-style creative in raw ad data, the exact filter stack that surfaces it, how to separate real creator footage from studio imitations, and how to turn the survivors into briefs your creators can shoot from. Working code included.
Why Scrolling for UGC Inspiration Doesn't Scale
A typical DTC niche runs thousands of active ads at any moment. Skincare alone returns five figures of results in most ad libraries. Your scroll session samples maybe 200 of them, weighted toward whatever the platform decided to surface today, which usually means recency. Recency is the opposite of what you want.
Here's the survivorship logic that makes longevity the strongest public signal available. Advertisers kill underperforming creative fast, usually inside the first week, because every day a loser runs costs real money. An ad still spending after 90 days has survived dozens of internal kill decisions. Nobody funds a dud for a quarter. The complete UGC ads guide covers why creator-style creative wins auctions. This post covers how you find the proven specimens without scrolling for them.
Manual research also rots. The deck you assembled last month references ads that died three weeks ago. A programmatic pull is fresh every time it runs, and it runs while you sleep. Most UGC ads fail for predictable reasons, so your brief should start from the rare ones that demonstrably didn't.
The shift in mindset matters more than the tooling. Stop asking "what UGC looks good?" and start asking "what creator-style video has a competitor paid to run the longest?" The first question gets opinions. The second gets data.
What Marks UGC Creative in Ad Data
Before you can find UGC ads in a dataset, you need to know what they look like to a machine. There is no ugc=true checkbox in any ad dataset, because UGC is a creative style, not a technical attribute. Ad platforms know an ad's format, dimensions, and runtime. They don't know whether a human filmed it on a phone in their kitchen. So you identify UGC structurally first, then verify stylistically.
Three structural markers do most of the work:
- Format: video. UGC is overwhelmingly a video phenomenon. In AdLibrary's data model that's
ads_type: 2, and you can filter for it directly with media type filters. - Aspect ratio: 9:16. Creator content is shot on phones for phones. Vertical 9:16 framing is the native shape of selfie-style footage, and it's filterable via the
adsFormatparameter. Studio brand spots still skew 1:1 and 16:9 far more often. - Runtime.
days_counttells you how long the creative has been live. This is your winner signal, the difference between a test and a scaled performer.
The stylistic markers live inside the creative itself: a person talking directly to camera, handheld movement, native captions, kitchen-and-bathroom settings, unscripted cadence. No filter reads those from metadata. AI enrichment does — it watches the video and returns a scene-by-scene transcript plus a creative teardown, which is how you confirm the hook is a face saying "I almost didn't buy this" rather than a logo animation. That verification layer is step 3 below.
One more marker worth knowing: the advertiser name. UGC run through creator whitelisting shows the creator's handle as the advertiser rather than the brand. Spotting a brand's product in an ad published under a personal name is a strong tell that you're looking at a whitelisted creator post, the most native form of UGC running today.
How to Find UGC Ads with a Four-Layer Filter Stack
The whole discovery problem compresses into four filters applied in one API call. That's all it takes to find UGC ads at scale, and each layer removes a different kind of noise.
| Layer | Parameter | What it removes |
|---|---|---|
| 1. Video only | adsType: ["2"] | Static images, carousels, collections |
| 2. Vertical 9:16 | adsFormat: ["9:16"] | Studio-format 16:9 and square brand spots |
| 3. Longevity | daysBack: 90 + sortField: "-days" | Week-old tests with no survival evidence |
| 4. Niche keyword | keyword: "your niche" | Every vertical that isn't yours |
Layer 1 and 2 are your UGC shape proxy. Layer 3 is your quality proxy: sorting by -days puts the longest-running creatives first, which is the same signal media buyers use when diagnosing ad fatigue with competitor longevity data. Layer 4 scopes the result set to ads you could actually learn from.
The stack isn't perfect, and that's fine. A 9:16 video that ran 90 days might still be a polished studio edit shot vertical. The filter stack gets you from 40,000 candidates to 60, and enrichment gets you from 60 to the genuinely creator-made subset. Precision at the cheap layer, verification at the expensive one. That's the right order for credit economics.
If you want to find winning UGC ads in a specific market, the keyword layer is where you tune. "Collagen powder" and "collagen supplement" return different advertiser pools. Run both. Each search costs one credit, so a five-keyword sweep of your niche costs five credits and takes under a minute inside the rate limit.
Step 1: Scope the Niche Before You Spend a Credit
Free calls first. The AdLibrary API ships a free advertiser-resolution endpoint that fans a brand name out across Meta, Google, and LinkedIn and tells you when the platforms agree it's the same advertiser. Use it to assemble your competitor list before any paid search:
curl -G "https://adlibrary.com/api/advertisers/search" \
-H "Authorization: Bearer adl_your_api_key" \
--data-urlencode "q=Javy Coffee" \
--data-urlencode "country=US"
The response includes a best_match with each platform's ID for the brand, plus candidate lists when the match is ambiguous. Resolve every competitor you care about in one sitting. It costs nothing, and the IDs feed directly into the saved-advertiser corpus you'll build in step 4.
For keyword scoping, run one broad search per candidate keyword and read the total field in the response before paging deeper. A keyword returning 12 matches isn't worth a nightly schedule. One returning 4,000 needs tighter filters before the results mean anything. If you're new to the category of tooling, what an ad library API actually is covers the landscape. The short version: you're querying the same public ad transparency data the platforms publish, merged and made filterable.
Worth checking at this stage too: where else the niche advertises. Google's Ads Transparency Center and TikTok's Commercial Content Library are the official per-platform transparency surfaces, useful for spot-checking a single brand by hand. The API's job is doing that across eleven platforms in one query when checking by hand stops scaling.
Step 2: Run the Search That Surfaces 90-Day UGC Winners
The full filter stack in one call:
curl "https://adlibrary.com/api/search" \
-H "Authorization: Bearer adl_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"keyword": "collagen powder",
"appType": "3",
"adsType": ["2"],
"adsFormat": ["9:16"],
"daysBack": 90,
"sortField": "-days",
"geo": ["USA"],
"platform": ["facebook", "instagram", "tiktok"]
}'
Each result carries the fields your pipeline sorts on: days_count (runtime), heat (a 0–1000 momentum score), impression (reach signal), like_count and share_count, the advertiser name, creative URLs, and the landing page. Treat impressions as a band rather than an exact figure, and remember spend is always an estimate. Runtime is the cleanest number in the set, which is why it anchors the stack.
Pagination is honest but metered. Every page is a fresh one-credit search, and the per-key limit is 10 requests per minute, so a deep crawl of a big niche wants a sleep between pages:
import requests, time
ADS = []
for page in range(1, 6):
r = requests.post(
"https://adlibrary.com/api/search",
headers={"Authorization": "Bearer adl_your_api_key"},
json={
"keyword": "collagen powder",
"appType": "3",
"adsType": ["2"],
"adsFormat": ["9:16"],
"daysBack": 90,
"sortField": "-days",
"page": page,
},
)
data = r.json()
ADS += [a for a in data["results"] if a.get("days_count", 0) >= 60]
print(f"page {page}: {len(data['results'])} ads, "
f"{data['_credits']['remaining']} credits left")
time.sleep(7) # stay under 10 req/min
The post-filter on days_count >= 60 matters because sort order surfaces the long-runners first, but page 4 of a thin niche can drift into short-lived creative. Cut where the survival evidence cuts. More patterns like this live in the Python ad library scripts cookbook, including retry handling for 429s via the Retry-After header.
What you have after this step: a few dozen vertical videos, each with at least two months of paid runtime in your niche. You didn't scroll to find UGC ads this time. The filters did the finding, and that's your candidate pool. Now you find out which ones are actually UGC.

Step 3: Separate Real UGC from Studio Faux-UGC
Brands noticed UGC outperforms, so studios started shipping faux-UGC: scripted actors, ring lights dressed down with a handheld wobble, "authentic" kitchens built on soundstages. Some of it performs. But if your goal is briefing real creators, you need to know which mechanics you're copying — a genuine creator's improvised cadence or a copywriter's script read by an actor. They're different briefs.
Metadata can't make that call. The creative teardown can. AdLibrary's AI enrichment endpoint runs an analysis over the actual video and returns a timestamped transcript plus a full creative teardown that quotes the ad itself:
curl "https://adlibrary.com/api/enrichment" \
-H "Authorization: Bearer adl_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"ad": {
"ad_key": "meta_123456789",
"platform": "facebook",
"video_url": "https://..."
}
}'
Read the output for the tells. Real UGC: direct-to-camera address in first person, location audio, one continuous speaker, product handled on camera, imperfect lighting noted in the scene descriptions. Faux-UGC: voiceover layered on b-roll, multiple cut-aways to studio product shots, suspiciously clean audio, dialogue that reads like landing-page copy. The transcript makes the script-versus-speech difference obvious within two sentences, the same way AI ad analysis at scale surfaces creative patterns across a whole portfolio.
Each enrichment costs one credit, which is exactly why the filter stack runs first. Enriching 40,000 raw results would be absurd. Enriching the 30 longest-running vertical videos in your niche costs 30 credits and tells you precisely which five are authentic creator work worth modeling. Re-running an ad you've already unlocked is free, so build your corpus without fearing double charges.
There's a compliance angle worth respecting here too. Real creator endorsements carry disclosure obligations — the FTC's Endorsement Guides require material connections between brand and creator to be disclosed clearly. When you study winning UGC, you'll notice the durable ones disclose and convert anyway. Brief your creators accordingly rather than treating disclosure as a performance tax.
If part of your production plan is synthetic, the same verification logic applies in reverse: AI UGC ads only work when they replicate the authenticity markers real winners exhibit, and the current crop of AI UGC video generators still needs a human-quality brief to avoid the uncanny valley.
Step 4: Build the UGC Swipe Corpus
A scroll session produces screenshots. A pipeline produces a corpus: structured rows you can query, sort, and brief from six months later. The difference compounds, as anyone maintaining a serious swipe file learns within a quarter.
Persist these fields per ad, keyed on ad_key (the stable identifier across calls):
ad_key, advertiser name, platform, landing page URLdays_countat capture time, plus capture date (runtime keeps growing while winners keep running)heatand engagement counts as a momentum snapshot- The enrichment transcript and hook line, verbatim
- Your own verdict: real UGC / faux-UGC / unclear
Two API features make the corpus durable. Saving an advertiser is free (POST /api/advertisers with the platform IDs you resolved in step 1), and a saved brand bundles all its accounts, so Nike's main page, Nike Football, and Nike Run Club merge into one entity. Then one curate call per session pulls every recent ad a saved brand runs across platforms, deduped, for a single credit. That's your weekly refresh: re-pull the niche leaders, diff against the corpus on ad_key, and flag new creative the day it appears.
Where you store rows is taste. The automated Airtable swipe file build is a working template, and the same shape drops into Notion, Sheets, or Postgres. Teams running creative inspiration and swipe file workflows usually settle on whatever their creative team already opens daily, which is the right call. A corpus nobody opens is a backup, and the goal here is for every creative angle on file to be one search away when a brief is due.
The corpus also tells you when to act, and it means you never start from zero: next quarter, nobody on your team needs to find UGC ads from scratch, because the proven ones are already filed. An ad that was at 45 days last month and 75 days today is being scaled in front of you. That trajectory, visible only because you snapshot runtime over time, is a louder buy signal than any single-day heat score.
Step 5: Extract the Brief from the Winners
You've found UGC ads with proof of life and confirmed they're genuinely creator-made. Now convert them into briefs. Manual extraction works (watch the ad five times, note the hook, the proof stack, the offer, the pacing), and the 60-minute research-to-brief workflow shows the API-plus-LLM version end to end. But the enrichment endpoint already does the heavy half: it returns the full creative teardown plus a 1:1 replication brief, built from the transcript and scene descriptions of the winner you fed it.
A strong creator brief built from a winner contains:
- The hook, quoted. Not "open with a strong hook" — the actual first line that held attention for 90 paid days, plus the enrichment's read on why it stops the scroll. Your creator records their own version, but they start from proof, which is the whole point of a research-first creative brief.
- The skeleton, timestamped. Problem at 0:00, agitation by 0:06, product in hand by 0:12, proof by 0:20, CTA by 0:28. Winners share structure even when they share nothing else.
- The authenticity markers. Setting, framing, audio quality, disclosure placement. These are instructions to preserve, since polish is what kills creator content.
- What you changed. Your product, your audience objection, your offer. Copying a winner verbatim produces a stale ad and a possible rights problem. Modeling its mechanics produces a test with a head start.
When you want winner evidence at the portfolio level rather than per-ad, point the winners scan at a competitor's page. It scores their whole portfolio, dedupes variants into concepts, and returns plain-language reasoning like "outran 12 sibling ads on the same landing page, 89 days versus a 21-day median." The methodology behind that scoring is unpacked in how to detect winning ads programmatically. For a UGC brief, the sibling comparison is gold: when the winner is creator footage and the losers on the same landing page are studio cuts, the format decision has been made for you, with someone else's budget.
Run each new creator video through creative testing against your current control, and feed results back into the corpus. The loop closes: find, verify, file, brief, test, refile.
Scheduling, Rate Limits, and Credit Budgeting
The workflow earns its keep when it runs on a schedule instead of a Tuesday whim. A practical nightly job: five niche keywords through the filter stack, diff results against the corpus, enrich anything new past 60 days of runtime, post the additions to Slack. Set the alert criteria once and the end-to-end competitor monitoring patterns or prebuilt n8n workflows handle the plumbing.
Budget math for that cadence, in real numbers. Five searches nightly is 150 credits a month. Two pages deep doubles it to 300. Add roughly 60 enrichments for newly surfaced candidates and a weekly curate refresh of ten saved advertisers, and a serious single-brand operation lands between 350 and 450 credits monthly. That sits comfortably inside the Business plan's 1,000+ monthly credits at €329/mo, which is also the tier that includes API access in the first place. Failed searches refund automatically, so errors don't leak budget.
Respect the limits and the pipeline never stalls. Ten requests per minute per key, with a Retry-After header on every 429 telling your client exactly how long to back off. A nightly five-keyword batch with a seven-second sleep never gets anywhere near the ceiling.
Close the loop on economics with your own numbers. A UGC winner you model still has to clear your unit economics, so sanity-check projected performance against the ROAS calculator before scaling, and use the ad spend estimator to gauge what competitors plausibly invest behind the creative you're studying. Estimated spend per ad in the API response feeds the same judgment: a 90-day runtime with meaningful estimated spend behind it is a stronger precedent than a 90-day zombie nobody funds.
Where This Fits Next to Meta's Free Ad Library API
Meta ships a free Ad Library API, and credit where due: Meta built the transparency infrastructure this whole discipline stands on. Use it when it fits. Its scope is transparency, though, which shapes what it returns: political and social-issue ads worldwide, all ad types only for the EU and UK over the last 12 months, app review plus identity verification to get in, and access tokens that expire every 60 days. The browsable Ad Library itself shows commercial ads, but the free API mostly doesn't, and neither exposes longevity sorting or aspect-ratio filters. The seven walls developers hit documents where research workflows outgrow it.
The AdLibrary API is the paid power-user lane for exactly this kind of workflow: commercial ads across Facebook, Instagram, TikTok, YouTube, Google, LinkedIn, Twitter, Pinterest and more from one endpoint, with the performance signals (runtime, heat, estimated spend, engagement) that make a filter stack possible, behind one adl_ key with no app review. If US political ads on Meta are all you need, Meta's free API is the right tool and costs nothing. If you brief UGC creators for a living, the stack above is how you find UGC ads with evidence behind them — the difference between sampling and measurement.
Frequently Asked Questions
Can you filter ads by "UGC" directly in an ad library?
No. UGC is a creative style, not a metadata field, so no ad dataset offers a UGC checkbox. The reliable way to find UGC ads is structural proxying (video format plus 9:16 aspect ratio plus longevity), then stylistic verification with AI enrichment, which reads the actual footage for direct-to-camera address, native captions, and unscripted speech.
Why is 90-day longevity the best signal a UGC ad is winning?
Advertisers kill losing creative within days because every impression on a dud costs money. An ad still spending after 90 days has survived continuous kill decisions by a team watching its real performance data. Runtime is the only public signal backed by the advertiser's own money, which makes it more reliable than likes or views.
How many credits does a monthly UGC discovery workflow cost?
A nightly five-keyword sweep is about 150 search credits monthly. Add a second page per keyword, roughly 60 enrichments on new candidates, and weekly curate refreshes of saved advertisers, and a serious operation runs 350–450 credits. The Business plan includes 1,000+ credits at €329/mo along with API access itself.
How do I tell real UGC from studio faux-UGC at scale?
Run candidates through the enrichment endpoint and read the transcript and scene descriptions. Real UGC shows one continuous speaker, location audio, handheld framing, and improvised cadence. Faux-UGC shows voiceover over b-roll, studio-clean audio, and dialogue that reads like landing-page copy. One credit per analysis, applied only to ads that passed the filter stack.
Does Meta's free Ad Library API support this workflow?
Only partially. Meta's free API is built for transparency and returns political and social-issue ads, with full commercial coverage limited to the EU and UK over the last 12 months. It has no longevity sort or aspect-ratio filter, requires app review, and expires tokens every 60 days. It's excellent for its purpose; programmatic UGC discovery across platforms isn't that purpose.
Find UGC Ads Before Your Competitors Brief Them
The scrolling habit persists because it feels like work. But the marketer who can find UGC ads with 90 days of paid survival behind them, verify authenticity in one API call, and hand a creator a brief quoting a proven hook is operating on evidence while everyone else operates on taste. Four filters, one verification pass, a corpus that compounds. The stack is small enough to build in an afternoon with the snippets above.
If that's the operating mode you want, API access ships on the Business plan at €329/mo with 1,000+ monthly credits, free integration help from the team, and refunds on failed calls. Run the first search tonight and your next creator brief starts from a winner instead of a guess.
Related Articles

UGC Ads: The Complete 2026 Guide for DTC Brands and Agencies
Everything you need to run UGC ads in 2026: 5 format types, creator sourcing (Insense, JoinBrands), AI UGC tools (Arcads, HeyGen), brief structure, FTC compliance, and swipe-file workflow.

AI UGC Ads: How to Research, Produce, and Test Creator-Style Ads at Scale
How to research winning UGC patterns, produce AI creator-style ads, run a proper test matrix, and rotate on fatigue — without a creator contract in sight.

How to Detect Winning Ads Programmatically (Winner Scoring Explained)
Detect winning ads programmatically: why ad longevity beats vibes, how winner tiers and composite scores work, and a scan-to-brief workflow with real code.

Python Ad Library API Scripts: A Working Cookbook
Five copy-paste Python ad library API scripts: resolve brands, search into pandas, track watchlists, scan winners, and batch-enrich ads with caching.

Automated Ad Swipe File in Airtable: Ads That File Themselves
Build an automated ad swipe file in Airtable: API ingestion script, four-table schema, AI auto-tagging, and a 30-min weekly review instead of data entry.

From Competitor Ad to Creative Brief in 20 Minutes (API + LLM)
Turn a competitor ad into a finished creative brief in 20 minutes: find the winner via the AdLibrary API, enrich it, and let an LLM draft the brief.

UGC ads: why most of it fails (and what wins)
UGC ads stop working when you treat creators as a hack. The brands winning in 2026 mine angles, brief on hooks, and refresh on a fixed cadence.