Bing Ad Library Scraper — Ad Search & Export
Pricing
Pay per event
Bing Ad Library Scraper — Ad Search & Export
Export ad records from Microsoft's public Bing/Microsoft Advertising Ad Library — ad id, advertiser, title, description, display and destination URLs, and creative assets. Search by advertiser name, resolved server-side to an AdvertiserId. Deduplicated rows, no login or API key required.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Quick answer: The Bing Ad Library Scraper searches Microsoft's public Bing/Microsoft Advertising Ad Library by advertiser name and returns every matching ad as structured, deduplicated data — ad id, advertiser, title, description, display URL, destination URL, and creative assets. Filtering works by advertiser name, resolved to a real advertiser id behind the scenes — Bing's own free-text ad search parameter doesn't actually filter anything, so we don't expose it. Pricing is pay-per-result — $3.20 per 1 000 ads landed, no subscription, no card required to try it.
🎯 What this scrapes
Microsoft's Bing/Microsoft Advertising Ad Library is a public ad-transparency surface — the same class as Meta's, TikTok's, LinkedIn's, and Pinterest's ad libraries, but for ads placed through Microsoft Advertising. This Actor searches it by advertiser name, resolves each name to one or more numeric advertiser ids via Bing's own advertiser-lookup endpoint, then pages through every ad Bing has on file for each matched advertiser.
Per ad you get:
| Field | Type | Notes |
|---|---|---|
ad_id | string | Bing's stable ad id — our dedup key |
advertiser_id | string | The resolved numeric advertiser id |
advertiser_name | string | Advertiser name as Bing reports it |
title | string | Ad headline |
description | string | Ad body copy |
display_url | string | Displayed URL shown on the ad |
destination_url | string | Landing page URL |
assets | array | Creative assets (width, height, type, URL), when present |
search_term | string | The advertiser name your search used |
scraped_at | string | ISO-8601 UTC timestamp |
🔥 What we handle for you
- 🕵️ We use the filter that actually works. Bing's ad-search endpoint accepts a
queryparameter that looks like a free-text ad-content filter — it silently does nothing and falls back to an unfiltered feed. We resolve your advertiser name to a real advertiser id first, the only parameter Bing's own API honors. - 🧊 We deduplicate every row. Adjacent pages of the same advertiser's ad feed overlap — we track unique ad ids incrementally so your dataset count is always the true unique count, never
pages × page size. - 🧱 We back off when Bing rate-limits. Sustained requests trigger a
429— we pause with exponential backoff (up to 5 attempts), honoringRetry-After, and resume from the same page rather than failing your run. - 🎯 We isolate faults per search term. One advertiser name that resolves to nothing, or one advertiser with zero ads on file, doesn't sink the other names in your list — each search term succeeds or fails independently.
- 🧷 We never choke on a bad creative blob. Bing occasionally serves an empty or malformed asset payload — we record it as an empty list instead of failing the row.
- 💰 You pay only for results that land. No data → no charge (only the small
actor-startwarm-up fee).
💡 Use cases
- Competitor ad monitoring — see what a brand is currently running through Microsoft Advertising.
- Ad creative research — pull headlines, body copy, and destination URLs for a market study.
- Brand protection — search your own brand name for unauthorized advertisers.
- Agency reporting — export a client's (or competitor's) live Bing ad set straight to a spreadsheet.
- AI / RAG ingestion — feed ad copy into a vector store for messaging-trend analysis.
⚙️ How to use it
- Click "Try for free" at the top of the page.
- Add one or more advertiser names to
advertiserNames— required, e.g.["nike", "adidas"]. - (Optional) Adjust
maxAdvertisersPerName(how many resolved advertiser matches to fetch per name) andmaxResultsPerAdvertiser(cap on unique ads per advertiser). - Run. Each unique ad is one row in the dataset; export to JSON, CSV, or Excel from the Storage tab.
The first run on a new account uses $5 of free Apify credit — roughly 1 500 ads at our pricing.
📥 Input
The schema lives in .actor/input_schema.json. The fields:
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
advertiserNames | array of strings | yes | — | Advertiser names to search, each resolved to a real advertiser id |
maxAdvertisersPerName | integer | no | 3 | Cap on resolved advertiser matches fetched per search term (1-10) |
maxResultsPerAdvertiser | integer | no | 100 | Cap on unique deduplicated ad rows per advertiser (1-1 000) |
proxyConfiguration | proxy config | no | no proxy | Bing's Ad Library API returns 200 with zero proxy by default |
advertiserNames must contain at least one non-blank entry — the Actor fails fast before any network call or charge if it's missing or empty.
Example input
{"advertiserNames": ["nike", "adidas"],"maxAdvertisersPerName": 3,"maxResultsPerAdvertiser": 100,"proxyConfiguration": { "useApifyProxy": false }}
📤 Output
Every row is one unique ad. Example:
{"ad_id": "73392676478586","advertiser_id": "4295000966","advertiser_name": "Nike - EMEA","title": "Football Jerseys from Nike - The Official Nike Shop","description": "Gear up for the game with official Nike football jerseys.","display_url": "www.nike.com/football/jerseys","destination_url": "https://www.nike.com/w/football-jerseys-1gdj0z6cb3p","assets": [],"search_term": "nike","scraped_at": "2026-09-21T06:00:00+00:00"}
Export options once the run finishes:
- JSON — full payload
- CSV / Excel — for analyst spreadsheets
- JSONL — line-delimited, easy to stream into a warehouse
- API — fetch programmatically via
GET /v2/datasets/{id}/items; webhook onACTOR.RUN.SUCCEEDEDfor live pipelines
💰 Pricing
Pay-per-event. You pay for what you get, nothing for what you ask for:
| Event | Price | When charged |
|---|---|---|
actor-start | $0.20 | Base fee, once per run (warm-up, input validation) |
ad-result | $0.003 | Per unique ad_id written to the dataset |
Examples:
| Pull | Cost |
|---|---|
| 100 ads | $0.50 |
| 1 000 ads | $3.20 |
| 10 000 ads | $30.20 |
🚧 Limitations
- Filtering is by advertiser name only. Bing's ad-search endpoint accepts a free-text
queryparameter, but it doesn't actually filter — we don't expose it since it would silently do nothing. - Hard wire ceiling of 1 000 ads per advertiser. Bing's own pagination caps at that point regardless of
maxResultsPerAdvertiser. Very high-volume advertisers are truncated there. maxAdvertisersPerNameslices a single advertiser-lookup response — it doesn't deep-paginate advertiser matches beyond what Bing returns for that search text in one call.- No country/market scoping. Bing's ad-search endpoint ignores a market parameter in testing, so we don't expose an input that would silently do nothing.
❓ FAQ
Is this legal?
Yes. Microsoft's Bing/Microsoft Advertising Ad Library is a public ad-transparency registry. We search only what the public API exposes, at a paced rate, with no login wall or paywall involved.
Do I need a Microsoft Advertising account or API key?
No. This Actor works entirely against the public Ad Library API — no app registration, no OAuth, no access token.
Why does my result count sometimes look lower than expected?
A few reasons: your maxAdvertisersPerName / maxResultsPerAdvertiser caps, an advertiser name that only resolves to a handful of matches, or an advertiser with fewer than 1 000 ads on file. A genuine zero-match search still succeeds — it just returns zero rows with a status message saying so.
Can I search by ad content instead of advertiser?
No — Bing's only proven working filter is advertiser name, resolved to an advertiser id. A raw keyword-search parameter exists on the wire but doesn't filter anything, so we don't build a feature on top of a parameter we verified is dead.
How do I schedule this to run automatically?
Apify Console → Schedules → attach this Actor → set your cron. Weekly is plenty; ad libraries don't turn over fast enough to need more.
What integrations does this Actor support?
- Schedule — Apify Console → Schedules for recurring monitoring.
- Webhooks — register
ACTOR.RUN.SUCCEEDEDto fire a downstream pipeline. - API —
POST /v2/acts/DevilScrapes~bing-ad-library-scraper/run-sync-get-dataset-itemsfor a single synchronous pull. - Make / Zapier — every Apify Actor surfaces as a node out of the box.
💬 Your feedback
Spotted a bug, missing field, or want a new feature? Open an issue on the Apify Store listing — we read every one.
Built by Devil Scrapes — Apify Actors with attitude. PPE, transparent pricing, no junk fields.