# Choose search providers for your workflow

> Choose Google-only search, automatic fallback, a provider list or consensus. Keep rank measurements consistent and inspect provider provenance when gathering research.

Choose a provider policy before you build retries, caching or comparisons around search results. Google is the default; other enabled providers can answer supported verticals when you opt in. The full [provider reference](https://serpkite.com/docs/providers) lists coverage and the meaning of each response field.

| Workflow | Policy | Why |
| --- | --- | --- |
| Google rank tracking or SERP audits | `engine: "google"` | Results and positions stay tied to Google's index |
| Agent research where fallback is acceptable | `engine: "auto"` | Another enabled engine can answer if Google fails |
| Restrict research to selected engines | `engine: ["google", "brave"]` | Only the selected providers can answer, in the service's route order |
| Research across independent indexes | `engine: "consensus"` | Merge results with per-result source labels |

An explicit policy overrides the key's **Allow fallback to other search engines** setting. Set `engine: "google"` explicitly in applications whose output must remain Google-specific.

## Use fallback and keep the provider label

```python
from serpkite import SerpKite

sk = SerpKite()
response = sk.search(
    "asyncio task group cancellation",
    engine="auto",
    country="us",
    include_domains=["docs.python.org"],
)
print("Answered by:", response.meta.engine)
for result in response.results:
    print(result.title, result.link)
```

Keep `meta.engine` with your stored search results. A Brave result has Brave's ranking and snippets, and may lack Google-specific extras. `meta.route` describes provider attempts on fresh requests; cache hits omit it. A failed attempt along the fallback route costs nothing; the response is settled for the provider that answered.

Use JSON when your application needs provider provenance. Markdown responses are text and do not contain a JSON `meta` object. If you project with `fields`, retain the metadata you inspect:

```ts
import { SerpKite } from "serpkite";

const sk = new SerpKite();
const response = await sk.search({
  q: "asyncio task group cancellation",
  engine: ["google", "brave"],
  fields: "results.title,results.link,meta.engine,meta.credits_used",
});
console.log(response);
```

Provider availability depends on the endpoint and deployment. A provider that serves web search may not serve news or images. An unavailable or unsupported explicit policy returns `400 invalid_request`; repeating it will not enable that provider. Check the [coverage table](https://serpkite.com/docs/providers#which-providers-serve-which-verticals).

## Merge independent indexes with consensus

```bash
curl https://api.serpkite.com/v1/search \
  -H "Authorization: Bearer $SERPKITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"asyncio task group cancellation","engine":"consensus","num":10}'
```

Consensus is available on web search only. It queries up to three independent indexes, deduplicates URLs and ranks by agreement. Each result's `sources` lists the providers that returned it; `meta.engine` is `consensus`. The merged position is a consensus rank, so it does not measure a Google ranking.

Budget for each provider that returns nonempty results: three successful single-page sources can cost 3 credits. Failed, blocked or empty providers are free. Cache hits cost half, and consensus results use a separate cache from single-provider requests.

`include_domains`, `exclude_domains` and `boost_domains` cannot be combined with consensus. For restricted-source research, use a single provider or `auto` with domain filters instead. An unsupported combination returns `400`.

## Apply the policy consistently

- **Rank tracking:** use Google explicitly for `/v1/rank` and any batch searches you compare over time. Keep country, language, location and device fixed too.
- **Batches:** put `engine` inside each request in the `requests` array, alongside its query. Preserve the returned provider with each job result.
- **Monitors:** search and news monitors can save `engine`; webpage monitors cannot. Changing a saved monitor search resets its baseline.
- **Caching:** set `max_age` only when older results suit the workflow. Google-only requests do not receive cached fallback or consensus results.
- **MCP:** tool schemas determine which options a client can pass. A dedicated key's fallback setting can opt search tools into `auto` when they omit `engine`.

## Related

- [Search providers](https://serpkite.com/docs/providers): coverage, route outcomes and consensus billing.
- [Rank tracking](https://serpkite.com/docs/guides/rank-tracking): Google position measurements at scale.
- [RAG pipeline](https://serpkite.com/docs/guides/rag-pipeline): fetch query-relevant passages for answers.
- [Scheduled monitoring](https://serpkite.com/docs/guides/scheduled-monitoring): persist a query and its policy.