404 model_not_found: why the model isn't found and how to fix the ID
A 404 model_not_found means the string in model didn't match anything in the published catalog. go2llm answers model is not in the published catalog; the official OpenAI API answers The model does not exist. The cause is almost always how the ID is spelled, or an Anthropic dated suffix that doesn't belong here — rarely the key, and never the balance.
Written 2026-09-11, updated 2026-09-11.
What it looks like
{
"error": {
"type": "model_not_found",
"code": "model_not_found",
"message": "model is not in the published catalog",
"request_id": "gw_d31e8074bb6a4c92a7f0e5c81d4b6a39"
}
}
The image-generation endpoint phrases it slightly differently — model is not in the published image catalog — but the status is the same 404.
The official OpenAI API answers like this:
{
"error": {
"message": "The model `gpt-5.6-sol-preview` does not exist or you do not have access to it.",
"type": "invalid_request_error",
"param": "model",
"code": "model_not_found"
}
}
Reproducing it takes one line:
curl -i https://go2llm.tech/v1/chat/completions \
-H "Authorization: Bearer $GO2LLM_API_KEY" \
-H "content-type: application/json" \
-d '{"model":"claude-sonnet-5-20260901","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'
go2llm publishes this model as claude-sonnet-5, with no dated suffix, so the request above returns a 404.
Why this happens
A dated ID was used instead of the public one. Anthropic's own API versions models with a date, like claude-sonnet-4-5-20250929. go2llm publishes short public IDs instead — claude-opus-5, claude-sonnet-5, claude-haiku-4-5, claude-opus-4-8, claude-fable-5. The dated form simply isn't in go2llm's catalog, and it returns 404.
A typo or an extra suffix. gpt-5.6-sol-preview, gpt5.6-sol, and gpt-5-6-sol are not the same string as gpt-5.6-sol. go2llm's ID comparison is exact — it doesn't normalize dots, hyphens, or case. The same goes for gemini-3.8-flash, deepseek-v4-pro, glm-5.3-flash, qwen3.8-max.
The model left the catalog, or hasn't been published yet. go2llm's catalog is versioned — as of 2026-09-11 the live version was v19, publishing 38 models. A model missing from the current version returns 404 regardless of whether the vendor still serves it elsewhere. GET /v1/models is the only source that's always current, and it works with no key.
The model exists but isn't allowed for this key. This one isn't a 404 at all. A go2llm key carries its own list of allowed models, and a request outside that list gets a 403 with type model and message model not allowed for this key. If your status is 403, that's the 403 page, not this one.
The model was called through the wrong endpoint. An image-generation model — gpt-image-2, nano-banana-2, nano-banana-pro, gemini-3.1-flash-image, grok-imagine-image — is in the catalog, but only answers on POST /v1/images/generations. Call it through POST /v1/chat/completions and you get 400 model_protocol_mismatch instead; call a chat model through the image endpoint and you get this 404, with the image-catalog wording. GET /v1/models lists the right endpoint for each one.
The request hit a route go2llm doesn't have. Four endpoints are published: POST /v1/messages, POST /v1/chat/completions, POST /v1/responses (live since 2026-09-14), and POST /v1/images/generations. Embeddings, image edits, video, and audio aren't published, and calling them 404s at the route level rather than the model level.
Finding the right ID
Pull the current catalog — no key needed:
curl -s https://go2llm.tech/v1/models | jq -r '.data[].id' | sort
Copy the ID straight from that output instead of typing it by hand. Case, dots, and hyphens all count.
Check that the model actually serves the endpoint you're calling — the same response carries modalities and endpoints per model:
curl -s https://go2llm.tech/v1/models | jq '.data[] | select(.id=="gpt-image-2")'
Add a startup check so a missing model fails at deploy, not on your first real user's request:
import httpx
def assert_model_published(model_id: str) -> None:
"""Fails at startup if the model isn't in go2llm's catalog."""
r = httpx.get("https://go2llm.tech/v1/models", timeout=15.0)
r.raise_for_status()
published = {m["id"] for m in r.json()["data"]}
if model_id not in published:
close = sorted(m for m in published if m.split("-")[0] == model_id.split("-")[0])
raise SystemExit(
f"Model {model_id!r} is not published on go2llm. "
f"Close matches: {close or 'none'}"
)
assert_model_published("claude-sonnet-5")
Confirm the fix with a minimal request — sixteen tokens is enough to prove it.
Keeping this from happening again
Don't hardcode a model list in more than one place. Keep one config and check it against GET /v1/models at startup or in CI — the catalog moves in versions (v19 as of 2026-09-11), and the check itself costs one HTTP call, no key required.
Don't carry Anthropic's dated identifiers into go2llm's config during a migration: claude-sonnet-4-5-20250929 becomes claude-sonnet-5; claude-opus-4-1-20250805 becomes claude-opus-4-8 or claude-opus-5, depending on which one you actually need. The full mapping is on the pricing page.
Treat model_not_found as a config error, not a transient one — retrying gets you the identical response. Log error.request_id; go2llm support uses it to trace a request's route, and logs are kept for 90 days.
Keep a fallback on the same protocol rather than the same vendor. If a quota keeps you off one Claude model, falling back to another one on the same POST /v1/messages needs no code changes at all.
Related errors
- 400 unsupported_content_type and model_protocol_mismatch — the model exists, but the request isn't in the right shape.
- 403: model not allowed for the key — a 403, not a 404.
- The full error reference.
FAQ
Where do I get the exact list of go2llm's models? GET https://go2llm.tech/v1/models — no key required, and the response carries public IDs, modalities, and supported endpoints for each one. The same IDs' pricing comes from GET https://go2llm.tech/api/pricing, alongside the catalog version.
How many models does go2llm publish? As of 2026-09-11, catalog v19 published 38 models, including claude-opus-5, gpt-6-astra, gemini-3.8-flash, grok-4.6, deepseek-v4-pro, kimi-k3, glm-5.3, qwen3.8-max, and the image-generation models. GET /v1/models always has the current count.
Why doesn't Anthropic's dated ID work here? go2llm publishes models under short public IDs with no dated suffix. The match is exact: claude-sonnet-5-20260901 won't match claude-sonnet-5, and you get 404 model_not_found with model is not in the published catalog.
How is 404 different from 403 for models? 404 model_not_found means the model isn't in go2llm's catalog at all. A 403 with type model means the model is there, but this particular key isn't allowed to use it. The first is fixed by correcting the ID; the second, by editing the key's allowed-model list.
Get a key and make your first request in 3 minutes → go2llm.tech. SDK and Claude Code setup are in the docs.