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.

These cover the ChatGPT + Google AI Mode experiences that drive the bulk of AI referral traffic.

ProviderWhyRough cost per prompt/month*Sign up
BrightDataCheapest solid option. Battle-tested dataset collectors for each major AI surface.~$0.45get.brightdata.com
OxylabsAsynchronous Push-Pull API. Good for ChatGPT, Perplexity, Google AI Mode.pay-as-you-gooxylabs.io
OlostepPowers most large-scale AI visibility trackers today. Good reliability at scale.~$2.25olostep.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:online

You 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:online

Oxylabs 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:online

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

ProviderTracksCost 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 APIpass-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-k3

OpenAI/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:online
  • google-ai-mode uses DataForSEO's SERP Google AI Mode endpoint (unchanged).
  • google-ai-overview uses DataForSEO's Google Organic SERP endpoint with load_async_ai_overview on, returning the AI Overview block and its cited sources.
  • chatgpt, perplexity, and gemini use 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.

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:online

or

OLOSTEP_API_KEY=...
SCRAPE_TARGETS=chatgpt:olostep:online,google-ai-mode:olostep:online

Starter + 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-6

No 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-6

SCRAPE_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 for openai-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?