Playbooks · Recipe
Pull ads from the Meta Ad Library, collapse them to Pages, bridge each Page name to a real company domain, then work down to people and verified emails. The scraper bills 1 credit per result returned and bills on any 2xx. Only the finder and verifier give you a free miss.
Last updated September 22, 2026
Pattern: meta_ads_library_scraper_sync → dedupe to Pages → find_website_by_company_name → linkedin_company_search → linkedin_company_employees_search → email_finder → email_verifier
Credit math: Worked example at stated counts: one Ad Library URL with limit 100 = 100 results at 1 = 100 credits. Those collapse to 38 Pages. 16 of them need find_website_by_company_name at 1 per call = 16 credits, charged whether or not a site comes back. linkedin_company_search, 38 queries returning 10 each = 380 results at 0.1 = 38 credits. linkedin_company_employees_search, 38 companies at 20 results = 760 results at 0.1 = 76 credits. email_finder on 90 selected people, 55 hits at 5 = 275 credits, misses free. email_verifier on 55 at 2 = 110 credits. 1 credit per result on meta_ads_library_scraper_sync, 1 credit per find_website_by_company_name call, 0.1 credits per result on linkedin_company_search and linkedin_company_employees_search, 5 credits per email_finder call, 2 credits per email_verifier call
ROI math: At 1 credit per result the scrape is cheap enough to run wide, and the expensive part moves downstream into the Page-to-company bridge, which bills per attempt and fails often. Budget for the bridge, not the scrape. Convert credits at your tier rate on /pricing.
Owned internally by: Agency new-business, or a founder doing their own prospecting with a browser tab open
Best for: Selling to brands that spend on Meta — creative studios, UGC and performance agencies, ecommerce apps, post-purchase and retention tools
curl -X POST https://api.richapi.ai/api/v1/meta_ads_library_scraper_sync \
-H "x-api-key: $RICHAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"meta_ad_url": "https://www.facebook.com/ads/library/?q=skincare&country=US", "limit": 100}'
Pull 100 ads from this Meta Ad Library search, group them by page name,
and rank the pages by how long their oldest still-active ad has been
running. For the ten longest-running, find the company website, then get
me a verified email for the head of growth or the founder.
Sign up at app.richapi.ai and copy your key.
25 free credits, no card.
Build your Ad Library URL in the browser first, with the country and keyword filters you actually want, then paste it into meta_ad_url. Set limit deliberately — default 0, maximum 100, every result bills.
Group the results by pageName and keep the earliest startDate per page.
Ad longevity is the signal worth ranking on.
Bridge each Page to a company.
Use ctaDomain when it is a real corporate domain, and find_website_by_company_name for the rest. That call bills per attempt.
Run linkedin_company_search, then linkedin_company_employees_search, then email_finder and email_verifier on the shortlist.
This is the whole reason the recipe differs from the Google one. Google's disclosure hands you a `landingDomain`, which is already most of the way to a company. Meta's hands you a `pageName` — "Hydra Skincare", "Hydra Skin Co", "Hydra (UK)" — and a `ctaDomain` that is as likely to be a Shopify subdomain, a link shortener or a campaign landing page as it is the brand's actual site. So there is a bridge step in the middle of this chain that the Google recipe does not have, and it costs money. `find_website_by_company_name` turns a Page name into a website at a flat rate per call, and it bills on any 2xx, including calls where the name was too generic to resolve. Check `ctaDomain` first and only pay for the bridge on the Pages where it is unusable. **[Get 25 free credits — no card](https://app.richapi.ai)**
The Google chain ranks advertisers by how many creatives they run. Here the field that matters is `startDate`, because the Ad Library shows you when each ad started and `adStatus` tells you whether it is still live. An ad that has been running continuously for four months is an ad that is working, and a brand with three of those is a brand with budget and a functioning funnel. A page with thirty ads all started last Tuesday is a brand testing, or an agency spraying. Both are real signals and they lead to completely different first lines. `adText` and `publisherPlatforms` are what make the outreach specific. You can quote the copy. You can point out they are running Reels and nothing on Stories. That is worth more than the fact of spending. None of it is intent. It is a public advertising disclosure, dated and checkable, and we sell no intent feed.
One Ad Library search URL, `limit` 100. | Step | Count | Rate | Bills regardless? | Credits | |---|---|---|---|---| | `meta_ads_library_scraper_sync` | 100 results | 1 / result | **Yes, every 2xx** | 100 | | `find_website_by_company_name` | 16 calls | 1 / call | **Yes** | 16 | | `linkedin_company_search` | 38 × 10 = 380 results | 0.1 / result | **Yes** | 38 | | `linkedin_company_employees_search` | 38 × 20 = 760 results | 0.1 / result | **Yes** | 76 | | `email_finder` | 90 calls, 55 hits | 5 / call | No, waterfall | 275 | | `email_verifier` | 55 calls | 2 / call | No, waterfall | 110 | Rates used above: 1 credit per result on `meta_ads_library_scraper_sync`, 1 credit per `find_website_by_company_name` call, 0.1 credits per result on `linkedin_company_search` and `linkedin_company_employees_search`, 5 credits per `email_finder` call, 2 credits per `email_verifier` call. At 1 credit per result the scrape is a third the price of the Google equivalent, which makes wide pulls affordable and makes the middle of the chain the place where money leaks. A hundred ads that collapse to 38 Pages is a good day; a hundred ads from one very busy advertiser collapse to three. Per-credit rates vary by tier, so convert on [the pricing page](/pricing).
**Page name is not company name.** Brands run regional Pages, sub-brands and seasonal Pages. "Hydra Skincare UK" and "Hydra Skincare" are one account, and no deduplication rule you write will catch every variant. Eyeball the list before you spend on contacts. **`ctaDomain` pointing at a storefront.** A Shopify or marketplace subdomain tells you the platform and not much else. Useful for qualification, useless as a corporate domain for the LinkedIn match. **Agency-run Pages.** Performance agencies run ads from the client's Page, so the Page looks like the brand and the person making creative decisions sits somewhere else entirely. If you sell to brands this is fine. If you sell to agencies you are chasing the wrong end. **Politics and issue ads.** The Ad Library covers those under a separate disclosure regime with different fields and a different retention window. If your keyword catches them, filter them out rather than trying to enrich them. **Small companies with no LinkedIn presence.** A five-person DTC brand may have a Page, a store and no company LinkedIn page worth searching. The chain dead-ends after the bridge and you have paid for the bridge. This is the most common way this recipe underperforms against the Google one, whose advertisers skew larger and better documented.
If your buyers spend on search rather than social, the Google chain starts from a landing domain and skips the bridge entirely — see [Google Ads Transparency to outbound](/use-cases/google-ads-transparency-to-outbound). To size a brand before you spend on its contacts, [Similarweb traffic qualification](/use-cases/similarweb-traffic-qualify) is a 2-credit filter per domain. For local businesses rather than online brands, [maps local lead to CRM](/use-cases/maps-local-lead-to-crm) is the better shape, and [signal-based prospecting](/use-cases/signal-based-prospecting) covers the pattern in general. Endpoint detail for the last two steps sits on [the email verifier page](/api/email-verifier), pricing on [the pricing page](/pricing), and the rest on [the use-case index](/use-cases).
**Do I have to build the Ad Library URL by hand?** Yes, and that is the fastest way to work. Filter in the browser until the results look right, then pass that URL straight to `meta_ad_url`. **What does `limit` do to my bill?** It sets how many results you pay for. The default is 0 and the maximum is 100, and there is no preview. On a new keyword, start at 10. **Can I tell how much a brand is spending?** Not from this. You get the ads, their status, their start dates and their platforms. Spend is not disclosed outside the political and issue-ad regime, and anybody quoting you a number for a commercial advertiser is estimating. **What is free if the chain misses?** Only `email_finder` and `email_verifier`. Their soft misses return `billed: false` and cost zero. The scraper, the website bridge and both LinkedIn searches bill on any 2xx. **Do I need a credit card?** No. 25 free credits on signup.
Pull ten ads from a keyword you already know well and see how many distinct Pages come back. That ratio decides whether the rest is worth automating. **[Get 25 free credits](https://app.richapi.ai)**