# Bing Maps Scraper (`aerodynamic_tripod/bing-maps-scraper`) Actor

Extract Bing Maps business leads by keyword and location. Get names, phones, websites, addresses, ratings, coordinates, observed Bing rank, and search provenance with branch-safe deduplication, multi-query support, and clean Dataset/API output.

- **URL**: https://apify.com/aerodynamic\_tripod/bing-maps-scraper.md
- **Developed by:** [SearchShark Tools](https://apify.com/aerodynamic_tripod) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<h2>
  <img src="https://pub-31d26fc774b940b9a1ecd976e5fd6a0c.r2.dev/icon.png" width="32" height="32" alt="Bing Maps Scraper icon" style="vertical-align: middle;">
  Bing Maps Scraper
</h2>

**Bing Maps Scraper** lets you extract **structured business data from Bing Maps** using keywords and a location.

Generate **local business leads**, analyze competitors, research markets, and collect contact data **without manually searching Bing Maps**.

- 🎯 **Generate business leads:** collect business names, phone numbers, websites, addresses, and domains
- 📊 **Analyze competitors:** compare ratings, review counts, categories, and observed Bing Maps visibility
- 📍 **Research local markets:** discover businesses operating in a specific city, state, or region
- 🔎 **Track search visibility:** preserve the observed Bing Maps result rank for every query
- 🧹 **Get cleaner data:** branch-safe deduplication prevents duplicate appearances from polluting your results
- ⚡ **Automate workflows:** export structured results to Apify Dataset, API, integrations, or downstream applications

***

### 📦 What data does Bing Maps Scraper extract?

| | |
| --- | --- |
| 🏢 **Business name** | 🆔 **Bing Place ID** |
| 🏷 **Primary category** | 📍 **Full address** |
| 🛣 **Street** | 🏙 **City** |
| 🗺 **State / region** | 📮 **Postal code** |
| 🌎 **Country** when confidently available | 📌 **Latitude & longitude** |
| ☎️ **Phone number** | 📱 **Normalized phone number** |
| 🌐 **Website** | 🔗 **Domain** |
| ⭐ **Rating** | 💬 **Review count** |
| 📝 **Rating source** | 🟢 **Opening status** |
| 🕐 **Opening-hours summary** | 🖼 **Business image** |
| 📍 **Bing Maps URL** | 🔎 **Search source URL** |
| 🏆 **Observed Bing rank** | 🔍 **Search query** |
| 🌍 **Search location** | 🕒 **Scrape timestamp** |

> **Missing fields are returned as `null`.** The Actor does **not invent business data** that Bing does not expose.

***

### 🚀 Features

Bing Maps Scraper is designed for **lead generation** and **local-search intelligence**.

- **Multiple search terms:** run up to 20 keywords or business categories in one Actor run
- **One location per run:** apply the same location to every search term
- **Up to 100 unique businesses per query**
- **Observed Bing Maps ranking:** preserve the real position where the business appeared during the scrape
- **Branch-safe deduplication:** different physical locations are not incorrectly merged
- **Normalized business data:** clean phone, website, domain, and address fields
- **Sticky proxy sessions:** each logical search maintains its own network session
- **Automatic pagination:** continue collecting until Bing stops exposing new businesses
- **Retry handling:** temporary Bing errors are retried automatically
- **Partial failure protection:** successful queries remain available even if another query fails
- **API-friendly output:** every Dataset row follows a predictable schema
- **HTTP-first architecture:** normal searches do not require expensive browser automation

***

## ⬇️ Input

You can configure Bing Maps Scraper directly from the **Apify Console** or send the input programmatically through the **Apify API**.

### 🔎 Search terms

Add one or more business keywords or categories.

Example:

```text
plumber
electrician
HVAC contractor
```

**Each search term is processed independently.**

You can provide:

```text
Minimum: 1 search term
Maximum: 20 search terms
```

**Duplicate search terms are removed case-insensitively.**

For example:

```text
Plumber
plumber
PLUMBER
```

are treated as one search.

The first normalized version is preserved.

***

### 📍 Location

Enter the location that should be applied to every search term.

Example:

```text
Los Angeles, California
```

Other examples:

```text
Phoenix, Arizona
Miami, Florida
Austin, Texas
London, United Kingdom
Sydney, Australia
```

The current version supports **one location per Actor run**.

***

### 🔢 Maximum results per search

Set the maximum number of unique businesses to collect for **each search term**.

```text
Minimum: 1
Default: 100
Maximum: 100
```

For example:

```text
Search terms:
plumber
electrician

Maximum results per search:
100
```

can return up to:

```text
100 plumbers
+
100 electricians
=
200 Dataset rows
```

The requested number is a **maximum, not a guarantee**.

If Bing stops exposing new businesses before the limit is reached, the Actor stops naturally instead of generating fake or duplicate records.

***

### 🌐 Proxy configuration

**Apify Proxy is enabled by default.**

Each logical Bing Maps search receives its own **sticky proxy session**.

This helps maintain consistent:

```text
IP address
Cookies
Bing session
Pagination context
```

throughout that query.

***

### 🧪 Example input

```json
{
  "searchTerms": [
    "plumber",
    "electrician"
  ],
  "location": "Los Angeles, California",
  "maxResultsPerSearch": 50,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

***

## ⬆️ Output

Results are stored in the Actor's default **Apify Dataset**.

You can access the results from:

```text
Output
Storage
Apify API
Integrations
```

Each Dataset row represents **one unique business appearance for one search query**.

***

### 📊 Example result

```json
{
  "bingPlaceId": "ypid:YN92B7C7F6987EA109",
  "name": "JW Plumbing, Heating and Air",
  "primaryCategory": "Home service",
  "fullAddress": "904 Wall St Ste 203, Los Angeles, CA 90015",
  "street": "904 Wall St Ste 203",
  "city": "Los Angeles",
  "state": "CA",
  "postalCode": "90015",
  "country": null,
  "latitude": 34.03840255737305,
  "longitude": -118.25193786621094,
  "phone": "(213) 379-5931",
  "normalizedPhone": "+12133795931",
  "website": "https://jwheatingandair.com/",
  "domain": "jwheatingandair.com",
  "rating": 4,
  "reviewCount": 673,
  "ratingSource": "Yelp",
  "openingStatus": "Open",
  "openingHoursText": "Open 24 hours",
  "imageUrl": "https://www.bing.com/...",
  "bingMapsUrl": "https://www.bing.com/maps?...",
  "sourceUrl": "https://www.bing.com/maps?q=plumber+Los+Angeles%2C+California",
  "searchRank": 2,
  "query": "plumber",
  "location": "Los Angeles, California",
  "scrapedAt": "2026-09-03T07:21:27.000Z"
}
```

***

### 🏆 Observed Bing Maps rank

One of the most useful fields returned by the Actor is the **observed Bing rank**:

```text
searchRank
```

This means:

> **Observed Bing Maps result position for this query during this scrape.**

For example:

```text
Business A → searchRank 1
Business B → searchRank 2
Business C → searchRank 7
```

Rank is recorded **before deduplication**.

If the same Bing Place ID appears multiple times at:

```text
Rank 3
Rank 19
Rank 42
```

the Actor keeps:

```text
searchRank: 3
```

The remaining Dataset results are **not renumbered**.

This preserves the **actual Bing search provenance**.

> Bing Maps rankings can change over time and may vary depending on Bing's search context. `searchRank` should not be interpreted as a permanent universal ranking.

***

### 🧹 Branch-safe deduplication

Businesses are deduplicated **within each search query**.

Identity is determined using the **strongest available signal**:

1. Bing Place ID
2. Domain + address
3. Phone + address
4. Business name + address
5. Business name + coordinates

#### 🏪 Different branches remain separate

Two physical branches may share:

```text
Business name
Website
Domain
Phone number
```

but still represent different locations.

If Bing provides different non-null Place IDs, the Actor **never merges them using weaker signals**.

Example:

```text
McDonald's — Address A — Bing ID A
McDonald's — Address B — Bing ID B
```

remain two separate businesses.

***

### 🔍 Multiple search terms

Every search term gets its own search context.

For example, the same business may appear as:

```text
ABC Home Services
Query: plumber
Rank: 4
```

and:

```text
ABC Home Services
Query: electrician
Rank: 16
```

**Both rows are retained.**

This is intentional because they represent **two different search appearances**.

The Actor does **not globally deduplicate businesses across different queries**.

***

### 📄 Pagination

Bing Maps Scraper **automatically requests additional result pages**.

The search stops when:

- 🎯 **Maximum unique businesses reached**
- 📭 **No parseable listings returned**
- 🆕 **No new Bing Place IDs found**
- 🔁 **Previously seen page repeated**
- ⚠️ **Request retries exhausted**
- 🛡 **Defensive pagination limit reached**

The Actor does **not secretly move the map or perform grid searches** simply to force the requested maximum.

***

### ⚡ Performance

The scraper uses an **HTTP-first architecture**.

Instead of launching a full browser for normal Bing Maps searches, it communicates directly with Bing's search response.

This generally provides:

```text
Lower memory use
Faster startup
Lower compute requirements
Less browser overhead
```

Each search also keeps a consistent session across its pagination requests.

***

### 🛡 Reliability

**Temporary request failures are automatically retried** with exponential delays.

If you search:

```text
plumber
electrician
roofing contractor
```

and only the electrician query fails, **successful plumber and roofing results remain in the Dataset**.

If **every search fails**, the **Actor run fails** instead of silently reporting a successful empty run.

***

## 🔌 API & integrations

Bing Maps Scraper can be used programmatically through the **Apify API**.

You can connect results to workflows such as:

- Google Sheets
- Make
- Zapier
- CRMs
- Internal APIs
- Data warehouses
- Lead-generation systems
- AI agents
- MCP workflows

Each Actor run stores **structured results in the default Dataset**, making them easy to consume from another application.

***

## 💡 Example use cases

#### 🎯 Local lead generation

Search:

```text
roofing contractor
HVAC contractor
plumber
```

Location:

```text
Phoenix, Arizona
```

Build a prospect list containing:

```text
Business
Phone
Website
Address
Rating
Reviews
Observed rank
```

***

#### 📊 Competitor research

Search your business category and analyze:

```text
Which companies rank highest
Which businesses have the most reviews
Average ratings
Business locations
Website coverage
```

***

#### 📍 Market research

Compare how many businesses Bing exposes for different categories within a market.

Use the results to identify:

```text
Market saturation
Potential service gaps
Highly competitive categories
Local business concentration
```

***

## ⚠️ Current limitations

The current version focuses on **reliable Bing Maps keyword + location search**.

It **does not currently perform**:

```text
Multiple locations in one run
Grid-based geographic crawling
Hidden map panning
Complete weekly opening hours
Detailed review extraction
Business website email crawling
Social media enrichment
Employee/contact enrichment
```

These are intentionally separate from the current search mode.

***

## ❓ FAQ

### How does Bing Maps Scraper work?

The Actor combines each search term with your selected location and requests Bing Maps search results.

It then:

```text
Fetches Bing listings
Parses business information
Normalizes fields
Tracks observed ranking
Removes duplicate appearances
Automatically paginates
Stores results in an Apify Dataset
```

***

### How many businesses can I scrape?

The current maximum is:

```text
100 unique businesses per search term
```

Bing may expose fewer results.

For example, if you request 100 businesses and Bing exhausts the search after 54 unique businesses, the Actor returns 54.

***

### Can I search multiple business categories?

**Yes.**

You can provide up to:

```text
20 search terms
```

in a single run.

Each term is searched independently.

***

### Can I search multiple locations in one run?

**Not in the current version.**

One location is applied to all search terms.

Multiple-location support can be added later without changing the existing Dataset structure.

***

### Why are some fields null?

**Bing does not expose every field for every business.**

The Actor deliberately returns:

```text
null
```

when information cannot be determined confidently.

It does not fabricate missing business data.

***

### Why do rank numbers sometimes have gaps?

Because Bing rank is captured **before duplicate businesses are removed**.

For example:

```text
Dataset row 40
searchRank 87
```

can be completely valid.

This preserves the business's actual observed Bing Maps position rather than renumbering results.

***

### Can I use Bing Maps Scraper through an API?

Yes.

Every Actor can be started through the **Apify API**, and the resulting Dataset can be downloaded programmatically.

This makes the scraper suitable for automated lead-generation and data-processing pipelines.

***

### Can I export the results?

Yes.

**Apify Dataset results can be exported** in supported formats such as:

```text
JSON
CSV
Excel
XML
HTML
```

***

### Is a browser required?

**Not for the normal search workflow.**

Bing Maps Scraper uses an HTTP-first search transport, which avoids launching browser automation during standard searches.

***

## 🧭 Recommended workflow

For **strong lead-generation coverage**, use **distinct business categories** instead of many nearly identical search terms.

Good:

```text
plumber
electrician
HVAC contractor
roofing contractor
```

Less useful:

```text
plumber
plumbers
plumbing
plumbing company
plumbing companies
```

The Actor already removes exact duplicate terms case-insensitively, but semantically similar terms can still overlap heavily.

***

## 💬 Feedback & support

Found a bug or have a feature request?

Use the Actor's **Issues** tab on Apify.

Useful future additions may include:

```text
Multiple locations
Business detail mode
Full opening hours
Website/contact enrichment
Social profiles
Area/grid search
Additional local-search intelligence
```

***

### 🚀 Bing Maps business data without the manual searching

Enter your keywords, choose a location, run the Actor, and receive **structured Bing Maps business data** ready for **lead generation, research, APIs, and automation**.

# Actor input Schema

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

Add one or more business keywords or categories. Each search term is searched independently using the same location below.

## `location` (type: `string`):

Enter the location that should be used for all search terms, for example: Los Angeles, California.

## `maxResultsPerSearch` (type: `integer`):

Maximum number of unique businesses to collect for each search term. Bing may return fewer results when no more new businesses are available for that search.

## `proxyConfiguration` (type: `object`):

Apify Proxy is recommended for reliable Bing Maps requests. The default automatic configuration is suitable for most users.

## Actor input object example

```json
{
  "searchTerms": [
    "plumber",
    "HVAC contractor",
    "dentist"
  ],
  "location": "Los Angeles, California",
  "maxResultsPerSearch": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}
```

# Actor output Schema

## `businesses` (type: `string`):

Normalized Bing Maps business results collected by the Actor.

# 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": [
        "plumber"
    ],
    "location": "Los Angeles, California",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": []
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("aerodynamic_tripod/bing-maps-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": ["plumber"],
    "location": "Los Angeles, California",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": [],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("aerodynamic_tripod/bing-maps-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": [
    "plumber"
  ],
  "location": "Los Angeles, California",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": []
  }
}' |
apify call aerodynamic_tripod/bing-maps-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aerodynamic_tripod/bing-maps-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/QMgdFKddfDTSHNRNN/builds/a8vQJKkkyA05MF7kn/openapi.json
