# AEO & GEO Tracker (`zucchini_gopher_m2v/aeo-geo-tracker`) Actor

Track whether your brand/domain appears in Bing search results, Google AI Overviews, and DuckDuckGo AI Chat answers -- Answer-Engine and Generative-Engine Optimization tracking, no account or API key needed.

- **URL**: https://apify.com/zucchini\_gopher\_m2v/aeo-geo-tracker.md
- **Developed by:** [Faisal Ahdan naufal](https://apify.com/zucchini_gopher_m2v) (community)
- **Categories:** AI, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 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.
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?

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

## AEO Bing Rank Tracker

Track whether your brand/domain appears in Bing search results — Answer-Engine Optimization rank tracking, no account or API key needed.

### Why use this actor

- No account, login, or API key required
- Honest results: a genuine bot-detection block is reported as a clear `_error`, never disguised as "brand not found"
- Built-in guidance to avoid a real, confirmed Bing quirk that silently ruins results for naively-phrased queries (see Known limits — this alone can be the difference between a correct report and a false "you're not ranking" scare)
- Every result's real destination URL is used for domain-matching, not Bing's tracking-redirect wrapper (Bing wraps every link in a `bing.com/ck/a?...` redirect; this actor decodes it)

### ⚠️ Important: phrase queries as natural questions, not "best X" keywords

This was found and confirmed during development, not a stylistic suggestion: Bing returns a completely irrelevant **decoy** result set for queries starting with a bare superlative.

| Query | Result |
|---|---|
| `"best crm software for small business"` | ❌ Irrelevant — pages about the standalone word "best" (a dictionary, BestBuy, an electronics retailer) |
| `"which crm software is best for small business"` | ✅ Correct — real CRM pages, Salesforce found ranking on page 1 |
| `"crm software for small business"` | ✅ Also correct |

Always phrase `query`/`queries` the way you'd actually ask a person or an AI assistant.

### Input

```json
{
  "queries": ["which crm software is best for small business", "what's a good alternative to salesforce"],
  "targetDomain": "hubspot.com"
}
```

| Field | Type | Description |
|---|---|---|
| `query` / `queries` | string / array | Natural-question phrasing (see above). |
| `targetDomain` | string | Your domain to check for. |
| `maxConcurrency` | integer | How many queries to run in parallel. Default 3. |
| `proxyConfiguration` | object | Apify Proxy settings. Not required — confirmed working without a proxy. |

### Output

One record per query:

```json
{
  "_input": "which crm software is best for small business",
  "_source": "S1-html",
  "query": "which crm software is best for small business",
  "targetDomain": "salesforce.com",
  "targetFound": true,
  "targetRank": 8,
  "resultCount": 10,
  "results": [
    { "rank": 1, "title": "...", "url": "https://qontak.com/...", "domain": "qontak.com", "isTarget": false },
    { "rank": 8, "title": "What Is a CRM? | Salesforce IN", "url": "https://www.salesforce.com/in/crm/what-is-crm/", "domain": "salesforce.com", "isTarget": true }
  ]
}
```

A record with `_error` instead means that lookup couldn't complete (e.g. `"_error": "blocked_or_transient"` for a network-level issue).

### Known limits

- **Results are capped at the top 10.** Confirmed during development that neither the `count` parameter nor real next-page links return additional/different results through this access path — for AEO purposes this is a reasonable scope anyway, since answer engines draw citations overwhelmingly from top-ranking pages.
- **Leading "best"/"top" queries get decoy results** — see the warning above. This is the single most important thing to get right when using this actor.
- **This actor tracks Bing's traditional organic results, not an AI-generated answer box.** Two "generative engine" surfaces (Google AI Overview, DuckDuckGo AI Chat) were thoroughly investigated during development and both turned out to require executing real JavaScript to access — Google's results are now entirely client-side-rendered (confirmed via Google's own `<noscript>` "enable JavaScript" fallback, present even on a clean, non-blocked response), and DuckDuckGo's anonymous chat API now gates access behind a proof-of-work-style JS challenge with an undocumented, very recently changed protocol. Both are genuine architectural walls, not solvable with better headers or proxies — see `CRAWLING_METHOD.md` for the full evidence trail from both investigations. This actor ships the one surface that's honestly, reliably deliverable via HTTP-only access.

# Actor input Schema

## `query` (type: `string`):

Phrase this as a NATURAL QUESTION, not a bare "best X"/"top X" SEO phrase. Bing was confirmed live to return an irrelevant decoy result set for queries starting with a bare superlative (e.g. "best crm software" returns pages about the word "best" itself) while the exact same intent phrased naturally ("which crm software is best for small business") returns correct, relevant results. See README.

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

Multiple queries to check in one run. Same natural-phrasing requirement as "query".

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

Your brand's domain (e.g. "hubspot.com") to check for in results.

## `maxConcurrency` (type: `integer`):

How many queries to process in parallel.

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

Apify Proxy configuration. Not required -- confirmed working without a proxy -- but Residential can be set here if you see transient blocks at scale.

## Actor input object example

```json
{
  "query": "which crm software is best for small business",
  "targetDomain": "hubspot.com",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All scraped Bing SERP / Google AI Overview / DuckDuckGo AI Chat records produced by this run.

# 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 = {
    "query": "which crm software is best for small business",
    "targetDomain": "hubspot.com",
    "maxConcurrency": 3,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("zucchini_gopher_m2v/aeo-geo-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 = {
    "query": "which crm software is best for small business",
    "targetDomain": "hubspot.com",
    "maxConcurrency": 3,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("zucchini_gopher_m2v/aeo-geo-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 '{
  "query": "which crm software is best for small business",
  "targetDomain": "hubspot.com",
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call zucchini_gopher_m2v/aeo-geo-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zucchini_gopher_m2v/aeo-geo-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/F2LtjIJdXggfi5P46/builds/xFF9A16cbC9WgCggp/openapi.json
