Track ChatGPT, Claude, Perplexity, and Gemini citations daily
Daily share-of-voice snapshot across 5 LLMs and Google AI Overviews for your brand and category queries, with alerts on drops and an optional skill to reclaim lost mentions.
Daily snapshot of who's being cited by ChatGPT, Perplexity, Claude, Gemini, and Google AI Overviews for your top brand and intent queries. The GEO flagship workflow.
| Outcome | Daily share-of-voice snapshot across 5 LLMs for 20–50 queries; alerts on drops |
| Time | ~5 min setup, runs in the background daily |
| Cost | ~0.5 credits per (query × LLM × sample); typical setup ≈ 225 credits/month per query |
| Prereqs | API key, list of monitored prompts (start with your top brand + category queries) |
What it does
For each citation query:
Daily, per LLM (5), per sample (3-5):
Query the LLM with the prompt
Parse citations and mentions
Score each cited domain
Aggregate over the day, the week, the month
Compare to baseline
Alert on drops
Optional: citation_hunter skill on alerts → produce.refine to reclaim lost mentionsStep 1 — Pick your prompts
Start with 20–50 prompts that matter. Three classes:
- Brand queries: "What is acme.com?" "Reviews of Acme PM?"
- Category queries: "Best project management software for engineering teams"
- Comparison queries: "Acme vs monday.com"
- Problem queries: "How to track team capacity?"
The category and problem queries are where you discover whether AI search even mentions you — usually the biggest gap.
Step 2 — Add each as a monitored query
for PROMPT in \
"Best project management software for engineering teams" \
"How to track team capacity in real time" \
"Acme vs monday.com" \
"Reviews of acme.com"
do
curl -X POST https://api.citationbench.com/v1/research/ai-citation/queries \
-H "Authorization: Bearer $CITATIONBENCH_API_KEY" \
-H "X-Workspace-Id: $WORKSPACE_ID" \
-d "{
\"prompt\": \"$PROMPT\",
\"llms\": [\"chatgpt\", \"perplexity\", \"claude\", \"gemini\", \"google_aio\"],
\"samplesPerDay\": 3,
\"trackDomains\": [\"acme.com\", \"monday.com\", \"linear.app\", \"asana.com\"],
\"tags\": [\"category-query\", \"q2-2026\"]
}"
doneStep 3 — Watch the dashboard or wire alerts
Dashboard
https://app.citationbench.com/<ws_id>/geo renders the share-of-voice over time per query.
Webhook on drops
curl -X POST .../v1/webhooks -d '{
"url": "https://hooks.our-portal.com/citation-drops",
"events": ["ai_citation.share_of_voice.dropped"]
}'Payload:
{
"queryId": "aiq_***",
"prompt": "Best project management software for engineering teams",
"domain": "acme.com",
"previousRate": 0.42,
"currentRate": 0.28,
"deltaRate": -0.14,
"windowDays": 7,
"perLlm": {
"chatgpt": { "ourRate": 0.2, "delta": -0.2 },
"perplexity": { "ourRate": 0.8, "delta": 0.0 }
}
}Step 4 — Set up reclamation (optional, recommended)
When a citation drop happens, fire the citation_hunter skill to draft a refresh:
curl -X POST .../v1/agent/invoke -d '{
"skill": "citation_hunter",
"input": {
"queryIds": ["aiq_***"],
"reclamation": "recommend",
"schedule": "daily:08:00"
}
}'reclamation: "recommend" queues a draft refresh at WAITING_APPROVAL. "auto" lets it run unattended (only enable for content you trust the agent to update).
Step 5 — Cross-portfolio for agencies
Same prompts, every client workspace:
curl -X POST .../v1/workspaces/bulk-action -d '{
"action": "research.ai_citation.queries.create",
"workspaces": "all",
"config": {
"prompt": "{{ workspace.brand.primaryKeyword }}",
"samplesPerDay": 3
}
}'{{ workspace.brand.primaryKeyword }} resolves per workspace, so each client tracks their own primary query.
One-shot script
#!/usr/bin/env bash
set -euo pipefail
KEY="${CITATIONBENCH_API_KEY:?}"
WS="${WORKSPACE_ID:?}"
BASE="https://api.citationbench.com/v1"
PROMPTS=(
"Best project management software for engineering teams"
"How to track team capacity"
"Acme vs monday.com"
"Reviews of acme.com"
)
for P in "${PROMPTS[@]}"; do
curl -sf -X POST $BASE/research/ai-citation/queries \
-H "Authorization: Bearer $KEY" \
-H "X-Workspace-Id: $WS" \
-d "{
\"prompt\": \"$P\",
\"llms\": [\"chatgpt\",\"perplexity\",\"claude\",\"gemini\",\"google_aio\"],
\"samplesPerDay\": 3,
\"trackDomains\": [\"acme.com\",\"monday.com\",\"linear.app\",\"asana.com\"]
}"
done
# Wire reclamation
curl -sf -X POST $BASE/agent/invoke \
-H "Authorization: Bearer $KEY" \
-H "X-Workspace-Id: $WS" \
-d '{
"skill": "citation_hunter",
"input": { "reclamation": "recommend", "schedule": "daily:08:00" }
}'
echo "Daily citation tracking + reclamation drafting active."Gotchas
- LLM variance is real. A single sample can wildly mislead — always use 3+ samples per LLM per day.
- Citation ≠ mention. We distinguish cited domains (with URLs) from brand mentions (name-only). They have different remediation paths.
- AI Overviews differ by location. Google AIO results vary by region — set
locationper workspace. - Reclamation isn't instant. Even after you refresh content, LLM training data lags. Expect 2–8 weeks for reclamation to show up.
- Cost grows with prompts × samples. Start with 20 prompts × 3 samples × 5 LLMs = 300 samples/day = 150 credits/day. Scale up after you see signal.
Related
- API: Research · ai citation
- API: Agent · invoke
- API: Production · refine
- Concept: Agent
- Playbook: Refresh stale content on rank drops
Weekly rank checks
Set up one Monday-morning scheduled job that fans out rank checks across every workspace, alerts on meaningful drops, and optionally triggers a stale-content refresh on impacted pages.
SERP → outreach campaigns
From one seed keyword to a scoped outreach campaign of 10–25 personalized emails — SERP scraping, Apollo contact discovery, LLM drafts, bulk approval, and Instantly send in under 15 minutes.