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



Recall 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.72                       | [get.brightdata.com](https://get.brightdata.com/67h1b7h0shcn)                       |
| **Oxylabs**    | Asynchronous Push-Pull API. Good for ChatGPT, Perplexity, Google AI Mode.          | \~$0.96                       | [oxylabs.io](https://oxylabs.go2cloud.org/aff_c?offer_id=7\&aff_id=2263\&url_id=32) |
| **Olostep**    | Powers most large-scale AI visibility trackers today. Good reliability at scale.   | \~$1.92                       | [olostep.com](https://olostep.com/?ref=recall)                                      |

<Callout>
  Monthly estimates assume Recall's default cadence — `RUNS_PER_PROMPT` (8) probes per prompt per target on a 24-hour cycle, so **240 probes per surface per month** — across 2 surfaces (ChatGPT + Google AI Mode). At BrightData's ~~$0.0015 per record that is ≈ **$0.72/mo per prompt**; Oxylabs (~~$0.002) and Olostep ($0.003–0.005, the higher rate on ChatGPT) scale from the same count, putting Olostep at roughly 2.7× BrightData rather than the flat multiple it is often quoted at. Per-probe rates live in `packages/lib/src/provider-costs.ts`, which is also what the spend caps are enforced against.

  Treat all of these as floors. Grounded surfaces bill per search query the model chooses to issue rather than per prompt, which can be several times the headline rate, so budget with headroom and reconcile against your first invoice. Actual cost also depends on volume tier and provider promos. The BrightData, Oxylabs, and Olostep sign-up links above are Recall'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
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]

```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 uses HTTP Basic auth (Web Scraper API username + password). Recall 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]

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

`DATAFORSEO_LOGIN` + `DATAFORSEO_PASSWORD` enable several surfaces as an alternative to BrightData/Olostep:

```bash
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"](https://docs.dataforseo.com/v3/ai_optimization-llm_responses-overview/) 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 [#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-6
```

**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-6
```

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