# Microsoft Ads Library Scraper | Bing Ads | $0.50/1K (`monkey.d.scraping/microsoft-ads-library-scraper`) Actor

Scrape the Microsoft Ad Library (Bing Ads) by keyword, advertiser or website domain: ad copy, landing page with UTM, impressions by country, targeting and dates. From $0.50/1K.

- **URL**: https://apify.com/monkey.d.scraping/microsoft-ads-library-scraper.md
- **Developed by:** [Monkey D. Scraping](https://apify.com/monkey.d.scraping) (community)
- **Categories:** Marketing, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 ads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Microsoft Ads Library Scraper | Bing Ads | $0.50/1K

**Microsoft Ads Library Scraper** exports ads from the public **Microsoft Ad Library** (Bing Ads transparency) by keyword, advertiser or website domain. Get the ad title, description, display URL, **landing page with UTM parameters**, images and advertiser for **$0.50 per 1,000 ads**, platform usage included. Add who paid for the ad, run dates, total impressions, **impressions by country** and **targeting criteria** for another **$0.50 per 1,000 ads**. No Microsoft account, login or cookies needed.

Also known as: Bing Ads Library scraper, Microsoft Advertising transparency scraper, Bing ads spy tool, Microsoft Ad Library API.

Built for PPC managers, agencies, e-commerce and SaaS teams who want to see which search ads competitors run on Bing and the Microsoft network, which landing pages and campaigns they use, and in which European countries their ads are seen.

#### Why choose this Microsoft Ads Library scraper?

- **Complete and affordable.** $0.50 per 1,000 ads, or **$1.00 with full details**, platform usage included, no start fee, and lower prices on paid Apify plans (down to $0.70 with details). Popular Microsoft and Bing ad library scrapers in the Apify Store charge $2–$9 per 1,000 results, and up to $5 for details, on the free plan (checked on 6 November 2026).
- **Search by website domain.** Enter `booking.com` and get the ads that link to it, from every advertiser account, not only the brand's own.
- **Landing pages with UTM parameters.** The destination URL, its domain and its UTM parameters (`source`, `medium`, `campaign`...), so you see where competitors send traffic and how they name campaigns.
- **More than 1,000 ads per search.** The Microsoft Ad Library returns at most 1,000 results per query. When a search reaches that cap, this scraper automatically splits it by country and merges the results.
- **Impressions by country and targeting.** Total impressions as text and numbers, every country's share, and which targeting criteria (age, gender, location, audiences) were used or excluded. Run dates, days running and whether the ad is still active.
- **Fast and reliable.** Plain HTTP on the library's own JSON API, no browser. When Microsoft limits requests, the scraper rotates IPs and slows down instead of failing. 200 ads with full details in about 3 minutes.
- **You never pay for gaps.** Duplicates are free; details are charged only when obtained; unreadable ad IDs are not charged.

#### What can you use it for?

- **PPC competitor research**: every Bing search ad a competitor runs, with headline, description and landing page.
- **Campaign intelligence**: UTM parameters reveal campaign names and channels; landing pages show which offers are pushed.
- **Market analysis**: which countries an ad reached and how impressions are split across the EEA.
- **Lead generation**: which companies advertise on Microsoft Ads for a keyword, and who pays for their ads.
- **Monitoring with schedules or API**: run the same search weekly and compare by `adId`.

#### What data do you get?

| Field | Description | Ad ($0.50/1K) | Details (+$0.50/1K) |
|---|---|---|---|
| `adId`, `adUrl` | Ad ID and link to the ad in the Microsoft Ad Library | ✅ | ✅ |
| `advertiserName`, `advertiserId`, `advertiserUrl` | Advertiser and its page in the library | ✅ | ✅ |
| `title`, `description`, `displayUrl` | Ad copy as shown on Bing | ✅ | ✅ |
| `destinationUrl`, `landingDomain`, `utmParameters` | Landing page, its domain and UTM parameters | ✅ | ✅ |
| `imageUrls`, `assets` | Ad images (largest first) with sizes | when listed | ✅ |
| `advertiserCountry`, `advertiserVerified` | Advertiser country and verification (Search by advertiser) | ✅ | ✅ |
| `paidBy` | Who paid for the ad, when published | — | ✅ |
| `firstShown`, `lastShown`, `daysRunning`, `isActive` | Run dates, days running, still running | — | ✅ |
| `totalImpressions`, `totalImpressionsMin`, `totalImpressionsMax` | Total impressions range, as text and numbers | — | ✅ |
| `impressionsByCountry` | Every EEA country with its share of impressions | — | ✅ |
| `targetingCriteria`, `exclusionCriteria` | Targeting used or excluded: age, gender, location, audiences | — | ✅ |
| `removedByMicrosoft`, `removalReason` | Whether Microsoft removed the ad, and why | — | ✅ |

Every row also has `searchTerm`, `searchBy`, `detailsIncluded` and `scrapedAt`.

#### How much does it cost?

You pay only for results. Platform usage is included.

| Per 1,000 ads | Free plan | Starter plan | Scale plan | Business plan and above |
|---|---|---|---|---|
| Ads only (details off) | **$0.50** | $0.45 | $0.40 | $0.35 |
| Ads with full details (default) | **$1.00** | $0.90 | $0.80 | $0.70 |

For example, 100 ads with full details cost $0.10 on the free plan. The exact price for your plan is shown on the pricing tab.

- Duplicate ads are removed and not charged.
- Details are charged only when they were actually obtained.
- An ad requested by ID that cannot be read is not charged.
- Set a maximum cost per run in Apify Console and the run stops when it is reached.

#### Benchmark on the same search

Same input, same day (6 November 2026): keyword `hotel`, 50 ads with details, free Apify plan.

| | This Actor | Alternative A | Alternative B |
|---|---|---|---|
| Ads delivered | **50** | 49 | 50 |
| Dates, impressions by country, targeting | ✅ **parsed, for all 50** | raw nested data | ❌ not returned |
| Landing domain and UTM parameters | ✅ | ❌ | ❌ |
| Run time | **45 s** | 59 s | 2 min 5 s (details skipped on many ads when rate-limited) |
| Price paid | $0.050 | $0.148 | **$0.009** |

Alternative B is cheaper but returns only ad copy and landing pages; this Actor returns the full transparency data at a third of the price of the most complete alternative.

#### Measured on real searches

Runs from 6 November 2026, default settings:

| Search | Result | Run time |
|---|---|---|
| keyword `hotel`, 200 ads with details | 200 / 200 with details, impressions by country for all | 3 min 19 s |
| advertiser `Nike - EMEA`, 30 ads with details | 30 / 30 | 22 s |
| domain `booking.com`, 20 ads with details | 20 / 20, all linking to booking.com | 30 s |
| keyword `hotel`, 1,500 ads without details | 1,500 unique ads (search split by country past the 1,000 cap) | 6 min 10 s |
| keyword `assicurazione`, Italy, October 2026, 20 ads | 20 / 20 with details | 29 s |
| keyword `nike`, 10 ads with details (example input) | 10 / 10 | under 30 s |

Results depend on the search and on how busy the library is. Re-run your own search with 10 ads to check output and cost before larger runs.

#### How to use it

1. Enter one or more **keywords, advertisers or website domains**, one per line.
2. Choose **Search by**: keyword, advertiser (name, ID or advertiser page URL) or website domain.
3. Optional: choose **countries** and **dates**.
4. Set **maximum ads per search**. Start with 10 to see the output.
5. Click **Start** and export to JSON, CSV, Excel, or use the API.

For faster and cheaper runs, turn off **Include payer, dates, impressions and targeting**. To get details for specific ads only, put their IDs or URLs in **Ad IDs or ad URLs**.

#### Input example

```json
{
  "searchTerms": ["booking.com"],
  "searchBy": "domain",
  "countries": ["IT", "DE"],
  "maxAdsPerSearch": 50,
  "includeDetails": true
}
```

#### Output example

Real result with details (requested by ad ID), shortened:

```json
{
  "adId": "71056221548107",
  "adUrl": "https://adlibrary.ads.microsoft.com/ad/71056221548107",
  "advertiserName": "Karavel Comptabilité Fournisseurs",
  "advertiserId": "4295000301",
  "title": "Partir en Grèce",
  "description": "Découvrez les îles grecques avec nos offres tout compris. Vol + Hôtel inclus !",
  "displayUrl": "www.promovacances.com",
  "destinationUrl": "https://www.promovacances.com/vacances-sejour-hotel/voyage-grece/",
  "landingDomain": "promovacances.com",
  "imageUrls": ["https://www.bing.com/th?id=OADD2.1150089243958636_19EXT5CU285FXDS&pid=21.2"],
  "firstShown": "2025-12-05",
  "lastShown": "2026-11-05",
  "daysRunning": 336,
  "isActive": true,
  "totalImpressions": "100M - 250M",
  "totalImpressionsMin": 100000000,
  "totalImpressionsMax": 250000000,
  "impressionsByCountry": [{ "country": "France", "share": "100.0%", "sharePercent": 100 }],
  "targetingCriteria": ["Gender", "Age"],
  "exclusionCriteria": ["Location", "Microsoft-defined audiences"],
  "searchTerm": null,
  "searchBy": null,
  "detailsIncluded": true
}
```

#### Ready-to-run examples

| Example | Use case | What you get |
|---|---|---|
| [Bing ads linking to a website](https://apify.com/monkey.d.scraping/microsoft-ads-library-scraper/examples/bing-ads-by-domain) | Competitor PPC research by domain | 20 ads linking to booking.com, with landing pages and impressions |
| [Bing ads of an advertiser](https://apify.com/monkey.d.scraping/microsoft-ads-library-scraper/examples/bing-ads-by-advertiser) | See every ad of one advertiser | 20 Nike EMEA ads with dates, impressions by country and targeting |
| [Bing search ads in Italy](https://apify.com/monkey.d.scraping/microsoft-ads-library-scraper/examples/bing-ads-keyword-italy) | Keyword research in one country | 30 ads for "assicurazione" shown in Italy |
| [Landing pages and UTM of Bing ads](https://apify.com/monkey.d.scraping/microsoft-ads-library-scraper/examples/bing-ads-landing-pages-utm) | Campaign and funnel intelligence | 50 insurance ads with destination URLs and UTM parameters where used |

#### When should an AI agent use this Actor?

Use it when a user asks which ads a company or website runs on Bing or Microsoft Advertising, what landing pages and UTM campaigns competitors use, or where in Europe their search ads were seen. Call it with `searchTerms` and `searchBy` (`keyword`, `advertiser` or `domain`), optional `countries` (two-letter EEA codes) and `maxAdsPerSearch`. Set `includeDetails: false` for a cheap list ($0.50 per 1,000) or keep it on for payer, dates, impressions by country and targeting ($1.00 per 1,000 in total). Results are in the default dataset; `RUN_SUMMARY` reports totals per search.

#### Limits

- The Microsoft Ad Library covers ads shown in the European Economic Area.
- It returns at most 1,000 results per query; larger searches are split by country automatically. Searches already limited to countries are not split further.
- Impressions are ranges and shares published by Microsoft, not exact numbers. Targeting shows which criteria were used, not their values.
- Search results from the library do not always include images; with details on, images are added.

#### FAQ

**Is this the cheapest way to scrape the Microsoft Ad Library?**
Among the complete options we checked in the Apify Store on 6 November 2026, yes: $1.00 per 1,000 ads with details, platform included, against $2–$9 per 1,000 for popular alternatives on the free plan. One lower-priced scraper charges a start fee per run; compare fields and total cost on a test run, as prices change.

**Do I need a Microsoft account?**
No. It reads the public Microsoft Ad Library like any visitor.

**Can I find all ads that link to a website?**
Yes. Use **Search by: Website domain** and enter the domain, for example `booking.com`. Ads from every advertiser that link to it are returned.

**Why are there no ads outside Europe?**
The Microsoft Ad Library is published for the EEA under the Digital Services Act. Ads shown only elsewhere are not in it.

**How do I monitor a competitor?**
Save an Apify task with the advertiser or domain and schedule it; compare runs by `adId`.

#### Related ad research tools

- [Google Ads Scraper — Transparency Center](https://apify.com/monkey.d.scraping/google-ads-transparency-scraper): a competitor's Google Search, YouTube and Shopping ads by domain or brand, with reach by country. From $0.40 per 1,000 ads.
- [LinkedIn Ad Library Scraper](https://apify.com/monkey.d.scraping/linkedin-ad-library-scraper): LinkedIn ads by company, keyword or payer, with impressions by country, targeting and landing pages. From $0.50 per 1,000 ads.
- [TikTok Ads Library Scraper](https://apify.com/monkey.d.scraping/tiktok-ads-library-scraper): TikTok ads by brand or keyword, with reach by country, age and gender. From $0.29 per 1,000 ads.
- [Google Ads Domain Checker](https://apify.com/monkey.d.scraping/google-ads-domain-checker): check whether a website advertises on Google.

#### More tools for marketers

- [Website SEO Audit & Contact Scraper](https://apify.com/monkey.d.scraping/website-opportunity-auditor): audit the landing pages your competitors advertise, with SEO issues and contact details.
- [Google Shopping Price Tracker & Seller Monitor](https://apify.com/monkey.d.scraping/google-shopping-price-change-seller-monitor): track competitor prices and sellers on Google Shopping.
- [Google Trends Scraper — Keyword History API](https://apify.com/monkey.d.scraping/google-trends-keyword-analysis): check the search interest behind the keywords competitors bid on.
- [Affiliate Program Finder & Commission Checker](https://apify.com/monkey.d.scraping/affiliate-program-finder): find affiliate programs and commissions in your niche.

These are separate Actors and are never called by this one.

# Actor input Schema

## `searchTerms` (type: `array`):

One per line: a keyword (for example <code>nike</code>), an advertiser name or ID, or a website domain. What is searched depends on <b>Search by</b>.

## `searchBy` (type: `string`):

Keyword in the ads, advertiser (name, ID or advertiser page URL), or website domain the ads link to.

## `countries` (type: `array`):

Only ads shown in these countries (the Microsoft Ad Library covers the EEA). Leave empty for all.

## `maxAdsPerSearch` (type: `integer`):

Ads to return for each keyword, advertiser or domain. Start with 10 to check the output.

## `includeDetails` (type: `boolean`):

Adds who paid for the ad, run dates, total impressions, impressions by country and targeting criteria. Turn off for a faster and cheaper list of ads.

## `dateFrom` (type: `string`):

Only ads shown on or after this date (YYYY-MM-DD).

## `dateTo` (type: `string`):

Only ads shown on or before this date (YYYY-MM-DD).

## `maxAdvertisersPerName` (type: `integer`):

With Search by advertiser, how many matching advertiser accounts to read for each name (exact name first).

## `adIds` (type: `array`):

Get details for specific ads: Microsoft Ad Library ad IDs or ad page URLs, one per line.

## Actor input object example

```json
{
  "searchTerms": [
    "nike"
  ],
  "searchBy": "keyword",
  "maxAdsPerSearch": 10,
  "includeDetails": true,
  "maxAdvertisersPerName": 3
}
```

# Actor output Schema

## `ads` (type: `string`):

One row per unique ad, with details when enabled.

## `reach` (type: `string`):

Total impressions, impressions by country and targeting per ad.

## `landing` (type: `string`):

Destination URL, domain and UTM parameters per ad.

## `summary` (type: `string`):

Searches, totals reported by the library and network statistics.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchTerms": [
        "nike"
    ],
    "maxAdsPerSearch": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("monkey.d.scraping/microsoft-ads-library-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchTerms": ["nike"],
    "maxAdsPerSearch": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("monkey.d.scraping/microsoft-ads-library-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchTerms": [
    "nike"
  ],
  "maxAdsPerSearch": 10
}' |
apify call monkey.d.scraping/microsoft-ads-library-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,monkey.d.scraping/microsoft-ads-library-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/CjXJ62ZAf9iialpyr/builds/b2Vk5pXz59QTLz9aW/openapi.json
