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

Beai 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. They're ranked the way we'd pick one today. Beai runs all six continuously and publishes every result on the [status page](https://www.elmohq.com/status), so the reliability and speed claims below are measured rather than borrowed from marketing copy — go check them yourself before you trust them.

| Provider | Why | Rough cost per prompt/month | Floor |
|---|---|---|---|
| [**Cloro**](https://cloro.dev?fpr=elmo&fp_sid=docs) | The most reliable of the ones we've measured over time, and it covers every surface Beai scrapes. Good docs, ergonomic API, slightly pricier than BrightData. Also behind Ahrefs, Scrunch, and Evertune — and it's the primary data provider for Beai Cloud, so it's the one we pay for ourselves. | ~$0.65 | $30/mo plan (≈22 prompts) |
| [**BrightData**](https://get.brightdata.com/elmo?sid=docs) | The most common scraping option, pay-as-you-go and a little cheaper — but measurably slower than Cloro, and weak on Google AI Overview. | ~$0.45 | Pay-as-you-go, $10 minimum |
| [**Oxylabs**](https://oxylabs.go2cloud.org/aff_c?offer_id=7&aff_id=2263&url_id=32) | Cheapest per run, but it can't reach Gemini or Copilot and it's the least reliable of the ones we've measured over time. | ~$0.15 | $49/mo plan (≈325 prompts) |
| [**SearchApi**](https://www.searchapi.io/?via=elmo) | Simple synchronous scraping API with good documentation and flat pricing per search regardless of the engine. | ~$1.20 | $40/mo plan (≈33 prompts) |
| [**Olostep**](https://olostep.com/?ref=elmo) | Premium 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.25 | Pay-as-you-go |
| [**DataForSEO**](https://try.dataforseo.com/elmo) | Solid pay-as-you-go all-rounder with good reliability, the fastest of the ones we've measured over time, and the only one here that also fronts direct model APIs. | ~$1.20 | $50 minimum top-up |

Which surfaces each one reaches:

| Surface | Cloro | BrightData | Oxylabs | SearchApi | Olostep | DataForSEO |
|---|:---:|:---:|:---:|:---:|:---:|:---:|
| ChatGPT | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Google AI Mode | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Google AI Overview | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Gemini | ✅ | ✅ | – | ✅ | ✅ | ✅ |
| Perplexity | ✅ | ✅ | ✅ | ✅ | ✅ | API-only |
| Copilot | ✅ | ✅ | – | ✅ | ✅ | – |

### Query fan-out [#query-fan-out]

The Query Fan-Out page shows the web searches an engine ran while answering a prompt, but only some provider and surface combinations return them. These tables come from the same data as the Query Availability card in the app, checked against the scheduled provider tests behind the [status page](https://www.elmohq.com/status).

{/* fanout-support:start — generated by `pnpm --filter @workspace/config docs:fanout` */}

| Surface | Cloro | BrightData | Oxylabs | SearchApi | Olostep | DataForSEO |
| --- | :---: | :---: | :---: | :---: | :---: | :---: |
| ChatGPT | ✅ | Stopped Sep 27, 2026 | Stopped Sep 29, 2026 | ✅ | ✅ | ✅ |
| Google AI Mode | – | – | – | – | – | – |
| Google AI Overview | – | – | – | – | – | – |
| Gemini | – | – | Not offered | – | – | – (✅ with a pinned model) |
| Perplexity | ✅ | Unknown | Stopped Aug 4, 2026 | Unknown | ✅ | – |
| Copilot | ✅ | – | Not offered | – | – | Not offered |

| API | Query fan-out |
| --- | :---: |
| OpenAI API | ✅ |
| Anthropic API | ✅ |
| Mistral API | ✅ |
| OpenRouter | – |

{/* fanout-support:end */}

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

<Callout title="How we make money on this page">
Every scraping-provider link on this page is an Beai 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](https://www.elmohq.com/status).

If you would like to support the project directly, please [sponsor Beai on GitHub](https://github.com/sponsors/elmohq).
</Callout>

### Cloro [#cloro]

```bash
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](https://cloro.dev?fpr=elmo&fp_sid=docs) authenticates with a single bearer API key. Beai submits each request through Cloro's [asynchronous task API](https://cloro.dev/docs/) 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](https://cloro.dev/pricing/), 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 Beai uses carries no surcharge — the synchronous endpoints add 2 credits per request — and failed requests aren't charged.

### BrightData [#brightdata]

```bash
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](https://get.brightdata.com/elmo?sid=docs)'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]

```bash
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](https://oxylabs.go2cloud.org/aff_c?offer_id=7&aff_id=2263&url_id=32) uses HTTP Basic auth (Web Scraper API username + password). Beai 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.

### SearchApi [#searchapi]

```bash
SEARCHAPI_API_KEY=...
```

Supported scrape targets:

```
chatgpt:searchapi:online
chatgpt:searchapi
perplexity:searchapi:online
copilot:searchapi:online
gemini:searchapi:online
google-ai-mode:searchapi:online
google-ai-overview:searchapi:online
```

[SearchApi](https://www.searchapi.io/?via=elmo) authenticates with a single bearer API key and serves every surface from one synchronous `GET /api/v1/search`, keyed by an `engine` parameter — one request per run, with no task queue to poll. ChatGPT is the only surface with a web-search toggle, so it is the one target you can run without `:online`; even then ChatGPT often searches on its own, and SearchApi reports whether it did.

Google AI Overview goes through the Google SERP engine rather than SearchApi's dedicated `google_ai_overview` engine. That engine takes only a `page_token`, and the token comes from a SERP call — so it is always a second request on top of the first, never a route you can take on its own. The SERP response usually carries the overview inline, and reading it there costs one search instead of two.

When it doesn't, Google has loaded the overview separately from the result page, and the SERP returns `ai_overview.page_token` instead. Beai redeems that token against `google_ai_overview` right away, since it expires within a minute, so those runs cost two searches. A run whose token still comes back without an overview fails rather than storing an empty answer, which would otherwise read as a run where nobody mentioned your brand.

Pricing is flat per successful search regardless of surface — $4 per 1,000 on the $40/mo Developer plan, falling to $1 per 1,000 at the top of the [plan ladder](https://www.searchapi.io/pricing). Requests that don't return a 200 aren't billed, and sign-up comes with 100 free searches. Note that plans cap you at 20% of your monthly credits per hour.

### 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
```

[Olostep](https://olostep.com/?ref=elmo) models always use web search, so the `:online` suffix is required.

### DataForSEO [#dataforseo]

[DataForSEO](https://try.dataforseo.com/elmo) is pay-as-you-go with no subscription. `DATAFORSEO_LOGIN` + `DATAFORSEO_PASSWORD` enable several surfaces:

```bash
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.**

| Target | Route |
|---|---|
| `chatgpt`, `gemini` | [AI Optimization "LLM Scraper"](https://docs.dataforseo.com/v3/ai_optimization-chat_gpt-llm_scraper-live-advanced/) — drives chatgpt.com and gemini.google.com |
| `google-ai-mode` | SERP Google AI Mode endpoint |
| `google-ai-overview` | Google Organic SERP endpoint with `load_async_ai_overview` on |
| `perplexity` | [AI Optimization "LLM Responses"](https://docs.dataforseo.com/v3/ai_optimization-llm_responses-overview/) — 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 [#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:

```bash
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 [#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-6-luna` 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 |
| **DataForSEO** (`DATAFORSEO_LOGIN` + `DATAFORSEO_PASSWORD`) | ChatGPT, Gemini, or Perplexity through its LLM Responses API — see [Pinning a model](#pinning-a-model) | 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-haiku-5-5
chatgpt:openai-api:gpt-6-luna:online
mistral:mistral-api:mistral-medium-latest:online
claude:openrouter:anthropic/claude-haiku-5.5
grok:openrouter:x-ai/grok-4.5:online
kimi:openrouter:moonshotai/kimi-k2.5
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](#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).

## Recommended setups [#recommended-setups]

**Starter (scrape the two that matter).** Pick one scraper, add one direct API key for onboarding analysis and a [TypeSafe key](/docs/developer-guide/configuration#mention-judging) for mention and sentiment judging, and you're done. With an `OPENROUTER_API_KEY`, you can leave out `TYPESAFE_API_KEY`: Beai then calls Jev through OpenRouter.

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

Set `CLORO_COUNTRY=SG` for Singapore or another supported ISO country code. If unset, Cloro collection defaults to `US`.

or

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

or

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

## SCRAPE_TARGETS format [#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`, `searchapi`, `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.
