# Bing Organic Rank Tracker for Domains (`khadinakbar/bing-rank-tracker`) Actor

Track a domain's organic Bing positions by keyword, market, and top-N depth. Returns one decision-ready rank row per keyword with ranking URL, position, and competitors.

- **URL**: https://apify.com/khadinakbar/bing-rank-tracker.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** SEO tools, Automation, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 bing rank checks

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Bing Rank Tracker

Track where one website ranks in Bing organic results for a bounded keyword list. The actor returns one decision-ready dataset row per keyword with the matched position, ranking URL, localized market, and optional top organic competitor context.

### Use it when

- You need a dated Bing position check for a domain.
- You need repeatable checks for US, UK, German, or other localized markets.
- You want a compact row per keyword for an SEO dashboard, scheduled task, or AI agent.

Pair this actor with Bing Search Scraper when a workflow needs the full SERP, ads, related searches, or Copilot blocks alongside a target-domain rank row. Google, Yahoo, Bing Maps, backlink, search-volume, and historical trend workflows belong to their respective measurement tools; schedule repeated runs and compare these rows to create a dated history.

### Output

| Field | Meaning |
| --- | --- |
| `keyword` | Exact Bing query checked |
| `position` | 1-based organic position, or `null` when not found within `depthChecked` |
| `found` / `checkStatus` | Whether Bing returned a match or a valid `not_found` result |
| `rankingUrl`, `rankingTitle`, `rankingSnippet` | The matched Bing result |
| `topCompetitors` | Optional top organic results for context |
| `market`, `depthChecked`, `checkedAt` | Localization, coverage boundary, and freshness |

#### Example row

```json
{
  "runId": "abc123XYZ",
  "keyword": "web scraping",
  "targetDomain": "example.com",
  "position": 4,
  "found": true,
  "rankingUrl": "https://example.com/guide",
  "rankingTitle": "Web scraping guide",
  "rankingSnippet": "A practical guide to web scraping.",
  "topCompetitors": [
    { "position": 1, "domain": "competitor.com", "title": "Competitor guide", "url": "https://competitor.com/guide" }
  ],
  "market": "en-US",
  "safeSearch": "moderate",
  "depthChecked": 20,
  "source": "bing-direct",
  "checkStatus": "ranked",
  "checkedAt": "2026-08-09T12:00:00.000Z"
}
```

### Input

```json
{
  "targetDomain": "example.com",
  "keywords": ["web scraping", "Bing rank tracker"],
  "country": "US",
  "language": "en",
  "depth": 20,
  "includeCompetitors": true
}
```

`targetDomain` and `keywords` are required. `depth` accepts 10, 20, 50, or 100. Subdomains count by default; set `includeSubdomains` to `false` for exact-host matching. Keywords without a match are persisted as successful `not_found` rows, keeping absence within the selected market and depth visible.

### Pricing

| Event | Bronze price | Billing unit |
| --- | ---: | --- |
| Actor start | $0.00005 | One valid run, scaled by memory |
| Bing rank check | $0.008 | One persisted keyword row |

The actor uses Pay per event + usage. A 10-keyword run has a defined event-charge ceiling of about `$0.08005`; Apify platform compute and residential proxy usage are passed through separately. The live Pricing tab is the current source of truth for effective event prices and platform usage settings. A rank event is charged only alongside a validated persisted row.

### API and agent use

```bash
curl -X POST 'https://api.apify.com/v2/acts/khadinakbar~bing-rank-tracker/runs?token=YOUR_APIFY_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"targetDomain":"example.com","keywords":["web scraping"],"depth":20}'
```

#### MCP and AI-agent prompt card

> Use Bing Rank Tracker for a read-only, localized organic-rank check: check `example.com` in Bing US for `web scraping` and `Bing rank tracker` at depth 20. Return each keyword, `position`, `rankingUrl`, `checkStatus`, `market`, and `checkedAt`. Read `OUTPUT` for the terminal outcome and the default dataset for the persisted rows; use `source: "bing-direct"`, market, depth, and timestamp as provenance. This tool covers Bing organic results, not ads, Bing Maps, Google, or historical rankings. Each persisted keyword row is one billable rank-check event; keep the keyword list bounded and use the live Pricing tab for current event and platform-usage costs.

For agent readback, `COMPLETE` means every normalized keyword produced one row; `PARTIAL` keeps useful rows while identifying the affected keyword in `RUN_SUMMARY`; `not_found` is a successful bounded observation rather than a missing dataset row. The actor does not paginate a single row: increase `depth` to inspect more Bing positions, or schedule repeat runs and compare the timestamped rows for a history.

### Practical guidance

- Bing results vary by market, language, device, personalization, and time. Keep these settings consistent across scheduled runs when building a comparison series.
- Residential Apify Proxy is used by default for a consistent search route. When Bing returns a challenge, the terminal summary identifies the affected keyword and preserves any useful rows already collected.
- Maximum input is 100 unique keywords and depth is capped at 100 organic positions.
- Output rows preserve `null` for unavailable rank fields and include `source: "bing-direct"` for provenance. Start with depth 10 or 20 for routine monitoring and reserve depth 50 or 100 for keywords where page-two visibility matters.

### Builder's note

I designed the output around the decision a rank-tracking workflow actually needs: one keyword row with a position, target URL, market, and timestamp. Keeping a valid no-match as a persisted row makes scheduled reports easier to join, while coupling the billable event to that validated row keeps the cost boundary legible to both humans and agents.

### Legal and compliance

Use this actor for search data you are permitted to collect. Respect applicable law, Bing terms, robots and rate limits, and the rights of destination websites. Keep the workflow focused on website visibility and content research rather than decisions about people.

### Related workflow

Use the full [Bing Search Scraper](https://apify.com/khadinakbar/bing-search-scraper) upstream when you need raw SERP evidence, then feed the resulting keyword/URL findings into this actor for a bounded domain check. For AI answer visibility rather than web search positions, use the separate AI rank-tracking workflow only when you need AI-platform evidence.

# Actor input Schema

## `targetDomain` (type: `string`):

Use this when you need the organic Bing position for one website. Enter a hostname such as "example.com" or a full HTTPS URL. This is normalized to a domain before matching. It is not a competitor list or a Bing search URL.

## `keywords` (type: `array`):

Use this for the search terms whose Bing positions you want to measure. Provide one keyword per array item, for example \["web scraping", "Bing rank tracker"]. Defaults to the first 100 unique terms. This is not a list of URLs.

## `country` (type: `string`):

Use this to localize the Bing market used for the check. Enter a two-letter ISO code such as "US", "GB", or "DE". Defaults to US. This is not a city or a Bing market string like en-US.

## `language` (type: `string`):

Use this to request the result language for the Bing market. Enter a two-letter code such as "en", "de", or "fr". Defaults to en. This is not a country code or a full locale.

## `safeSearch` (type: `string`):

Use this to control Bing's adult-content filter during the rank check. Choose off, moderate, or strict; moderate is the default. This affects the SERP returned by Bing and is not a content-quality score.

## `depth` (type: `integer`):

Use this to define how deep Bing should be checked for each keyword. Choose 10, 20, 50, or 100 organic positions; 20 is the default. Deeper checks use more page requests but still produce one billed rank row per keyword.

## `includeSubdomains` (type: `boolean`):

Use this when subdomains should count as owned results for the target domain. Defaults to true, so blog.example.com matches example.com. Set false for an exact-host check. This does not match unrelated domains that merely contain the same text.

## `includeCompetitors` (type: `boolean`):

Use this when the rank row should include the highest organic results above or around the target. Defaults to true and returns up to competitorCount domains from the checked SERP. Set false for a smaller dataset row. This does not identify paid advertisers.

## `competitorCount` (type: `integer`):

Use this to cap the competitor context attached to each keyword row. Enter 1 to 10; the default is 3. It only affects the returned context after the SERP is checked. This is not the number of keywords or ranking positions.

## `maxKeywords` (type: `integer`):

Use this as a safety cap when another workflow passes a large keyword list. Enter 1 to 100; the default is 100. Extra terms are ignored after normalization. This is not the SERP depth for each keyword.

## Actor input object example

```json
{
  "targetDomain": "example.com",
  "keywords": [
    "web scraping",
    "Bing rank tracker"
  ],
  "country": "US",
  "language": "en",
  "safeSearch": "moderate",
  "depth": 20,
  "includeSubdomains": true,
  "includeCompetitors": true,
  "competitorCount": 3,
  "maxKeywords": 100
}
```

# Actor output Schema

## `rankChecks` (type: `string`):

Default dataset with one record per keyword, including position, ranking URL, market, and competitor context.

## `output` (type: `string`):

Stable outcome, counts, charges, and warnings.

## `runSummary` (type: `string`):

Per-keyword statuses, request diagnostics, costs, and warnings.

# 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 = {
    "targetDomain": "apify.com",
    "keywords": [
        "web scraping",
        "Bing rank tracker"
    ],
    "country": "US",
    "language": "en",
    "safeSearch": "moderate",
    "depth": 20,
    "includeSubdomains": true,
    "includeCompetitors": true,
    "competitorCount": 3,
    "maxKeywords": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/bing-rank-tracker").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 = {
    "targetDomain": "apify.com",
    "keywords": [
        "web scraping",
        "Bing rank tracker",
    ],
    "country": "US",
    "language": "en",
    "safeSearch": "moderate",
    "depth": 20,
    "includeSubdomains": True,
    "includeCompetitors": True,
    "competitorCount": 3,
    "maxKeywords": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/bing-rank-tracker").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 '{
  "targetDomain": "apify.com",
  "keywords": [
    "web scraping",
    "Bing rank tracker"
  ],
  "country": "US",
  "language": "en",
  "safeSearch": "moderate",
  "depth": 20,
  "includeSubdomains": true,
  "includeCompetitors": true,
  "competitorCount": 3,
  "maxKeywords": 100
}' |
apify call khadinakbar/bing-rank-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,khadinakbar/bing-rank-tracker"
        }
    }
}

```

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/rV7Dz9RPs9hkomoGm/builds/h3iuGNqiVLvoQ4h01/openapi.json
