Build a Cross-Platform Ad-Spy Workflow (Meta, Google, LinkedIn & TikTok)
Here's the problem with most competitor ad research: it's platform-shaped. You check the Meta Ad Library in one tab, the Google Ads Transparency Center in another, maybe TikTok Creative Center if you remember it exists, and LinkedIn's library if you're in B2B. Each one has a different UI, a different export story (usually none), and a different mental model. So most teams just check Meta and call it a day, and miss half of what a competitor is doing.
The advantage of a single API that fronts all four is that "spy on this competitor everywhere" becomes one function call per platform, same auth, same response shape, results you can merge into one view. Let me show you how to build that.
The four libraries, and why you want all of them
Each ad library reveals something the others don't:
- Meta (Facebook/Instagram): highest volume for DTC and consumer brands; strong creative signal. This is where most spend-heavy testing happens.
- Google (Search, YouTube, Display): intent-driven Search copy plus YouTube video pushes. The Search text ads are a competitor's positioning in compressed form.
- TikTok (Creative Center Top Ads): short-form video trends and hooks, sortable by engagement. Best early read on creative formats that are working right now.
- LinkedIn: the B2B picture, messaging and longevity for anything sold to businesses.
A competitor rarely runs the same creative across all four. The gaps and overlaps between platforms are the actual insight, that's the strategy you can't see from one library.
One client, four endpoints
Every ad-library endpoint on SociaVault shares the same base (https://api.sociavault.com/v1), the same x-api-key auth, the same 1-credit cost, and the same envelope with the payload under data. That consistency is the whole point, here's a thin client that hits all four:
const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE = "https://api.sociavault.com/v1";
async function get(path, params) {
const qs = new URLSearchParams(params).toString();
const res = await fetch(`${BASE}${path}?${qs}`, {
headers: { "x-api-key": API_KEY },
});
if (!res.ok) throw new Error(`${path} failed: ${res.status}`);
return (await res.json()).data;
}
async function spyOnCompetitor({ companyName, domain }) {
const results = {};
// Meta: all ads a company is running
results.meta = await get("/scrape/facebook-ad-library/company-ads", {
companyName,
});
// Google: ads by domain across Search/YouTube/Display
results.google = await get("/scrape/google-ad-library/company-ads", {
domain,
region: "US",
});
// LinkedIn: B2B ad roster
results.linkedin = await get("/scrape/linkedin-ad-library/search", {
company: companyName,
});
// TikTok: top ads matching the brand as a keyword
results.tiktok = await get("/scrape/tiktok-ad-library/search", {
query: companyName,
region: "US",
period: "30",
});
return results;
}
const intel = await spyOnCompetitor({
companyName: "Notion",
domain: "notion.so",
});
console.log(Object.keys(intel));
Four platforms, four credits, one object you can normalize and diff. Note that the parameters differ slightly per library, that's real: Meta and LinkedIn key off company name, Google off domain, and TikTok's ad library is a keyword-and-region search over Creative Center Top Ads rather than a per-company roster. Don't paper over that difference; it reflects how each platform actually exposes its data.
Normalizing into one view
The raw responses have different shapes, so map each into a common record before you analyze. Read fields defensively and log one raw response per platform first to confirm names, this is exactly where assuming a field exists will bite you:
function normalize(platform, raw) {
const ads = Array.isArray(raw) ? raw : raw?.ads ?? raw?.results ?? [];
return ads.map((ad) => ({
platform,
text: ad.text ?? ad.body ?? ad.headline ?? null,
format: ad.format ?? ad.media_type ?? null,
firstSeen: ad.start_date ?? ad.startDate ?? ad.first_shown ?? null,
raw: ad, // keep the original so nothing is lost
}));
}
Once every ad is a { platform, text, format, firstSeen } record, you can do the useful stuff: count ads per platform, cluster the copy by theme, and sort by firstSeen to find the long-runners (the proven winners) on each surface.
Make it a standing feed, not a one-off
The real value is longitudinal. Run this monthly for your competitor set, store each pull, and diff against the previous month:
- New ads appearing = fresh creative tests worth studying.
- Ads that disappear = things that didn't work (learn from their failures for free).
- A platform lighting up = a competitor shifting budget somewhere new.
For a set of, say, 6 competitors across 4 platforms, that's roughly 24 credits a month for a cross-platform competitive feed. If you're wiring this into a broader system, it pairs naturally with an AI agent for social monitoring or a competitor-driven content calendar.
The honest limits
- No platform gives you spend or performance for standard ads. All four are creative-and-presence libraries. Ad longevity is your best proxy for "working," and it's still a proxy.
- The libraries aren't symmetrical. TikTok's is a Creative Center Top Ads search, not a guaranteed full per-advertiser roster like Meta's. Don't compare raw ad counts across platforms as if they mean the same thing.
- Coverage and fields vary by platform and region. Set region deliberately, and expect to maintain your field mappings as payloads change.
- You see creative, not targeting. Two identical ads can chase completely different audiences; the libraries won't tell you which.
- Public ads only. This is competitive research on published ads, not a route to private account data.
Frequently Asked Questions
Can one tool really pull ads from Meta, Google, LinkedIn, and TikTok?
Yes. SociaVault exposes an ad-library endpoint for each, all with the same auth and response envelope, so a single script can pull all four. The parameters differ slightly because each platform organizes its library differently.
Do any of these show competitor ad spend?
No. Every public ad library, Meta, Google, LinkedIn, TikTok, shows creative, format, and rough timing, but not budgets or performance for standard commercial ads. Treat how long an ad has run as a rough signal of what's working.
Why are the parameters different for each platform?
Because the platforms expose data differently. Meta and LinkedIn let you pull a company's roster by name, Google works by domain or advertiser ID, and TikTok's Creative Center is a keyword-and-region search over top ads. The workflow embraces that rather than pretending they're identical.
How many credits does a full cross-platform pull cost?
One credit per platform per call, so about 4 credits to sweep one competitor across all four libraries. Monitoring several competitors monthly is still a small credit spend, and you start with 50 free.
How do I compare ads fairly across platforms?
Normalize each response into a common record (platform, copy, format, first-seen date), then analyze those fields rather than raw counts. Because the libraries aren't symmetrical, use per-platform trends over time instead of cross-platform ad-count comparisons.
How often should I run it?
Monthly works for most teams. Store each pull and diff against the last to catch new creative, retired ads, and budget shifts between platforms.
Want a single competitive ad feed across every major platform? Start free with 50 credits, no card required and pull your first competitor across all four libraries today. Comparing options first? See our social scraping API roundup.
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API. No credit card required.