Providers
Choose how Elmo tracks each AI answer engine — scrapers, direct APIs, or both.
Elmo tracks which AI answer engines mention your brand. Most AI search traffic comes from ChatGPT and Google AI Mode, and neither exposes a public API. You can approximate their responses by calling the underlying model APIs (OpenAI, Anthropic, Mistral, OpenRouter) with web search enabled, but that's not the real consumer UI — scraping the actual surface is usually closer to what your customers see.
Recommended scrapers
These cover the ChatGPT + Google AI Mode experiences that drive the bulk of AI referral traffic.
| Provider | Why | Rough cost per prompt/month* | Sign up |
|---|---|---|---|
| BrightData | Cheapest solid option. Battle-tested dataset collectors for each major AI surface. | ~$0.45 | get.brightdata.com |
| Oxylabs | Asynchronous Push-Pull API. Good for ChatGPT, Perplexity, Google AI Mode. | pay-as-you-go | oxylabs.io |
| Olostep | Powers most large-scale AI visibility trackers today. Good reliability at scale. | ~$2.25 | olostep.com |
Monthly estimates assume Elmo's default cadence of ~5 runs/day per target across 2 surfaces (ChatGPT + Google AI Mode). BrightData's list price is ~$0.0015 per evaluation (5/day × 30 days × 2 surfaces ≈ 300 evals/mo × $0.0015 ≈ $0.45/mo per prompt); Olostep runs roughly 5× that; Oxylabs Web Scraper API pricing depends on the plan. Actual cost depends on volume tier and provider promos. The BrightData, Oxylabs, and Olostep sign-up links above are Elmo's affiliate links — they give us a small kickback and cost you nothing extra.
BrightData
BRIGHTDATA_API_TOKEN=...Supported scrape targets out of the box:
chatgpt:brightdata:online
google-ai-mode:brightdata:online
google-ai-overview:brightdata:online
perplexity:brightdata:online
copilot:brightdata:online
gemini:brightdata:onlineYou can also pass a custom dataset id as the version slug: chatgpt:brightdata:gd_abc123.
google-ai-overview is the one exception: it's the AI summary block on a normal Google results page, so it's fetched through BrightData's SERP API rather than a dataset collector — no dataset id needed. It runs through a serp zone (default sdk_serp, the zone the BrightData SDK auto-provisions; override with BRIGHTDATA_SERP_ZONE) billed to the same BRIGHTDATA_API_TOKEN.
Oxylabs
OXYLABS_USERNAME=...
OXYLABS_PASSWORD=...Supported scrape targets:
chatgpt:oxylabs:online
chatgpt:oxylabs
perplexity:oxylabs:online
google-ai-mode:oxylabs:online
google-ai-overview:oxylabs:onlineOxylabs uses HTTP Basic auth (Web Scraper API username + password). Elmo submits each request through the asynchronous Push-Pull API and polls until the result is ready, avoiding the Realtime API's connection timeout. :online toggles in-product web search for ChatGPT; Perplexity, Google AI Mode, and Google AI Overview always search.
Olostep
OLOSTEP_API_KEY=...Supported scrape targets:
chatgpt:olostep:online
google-ai-mode:olostep:online
google-ai-overview:olostep:online
gemini:olostep:online
copilot:olostep:online
perplexity:olostep:onlineOlostep models always use web search, so the :online suffix is required.
Direct model APIs
These hit the provider API directly — cheaper per token than scrapers, but they don't represent the actual ChatGPT / Google AI Mode experience. Use them alongside a scraper when you want extra Claude or OSS model coverage.
| Provider | Tracks | Cost per prompt/month* |
|---|---|---|
Anthropic API (ANTHROPIC_API_KEY) | Claude Sonnet / Opus / Haiku | ~$4–5 per tracked model |
OpenAI API (OPENAI_API_KEY) | gpt-5-mini with web search (ChatGPT-like, but not the real UI) | ~$2–3 per tracked model |
Mistral API (MISTRAL_API_KEY) | Mistral Small / Medium / Large, optional web search via the beta Conversations API | pass-through |
OpenRouter (OPENROUTER_API_KEY) | Any OpenRouter-hosted model (Claude, Llama, Mistral, etc.) | pass-through |
*Direct-API estimates also assume ~5 runs/day × 30 days = 150 calls/mo per tracked model, with typical prompt/response lengths. Prompt length drives real cost.
Example scrape targets:
claude:anthropic-api:claude-sonnet-4-6
chatgpt:openai-api:gpt-5-mini:online
mistral:mistral-api:mistral-medium-latest:online
claude:openrouter:anthropic/claude-sonnet-4.6
grok:openrouter:x-ai/grok-4.5:online
kimi:openrouter:moonshotai/kimi-k3OpenAI/Anthropic/Mistral/OpenRouter entries all require a version slug as the third segment. For Mistral, append :online to route through the beta Conversations API with the web_search tool; without it the request goes to the standard chat completions endpoint and no citations are returned.
DataForSEO (optional)
DATAFORSEO_LOGIN + DATAFORSEO_PASSWORD enable several surfaces as an alternative to BrightData/Olostep:
google-ai-mode:dataforseo:online
google-ai-overview:dataforseo:online
chatgpt:dataforseo:online
perplexity:dataforseo:online
gemini:dataforseo:onlinegoogle-ai-modeuses DataForSEO's SERP Google AI Mode endpoint (unchanged).google-ai-overviewuses DataForSEO's Google Organic SERP endpoint withload_async_ai_overviewon, returning the AI Overview block and its cited sources.chatgpt,perplexity, andgeminiuse DataForSEO's AI Optimization "LLM Responses" API with web search enabled, returning the answer text and cited source URLs.
Each LLM surface defaults to a sensible model (gpt-5.5, sonar, gemini-2.5-flash). Override the underlying DataForSEO model_name via the version slug, e.g. chatgpt:dataforseo:gpt-5-mini:online. All require :online.
DataForSEO prompt text is limited to 500 characters. Country localization is intentionally not exposed in SCRAPE_TARGETS yet because support differs by DataForSEO surface and underlying model.
Recommended setups
Starter (scrape the two that matter). Pick one scraper and you're done:
BRIGHTDATA_API_TOKEN=...
SCRAPE_TARGETS=chatgpt:brightdata:online,google-ai-mode:brightdata:onlineor
OLOSTEP_API_KEY=...
SCRAPE_TARGETS=chatgpt:olostep:online,google-ai-mode:olostep:onlineStarter + Claude. Add Anthropic direct for cheap Claude coverage:
BRIGHTDATA_API_TOKEN=...
ANTHROPIC_API_KEY=...
SCRAPE_TARGETS=chatgpt:brightdata:online,google-ai-mode:brightdata:online,claude:anthropic-api:claude-sonnet-4-6No scraper (APIs only). Cheapest option, but you're tracking model APIs instead of the real consumer surfaces:
OPENAI_API_KEY=...
ANTHROPIC_API_KEY=...
SCRAPE_TARGETS=chatgpt:openai-api:gpt-5-mini:online,claude:anthropic-api:claude-sonnet-4-6SCRAPE_TARGETS format
model:provider[:version][:online]model— the AI surface being tracked (chatgpt,claude,google-ai-mode,google-ai-overview,gemini,perplexity,copilot,grok,kimi).provider— how to reach it (brightdata,oxylabs,olostep,openai-api,anthropic-api,mistral-api,openrouter,dataforseo).version— required foropenai-api,anthropic-api,mistral-api,openrouter. Optional for scrapers (pass a BrightData dataset id here).:online— append to enable web search. Required for most scraped models since the live UIs always search.
Entries are comma-separated.
Was this page helpful?