# AI Rival Report: Who ChatGPT Recommends Instead (`growth-installations/ai-rival-report`) Actor

Find local businesses that ChatGPT, Perplexity, Gemini and Google AI skip, see which rival they name instead, and get an agency-ready report plus outreach for each one.

- **URL**: https://apify.com/growth-installations/ai-rival-report.md
- **Developed by:** [Growth Installations](https://apify.com/growth-installations) (community)
- **Categories:** AI, SEO tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $750.00 / 1,000 prospect reports

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

### What does AI Rival Report do?

**AI Rival Report** shows which local businesses ChatGPT, Perplexity, Gemini, Copilot and Google's AI Overview / AI Mode **skip** when someone asks *"best HVAC company in Richmond, VA"* (or any niche and city), and which **rival** they recommend instead. Each skipped business becomes a ready-to-sell prospect: a one-page AI visibility report, the owner's LinkedIn, and outreach copy your agency can send today.

Give it a city and a niche. It pulls the Google Maps list, asks every AI engine the same question, and compares the answers against the list:

- **Prospect** = a well-reviewed business (default 4.0+ stars, 10+ reviews) that no AI engine named, while a rival was named.
- **Rival** = the business the AI engines named most often (ties broken by review count).
- **Report** = what each AI said, which sites it cited, where the prospect is missing, and the fixes that usually move AI answers.

### Why use AI Rival Report?

AI answers are the new top-3 map pack, and most local businesses have no idea they are invisible there. "ChatGPT recommends your competitor Woodfin, not you" is the strongest cold-outreach opener an SEO or GEO agency can have, because the owner can check it in ten seconds.

- **SEO / GEO / AEO agencies:** fill your pipeline with businesses that have a visible, provable problem you fix.
- **AI-search consultants:** hand prospects a free report that does the selling.
- **Freelancers starting an AI business:** a weekly list of warm prospects in any niche and city.

### What data does it return?

| Field | Example |
|---|---|
| business, website, phone, rating, reviews | TechMasters LLC, 4.8★ |
| rival, rival_named_in | Woodfin - Your Home Team (chatgpt, perplexity, gemini) |
| business_named_in | (empty: named by no engine) |
| rival_quote | the AI's own sentence about the rival |
| cited_domains | sites the AI engines cited (Yelp, Angi, BBB, local news...) |
| dm_name, dm_title, dm_linkedin | owner / president from LinkedIn |
| linkedin_note, linkedin_message, email_subject, email_body, followup | outreach copy |
| report_url | the Markdown report in the run's key-value store |

The key-value store also holds `SUMMARY`, `VISIBILITY` (every business x engine mention count) and `AUTOSEND_PROMPT`: a ready-to-paste prompt for Claude in Chrome or ChatGPT in Chrome that sends the LinkedIn outreach for you, fully automatically.

### How to use AI Rival Report

1. Enter a **City** (e.g. `Richmond, VA`) and a **Niche** (presets: hvac, plumber, electrician, roofing, dentist, med-spa, pi-lawyer, chiropractor, auto-repair, moving, pest-control, landscaping, pool, garage-door, foundation, water-damage; or any free text).
2. Optional: add your agency name, your name and your offer so the outreach is signed.
3. Run. A 40-business city takes 2-4 minutes.
4. Download prospects as CSV/Excel/JSON, open each report from `report_url`, and paste `AUTOSEND_PROMPT` into Claude in Chrome or ChatGPT in Chrome to send.

### How much does it cost?

**$1 per market scan + $0.75 per prospect report.** The $1 scan fee is charged once per run (one city + niche). Reports are only charged for prospects: businesses the AI skipped while naming a rival. Example: a city with 10 skipped businesses = $8.50. Set **Max prospects** or your run's max charge to cap the bill; the Actor stops before paying for sub-runs it can't charge for.

The Actor runs Google Maps and AI-answer scrapers on your Apify account. These sub-runs are typically $0.30-$1.20 per city (estimate shown in the log before anything runs) and are capped by the **spend cap** inputs.

### Input

See the Input tab. Only **City** and **Niche** are required. Advanced inputs let you ask custom prompts, choose engines, ask each prompt several times (AI answers vary), set a do-not-contact list, and replay finished datasets for free re-analysis.

### Output

One dataset row per prospect (Overview view shows the key columns). Example:

```json
{
  "business": "TechMasters LLC",
  "website": "http://www.techmastersva.com/",
  "phone": "(804) 361-6071",
  "address": "4112 Forest Cir, Richmond, VA 23225",
  "rating": 4.9,
  "reviews": 98,
  "maps_url": "https://www.google.com/maps/search/?api=1&query=TechMasters%20LLC&query_place_id=ChIJ_ZeAUGptsYkRdE9X3z_XBe4",
  "city": "Richmond, VA",
  "niche": "HVAC company",
  "ai_prompt": "best HVAC company in Richmond, VA",
  "rival": "Woodfin - Your Home Team",
  "rival_rating": 4.9,
  "rival_reviews": 11720,
  "rival_website": "https://askwoodfin.com/",
  "business_short": "TechMasters LLC",
  "rival_short": "Woodfin",
  "rival_named_in": "ChatGPT 1/1, Perplexity 1/1, Gemini 0/1, Google AI Mode 1/1",
  "business_named_in": "ChatGPT 0/1, Perplexity 0/1, Gemini 0/1, Google AI Mode 0/1",
  "engines_asked": "ChatGPT, Perplexity, Gemini, Google AI Mode",
  "rival_engines": [
    "chatgpt",
    "perplexity",
    "ai_mode"
  ],
  "others_named": [
    "Bradley Mechanical",
    "Michael & Son Services",
    "Automatic Climate HVAC & Air Conditioning",
    "Air Repair Inc"
  ],
  "rival_quote": "Woodfin – Your Home Team and Automatic Climate HVAC at the top of my list for Richmond, VA. However, there are several excellent alternatives depending on whether you need a repair, replacement, or a…",
  "rival_quote_engine": "ChatGPT",
  "cited_domains": "google.com, jamesriverair.com, automaticclimate.com, bradleymechanical.com, carrier.com, aireserv.com, woodfin.com, rivercityheatingair.com",
  "business_site_cited": false,
  "checked_at": "2026-11-03T09:41-05:00",
  "dm_source_query": "site:linkedin.com/in \"techmasters\" Richmond owner OR founder OR president OR partner",
  "dm_name": "Joey Smith",
  "dm_first_name": "Joey",
  "dm_title": "President",
  "dm_linkedin": "https://www.linkedin.com/in/joey-smith-3980701b8",
  "dm_confidence": "high",
  "linkedin_note": "Hi Joey, I asked ChatGPT for the best HVAC company in Richmond and it recommended Woodfin, not TechMasters LLC. I put what 6 AI assistants said into a 1-page report. Want it?",
  "email_subject": "ChatGPT and TechMasters LLC",
  "report_key": "report-techmasters-llc"
}
```

### Tips

- Run the same city weekly: AI answers drift, and "you dropped out of ChatGPT this week" is a great follow-up.
- Ask 2-3 prompts ("best", "most trusted", "emergency") to catch more skipped businesses.
- Some engines (Copilot, AI Overview) don't answer every query; the report only counts engines that answered.

### FAQ

**Is the AI answer real?** Yes. Answers are collected live from each engine through Apify's Google Search Scraper AI modes, and quoted verbatim in each report.

**Why is the owner missing for some prospects?** The owner lookup only accepts a LinkedIn profile whose headline names the business in the same area, so it prefers blank over wrong.

**Can I white-label the report?** Yes. Reports are Markdown with your agency name; convert to PDF or paste into your own template.

**Support:** open an issue on the Actor's Issues tab.

# Actor input Schema

## `city` (type: `string`):

City and state/country to check, e.g. "Richmond, VA".

## `niche` (type: `string`):

Business type. Presets: hvac, plumber, electrician, roofing, dentist, med-spa, pi-lawyer, chiropractor, auto-repair, moving, pest-control, landscaping, pool, garage-door, foundation, water-damage. Any other text is used as the Maps search.

## `prompts` (type: `array`):

Questions to ask the AI engines. Default: "best <niche> in <city>".

## `engines` (type: `array`):

Which AI answers to read.

## `asksPerPrompt` (type: `integer`):

Ask each prompt this many times (AI answers vary between asks).

## `maxPlaces` (type: `integer`):

How many Google Maps businesses to compare against the AI answers.

## `minReviews` (type: `integer`):

Skip businesses with fewer Google reviews (they are not worth an agency's time).

## `minRating` (type: `number`):

Skip businesses rated below this.

## `maxProspects` (type: `integer`):

Stop after this many prospect reports (you pay per report).

## `findDecisionMakers` (type: `boolean`):

Look up the owner or president on LinkedIn through Google.

## `agencyName` (type: `string`):

Used in the report header and outreach sign-off.

## `senderName` (type: `string`):

Signs the outreach copy.

## `senderOffer` (type: `string`):

What you offer in the outreach.

## `doNotContact` (type: `array`):

Business names, domains or phone numbers to never include.

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

Google country for searches.

## `maxMapsChargeUsd` (type: `number`):

Cap for the Google Maps sub-run. Minimum $0.50 (the lowest cap Apify accepts for the scraper sub-run).

## `maxSearchChargeUsd` (type: `number`):

Cap for the AI-answer sub-runs. Minimum $0.50 (the lowest cap Apify accepts for the scraper sub-run).

## `maxDmChargeUsd` (type: `number`):

Cap for the LinkedIn owner lookup.

## `mapsDatasetId` (type: `string`):

Reuse a finished compass/crawler-google-places dataset instead of scraping.

## `searchDatasetIds` (type: `array`):

Reuse finished apify/google-search-scraper datasets.

## `dmDatasetId` (type: `string`):

Reuse a finished owner-lookup search dataset.

## Actor input object example

```json
{
  "city": "Richmond, VA",
  "niche": "hvac",
  "prompts": [
    "best HVAC company in Richmond, VA"
  ],
  "engines": [
    "chatgpt",
    "perplexity",
    "gemini",
    "copilot",
    "ai_overview",
    "ai_mode"
  ],
  "asksPerPrompt": 1,
  "maxPlaces": 40,
  "minReviews": 10,
  "minRating": 4,
  "maxProspects": 25,
  "findDecisionMakers": true,
  "agencyName": "Rank Local",
  "senderName": "Chris",
  "senderOffer": "a free 1-page AI visibility report",
  "countryCode": "us",
  "maxMapsChargeUsd": 0.5,
  "maxSearchChargeUsd": 2,
  "maxDmChargeUsd": 0.5
}
```

# Actor output Schema

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

No description

## `files` (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 = {
    "city": "Richmond, VA",
    "niche": "hvac",
    "prompts": [
        "best HVAC company in Richmond, VA"
    ],
    "agencyName": "Rank Local",
    "senderName": "Chris"
};

// Run the Actor and wait for it to finish
const run = await client.actor("growth-installations/ai-rival-report").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 = {
    "city": "Richmond, VA",
    "niche": "hvac",
    "prompts": ["best HVAC company in Richmond, VA"],
    "agencyName": "Rank Local",
    "senderName": "Chris",
}

# Run the Actor and wait for it to finish
run = client.actor("growth-installations/ai-rival-report").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 '{
  "city": "Richmond, VA",
  "niche": "hvac",
  "prompts": [
    "best HVAC company in Richmond, VA"
  ],
  "agencyName": "Rank Local",
  "senderName": "Chris"
}' |
apify call growth-installations/ai-rival-report --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,growth-installations/ai-rival-report"
        }
    }
}
```

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/KkLWH0FZwuAOe4gEK/builds/qYAshWtq1gOg9ZYei/openapi.json
