# AI Citation Tracker: Sites ChatGPT & Perplexity Cite (`crunchy_galaxy_qcr/ai-citation-tracker`) Actor

See which websites and pages ChatGPT and Perplexity cite when buyers ask about your market. Get every cited URL, domain citation share, your citation rate vs competitors and the prompts where you're missing. GEO / AEO source tracking, $0.05 per answer.

- **URL**: https://apify.com/crunchy_galaxy_qcr/ai-citation-tracker.md
- **Developed by:** [Kendall Sorenson](https://apify.com/crunchy_galaxy_qcr) (community)
- **Categories:** SEO tools, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

$50.00 / 1,000 ai answer analyzeds

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

## AI Citation Tracker: which websites ChatGPT and Perplexity cite for your market

When buyers ask ChatGPT or Perplexity "what's the best project management software?", it searches the web and cites a handful of pages. **Those cited pages decide which brands get recommended.** This Actor shows you exactly which websites and URLs ChatGPT and Perplexity cite for the questions your buyers ask, how often your own site is cited compared with competitors, and the prompts where competitors are cited and you aren't.

Use it for **GEO (generative engine optimization)**, **AEO**, LLM SEO, content planning and digital PR: find the review sites, listicles and competitor pages AI keeps citing, then get listed there or publish something better.

- ✅ No API keys needed. Just add your prompts and domains.
- ✅ Every cited URL with its title, domain and position in the answer
- ✅ Citation share by domain, your citation rate, and a competitor comparison
- ✅ An **opportunity list** of prompts where competitors are cited and you aren't
- ✅ Pay only for answers you get: **$0.05 per AI answer**. Failed requests are never charged.

👉 Want to know whether ChatGPT *mentions* your brand, not just cites your site? Use the companion [AI Search Visibility Tracker](https://apify.com/crunchy_galaxy_qcr/ai-visibility-tracker), or try the [free AI visibility checker](https://ai-visibility-checker-lac.vercel.app).

### How it works

1. You enter the questions your buyers ask. Or enter a category such as `CRM software for small businesses`, and the Actor writes realistic buyer prompts for you.
2. Each prompt goes to ChatGPT (OpenAI's current model with live web search) and Perplexity (its official API with live web search), once per engine and sample. Pick just one engine in **AI engines** if you prefer.
3. The Actor pulls out every cited URL in order, cleans tracking parameters, normalizes domains, and checks your domains and your competitors' domains, including subdomains.
4. You get one dataset row per answer, plus a `REPORT` record with the totals.

### Example output (real run, Nov 2, 2026)

Prompts: 3 project management questions, 2 samples each (6 answers). Your domain: `notion.so`. Competitors: `asana.com`, `clickup.com`, `monday.com`.

| Domain | Cited in answers | Share of all citations | Avg. first position |
|---|---|---|---|
| asana.com | 83% (5 of 6) | 50% | 1.2 |
| capterra.com | 17% | 25% | n/a |
| clickup.com | 33% | 17% | 3 |
| g2.com | 17% | 8% | n/a |
| notion.so (you) | **0%** | 0% | n/a |
| monday.com | 0% | 0% | n/a |

All three prompts went into the opportunity list. For example, for "What is the best project management software for a small team?" ChatGPT cited `asana.com/resources/best-project-management-software`, `asana.com/pricing` and `clickup.com/learn/topic/project-management/tools/`, plus a G2 category page. Notion's site wasn't cited once.

#### One dataset row (shortened)

```json
{
  "prompt": "What is the best project management software for a small team?",
  "engine": "chatgpt",
  "model": "gpt-5.4-mini-2026-03-17",
  "checkedAt": "2026-11-02T16:12:44.725Z",
  "answerExcerpt": "For most small teams, ...",
  "citationCount": 3,
  "citations": [
    { "position": 1, "url": "https://asana.com/resources/best-project-management-software", "title": "Best project management software: 11 tools compared [2026] • Asana", "domain": "asana.com" },
    { "position": 2, "url": "https://asana.com/pricing", "title": "Asana Pricing | ...", "domain": "asana.com" }
  ],
  "citedDomains": ["asana.com", "clickup.com"],
  "yourDomainCited": false,
  "yourFirstPosition": null,
  "competitorsCited": ["asana.com", "clickup.com"],
  "trackedDomains": { "asana.com": { "cited": true, "citations": 2, "firstPosition": 1, "urls": ["..."] } },
  "consultedSources": [ { "url": "...", "domain": "..." } ],
  "searchQueries": ["best project management software small team 2026"]
}
```

#### REPORT (key-value store)

- `comparison`: each of your domains and competitor domains, with the share of answers citing it, citation count, share of citations and average first position
- `yourCitationRate` and `byEngine`: the same figures for each engine
- `opportunities`: prompts where a competitor was cited and you weren't, with the competitor URLs and other cited sites
- `topDomains` and `topUrls`: the sites and pages AI cites most for your prompts
- `inputWarnings`: anything that was skipped or corrected in your input

### Input

| Field | What it does |
|---|---|
| `prompts` | Buyer questions, one per line (up to 100) |
| `category` | Used only if `prompts` is empty. Generates `autoPromptCount` prompts |
| `yourDomains` | Your sites, e.g. `notion.so`. Full URLs are fine |
| `competitorDomains` | Up to 25 competitor domains |
| `samplesPerPrompt` | Asks each prompt 1–5 times. AI answers vary, so 2–3 gives steadier numbers |
| `country` | 2-letter code (e.g. `US`) to localize web search |
| `language` | Answer language, e.g. `German` |
| `maxAnswers` | Hard cap on billed answers |

Bad input never costs you money. Empty, too-short or duplicate prompts and invalid domains are skipped with a warning in `INPUT_WARNINGS`. If nothing valid is left, the run ends without charging.

### Pricing and cost examples

**$0.05 per AI answer**, which is one prompt × one engine × one sample, including all citation extraction. Both engines are on by default, so each prompt is 2 answers unless you pick one engine. There's no subscription.

| Setup | Answers | Cost |
|---|---|---|
| 10 prompts × 1 engine × 1 sample, one-off audit | 10 | $0.50 |
| 10 prompts × 2 engines × 1 sample | 20 | $1.00 |
| 20 prompts × 2 engines × 1 sample, weekly | 40/week | $2/week (about $8.70/month) |
| 50 prompts × 2 engines × 2 samples, monthly deep dive | 200 | $10.00 |

AI-visibility subscription tools usually cost $29–$99+ a month. Set a run spending limit and the Actor stops before going over it.

### FAQ

**Why do citations matter more than mentions?** AI search answers are built from the pages it retrieves. If you know which pages it cites, you know where to get listed, which comparison pages to pitch, and which content of yours to improve.

**Which engines are supported?** ChatGPT with web search and Perplexity with web search, both through the official APIs. Each answer costs the same on either engine. Google Gemini isn't offered, because Google's Gemini API terms don't allow collecting or analyzing the links from its Search grounding.

**Is this exactly what I see in chatgpt.com?** It uses OpenAI's API with the same hosted web search tool, which is the closest programmatic match. Answers vary from run to run (as they do in the app), which is why samples help.

**Some cited pages return 403 when I script them.** Sites like G2 and Capterra block bots. The pages are real and open fine in a browser.

**Can I schedule it?** Yes. Use Apify Schedules to run weekly and compare the reports over time.

**Do I need an OpenAI key?** No. The Actor's own keys are used, and the price per answer includes everything.

### Related tools

- [AI Search Visibility Tracker](https://apify.com/crunchy_galaxy_qcr/ai-visibility-tracker): brand mentions, rank, share of voice and sentiment in ChatGPT, Gemini and Perplexity
- [Free AI visibility checker](https://ai-visibility-checker-lac.vercel.app): a 30-second check of whether ChatGPT recommends your brand
- [Google Ads Transparency & Ad Library Scraper](https://apify.com/crunchy_galaxy_qcr/google-ads-transparency-scraper): see your competitors' ads
- [Microsoft Ads Library Scraper](https://apify.com/crunchy_galaxy_qcr/microsoft-ads-library-scraper): your competitors' Bing ads, with copy, landing pages and EU impressions

Built by Kendall Sorenson.

# Actor input Schema

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

Questions your buyers ask AI assistants, one per line. Leave empty and fill in <b>Category</b> to generate prompts automatically.

## `yourDomains` (type: `array`):

Your website domains, e.g. <code>notion.so</code>. Subdomains count too. Full URLs are fine; they're trimmed to the domain.

## `competitorDomains` (type: `array`):

Competitor domains to compare against (up to 25).

## `category` (type: `string`):

Used only when Prompts is empty, e.g. <code>project management software</code>.

## `autoPromptCount` (type: `integer`):

How many prompts to generate from the category.

## `audience` (type: `string`):

Who the generated prompts should sound like, e.g. <code>a 10-person marketing agency</code>.

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

ChatGPT and Perplexity, both with live web search. Each answer from either engine is billed as one answer.

## `samplesPerPrompt` (type: `integer`):

AI answers vary. Ask each prompt 2–3 times for steadier numbers. Each sample is one billed answer.

## `country` (type: `string`):

Optional 2-letter country code (e.g. <code>US</code>, <code>GB</code>) to localize web search.

## `language` (type: `string`):

Optional, e.g. <code>German</code>. Leave empty to answer in the prompt's language.

## `maxAnswers` (type: `integer`):

Hard cap on billed answers for this run.

## `includeAnswerText` (type: `boolean`):

Adds the full AI answer to each row (an excerpt is always included).

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

Parallel requests.

## Actor input object example

```json
{
  "prompts": [
    "What is the best project management software for a small team?",
    "Best alternatives to spreadsheets for tracking team projects?"
  ],
  "yourDomains": [
    "notion.so",
    "notion.com"
  ],
  "competitorDomains": [
    "asana.com",
    "clickup.com",
    "monday.com"
  ],
  "autoPromptCount": 5,
  "engines": [
    "chatgpt",
    "perplexity"
  ],
  "samplesPerPrompt": 1,
  "maxAnswers": 100,
  "includeAnswerText": false,
  "concurrency": 4
}
```

# Actor output Schema

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

No description

## `citations` (type: `string`):

No description

## `report` (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 = {
    "prompts": [
        "What is the best project management software for a small team?",
        "Best alternatives to spreadsheets for tracking team projects?"
    ],
    "yourDomains": [
        "notion.so",
        "notion.com"
    ],
    "competitorDomains": [
        "asana.com",
        "clickup.com",
        "monday.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crunchy_galaxy_qcr/ai-citation-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 = {
    "prompts": [
        "What is the best project management software for a small team?",
        "Best alternatives to spreadsheets for tracking team projects?",
    ],
    "yourDomains": [
        "notion.so",
        "notion.com",
    ],
    "competitorDomains": [
        "asana.com",
        "clickup.com",
        "monday.com",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("crunchy_galaxy_qcr/ai-citation-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 '{
  "prompts": [
    "What is the best project management software for a small team?",
    "Best alternatives to spreadsheets for tracking team projects?"
  ],
  "yourDomains": [
    "notion.so",
    "notion.com"
  ],
  "competitorDomains": [
    "asana.com",
    "clickup.com",
    "monday.com"
  ]
}' |
apify call crunchy_galaxy_qcr/ai-citation-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crunchy_galaxy_qcr/ai-citation-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/qN5AlztzXxhUridz1/builds/CamEwau3vtzR9ec4W/openapi.json
