# Bing SERP & Copilot Presence Scraper (`leaderly_jackpine/bing-serp-copilot-presence`) Actor

Returns Bing organic search results (title, URL, domain, snippet, rank) per query, plus a signal for whether Bing's Copilot Search surface was present on the SERP. Built for SEO rank tracking and AI-visibility (GEO) monitoring.

- **URL**: https://apify.com/leaderly\_jackpine/bing-serp-copilot-presence.md
- **Developed by:** [William](https://apify.com/leaderly_jackpine) (community)
- **Categories:** SEO tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 serp 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/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 SERP & Copilot Presence Scraper

Returns **one dataset row per organic Bing result** (rank, title, URL, domain, snippet) plus a `copilotPresent` flag indicating whether Bing's Copilot Search surface appeared on the SERP. Built for SEO rank tracking and AI-visibility / Generative Engine Optimisation (GEO) monitoring. You are charged per organic result.

### What you get per organic result

- `position` — rank on the SERP (1 = top)
- `title`, `url`, `domain`, `snippet`
- `copilotPresent` — whether the Bing Copilot Search surface appeared for that query
- `query`, `market`, `language`, `capturedAt`, `pageUrl`, `pageTitle`

Queries that return no organic results (e.g. Bing CAPTCHA/block) are pushed as a single uncharged status row.

### Quick start

```json
{
  "queries": ["best crm for small business", "what is rag"],
  "countryCode": "US",
  "languageCode": "en-US",
  "maxResults": 10,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

### How it works

- Runs headless Chromium with stealth fingerprinting through Apify's **residential** proxy.
- Retries automatically on transient proxy/network errors (configurable, default 3).
- Bing tracking URLs in organic links are decoded to their real destinations.

### Important notes

- The Actor reports whether the Copilot Search **surface** is present on the SERP; it does not extract the text of Bing's generated AI answer (Bing does not reliably generate one for automated sessions).
- Bing controls what each market/session sees and may show a CAPTCHA on some IPs. The Actor reports `captcha` rather than pretending success.
- No accounts, login credentials, or CAPTCHA-solving are used.

# Actor input Schema

## `queries` (type: `array`):

One Bing search query per item.

## `countryCode` (type: `string`):

Two-letter country code sent to Bing (cc). Use a matching proxy country where possible.

## `languageCode` (type: `string`):

Bing UI language, for example en-US.

## `maxResults` (type: `integer`):

Number of organic results to return per query (1-50).

## `responseWaitSeconds` (type: `integer`):

Seconds to wait after Bing loads before extracting. Keep low (4-8); higher increases cost.

## `copilotAnswerWaitSeconds` (type: `integer`):

When Bing's Copilot surface is present but the generated answer hasn't rendered yet, poll for up to this many extra seconds to capture the answer text and citations. 0 disables the extra wait. Bing gates the Copilot answer, so this is best-effort: when Bing serves one, it is captured.

## `bingCookies` (type: `string`):

Optional. A JSON array of cookie objects for bing.com from a logged-in Microsoft/Bing session, e.g. \[{"name":"\_U","value":"...","domain":".bing.com"}]. When provided, the Actor injects them so Bing serves the Copilot generative answer, which is otherwise gated to anonymous sessions. The \_U cookie is the key login token. Store via an Apify secret (reference "@bingCookies"). Cookies expire; refresh from your browser when needed. Use only in line with Bing's terms.

## `maxAttempts` (type: `integer`):

Retries with a fresh proxy session on non-success or transient errors (1-5). Each retry adds proxy cost; 2 is a good balance.

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

Apify Proxy. A residential proxy (RESIDENTIAL group) is required for Bing reliability; datacenter proxies get CAPTCHA'd.

## Actor input object example

```json
{
  "queries": [
    "best crm for small business"
  ],
  "countryCode": "US",
  "languageCode": "en-US",
  "maxResults": 10,
  "responseWaitSeconds": 6,
  "copilotAnswerWaitSeconds": 8,
  "bingCookies": "[]",
  "maxAttempts": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "queries": [
        "best crm for small business"
    ],
    "countryCode": "US",
    "languageCode": "en-US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("leaderly_jackpine/bing-serp-copilot-presence").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 = {
    "queries": ["best crm for small business"],
    "countryCode": "US",
    "languageCode": "en-US",
}

# Run the Actor and wait for it to finish
run = client.actor("leaderly_jackpine/bing-serp-copilot-presence").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "best crm for small business"
  ],
  "countryCode": "US",
  "languageCode": "en-US"
}' |
apify call leaderly_jackpine/bing-serp-copilot-presence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=leaderly_jackpine/bing-serp-copilot-presence",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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