AnyRouter

OpenRouter

Move OpenRouter Chat Completions requests to AnyRouter, including provider preferences for ordering, price caps, and fallbacks.

Moving from OpenRouter is mostly a base-URL and key change. AnyRouter accepts the same provider/model ids and the same request-level provider preferences on its OpenAI-compatible endpoints, so your ordering, price caps, and fallback settings carry over unchanged.

Before you start

  • An AnyRouter API key (prefixed sk-ar-). Create one in the dashboard.
  • An existing OpenRouter integration built on the OpenAI-compatible client.

Your HTTP-Referer and X-Title headers can stay — AnyRouter reads both for dashboard attribution, so no header changes are needed.

What changes

SettingBefore (OpenRouter)After (AnyRouter)
Base URLhttps://openrouter.ai/api/v1https://anyrouter.dev/api/v1
API keyOpenRouter keyYour AnyRouter key, prefixed sk-ar-
Modelprovider/modelprovider/model from the AnyRouter catalog
Provider preferencesprovider objectprovider object — same fields

Before and after

The client swap is a base URL and key change; model ids keep the provider/model form.

import OpenAI from "openai"

const client = new OpenAI({
  baseURL: "https://openrouter.ai/api/v1",
  apiKey: process.env.OPENROUTER_API_KEY,
})

const completion = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4-6",
  messages: [{ role: "user", content: "Summarize this support thread." }],
})

Migrate

Change the base URL from https://openrouter.ai/api/v1 to https://anyrouter.dev/api/v1, and use your AnyRouter key (prefixed sk-ar-).

Model ids keep the same provider/model form. Confirm each one is in the AnyRouter catalog by listing Models.

Request-level provider preferences carry over unchanged: only, ignore, order, sort, max_price, and allow_fallbacks. Leave them as they are.

OAuth PKCE

If your app lets users connect their OpenRouter account with OAuth PKCE, the same flow works on AnyRouter. Swap openrouter.ai for anyrouter.dev in the /auth URL and in the /api/v1/auth/keys exchange. See OAuth PKCE.

Provider preferences

Use only to allowlist, ignore to exclude, order to pin a preference order, and sort to choose the strategy:

curl https://anyrouter.dev/api/v1/chat/completions \
  -H "Authorization: Bearer sk-ar-your-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "openai/gpt-5.4-mini",
    "messages": [{"role": "user", "content": "Draft a changelog entry."}],
    "provider": {
      "only": ["OpenAI", "Groq"],
      "order": ["Groq", "OpenAI"],
      "sort": "latency",
      "allow_fallbacks": true
    }
  }'

Price caps

Filter out upstreams above your budget. Prices are dollars per 1M tokens:

{
  "provider": {
    "sort": "price",
    "max_price": { "prompt": "1.00", "completion": "4.00" },
    "allow_fallbacks": true
  }
}

If every route is filtered out, the request fails — AnyRouter never silently ignores a price ceiling.

Disable fallbacks

Fallbacks are on by default. Turn them off when reproducibility matters more than availability (an eval run against a fixed upstream):

{ "provider": { "allow_fallbacks": false } }

Verify

Send one request with your new key and confirm you get a reply:

curl https://anyrouter.dev/api/v1/chat/completions \
  -H "Authorization: Bearer sk-ar-your-key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-sonnet-4-6",
    "messages": [{"role": "user", "content": "Say hello in one sentence."}]
  }'

Migrate with an agent prompt

Paste this into a coding agent (Claude Code, Cursor, Codex, …) to do the swap:

Migrate this project from OpenRouter to AnyRouter.

1. Change the OpenAI client base URL from https://openrouter.ai/api/v1
   to https://anyrouter.dev/api/v1
2. Swap the OpenRouter key for ANYROUTER_API_KEY (prefix sk-ar-). Never hardcode it.
3. Model ids keep the same provider/model form — verify each id exists in the
   AnyRouter catalog at https://anyrouter.dev/api/v1/models
4. Request-level `provider` preferences (only / ignore / order / sort /
   max_price / allow_fallbacks) are supported — keep them as they are.
5. Leave your HTTP-Referer and X-Title headers as-is — AnyRouter reads both for
   dashboard attribution, so no header changes are needed.
6. Keep streaming and error handling unchanged.
7. Add a smoke test that sends one short prompt and prints the reply.

Only swap the provider config — do not change UI or business logic.

Troubleshooting

The provider/model id must exist in the AnyRouter catalog. Some OpenRouter ids differ — list Models and pick the matching AnyRouter id.

It isn't — max_price is a hard filter. If no upstream fits your ceiling, the request fails rather than routing to a more expensive provider. Loosen the cap or set allow_fallbacks: true.