
# Chat apps

Any chat client that lets you set a **base URL** and an **API key**
can use LowRouter as a custom OpenAI-compatible provider. This page
gives the pattern once, then walks through two popular desktop
clients — [Chatbox](https://chatboxai.app/) and
[Jan](https://www.jan.ai/) — end to end. Coding tools have their own
pages ([OpenCode](opencode), [Cline](cline), [Goose](goose));
libraries, SDKs, and other non-chat tools are on
[generic OpenAI-compatible clients](openai-compatible).

## The pattern

| Setting | Value |
|---------|-------|
| Provider type | OpenAI Compatible (sometimes "Custom OpenAI" or "OpenAI API") |
| Base URL | `https://api.lowrouter.ai/v1` |
| API Key | your `sk-lr-...` token |
| Path / endpoint | `/chat/completions` (most clients handle this automatically) |

Chat clients build their model picker from `GET /v1/models` on the
base URL. LowRouter's listing draws on the same catalogue as the
[model browser](/models), so once the provider is saved the picker
fills itself with everything currently routable — no model IDs to
type.

## Worked example: Chatbox

1. Open **Settings → Model Provider**.
2. Click **Add custom provider**.
3. Fill in:
   - **Name**: `LowRouter`
   - **API Mode**: `OpenAI API Compatible`
   - **API Host**: `https://api.lowrouter.ai/v1`
   - **API Path**: `/chat/completions`
   - **API Key**: your `sk-lr-...` token
4. Save.

Under **Model**, pick from the fetched list, or choose **Custom model
name** and enter any LowRouter model ID —
`auto/mistralai/mistral-large-2512`, `openai/openai/gpt-4.1`,
`anthropic/anthropic/claude-sonnet-4.5`, etc.

## Worked example: Jan

1. Open **Settings → Model Providers** and click **Add Provider**.
2. Choose the **OpenAI-compatible** API format.
3. Fill in:
   - **Provider name**: `LowRouter`
   - **Base URL**: `https://api.lowrouter.ai/v1` — the `/v1` must be
     included, or every request 404s.
   - **API key**: your `sk-lr-...` token
4. Save. Jan fetches the model list from the base URL and populates
   the provider's **Models** section.

Two Jan quirks:

- **No free-form model input.** The chat picker only offers what is
  in the provider's Models list — there is nowhere to type an
  arbitrary ID mid-chat. If an ID you want is missing from the
  fetched list, add it with the **+** button in the provider's
  Models section, entering the ID exactly as LowRouter expects it.
- **Capabilities are not auto-detected** for custom providers. If
  you use vision or tools, enable those per model in the provider's
  Models section.

## Picking a model

The picker mirrors `GET /v1/models` and holds three kinds of ID:

- **Explicit IDs** — `<provider>/<creator>/<model>`, e.g.
  `anthropic/anthropic/claude-sonnet-4.5`. You choose who serves the
  request; the region is picked for you. See
  [available models](../models/available).
- **`auto/<creator>/<model>`** — you name the model, the router
  picks the provider and region, preferring EU-sovereign routes. The
  right default for chat. See [routing](../models/routing).
- **`alias/<name>`** — your account's
  [aliases](../models/aliases), listed for the account behind the
  API key. An alias is a named pointer to one exact
  (provider, model, region) route that you can repoint from the
  dashboard at any time — the client keeps its configuration.

### Targeting a region from a chat app

Picker entries are not region-pinned, and chat apps have no field
for a fourth `/<locode>` segment. To pin a region:

1. In the dashboard, create an alias pointing at a region-pinned
   route — from **Dashboard → Aliases**, or the **Alias** button on
   any provider/region row in the [model browser](/models). Say
   `eu-chat` → `scaleway/mistralai/mistral-medium-3.5-128b/fr-par`.
2. In the chat app's picker, select `alias/eu-chat`.

Every message now routes through that region. Change your mind
later — repoint the alias in the dashboard and the very next message
follows, with zero client reconfiguration. If `alias/eu-chat` is not
in the client's fetched list, don't wait for it to appear: add it in
Jan with the **+** button in the provider's Models section, or enter
it in Chatbox as a custom model name. Aliases resolve at request
time whether or not the listing showed them.

## Recommended setup

These apply to any chat app, not just the two above:

- **Use a key dedicated to the app.** A chat app's key sits in a
  desktop config file, so treat it as leakable: give it its own name
  so its usage stays attributable, and revoke it on any doubt without
  touching the keys your other tools use. See
  [API keys](../guides/api-keys).
- **Stream replies on.** The desktop UX expects streaming and
  LowRouter supports it the same way OpenAI does.
- **Check the client's telemetry settings** if you care about not
  exposing prompt content to the publisher's analytics. The clients
  themselves do not see prompts in normal operation, but features
  like crash reporting can capture context.

## Troubleshooting

- **401 / Unauthorized**: confirm the API key starts with `sk-lr-`
  and has not been revoked. Test with `curl` from
  [the curl page](curl) using the same key.
- **404 / Not Found**: the base URL must end in `/v1` and the path
  must be `/chat/completions`. Some Chatbox versions default the
  API Path to `/v1/chat/completions`, which becomes
  `https://api.lowrouter.ai/v1/v1/chat/completions` — drop the
  leading `/v1/`.
- **Model not available**: look up the exact model ID on the
  [model browser](/models). Auto-complete in these clients is not
  always accurate, and a stale fetched list is refreshed by
  re-saving the provider.
