Ad Library Scraper for Bing Ads - Microsoft Ads Transparency avatar

Ad Library Scraper for Bing Ads - Microsoft Ads Transparency

Pricing

from $0.75 / 1,000 ads

Go to Apify Store
Ad Library Scraper for Bing Ads - Microsoft Ads Transparency

Ad Library Scraper for Bing Ads - Microsoft Ads Transparency

See the Bing ads any advertiser runs in the EU/EEA. Scrape the Microsoft Ad Library by keyword, advertiser or link: ad copy, landing pages, images, verified advertiser identity, country & date filters, new-ad monitoring. Independent tool, not affiliated with Microsoft.

Pricing

from $0.75 / 1,000 ads

Rating

0.0

(0)

Developer

Scrape Sage

Scrape Sage

Maintained by Community

Actor stats

0

Bookmarked

14

Total users

6

Monthly active users

3 days ago

Last modified

Share

Ad Library Scraper for Bing Ads - Competitor Ads, Advertisers & New-Ad Monitoring (Microsoft Advertising Transparency)

Disclaimer: This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Microsoft Corporation or any of its subsidiaries. All trademarks mentioned are the property of their respective owners. "Bing Ads Library" is referenced only to describe the publicly available website this Actor collects data from.

See the ads any advertiser runs on Bing in Europe. This actor scrapes the Microsoft Ad Library, Microsoft Advertising's public register of ads served on Bing in the EU and EEA, and turns it into clean, structured competitor intelligence: full ad copy (headlines + descriptions), display URLs, real landing-page URLs, image assets, verified advertiser identity and per-advertiser ad counts. Search by keyword, company name, advertiser ID or library link, filter by country and date, and switch on monitor mode to get only the new ads a competitor launches between runs.

No login, no API key, no browser: structured data straight from the API the library website itself uses.

Why this ad library scraper for Bing?

Google and Meta ad-spy tools are everywhere, but Bing is the blind spot: high-value insurance, finance, travel, B2B and e-commerce advertisers, and very little competitive-intel coverage. What you get here:

DataIncluded
Full headline + ad copy✅
Display URL (the path shown in the ad)✅
Real destination/landing URL + landing domain✅
Image assets (URL + type, dimensions when the library has them)✅
Advertiser registered country + identity verified status✅
Per-advertiser ads count + sample ad titles✅
All ads of one advertiser, by name or ID✅
Advertiser register search (directory mode, lead lists)✅
Country filter (30 EU/EEA countries) + date filter (dates or "last 30 days")✅
Monitor mode: only new or changed ads per run✅
Deep links back to every ad and advertiser in the library✅

Use cases

  • Competitor PPC intelligence: see every search ad a competitor runs on Bing in Europe, the copy angles they test and the landing pages behind them.
  • Ad copy research & swipe files: collect live headlines and descriptions for any keyword ("car insurance", "crm software", "running shoes") to feed your own ad testing, or an LLM that writes variants.
  • New-ad alerts: schedule a daily run with monitorMode on a competitor's advertiser ID and get only their newly launched ads, straight to Slack or your CRM.
  • Lead generation: directory mode turns the library's advertiser register into a list of companies actively spending on Bing ads (name, country, verified identity, ad volume), filterable to the countries you sell in.
  • Landing-page & funnel analysis: destinationUrl is the full final URL with its tracking parameters, so you see which pages, offers and UTM structures competitors send paid traffic to.
  • Brand protection: search your own brand name and find affiliates, resellers or impostors bidding on it in any EU/EEA market.

How to use

  1. Sign up for Apify. The free plan is enough to try this actor.
  2. Open Ad Library Scraper for Bing Ads, enter keywords or advertiser names (or paste library links), and click Start.
  3. Watch results stream into the dataset table (Ads view, or Advertisers for directory runs).
  4. Export as JSON, CSV, Excel, XML or RSS, or pull results through the Apify API.

Input

{
"searchQueries": ["car insurance"],
"advertiserNames": ["Booking.com"],
"countries": ["DE", "FR"],
"dateFrom": "90 days",
"maxResults": 200,
"includeAdvertiserDetails": true,
"monitorMode": false
}

What to scrape (use any mix; each one gets a fair share of maxResults, and anything one of them cannot use passes to the others):

  • searchQueries: keywords matched against ad copy. The library returns up to ~1,000 ads per search.
  • advertiserNames: company names. Each is matched in the advertiser register (up to 5 advertisers whose registered name contains every word you type, e.g. "Booking.com" or "Foot Locker") and their ads are scraped. A name that matches nothing is reported on the run card; it is never swapped for a different company.
  • advertiserIds: exact advertiser IDs (the number in adlibrary.ads.microsoft.com/advertiser/… links).
  • advertiserSearchQueries: search the advertiser register instead of ads: one record per advertiser with country, verified status, ads count and 3 sample ad titles. With countries or dates set, the ads count covers only that scope and advertisers with no ads in it are left out (and not charged).
  • startUrls / urlsFromFile: links copied from the library website: an ad page (/ad/…), an advertiser page (/advertiser/…, including its "Ad content" search) or a search link. A search link returns what its tab shows: copied from the Ads tab (the link contains t=ads) it returns the ads; copied right after searching, the site shows the Advertisers tab, so it returns the matching advertisers. A link's own country and date filters are applied to that link. urlsFromFile takes a pasted list or a link to a .txt/.csv file, Google Sheet or Drive file.

Filters:

  • countries: pick from the list or type ISO codes or names. The library covers the 27 EU countries plus Iceland, Liechtenstein and Norway: AT, BE, BG, HR, CY, CZ, DK, EE, FI, FR, DE, GR, HU, IS, IE, IT, LV, LI, LT, LU, MT, NL, NO, PL, PT, RO, SK, SI, ES, SE. Any other value (for example "UK" or "US") stops the run before anything is charged, so a filter is never silently dropped.
  • dateFrom / dateTo: a date (YYYY-MM-DD) or a period counted back from the day of the run ("30 days", "2 weeks", "3 months"), so a scheduled run always looks at the latest period. The library's own website only offers the last 12 months, but older ranges return ads too.
  • adFormat: all, text (classic search ads) or image (ads with image assets). Ads removed by this filter are never charged.

Output & limits:

  • includeAdvertiserDetails (default on): adds registered country + verified status to every ad (one cached lookup per advertiser).
  • includeAdvertiserAdStats (default on): directory mode adds ads count + sample titles per advertiser.
  • emitAdvertiserRecords (default off): also output one advertiser summary record per advertiser scraped by name or ID.
  • maxResults (default 100): total records for the run; 0 = no limit. maxAdsPerQuery: optional cap per search or advertiser.
  • splitByCountry (default off): the library returns at most ~1,000 ads for any one search. Turn this on and ask for more (maxResults above ~1,000 or 0) to repeat a capped search once per country and collect the ads beyond that limit (duplicates removed).
  • monitorMode / monitorStoreName: cross-run new-ad detection (see below).

Good to know: if you fill in advertisers or links and leave the form's example search ("nike") untouched, the example is skipped. A run with no search at all returns a small 25-ad sample of the library's latest ads. API and AI-agent callers can use common alternative field names (keywords, query, advertiser, country, maxItems and similar); they are mapped to the real fields and named on the run card, and a run whose only input is an unrecognised field stops before anything is charged.

Output

One record per ad (type: "ad"), plus optional advertiser records (type: "advertiser"):

{
"type": "ad",
"adId": "71056166831708",
"title": "Nike Dunk - Retrait en Magasin - Nike Dunk à partir de €39.99",
"description": "Commande dès maintenant les Nike Dunk chez Foot Locker. Sois au-devant des tendances.",
"displayUrl": "www.footlocker.fr/nike-dunk/foot-locker",
"destinationUrl": "https://www.footlocker.fr/fr/category/chaussures.html?query=%3Arelevance%3Abrand%3ANike",
"destinationDomain": "footlocker.fr",
"displayDomain": "footlocker.fr",
"adFormat": "text",
"images": [],
"imageCount": 0,
"firstImageUrl": null,
"advertiserId": "4295010202",
"advertiserName": "Footlocker Europe.com B.V.",
"advertiserCountry": "Netherlands",
"advertiserVerified": true,
"adLibraryUrl": "https://adlibrary.ads.microsoft.com/ad/71056166831708",
"advertiserLibraryUrl": "https://adlibrary.ads.microsoft.com/advertiser/4295010202",
"discoverySource": "q:nike",
"filters": { "countries": null, "dateFrom": null, "dateTo": null },
"queryTotalCount": 1000,
"queryTotalIsCapped": true,
"platform": "bing",
"adLibrary": "Microsoft Ad Library (EU/EEA — DSA transparency)",
"scrapedAt": "2026-10-14T09:00:00.000Z"
}

An image ad carries its creatives in images, for example [{ "url": "https://static.nike.com/…/image.png", "width": null, "height": null, "assetType": "Image" }], with imageCount and firstImageUrl filled in.

Output fields

FieldWhat it isFilled
adId, advertiserId, advertiserName, adLibraryUrl, advertiserLibraryUrlIdentity of the ad and the advertiser, with deep linksevery ad
title, descriptionHeadline and body copynearly every ad; some formats have a headline but no body text
displayUrl, displayDomain, destinationUrl, destinationDomainThe URL shown in the ad and the real landing pagenearly every ad; some image formats show the business name instead of a URL in displayUrl (e.g. "Nike Official"), and displayDomain is then empty
adFormattext or imageevery ad
images, imageCount, firstImageUrlImage assets (URL, type, width/height when the library gives them)image ads only; classic search ads are text-only, so this is empty for them (filter with adFormat: "image")
advertiserCountry, advertiserVerifiedRegistered country and identity-verification statusevery ad while includeAdvertiserDetails is on
discoverySourceWhich of your inputs found the ad (q:…, advertiser:…, ad:…, sample:top-ads)every ad
filtersThe country/date filters that ad was collected underevery ad
queryTotalCount, queryTotalIsCappedHow many ads the library reports for that search (it never reports more than 1,000; true = "1,000 or more")every ad found by a search; empty for ads fetched by a direct ad link
monitorStatusnew or updatedmonitor-mode runs only
adsCount, adsCountIsCapped, sampleAdTitles, sampleAdTitlesTextAdvertiser records: ad volume (in your country/date scope when set) and three sample titlesadvertiser records, while includeAdvertiserAdStats is on

The library does not publish ad spend, impressions or targeting for these ads, so no scraper can return them. Library entries that carry no ad text, link or image at all are skipped and never charged.

Monitor mode: only new ads, run after run

Set monitorMode: true and every delivered ad's fingerprint is remembered in a named key-value store. The next run outputs only ads that are new or changed, each tagged monitorStatus: "new" or "updated"; unchanged ads are not repeated and not charged. Pair it with an Apify Schedule:

  1. Input: { "advertiserIds": ["4295010202"], "monitorMode": true, "maxResults": 0 }
  2. Schedule: daily.
  3. Add a webhook or a Zapier/Make step, and new competitor ads land in Slack, email or your CRM within a day of launch.

Running several monitors? Give each schedule its own monitorStoreName.

Tip: monitor advertiser-scoped inputs (advertiserIds / advertiserNames) with maxResults: 0 so the full ad set is compared every run. A broad keyword search capped at a fraction of its ~1,000 results samples a different slice each run; those ads are not really new, you just had not seen them yet.

Speed and reliability

Scraping an advertiser by ID or by advertiser link answers within seconds. A keyword search (or an advertiser-name lookup) that the library has not answered recently is computed on demand by Microsoft and can take up to about a minute per page of 24 results; the actor waits for it, fetches the following pages in parallel and retries pages the library drops. Microsoft's keyword search occasionally has outages where it answers with server errors; quick errors are retried several times, so short hiccups rarely cost results. If the library still does not answer, the run card says which inputs are incomplete (and whether Microsoft's servers were failing); nothing that was not delivered is ever charged. Advertiser-ID runs do not use the keyword search, so they usually keep working during such outages.

How much does it cost to scrape Bing Ads Library?

This Actor uses Apify's pay-per-event pricing: you are charged only for the results it delivers, with no monthly rental and no start fee. The events it can charge are:

  • Ad - One Bing ad: full headline & copy, display + destination URL & landing domain, image assets, format, advertiser identity (country, verified) and library deep links.
  • Advertiser - One advertiser register record: name, ID, country, verification status, active-ads count, sample ad titles, deep link.

The current price of each event is shown on the Pricing tab of this page. Set a maximum total charge on the run if you want a hard cap on spend, and use the input limits to control how much the Actor fetches.

Automate & schedule

Run this actor on autopilot and pull results into your own stack:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('scrapesage/bing-ads-library-scraper').call({
advertiserNames: ['Booking.com'],
countries: ['DE'],
dateFrom: '30 days',
maxResults: 500,
monitorMode: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} Bing ads`);

Integrate with any app

Connect the dataset to thousands of apps, no code required:

  • Make: multi-step automation scenarios.
  • Zapier: push new competitor ads straight into your CRM or ad-ops board.
  • Slack: get pinged when a monitored advertiser launches new ads.
  • Google Drive / Sheets: auto-export every run to a spreadsheet.
  • Airbyte: pipe results into your data warehouse.
  • GitHub: trigger runs from commits or releases.

Use with AI assistants (MCP)

The output is clean, LLM-ready JSON. You can call this actor from Claude, ChatGPT or any agent framework through the Apify MCP server: ask your assistant to "pull every Bing ad Booking.com is running in Germany and summarize their copy angles" and let it run this scraper for you.

Agent-ready: autonomous payments (x402 & Skyfire)

This actor is agent-ready: AI agents can discover it, run it, and pay for it autonomously, with no Apify account and no human in the loop. It uses pay-per-event pricing and limited permissions, so it qualifies for Apify's agentic-payment standards:

  • x402: an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the Apify MCP server, with no account and no API key.
  • Skyfire: agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

More scrapers from scrapesage

Build a complete ads-transparency intelligence stack, every major ad platform in one dataset shape:

Tips

  • Go deep on one advertiser or keyword: any single search stops at ~1,000 ads. Turn on splitByCountry (with maxResults above 1,000 or 0), or split the work yourself by countries or by dateFrom/dateTo windows.
  • Cheap daily monitors: advertiserIds + monitorMode + a daily Schedule is the highest-signal, lowest-cost setup; you pay only for genuinely new ads.
  • Lead lists: advertiserSearchQueries: ["dentist"] with countries: ["DE"] returns advertisers with "dentist" in their registered name that run ads in Germany.
  • Keyword coverage: searches match ad text, so try both brand ("nike") and category ("running shoes") terms; the ad sets differ.
  • Copy a filtered view from the website: search on adlibrary.ads.microsoft.com, open the Ads tab, set countries and dates, copy the link into startUrls, and the actor applies the same filters.

FAQ

Where does the data come from? From Microsoft's public Microsoft Ad Library (adlibrary.ads.microsoft.com), the transparency register Microsoft publishes under the EU Digital Services Act. This actor reads the same public API the library website uses: no login, no private data.

Why EU/EEA only? The library publishes ads served in the EU and EEA, because that is what the Digital Services Act covers. Global brands (Nike, Booking.com, Amazon, insurance and SaaS advertisers) all appear because they advertise in Europe; ads shown only outside the EU/EEA are not in the library, so this actor cannot return them.

Which countries can I filter by? Austria, Belgium, Bulgaria, Croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Iceland, Ireland, Italy, Latvia, Liechtenstein, Lithuania, Luxembourg, Malta, Netherlands, Norway, Poland, Portugal, Romania, Slovakia, Slovenia, Spain and Sweden.

How far back does it go? Further than the library website shows: its date picker only offers the last 12 months, but older ranges still return ads (a January-June 2025 range returned ads in October 2026).

Why did I get fewer ads than maxResults? The search may have fewer matching ads, your filters may narrow it, or a single search hit the library's ~1,000-ad limit (turn on splitByCountry). The library's own result order also shifts between pages, so a deep search sees some ads twice (each ad is delivered and charged once) and its ~1,000-row window holds fewer unique ads. The run card always says which limit applied.

What happens if I send no input? You get a 25-ad sample of the library's latest ads, so you can see the data shape. Add a search to choose what to scrape.

Does it include Microsoft Audience Network / image ads? Yes. Ads with image assets return images and adFormat: "image". Classic Bing search ads are text-only.

Does it show ad spend or impressions? No: the Microsoft Ad Library does not publish per-ad spend, impressions or targeting for these ads. You get the complete creative, the landing page, advertiser identity, country availability through the filters, and ad volume per advertiser.

How do I find an advertiser's ID? Run their name through advertiserNames, list candidates with advertiserSearchQueries, or copy the number from an adlibrary.ads.microsoft.com/advertiser/… link.

Can I monitor a competitor automatically? Yes, that is the flagship use case: monitorMode: true + an Apify Schedule + a webhook = new-ad alerts.

Is scraping the Microsoft Ad Library legal? The library is a public transparency register that exists so ads can be inspected. You are responsible for complying with applicable laws and terms in your use of the data.

A field is null, why? Text ads have no images, some ad formats have a headline but no body text, and ads collected with includeAdvertiserDetails off carry no country/verified status. Fields are null only when the library does not provide the value.

Data & lawful use

The source is an official public register, published so that anyone can consult it. Records can name individuals (advertisers who register under their own personal name, such as sole traders), so the output may contain personal data even though it is public. If you are in the EU or UK you are the data controller for what you do with it: have a lawful basis, honour access and deletion requests, and respect the register's own reuse conditions, which can restrict marketing or commercial use.

Under Apify's Standard Actor Contract, which governs your use of this Actor, you are the controller of any personal data in your input and output and scrapesage acts only as your processor: that data is processed solely to run your job, written only to your own Apify storage, never used for any other purpose and never shared onward. If you need help with a data-subject request that involves this Actor's output, open an issue on the Issues tab.

Disclaimer

This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Microsoft Corporation or any of its subsidiaries. All trademarks mentioned are the property of their respective owners.

"Bing Ads Library" and any related marks are the property of their respective owners and are used here only in a descriptive, nominative sense - to identify the publicly accessible website from which this Actor collects data. This Actor is not an official Bing Ads Library product, is not authorised or certified by Microsoft Corporation, and does not distribute Bing Ads Library software. It collects only publicly available information; you are responsible for ensuring your use of that data complies with applicable laws, regulations and the terms of the source website.

Need help?

Open an issue on the actor's Issues tab, or visit the Apify help center. Feature requests are welcome; this actor is actively maintained.