Bing Ad Library Scraper — Ad Search & Export avatar

Bing Ad Library Scraper — Ad Search & Export

Pricing

Pay per event

Go to Apify Store
Bing Ad Library Scraper — Ad Search & Export

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

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 hours ago

Last modified

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:

FieldTypeNotes
ad_idstringBing's stable ad id — our dedup key
advertiser_idstringThe resolved numeric advertiser id
advertiser_namestringAdvertiser name as Bing reports it
titlestringAd headline
descriptionstringAd body copy
display_urlstringDisplayed URL shown on the ad
destination_urlstringLanding page URL
assetsarrayCreative assets (width, height, type, URL), when present
search_termstringThe advertiser name your search used
scraped_atstringISO-8601 UTC timestamp

🔥 What we handle for you

  • 🕵️ We use the filter that actually works. Bing's ad-search endpoint accepts a query parameter 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), honoring Retry-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-start warm-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

  1. Click "Try for free" at the top of the page.
  2. Add one or more advertiser names to advertiserNames — required, e.g. ["nike", "adidas"].
  3. (Optional) Adjust maxAdvertisersPerName (how many resolved advertiser matches to fetch per name) and maxResultsPerAdvertiser (cap on unique ads per advertiser).
  4. 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:

FieldTypeRequiredDefaultNotes
advertiserNamesarray of stringsyesAdvertiser names to search, each resolved to a real advertiser id
maxAdvertisersPerNameintegerno3Cap on resolved advertiser matches fetched per search term (1-10)
maxResultsPerAdvertiserintegerno100Cap on unique deduplicated ad rows per advertiser (1-1 000)
proxyConfigurationproxy confignono proxyBing'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 on ACTOR.RUN.SUCCEEDED for live pipelines

💰 Pricing

Pay-per-event. You pay for what you get, nothing for what you ask for:

EventPriceWhen charged
actor-start$0.20Base fee, once per run (warm-up, input validation)
ad-result$0.003Per unique ad_id written to the dataset

Examples:

PullCost
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 query parameter, 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.
  • maxAdvertisersPerName slices 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.SUCCEEDED to fire a downstream pipeline.
  • APIPOST /v2/acts/DevilScrapes~bing-ad-library-scraper/run-sync-get-dataset-items for 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.