# Providers (/docs/user-guide/providers)



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 [#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](https://get.brightdata.com/67h1b7h0shcn) |
| **Olostep**    | Powers most large-scale AI visibility trackers today. Good reliability at scale.   | \~$2.25                       | [olostep.com](https://olostep.com/?ref=elmo)                  |

<Callout>
  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. Actual cost depends on volume tier and provider promos. The sign-up links above are Elmo's affiliate links — they give us a small kickback and cost you nothing extra.
</Callout>

### BrightData [#brightdata]

```bash
BRIGHTDATA_API_TOKEN=...
```

Supported scrape targets out of the box:

```
chatgpt:brightdata:online
google-ai-mode:brightdata:online
perplexity:brightdata:online
copilot:brightdata:online
gemini:brightdata:online
grok:brightdata:online
```

You can also pass a custom dataset id as the version slug: `chatgpt:brightdata:gd_abc123`.

### Olostep [#olostep]

```bash
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
grok:olostep:online
```

Olostep models always use web search, so the `:online` suffix is required.

## Direct model APIs [#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-20250514
chatgpt:openai-api:gpt-5-mini:online
mistral:mistral-api:mistral-medium-latest:online
claude:openrouter:anthropic/claude-sonnet-4.6
```

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-optional]

`DATAFORSEO_LOGIN` + `DATAFORSEO_PASSWORD` enable Google AI Mode scraping via `google-ai-mode:dataforseo:online` as an alternative to BrightData/Olostep.

## Recommended setups [#recommended-setups]

**Starter (scrape the two that matter).** Pick one scraper and you're done:

```bash
BRIGHTDATA_API_TOKEN=...
SCRAPE_TARGETS=chatgpt:brightdata:online,google-ai-mode:brightdata:online
```

or

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

**Starter + Claude.** Add Anthropic direct for cheap Claude coverage:

```bash
BRIGHTDATA_API_TOKEN=...
ANTHROPIC_API_KEY=...
SCRAPE_TARGETS=chatgpt:brightdata:online,google-ai-mode:brightdata:online,claude:anthropic-api:claude-sonnet-4-20250514
```

**No scraper (APIs only).** Cheapest option, but you're tracking model APIs instead of the real consumer surfaces:

```bash
OPENAI_API_KEY=...
ANTHROPIC_API_KEY=...
SCRAPE_TARGETS=chatgpt:openai-api:gpt-5-mini:online,claude:anthropic-api:claude-sonnet-4-20250514
```

## SCRAPE\_TARGETS format [#scrape_targets-format]

```
model:provider[:version][:online]
```

* `model` — the AI surface being tracked (`chatgpt`, `claude`, `google-ai-mode`, `gemini`, `perplexity`, `copilot`, `grok`).
* `provider` — how to reach it (`brightdata`, `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.
