Migration guide

Migrating from OpenRouter

The base URL is a one-line change. Model names are not: the two services do not use the same naming, so budget time for a mapping pass. Everything else is a decision about whether you should migrate at all.

Should you migrate?

Probably not if OpenRouter works and the only complaint is the 5.5% credit fee. Moving to us means giving up 460 models for 199 and giving up a paid path you can plan around. The fee is real; so is what you get for it.

Consider it if you want Anthropic-format endpoints without a translation layer, if free-first routing is what you actually need, or if you are also adopting the agent layer above the gateway.

The three-line change

# Before (OpenRouter)
OPENAI_BASE_URL = "https://openrouter.ai/api/v1"
OPENAI_API_KEY  = "sk-or-..."

# After (FreeModel)
OPENAI_BASE_URL = "https://freemodel.online/v1"
OPENAI_API_KEY  = "sk-..."        # from the console

For Anthropic-format clients, the base URL is different:

ANTHROPIC_BASE_URL = "https://freemodel.online/api/gateway"
ANTHROPIC_API_KEY  = "sk-..."

The part that takes longer: model names

OpenRouter names models vendor/model: openai/gpt-4o, anthropic/claude-sonnet-4. FreeModel does not use that scheme, and it also exposes modality routes like auto/image and tier aliases like fm-v1-lite that have no OpenRouter equivalent. So this is a mapping pass, not a find-and-replace.

# Pull the live list before mapping anything: do not hard-code from memory
curl https://freemodel.online/v1/models

# No key required. If a model you depend on is not in the list,
# that is your answer about whether to migrate.

Two things to check while you map:

What changes in behaviour

OpenRouterFreeModel
Which model handles a requestYou name itThe router decides by task
Free model selectionExplicit :free suffixDefault, automatic
Model namingvendor/modelOwn scheme plus routing aliases
Fallback orderConfigurableOurs

The routing change is the one that surprises people. If your code depended on a specific model answering (because you tuned prompts against it, or you are benchmarking), name a model explicitly rather than relying on routing. Otherwise the same request can land on a different model tomorrow.

Migration checklist

[ ] Pull https://freemodel.online/v1/models and diff it against what you use
[ ] Confirm every model you depend on is present
[ ] Get a key from the console
[ ] Point base_url at https://freemodel.online/v1 (or /api/gateway for Anthropic format)
[ ] Strip :free suffixes
[ ] Pin model names anywhere the specific model matters
[ ] Run one request per model you actually use, not just one smoke test
[ ] Check latency: routing adds a decision step

If you decide not to migrate

That is a reasonable outcome, and worth saying plainly. OpenRouter has more models, a longer track record, and integrations everywhere. The honest summary:

Stay on OpenRouter   if you need a specific model, a paid path you can
                     budget against, or you are following someone else's
                     setup guide
Switch to FreeModel  if you want Anthropic-format endpoints directly,
                     free-first routing by default, or the agent layer
                     above it

If you are still weighing it, the two direct comparisons go deeper on each: vs OpenRouter covers the feature differences, alternatives covers what else exists if neither of us is right.

The migration, step by step

Five steps, in the order that avoids rework. The order matters: if you remap model names before you have pulled the live list, you are mapping against a list you remembered.

  1. Step 1: change the base URL and the key. For an OpenAI-format client that is two environment variables: OPENAI_BASE_URL="https://freemodel.online/v1" and OPENAI_API_KEY from the console. For an Anthropic-format client the URL is different: ANTHROPIC_BASE_URL="https://freemodel.online/api/gateway", which is the one clients like Claude Code read. If your SDK takes the URL as a constructor argument rather than an environment variable, the same value goes into base_url in code.
  2. Step 2: pull the live model list and diff it. curl https://freemodel.online/v1/models needs no key. Diff those ids against the ones your code calls before you touch anything else, and keep the output — it is the version you verified against, not the one on this page.
  3. Step 3: remap the model names. This is the pass that takes the time. OpenRouter ids are vendor/model, so the vendor prefix is the first thing to deal with; the :free suffix is the second, and it goes away entirely. Where a specific model has no counterpart, a tier alias such as fm-v1-lite or a modality route such as auto/image is usually the honest substitute: it describes a tier or a modality instead of pretending to pin a model.
  4. Step 4: run one request per model you actually use. Not one smoke test. A model can answer a hello-world prompt and still fail the JSON shape or the word limit your pipeline depends on, and that failure only shows up on a real task.
  5. Step 5: pin anything you benchmark against. If prompts were tuned against one model, name that model explicitly instead of relying on routing, or the same request can land on something else tomorrow and your benchmark stops being a benchmark.

Migration FAQ

How long does the migration take?
The URL and key change is minutes. The model mapping is the long part and it scales with how many ids your code names — a project that pins one model is an afternoon including the re-test, and a project that pins twenty needs a pass per model plus a real request against each. Budget for the mapping, not for the URL.
Will my prompts behave the same after the migration?
If the same model answers, yes. The difference is that the router may answer instead of the model you named, and routing is free-first by default, so the same request can land somewhere else tomorrow. Anywhere the specific model is load-bearing (tuned prompts, benchmarks, evals), name it explicitly rather than letting the router decide.
What happens to my :free model names?
Drop the suffix. On OpenRouter it is what selects a free model; here routing tries free capacity first without being asked, so there is no opt-in to translate and a name carrying the suffix may simply not resolve. To stay on the free tier rather than fall through to a paid model, call fm-v1-lite: any account can call it, and no subscription is needed.
Which models are actually present here?
199 ids at the last count. Of those, 77% are chat models and the other 23% are image, video, speech synthesis, speech recognition, embeddings and rerank. Broad coverage is not the same as containing the id you pinned, though, so diff the list rather than trusting a share.
Can I migrate only part of my traffic?
Yes. The base URL is set per client, not per project, so one service can move while another stays on OpenRouter — useful when a workload depends on a model that has no counterpart here. Running both means two keys to manage and two places to look when something breaks; that is the whole cost of a partial migration.

Last updated 2026-09-20. Model counts and endpoints verified on this date — pull the live model list rather than trusting any page, including this one.

Sources

Every third-party figure quoted on this site was read from the vendor documentation linked below, on the date stated. None of these links are affiliate links and none of these vendors paid to be listed. If a number here disagrees with the page it came from, the page is right — tell us and it gets corrected.