# AI Overview Rewrite Queue | Pages Losing Clicks to Google AI (`johnvc/ai-overview-rewrite-queue`) Actor

SEO API that joins your Search Console export with Google AI Overview citation data and returns a scored, tiered rewrite queue. Finds the pages where you rank but a competitor is cited, ranks them by lost opportunity, and explains each call in one sentence. MCP-ready.

- **URL**: https://apify.com/johnvc/ai-overview-rewrite-queue.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** SEO tools, AI, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 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/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

## AI Overview Rewrite Queue | Find Pages Losing Clicks to Google's AI

SEO API that joins your Google Search Console export with live AI Overview citation data and returns a scored, tiered list of which pages to rewrite first. It finds the queries where you already rank but Google's AI is answering with somebody else's content, and tells you which ones are worth the work.

Ranking and being cited are two different problems. Search Console shows you the first one. This shows you both at once.

### What this API returns

One row per query, sorted so the highest-leverage rewrites come first:

- **Your Search Console data**: clicks, impressions, CTR, and average position, parsed from whatever format your export used.
- **Live citation data**: whether an AI Overview appeared, which of your pages it cited, and every domain it cited instead.
- **A tier from A to X** with a one-sentence reason in plain language, so the row explains itself without a legend.
- **A join label on every row**, so a query that appears on only one side is visible rather than missing.
- **A whole-run summary** in the key-value store: counts per tier, the join rate, and the competitor domains cited most often across your keyword set.

What makes it different: no other tool on the Store puts Search Console position next to AI Overview citation status. Citation-only trackers tell you that you were not cited. This tells you which page to open first, and why.

### The five tiers

| Tier | What it means | What to do |
|---|---|---|
| **A** | You rank 5 to 20 and a competitor is cited instead of you | Rewrite first. Google already understands the page; someone else answers the question better. |
| **B** | You rank 1 to 4 and the AI ignores you, or cites nobody | Answer-shape problem, not an authority problem. Restructure the answer, do not chase links. |
| **C** | You are cited and still converting below your own baseline | The overview is satisfying the search. Consider what the page offers beyond the answer. |
| **D** | No AI Overview, or nothing indicating a rewrite | Ordinary SEO. Listed so the queue stays complete. |
| **X** | The check did not complete, or the query is on only one side of the join | Unknown. Evidence, not a conclusion. |

Tier C compares each query against **your own** median CTR at a similar position, computed from the no-overview queries in your own export. It never uses an industry table, because every account's normal is different.

### Example output

One real row, trimmed:

```json
{
  "result_type": "scored_query",
  "query": "what is a crm",
  "tier": "A",
  "tier_reason": "You rank at position 8.4 and a competitor is cited in the AI Overview instead of you, on 1,900 impressions. Google already understands this page; somebody else is answering the question better. Rewrite this one first.",
  "join_status": "matched",
  "clicks": 12,
  "impressions": 1900,
  "ctr": 0.0063,
  "position": 8.4,
  "check_status": "ok",
  "ai_overview_present": true,
  "citation_state": "competitor_cited",
  "cited_urls": [],
  "cited_pages_count": 0,
  "reference_count": 8,
  "reference_domains": ["reddit.com", "youtube.com", "ibm.com", "zendesk.com"],
  "fetched_at": "2026-08-17T22:41:03.118204+00:00"
}
```

A five-row queue looks like this:

| Tier | Query | Position | Impressions | Citation state | Why |
|---|---|---|---|---|---|
| A | what is a crm | 8.4 | 1,900 | competitor\_cited | You rank and a competitor is cited. Rewrite first. |
| A | crm integrations guide | 6.0 | 4,300 | competitor\_cited | Same shape, more traffic behind it. |
| B | crm software, cheap | 2.1 | 320 | overview\_no\_references | You rank top 3 and the overview cites nobody. |
| C | best crm for small business | 4.2 | 2,600 | cited | Cited, converting under your own median at this position. |
| X | free crm tools | 14.2 | 180 | null | The check did not complete, so this is unknown, not an absence. |

### Use cases

- **Build a rewrite backlog from evidence** rather than from opinion, by exporting Search Console once a month and running the queue.
- **Find the answer-shape problems**, the pages that rank in the top 4 and still get passed over by the AI.
- **See who is answering your queries**: the run summary tallies the domains cited most often across your keyword set.
- **Track the three states over time** on a schedule, since a single check is noise. The same query can cite you Monday and drop you Thursday.
- **Feed an agent**: an MCP client can pull the tier A list and draft the rewrites in the same session.

### Input parameters

| Parameter | Required | Default | Description |
|---|---|---|---|
| `target_domains` | **Yes** | | Domains you consider yours, for example `example.com`. Subdomains match their parent. |
| `search_console_csv_url` | No | | URL of a Search Console Queries export. A published Google Sheet CSV works and lets scheduled runs re-fetch fresh data. |
| `search_console_rows` | No | | The same rows pasted as JSON objects, instead of a URL. |
| `queries` | No | | Extra keywords to check on top of the export. |
| `min_impressions` | No | `10` | Ignore export rows below this impression count. |
| `gl` | No | `us` | Two-letter country code for the citation checks. |
| `hl` | No | `en` | Two-letter language code. AI Overviews are currently English-only. |
| `location` | No | | Optional named location, for example `Austin, Texas, United States`. |

At least one of `search_console_csv_url`, `search_console_rows`, or `queries` is required. No Google sign-in, no OAuth, and no service-account credentials: it reads an export you already have.

#### How to export from Search Console

1. Open the **Performance** report in Search Console.
2. Choose your date range, then open the **Queries** tab.
3. Click **Export** and pick a format, or export to Google Sheets.
4. For scheduled runs, put the sheet in Google Sheets and use **File, Share, Publish to web**, then choose comma-separated values. Paste that URL into `search_console_csv_url` and every run picks up fresh data.

Localized column headers, semicolon delimiters, comma decimals, percent signs on CTR, and non-breaking-space thousands separators are all handled, so an export from any locale works without editing.

### How to get started

1. Open the Actor and put your domain in **Your domains**.
2. Paste your Search Console export URL, or paste rows directly.
3. Run it. The queue arrives sorted, tier A first.

[View on Apify Store](https://apify.com/johnvc/ai-overview-rewrite-queue?fpr=9n7kx3)

### Pricing

Pay per event, with no subscription:

- A one-time **setup** event per run, covering the work before the first row exists: reading and parsing the export, running the citation checks, and computing your CTR baseline.
- A **scored row** event per query returned with a tier, a reason, and its joined data.

Current rates are on the Store card, which is always authoritative.

**One thing to know about cost.** The citation checks are performed by the [Google AI Overview API](https://apify.com/johnvc/google-ai-overview-api?fpr=9n7kx3), which this Actor runs on your account. Those runs are billed to you separately, under that Actor's own pricing, and they are the larger part of the cost of a run. Retrieval is not reimplemented here, so you pay for it once, at source. Use `min_impressions` to keep the checked set to queries with enough traffic to matter.

### 🔌 Use this API from Claude (MCP)

Add this Actor as a tool in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), or any other MCP client, through the hosted Apify MCP server:

```
https://mcp.apify.com/?tools=actors,docs,johnvc/ai-overview-rewrite-queue
```

Ask it for the tier A list and it can draft the rewrites in the same session.

https://www.youtube.com/watch?v=jREWahDGhJM

Apify MCP integration docs: https://docs.apify.com/platform/integrations/mcp

### 💸 Pay per run with crypto (x402)

The AI Overview Rewrite Queue supports agentic payments via the [x402 protocol](https://docs.apify.com/platform/integrations/x402).
AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed:
point your agent at the [Apify MCP server](https://mcp.apify.com/?tools=actors,docs,johnvc/ai-overview-rewrite-queue) and it can
discover, pay for, and run this Actor autonomously. Read the
[Apify x402 announcement](https://apify.com/change-log/pay-for-apify-actors-with-x402?fpr=9n7kx3) for details.

### Related tools

- [Google AI Overview API](https://apify.com/johnvc/google-ai-overview-api?fpr=9n7kx3): the citation checks behind this Actor. Use it directly when you want raw overview text and sources without the Search Console join.
- [Brave AI Mode API](https://apify.com/johnvc/brave-ai-mode-api?fpr=9n7kx3): the same visibility question on a different AI answer engine.
- [Naver AI Overview API](https://apify.com/johnvc/naver-ai-overview-api?fpr=9n7kx3): the same citation question for Korean search.
- [Google Autocomplete API](https://apify.com/johnvc/google-autocomplete-api?fpr=9n7kx3): find the question-shaped queries that trigger overviews in the first place.

### FAQ

#### How do you tell a real "no AI Overview" from a failed check?

They are different fields and they are never conflated. `ai_overview_present: false` means the query was checked and no overview appeared. `null` with `check_status` of `retrieval_failed` or `blocked` means it could not be checked. Failed checks land in tier X and can never be scored as a rewrite priority, because a failure that reads as a zero is worse than no data at all.

#### Why is my join rate only 40 percent?

Search Console anonymizes low-volume queries, so long-tail keyword lists commonly match somewhere between 30 and 60 percent. That is normal and not a fault in the export or the Actor. Unmatched rows are kept and labelled `gsc_only` or `check_only`, never dropped, so you can see exactly what did not line up.

#### Which of my pages is being cited, not just whether my domain is?

`cited_urls` lists the exact reference links belonging to your domains, and `cited_pages_count` counts them. `reference_domains` lists every domain the overview cited for that query, in order.

#### Are AI Overview citations correlated with classic top-10 rankings?

Not reliably, which is the reason this Actor exists. Tier B is precisely the set of queries where you rank in the top 4 and the AI still passes you over. If citation tracked ranking, tier B would always be empty.

#### How do you handle AI Overview volatility?

A single check is a snapshot, and the same query can cite you one day and drop you the next. Run it on a schedule and trend the tiers rather than reading one run as a verdict. A published Sheet URL in `search_console_csv_url` makes scheduled runs pick up fresh Search Console data automatically.

#### Can I pin the country or region?

Yes, with `gl`, `hl`, and `location`, and you should always set them deliberately. Checks run from datacenter addresses, so an unrecorded region makes a lost citation indistinguishable from a different exit node. The region actually used is recorded in the run summary.

#### Who else is being cited for my queries?

The run summary in the key-value store tallies `top_competitor_domains` across the whole run, ranked by how many of your queries each domain was cited on.

#### What if my export is from a non-English locale?

It will parse. Semicolon delimiters, comma decimals, percent signs, byte-order marks, non-breaking-space thousands separators, and localized column headers are all handled. Rows that genuinely cannot be read are counted in the run summary rather than silently discarded.

#### Does the tool distinguish being mentioned from being recommended?

Not yet. It reports citation, which is a link to your domain in the overview's sources. Whether the surrounding text recommends you, merely mentions you, or contradicts you is a text-analysis question this Actor does not answer.

#### Why do I see charges from a second Actor?

The citation checks run on the [Google AI Overview API](https://apify.com/johnvc/google-ai-overview-api?fpr=9n7kx3) under your account, so they appear as their own runs and their own charges. Retrieval lives in one place instead of being duplicated here, which is why it is billed once, at source.

***

### 🌐 About Alpha OSINT

This Actor is part of [Alpha OSINT](https://www.alphaosint.com), toolset of financial and operations data sources and APIs.
See the [AI Overview Rewrite Queue source page](https://www.alphaosint.com/sources/ai-overview-rewrite-queue/) for related tools and use cases.
For support or requests for this actor, please start a ticket [directly on our support page](https://apify.com/johnvc/ai-overview-rewrite-queue/issues/open?fpr=9n7kx3).

Last Updated: 2026.08.17

# Actor input Schema

## `target_domains` (type: `array`):

Domains you consider yours, for example example.com. Each result is classified by whether any of these was cited in the AI Overview. Subdomains match their parent, so learn.example.com matches example.com. Enter a domain you own, not a public suffix like co.uk.

## `search_console_csv_url` (type: `string`):

URL of a Search Console Queries export with the standard Query, Clicks, Impressions, CTR and Position columns. In Google Sheets use File, Share, Publish to web and choose comma-separated values; a published Sheet URL lets scheduled runs pick up fresh data every time. Localized headers, semicolon delimiters and comma decimals are all handled.

## `search_console_rows` (type: `array`):

An alternative to the URL. Paste rows as JSON objects with query, clicks, impressions, ctr and position. Combined with the URL when both are given.

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

Keywords to check on top of whatever the export contains. Leave empty to check exactly the queries in the export. Queries appearing in both are checked once.

## `min_impressions` (type: `integer`):

Ignore export rows below this impression count. Raising it focuses the queue on queries with enough traffic to be worth a rewrite.

## `gl` (type: `string`):

Two-letter country code for the citation checks (ISO 3166-1, for example us, gb, ca). AI Overviews are available in a limited set of countries. Always set this deliberately: an unlogged region makes a lost citation indistinguishable from a different exit node.

## `hl` (type: `string`):

Two-letter interface language code (ISO 639-1, for example en). AI Overviews are currently shown for English searches, so en is recommended.

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

Optionally narrow the citation checks to a named location, for example 'Austin, Texas, United States'. Leave empty to use country-level targeting from the country code.

## Actor input object example

```json
{
  "target_domains": [
    "example.com"
  ],
  "min_impressions": 10,
  "gl": "us",
  "hl": "en"
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every dataset item from this run, including any error row.

## `rewriteQueue` (type: `string`):

Every scored query with its tier, the reason, and the joined Search Console and citation data.

## `citationDetail` (type: `string`):

Which of your pages were cited and which domains were cited instead, per query.

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

Counts per tier, join rate, top competitor domains, and the click-through baseline.

# 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 = {
    "target_domains": [
        "example.com"
    ],
    "search_console_csv_url": "",
    "min_impressions": 10,
    "gl": "us",
    "hl": "en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/ai-overview-rewrite-queue").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 = {
    "target_domains": ["example.com"],
    "search_console_csv_url": "",
    "min_impressions": 10,
    "gl": "us",
    "hl": "en",
}

# Run the Actor and wait for it to finish
run = client.actor("johnvc/ai-overview-rewrite-queue").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 '{
  "target_domains": [
    "example.com"
  ],
  "search_console_csv_url": "",
  "min_impressions": 10,
  "gl": "us",
  "hl": "en"
}' |
apify call johnvc/ai-overview-rewrite-queue --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,johnvc/ai-overview-rewrite-queue"
        }
    }
}

```

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/9AbYKG1blET2sZRQA/builds/V15nKA2JJdva7hv1O/openapi.json
