# How do I use one API for multiple LLMs?

> Connect an OpenAI- or Anthropic-compatible client to an AI gateway, authenticate with a gateway key, and set the model to a canonical ID from its live catalog. Keep the endpoint family and model ID configurable, because specialized modalities and model-specific features may require different routes.

_Last reviewed 2026-08-15 · [Editorial review](https://keeprouter.com/editorial-policy#editorial-team)_

## 1. Pick the client contract

Use OpenAI Chat Completions or Responses when your application is built around OpenAI-shaped objects. Use Anthropic Messages for an Anthropic SDK or Claude Code workflow. Do not translate between them inside every feature; centralize the chosen client shape at your platform boundary.

## 2. Prove authentication

Create a key restricted to the current free model, change the base URL, and send a bounded non-streaming request. Inspect the request record before adding paid credit. This separates connection problems from model-selection problems.

## 3. Build an approved model map

Read the [live catalog](/models), choose IDs that support the required endpoint, and record the capability tests each passed. Keep those IDs in configuration. A public catalog is not automatically your product's approved catalog.

## 4. Run the same workload

Use a fixed prompt, context, tool set, output cap, and pass criteria. Compare completion, input and output tokens, charge, latency, and product quality. Changing only the model ID makes the integration comparable; it does not make the outputs equivalent.

## 5. Put boundaries on production

Issue separate keys per environment or service, set model allowlists and spend limits, handle retryable errors deliberately, and retain a tested rollback. For images, embeddings, audio, or other specialized modalities, use the endpoint listed on the model page instead of forcing everything through chat.

## Minimal shape

```python
model = os.environ["APPROVED_MODEL_ID"]
client = OpenAI(base_url="https://keeprouter.com/v1", api_key=os.environ["KEEPROUTER_KEY"])
response = client.chat.completions.create(model=model, messages=messages, max_tokens=800)
```

## Frequently asked questions

### Can I switch models by changing one field?

Often yes when both models support the same route, but you must still test behavior and capabilities.

### Should every model share one key?

A gateway key can access multiple approved IDs, but production keys should use a narrow allowlist.

### Can chat routes serve images and audio?

Specialized generation or audio operations normally use their own documented endpoints.

### Where should model IDs live?

Keep them in reviewed deployment configuration so promotion and rollback do not require code changes.

## Sources reviewed

1. [OpenAI API reference](https://platform.openai.com/docs/api-reference)
2. [Anthropic Messages API](https://docs.anthropic.com/en/api/messages)
3. [KeepRouter OpenAPI](https://keeprouter.com/api/openapi.json)

## Related guides

- [Unified LLM API](https://keeprouter.com/features/unified-llm-api.md)
- [AI prototyping](https://keeprouter.com/built-for/ai-prototyping.md)
- [quickstart](https://keeprouter.com/docs/quickstart.md)
- [How to evaluate an AI gateway with a proof-based scorecard](https://keeprouter.com/blog/evaluate-ai-gateway.md)

## Verify it with the live product

Check the live model catalog, create a free-scoped key, and inspect the resulting request evidence.

[Create a free key](https://keeprouter.com/login?returnTo=%2Fconsole%2Fkeys%3Fmodel%3Dfree) · [Live models and pricing](https://keeprouter.com/models.md)
