# SEO & AI Search Booster - Audit, Rank Tracker, Keyword Gap (`reportable_broth/seo-ai-search-booster`) Actor

SEO and AI search (GEO) toolkit: audit pages with ready-to-paste fixes, compare against the top results for your keywords, track rankings on a schedule, find keyword ideas and outreach sites, submit with IndexNow. Chinese, Japanese and Korean aware.

- **URL**: https://apify.com/reportable\_broth/seo-ai-search-booster.md
- **Developed by:** [Quiet Harvest](https://apify.com/reportable_broth) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $35.00 / 1,000 page audits

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SEO & AI Search Booster

An SEO and AI search (GEO) toolkit you can call as an API. It audits your pages, compares them with the pages that outrank you, tracks your rankings on a schedule, finds keyword ideas and sites worth contacting, and submits updated pages with IndexNow.

It doesn't stop at a score. Every problem comes with a fix, and the fixes it can write for you (JSON-LD, FAQ markup, llms.txt, robots.txt lines, a better title) come ready to paste.

Works in English, Chinese, Japanese and Korean. Title and description lengths are measured in display width, so CJK text isn't cut in the wrong place.

### What does SEO & AI Search Booster do?

- **Page audit.** Google SEO checks (title, description, headings, canonical, mobile, images, links, structured data, noindex) and AI search checks: does robots.txt block ChatGPT search, Perplexity or Claude? Can AI crawlers see your text without JavaScript? Do you have FAQ markup, dates, an author, llms.txt? Returns a 0-100 score and ready-made fixes.
- **Keyword gap.** Fetches the pages that rank for your keyword and lists what they cover that you don't: topics, questions, terms, structured data, length, freshness. Then turns it into a short to-do list.
- **Rank tracking.** Your position on Bing (and optionally DuckDuckGo) for each keyword, with change since the last run, your best position, who's ahead of you, and alerts (dropped, climbed, entered or left the top 10).
- **Keyword ideas.** Real searches from Google and Bing suggestions around your keywords, sorted into questions, comparisons, buying and local searches. On a schedule it only returns new ones.
- **Sites to contact.** Pages that rank for your keywords but don't mention you yet, with emails and contact pages. Lists and pages that mention your competitors come first.
- **IndexNow.** Tells Bing, Yandex, Naver and Seznam to recrawl your updated pages right away.

### What can I use it for?

- Fix the things that stop a page from ranking or being cited by AI answers.
- Find out exactly what the top 10 pages cover that yours doesn't, before you rewrite it.
- Check every week whether your changes moved your rankings, and get told when a keyword drops.
- Plan content from real searches, especially the questions people ask.
- Build an outreach list for links and mentions.

### How do I use it?

1. Open this Actor and click Try for free. A free Apify account is enough.
2. Put your page URLs in `urls` and the keywords you want to rank for in `keywords`.
3. Pick your search market (e.g. `zh-TW`, `ja-JP`, `en-US`).
4. Turn on what you need. Audit, keyword gap and rank tracking are on by default.
5. Click Start, then download the results as JSON, CSV or Excel, or read them through the API.

To track rankings over time, save the input as a Task and add a weekly Schedule. History is kept between runs.

### Examples

Audit a page and compare it with the top results:

```json
{
  "urls": ["https://your-site.com/camping-checklist"],
  "keywords": ["camping gear checklist"],
  "locale": "en-US"
}
```

Weekly rank tracking for several keywords (Taiwan market):

```json
{
  "domain": "your-site.com.tw",
  "keywords": ["露營裝備", "露營裝備推薦", "露營裝備清單"],
  "locale": "zh-TW",
  "audit": false,
  "keywordGap": false
}
```

Keyword ideas and outreach list:

```json
{
  "domain": "your-site.jp",
  "keywords": ["キャンプ用品"],
  "locale": "ja-JP",
  "keywordIdeas": true,
  "findProspects": true,
  "brand": "Your Brand",
  "competitors": ["Snow Peak", "Coleman"]
}
```

### Input

| Field | Default | |
|---|---|---|
| `urls` | | Your pages. Same count as `keywords` = paired in order |
| `keywords` | | Keywords you want to rank for |
| `domain` | from first URL | Your site, for rankings and to skip your own pages |
| `locale` | `en-US` | `en-US`, `en-GB`, `zh-TW`, `zh-HK`, `zh-CN`, `ja-JP`, `ko-KR`, `de-DE`, `fr-FR`, `es-ES` |
| `audit` | `true` | Page audit with fixes |
| `keywordGap` | `true` | Compare with the top results |
| `trackRankings` | `true` | Bing positions |
| `includeDuckDuckGo` | `false` | Also DuckDuckGo (often rate-limited) |
| `keywordIdeas` | `false` | Suggestions from Google and Bing |
| `findProspects` | `false` | Sites to contact |
| `indexNow` | `false` | Submit URLs with IndexNow |
| `brand`, `brandAliases`, `competitors` | | For the outreach list |
| `rankDepth` | `30` | How many results to check (10-50) |
| `rivalsPerKeyword` | `10` | Top pages to compare (3-20) |
| `maxIdeas` | `200` | Keyword ideas per run |
| `ideasOnlyNew` | `true` | Only ideas you haven't had before |
| `alertDrop` | `3` | Places moved before it counts as dropped/climbed |
| `indexNowKey`, `indexNowKeyLocation`, `indexNowUrls` | | See the IndexNow section |

### What data do I get?

Each row has a `type`: `audit`, `keywordGap`, `ranking`, `keywordIdea`, `prospect` or `indexNow`.

An audit row, shortened:

```json
{
  "type": "audit",
  "url": "https://your-site.com/camping-checklist",
  "score": 86, "grade": "B", "seoScore": 87, "aiScore": 85,
  "issues": [
    { "severity": "high", "area": "ai", "id": "robots-ai-search",
      "message": "robots.txt blocks AI search crawlers: OAI-SearchBot, PerplexityBot.",
      "fix": "Allow them. See fixes.robotsTxt." },
    { "severity": "medium", "area": "ai", "id": "faq-schema",
      "message": "The page has question headings but no FAQPage markup.", "fix": "..." }
  ],
  "fixes": {
    "title": "Camping Gear Checklist | Your Site",
    "faqJsonld": { "@type": "FAQPage", "mainEntity": ["..."] },
    "robotsTxt": "User-agent: OAI-SearchBot\nAllow: /",
    "llmsTxt": "# Your Site\n\n> ...\n\n## Pages\n- [Tents](https://...)"
  }
}
```

A ranking row:

```json
{
  "type": "ranking", "keyword": "露營裝備", "engine": "bing",
  "position": 8, "previousPosition": 12, "change": 4, "bestPosition": 8,
  "alert": "entered-top10",
  "aheadOfYou": [{ "position": 1, "domain": "chilloutdoortw.com" }]
}
```

Keyword gap rows have `missingTopics`, `missingQuestions`, `missingTerms`, `schemaGap`, `rivalMedianLength`, `yourLength`, `titlePatterns` and `actions` (the to-do list). Prospect rows have `url`, `pageType` (listicle or article), `mentionsCompetitors`, `emails`, `contactPages`, `social` and `priority`.

### How much does it cost?

You pay per result:

| Event | Price |
|---|---|
| Page audit | $0.035 per page |
| Keyword gap | $0.05 per keyword |
| Ranking check | $0.005 per keyword per engine |
| Keyword idea | $0.003 per idea |
| Site to contact | $0.01 per site |
| IndexNow submit | $0.001 per submission |
| Run start | $0.00005 per run |

Some real numbers:

- Audit 10 pages: $0.35.
- Track 20 keywords on Bing every week: 20 × $0.005 = $0.10 a week.
- Gap analysis for 5 keywords: $0.25.
- 200 keyword ideas: $0.60.

Apify's free plan gives you $5 of credit a month.

### IndexNow

IndexNow lets you tell search engines a page changed instead of waiting for them to notice. Bing, Yandex, Naver, Seznam and Yep share submissions. Google doesn't use it.

1. Pick a key: 8-128 letters, numbers or dashes.
2. Upload a text file named `<key>.txt` containing only the key to your site root (`https://your-site.com/<key>.txt`).
3. Set `indexNow: true`, `indexNowKey` and the URLs. The Actor checks the key file first and tells you if it's missing.

### Limits

- Rankings come from Bing and DuckDuckGo. Google's result page can't be read without a browser. Bing is the engine behind ChatGPT search and Copilot, so it's a useful signal for AI search too, but Google positions can differ.
- Searches run through residential proxies in your market's country. Bing sometimes serves unrelated results to traffic it thinks is a bot; the Actor checks for that and reports `unknown` instead of a wrong position.
- The audit reads the HTML your server sends. It doesn't run JavaScript, which is also what most AI crawlers see.
- Keyword ideas don't include search volumes. They're real suggestions, which means people search them, but you don't get numbers.
- It doesn't create fake searches or clicks. That breaks search engine rules and gets sites demoted.

### FAQ

**Will this get me to the top of Google?**
No tool can promise that. What it does is show you what the pages above you have that yours doesn't, write the fixes it can, and measure whether your rankings move after you change things.

**What's the difference between AI search crawlers and AI training crawlers?**
Search crawlers (OAI-SearchBot, PerplexityBot, Claude-SearchBot) fetch pages to quote and link in answers. Block them and you can't be cited. Training crawlers (GPTBot, CCBot, Google-Extended) collect data for model training. The audit reports them separately so you can block training without disappearing from AI answers.

**Why is my ranking "unknown"?**
The search engine didn't return results we could trust on that run (blocked or unrelated). It isn't counted as a drop. The next run usually works. `unknown` rows aren't charged.

**Can I run it on a schedule?**
Yes. Save a Task and add a Schedule. Rankings keep their history and keyword ideas only return new ones.

### Other scrapers I made

- [Google Trends API](https://apify.com/reportable_broth/google-trends-scraper), [Google Ads Transparency](https://apify.com/reportable_broth/google-ads-transparency-scraper)
- [YouTube Monitor](https://apify.com/reportable_broth/youtube-scraper-monitor), [YouTube Transcript](https://apify.com/reportable_broth/youtube-transcript-scraper)
- [Threads Scraper & Monitor](https://apify.com/reportable_broth/threads-scraper-monitor)

Found a bug or need a check? Open an issue on the Issues tab.

### 中文说明

SEO 和 AI 搜索（GEO）工具：检查网页并直接给出可贴上的修正（JSON-LD、FAQ、llms.txt、robots.txt、标题），比对排在你前面的网页缺了什么，定期追踪 Bing 排名，找真实的长尾关键词和可以联系的网站，并用 IndexNow 通知搜索引擎重新收录。支持繁中、简中、日文、韩文。

### 日本語

SEO と AI 検索（GEO）のためのツール。ページ診断と貼り付けできる修正案、上位ページとの比較、順位の定期チェック、キーワード候補、IndexNow 送信。

***

Uses only public pages and public search suggestions. You're responsible for how you use the results.

# Actor input Schema

## `urls` (type: `array`):

Pages to audit (and compare against the top results). One URL per line.

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

Keywords you want to rank for. With the same number of URLs and keywords, they're paired in order.

## `domain` (type: `string`):

For rank tracking and to skip your own site. Defaults to the domain of the first URL.

## `locale` (type: `string`):

Language and country used for searches, suggestions and rankings.

## `audit` (type: `boolean`):

Score each page for Google SEO and AI search (ChatGPT, Perplexity, Claude) and return ready-to-paste fixes.

## `keywordGap` (type: `boolean`):

Fetch the pages that rank for each keyword and list the topics, questions, terms and structured data they have and you don't.

## `trackRankings` (type: `boolean`):

Your position on Bing and DuckDuckGo for each keyword, with change since the last run and alerts. Run it on a schedule.

## `keywordIdeas` (type: `boolean`):

Real searches from Google and Bing suggestions around your keywords: questions, comparisons, buying and local searches.

## `findProspects` (type: `boolean`):

Pages that rank for your keywords but don't mention you yet, with emails and contact pages. Good for outreach and links.

## `indexNow` (type: `boolean`):

Ask Bing, Yandex, Naver and Seznam to recrawl your pages now. Needs your IndexNow key (see README).

## `brand` (type: `string`):

Used to skip pages that already mention you.

## `brandAliases` (type: `array`):

e.g. Chinese/English names, abbreviations.

## `competitors` (type: `array`):

Pages that mention a competitor but not you are ranked higher.

## `maxProspectsPerKeyword` (type: `integer`):

Most sites to return for each keyword.

## `rankDepth` (type: `integer`):

How many Bing results to check for your site.

## `includeDuckDuckGo` (type: `boolean`):

Also check DuckDuckGo. It rate-limits often; when it does the row says 'unknown' and isn't charged.

## `rivalsPerKeyword` (type: `integer`):

How many top-ranking pages to fetch and compare for each keyword.

## `maxIdeas` (type: `integer`):

Most keyword ideas to return per run.

## `ideasOnlyNew` (type: `boolean`):

On a schedule, only return suggestions that earlier runs didn't.

## `alertDrop` (type: `integer`):

Flag a ranking as dropped/climbed when it moves this many places.

## `monitorStoreName` (type: `string`):

Ranking history and seen ideas are kept here between runs. Leave empty for the default.

## `indexNowKey` (type: `string`):

8-128 characters (letters, numbers, dashes). Put a file named <key>.txt containing the key at your site root.

## `indexNowKeyLocation` (type: `string`):

Only if the key file isn't at https://your-site/<key>.txt.

## `indexNowUrls` (type: `array`):

Defaults to 'Your pages'. Must be on the same host.

## `concurrency` (type: `integer`):

How many pages to download at the same time.

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

Residential in the search market's country is used automatically. Bing returns unrelated results to foreign or data-center IPs.

## Actor input object example

```json
{
  "urls": [
    "https://apify.com/reportable_broth/weibo-scraper"
  ],
  "keywords": [
    "weibo scraper"
  ],
  "locale": "en-US",
  "audit": true,
  "keywordGap": true,
  "trackRankings": true,
  "keywordIdeas": false,
  "findProspects": false,
  "indexNow": false,
  "brandAliases": [],
  "competitors": [],
  "maxProspectsPerKeyword": 20,
  "rankDepth": 30,
  "includeDuckDuckGo": false,
  "rivalsPerKeyword": 10,
  "maxIdeas": 200,
  "ideasOnlyNew": true,
  "alertDrop": 3,
  "indexNowUrls": [],
  "concurrency": 5,
  "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 = {
    "urls": [
        "https://apify.com/reportable_broth/weibo-scraper"
    ],
    "keywords": [
        "weibo scraper"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("reportable_broth/seo-ai-search-booster").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 = {
    "urls": ["https://apify.com/reportable_broth/weibo-scraper"],
    "keywords": ["weibo scraper"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("reportable_broth/seo-ai-search-booster").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 '{
  "urls": [
    "https://apify.com/reportable_broth/weibo-scraper"
  ],
  "keywords": [
    "weibo scraper"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call reportable_broth/seo-ai-search-booster --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,reportable_broth/seo-ai-search-booster"
        }
    }
}
```

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/oc1xuldLCXa5weVne/builds/3LNzahUtgtebALYeA/openapi.json
