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. They're ranked the way we'd pick one today. Elmo runs all five continuously and publishes every result on the status page, so the reliability and speed claims below are measured rather than borrowed from marketing copy — go check them yourself before you trust them.

ProviderWhyRough cost per prompt/monthFloor
CloroThe most reliable of the five, and it covers every surface Elmo scrapes. Good docs, ergonomic API, slightly pricier than BrightData. Also behind Ahrefs, Scrunch, and Evertune — and it's the primary data provider for Elmo Cloud, so it's the one we pay for ourselves.~$0.65$30/mo plan (≈22 prompts)
BrightDataThe most common scraping option, pay-as-you-go and a little cheaper — but measurably slower than Cloro, and weak on Google AI Overview.~$0.45Pay-as-you-go, $10 minimum
OxylabsCheapest per run, but it can't reach Gemini or Copilot and it's the least reliable of the five.~$0.15$49/mo plan (≈325 prompts)
OlostepPremium option used by Profound, Athena, and AirOps. Very strong at high-volume scraping with an ergonomic API, but reliability is inconsistent and it's the slowest by a wide margin.~$2.25Pay-as-you-go
DataForSEOSolid pay-as-you-go all-rounder with good reliability, the fastest of the five, and the only one here that also fronts direct model APIs.~$1.20$50 minimum top-up

Which surfaces each one reaches:

SurfaceCloroBrightDataOxylabsOlostepDataForSEO
ChatGPT
Google AI Mode
Google AI Overview
Gemini
PerplexityAPI-only
Copilot

Cost estimates assume Elmo's default cadence of about 5 runs/day per target across 2 surfaces (ChatGPT + Google AI Mode), so roughly 300 evaluations/mo per prompt.

How we make money on this page

Every scraping-provider link on this page is an Elmo affiliate link. If you sign up through one, we get a small kickback at no extra cost to you. This is one of the ways we fund work on the project. Our rankings are based on repeated testing we publish on the provider status page.

If you would like to support the project directly, please sponsor Elmo on GitHub.

Cloro

CLORO_API_KEY=...

Supported scrape targets:

chatgpt:cloro:online
perplexity:cloro:online
copilot:cloro:online
gemini:cloro:online
google-ai-mode:cloro:online
google-ai-overview:cloro:online

Cloro authenticates with a single bearer API key. Elmo submits each request through Cloro's asynchronous task API and polls until the task completes, which also lets Cloro meter concurrency for us instead of holding a synchronous connection open. Every Cloro surface is the live web-search UI, so the :online suffix is required.

Cloro bills credits from a monthly plan, not per request, and each surface costs a different number: Perplexity 3, Gemini and Google AI Mode 4, Copilot and Google AI Overview 5, ChatGPT 7. The asynchronous API Elmo uses carries no surcharge — the synchronous endpoints add 2 credits per request — and failed requests aren't charged.

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.

DataForSEO

DataForSEO is pay-as-you-go with no subscription. DATAFORSEO_LOGIN + DATAFORSEO_PASSWORD enable several surfaces:

chatgpt:dataforseo:online
gemini:dataforseo:online
google-ai-mode:dataforseo:online
google-ai-overview:dataforseo:online
perplexity:dataforseo:online

One account reaches three different DataForSEO products, and the target picks between them for you: DataForSEO always scrapes the live surface where it can.

TargetRoute
chatgpt, geminiAI Optimization "LLM Scraper" — drives chatgpt.com and gemini.google.com
google-ai-modeSERP Google AI Mode endpoint
google-ai-overviewGoogle Organic SERP endpoint with load_async_ai_overview on
perplexityAI Optimization "LLM Responses" — no Perplexity scraper exists

The scraped ChatGPT and Gemini runs return what a real user sees, including product cards and tables, and ChatGPT reports its query fan-out. They take roughly a minute, since a live session has to finish.

Pinning a model

Adding a version slug switches ChatGPT or Gemini to the LLM Responses API, which calls the vendor's model API instead of the consumer product:

chatgpt:dataforseo:gpt-5.5:online          # LLM Responses, pinned to gpt-5.5
gemini:dataforseo:gemini-2.5-flash:online

That route is much faster and cheaper but doesn't reflect the real ChatGPT or Gemini experience — reach for it when you specifically want to track a named model, or to run both side by side as separate targets. It's the only route that can honor a model_name, so the scraped and SERP surfaces reject a version slug rather than silently ignoring it.

All DataForSEO targets 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.

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
DataForSEO (DATAFORSEO_LOGIN + DATAFORSEO_PASSWORD)ChatGPT, Gemini, or Perplexity through its LLM Responses API — see Pinning a modelpass-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-5
chatgpt:openai-api:gpt-5-mini:online
mistral:mistral-api:mistral-medium-latest:online
claude:openrouter:anthropic/claude-sonnet-5
grok:openrouter:x-ai/grok-4.5:online
kimi:openrouter:moonshotai/kimi-k3
perplexity:openrouter:perplexity/sonar:online

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 straddles both halves of this page. Left alone it scrapes, but pinning a model_name switches ChatGPT or Gemini to a model API instead, and Perplexity always goes that way because no Perplexity scraper exists. See DataForSEO above.

On OpenRouter, :online runs the underlying model's own web search where one exists (Anthropic, Google, OpenAI, Perplexity, xAI) and falls back to OpenRouter's Exa search elsewhere. perplexity/sonar is the cheapest way to track Perplexity: $1/M tokens each way plus $0.005 per request. perplexity/sonar-pro-search is closer to the agentic stack perplexity.ai itself serves, at roughly seven times the cost ($3/$15 per M tokens plus $0.018 per request).

Starter (scrape the two that matter). Pick one scraper, add one direct API key for onboarding analysis and sentiment scoring, and you're done:

CLORO_API_KEY=...
OPENROUTER_API_KEY=...
# or ANTHROPIC_API_KEY=... or OPENAI_API_KEY=...
SCRAPE_TARGETS=chatgpt:cloro:online,google-ai-mode:cloro:online

or

BRIGHTDATA_API_TOKEN=...
OPENROUTER_API_KEY=...
# or ANTHROPIC_API_KEY=... or OPENAI_API_KEY=...
SCRAPE_TARGETS=chatgpt:brightdata:online,google-ai-mode:brightdata:online

or

DATAFORSEO_LOGIN=...
DATAFORSEO_PASSWORD=...
OPENROUTER_API_KEY=...
# or ANTHROPIC_API_KEY=... or OPENAI_API_KEY=...
SCRAPE_TARGETS=chatgpt:dataforseo:online,google-ai-mode:dataforseo:online

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 (cloro, brightdata, oxylabs, olostep, dataforseo, openai-api, anthropic-api, mistral-api, openrouter).
  • version — required for openai-api, anthropic-api, mistral-api, openrouter. Optional for scrapers (pass a BrightData dataset id here, or a DataForSEO model_name to switch that target to the LLM Responses API).
  • :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?