Clay
Ready-made Clay HTTP API columns for AdLib. Check whether a company is advertising and where, pull its current ad copy for personalization, and stream competitor ad changes into a Clay table. Works with any Clay plan, no integration install needed.
Clay's HTTP API enrichment calls AdLib directly, with your own API key. You don't need to install anything or wait for a marketplace listing. Every template below is one column: you paste the settings, run it on a few rows, and map the fields you want into their own columns.
Before you start
- Create an API key in the dashboard. The free plan is enough to try the templates.
- In Clay, add a domain column to the table, such as
nike.comorwww.nike.com. If you only have full website URLs, turn them into domains first (Clay's domain formatter or a formula), because a URL with a path doesn't fit into the endpoint. - In every HTTP API column, add the header
X-API-Keywith your key. Clay keeps it with the column; it is never written into the table.
Template 1: Is this company advertising?
The core signal for lead scoring: is the company running ads right now, on which platforms, and how many. One call covers Meta (Facebook and Instagram), Google and YouTube, TikTok, LinkedIn, Pinterest, X, Snapchat, the Apple App Store, Amazon and Microsoft.
| Setting | Value |
|---|---|
| Method | GET |
| Endpoint | https://api.adlibapi.com/v1/domains/{{Domain}}/check |
| Header | X-API-Key: your key |
| Run only if | Domain is not empty |
Run it on one row, then map these fields from data.columns into their own columns:
| Field | Example | Use it for |
|---|---|---|
advertising |
true |
Filter and score. false means no current ads were found, null that no platform could be checked (that row is free, run it again later) |
platforms_advertising |
meta,google,linkedin |
Personalization ("saw your LinkedIn ads") |
platform_count |
3 |
Scoring: active on several channels means real budget |
total_active_ads |
148 |
Scoring and segmenting by ad volume |
latest_ad_at |
2026-10-26T00:00:00Z |
Recency: launched something this week? |
linkedin_advertising, meta_active_ads, … |
true, 42 |
One column per platform you care about |
meta_advertiser_id, linkedin_advertiser_id, … |
meta:15087023444 |
Input for template 2 |
The full per-platform answer, including which advertiser account matched and up to three sample ad ids, is in data.platforms.
Cost: 3 credits per row. Rows where no platform could be reached are free.
Only the platforms you sell into
B2B teams usually only care about LinkedIn and Google. Add platform as a query parameter and the check asks only those platforms, which makes it faster:
| Setting | Value |
|---|---|
| Endpoint | https://api.adlibapi.com/v1/domains/{{Domain}}/check?platform=linkedin,google |
Platform names: meta, google, tiktok, linkedin, pinterest, x, snapchat, apple, amazon, microsoft. YouTube ads are part of google.
Template 2: Current ad copy for personalization
Take the advertiser id from template 1 and fetch the company's newest running ads. The ad text, headline and landing page make a strong first line for an AI personalization column ("Your new 'Spring sale' campaign on Meta …").
| Setting | Value |
|---|---|
| Method | GET |
| Endpoint | https://api.adlibapi.com/v1/advertisers/{{meta_advertiser_id}}/ads?status=active&limit=3 |
| Header | X-API-Key: your key |
| Run only if | meta_advertiser_id is not empty |
Useful fields to map:
| Field | Example |
|---|---|
data[0].creatives[0].text |
The ad copy |
data[0].creatives[0].headline |
Spring sale: 30% off |
data[0].creatives[0].landing_url |
The page the ad sends people to |
data[0].first_shown |
When the ad started |
data[0].creatives[0].media[0].url |
Image or video |
Swap meta_advertiser_id for linkedin_advertiser_id, google_advertiser_id or any other platform. Each ad is billed like any ad (1 credit on Meta, 2 on Google, 3 on LinkedIn), so three ads cost 3 to 9 credits; see Credits and billing.
Template 3: Competitor ad changes as rows
Instead of pulling, let AdLib push. A watchlist checks advertisers on a schedule and sends every new, stopped, changed or removed ad as a webhook. Clay can receive webhooks as a table source:
- In Clay, create a new table from the Webhook source and copy its URL.
- Create a watchlist with that URL as
webhook_url:
curl -X POST "https://api.adlibapi.com/v1/watchlists" \
-H "X-API-Key: $ADLIB_API_KEY" -H "Content-Type: application/json" \
-d '{"name": "Competitors",
"advertisers": ["meta:15087023444"],
"webhook_url": "<your Clay webhook URL>",
"interval_hours": 24}'- After each check, one row arrives per advertiser that changed. Map
advertiser_id,summary.new,summary.stoppedandnew[0].ad.creatives[0].textinto columns.
The first check is the baseline and sends nothing. Get the advertiser ids from template 1 or from resolve. How many advertisers and how often depends on the plan; see Watchlists and webhooks.
Run settings for large tables
- Rate limit. Set the column's rate limit to your plan's requests per minute (Free 10, Starter 60, Growth 120, Pro 300, Business 600). Over the limit AdLib answers
429 rate_limitedwith aRetry-Afterheader and the row stays empty, so keep the column's rate limit at or below your plan's limit. - Response time. A check asks every platform live and answers within 20 seconds, usually faster. Restricting
platformto the ones you need makes it quicker still. A platform that hasn't answered by then comes back with anerrorindata.platforms, and the rest of the row is still filled. A platform that is down (see the status page) is skipped at once. - Errors.
401means the key is missing or wrong,429 quota_exceededthat the month's credits are used up. Neither is billed. Error codes are in Errors and rate limits. - Lists of thousands. For very large lists outside Clay, a batch job of type
domainsdoes the same in the background.
Not in Clay?
The same calls work in any tool that can send an HTTP request with a header: n8n, Make, Zapier, HubSpot workflows, Google Sheets. See n8n, Clay and no-code.