The classic form is a 404 with code: model_not_found reading The model \`X\` does not exist or you do not have access to it. On Anthropic the equivalent is a 404 not_found_error whose message is just model: claude-sonnet-4-20250514, and on Gemini it is model_not_found with a 404. The four causes are a retired or renamed ID, a project or org that lacks access to a model that does exist, the wrong API surface for that model, and a gateway model-name mapping problem. The last two are the ones that waste the most time, because the model genuinely exists and your ID is genuinely correct.
- Check the retirement date first. 2026 retired a great deal, and a working ID can stop working overnight.
- A 403 with
code: model_not_foundmeans the model exists and your project cannot use it. Different fix entirely. - Anthropic returns 404
not_found_errorwith the bare model string, not a 400. gpt-5.6-cyberis Responses-only and approval-gated. Surface and entitlement are separate gates.- OpenRouter slugs are
vendor/model, and aliases silently resolve, so a wrong-punctuation slug may work. - LiteLLM needs a provider prefix. Without one you get
LLM Provider NOT provided, not a 404. - A
base_urlmissing or doubling/v1gives you a 404 with an HTML body. Not a model problem at all.
The model does not exist or you do not have access to it
One message, three providers, four causes. The message itself does not distinguish "no such model" from "not yours", which is the root of the confusion.
{
"error": {
"message": "The model `gpt-5.2` does not exist or you do not have access to it.",
"type": "invalid_request_error",
"param": null,
"code": "model_not_found"
}
}
| Provider | Status | Body |
|---|---|---|
| OpenAI, unknown or retired ID | 404 | code: model_not_found, message as above |
| OpenAI, project lacks access | 403 | Project \`proj_id\` does not have access to model \`X\`, also code: model_not_found |
| Anthropic | 404 | {"type":"not_found_error","message":"model: claude-sonnet-4-20250514"} |
| Gemini (Interactions API) | 404 | code: "model_not_found", "The specified model was not found." |
| OpenRouter | 404 | {"error":{"message":"Model not found: openai/gpt-nope-9000","code":404}} |
| LiteLLM, no provider prefix | 400 | LLM Provider NOT provided... (a BadRequestError, not a 404) |
Cause one: the ID was retired
This is the single most common cause in 2026, because all three providers retired a great deal of their previous generation. A retirement is not a soft failure: on the day, requests stop working. Our model directory keeps one card per live identity with its canonical id and known aliases, which is a faster way to confirm a replacement than reading three deprecation pages.
OpenAI
| Shutdown | Models | Replacement |
|---|---|---|
| 2026-07-23 (done) | gpt-5-codex, gpt-5.1-codex, gpt-5.1-codex-max, gpt-5.2-codex, gpt-5-chat-latest, gpt-5.1-chat-latest, computer-use-preview-2025-03-11 | GPT-5.6 family |
| 2026-08-10 (done) | gpt-5.2-chat-latest, gpt-5.3-chat-latest | gpt-5.6-sol |
| 2026-08-26 | Assistants API | Responses and Conversations API |
| 2026-09-28 | gpt-3.5-turbo-instruct, babbage-002, davinci-002, gpt-3.5-turbo-1106 | gpt-5.6-terra |
| 2026-10-23 | gpt-4-turbo, gpt-4-0613, gpt-4o-2024-05-13, gpt-4.1-nano, o1-2024-12-17, o3-mini-2025-01-31, o4-mini-2025-04-16 | GPT-5.6 family |
| 2026-12-11 | gpt-5-2025-08-07, gpt-5-mini-2025-08-07, gpt-5-nano-2025-08-07, gpt-5-pro-2025-10-06, o3-2025-04-16, o3-pro-2025-06-10 | gpt-5.6-sol / -terra / -luna |
The current lineup is three text models: gpt-5.6-sol, gpt-5.6-terra, and gpt-5.6-luna, with gpt-5.6 aliasing to Sol. A change worth noting if your code pins snapshots defensively: the model pages list only bare IDs, with no dated snapshot variants of the GPT-5.6 family. Note also that the undated gpt-4o and gpt-4o-mini aliases are not on the deprecation list; only gpt-4o-2024-05-13 is.
Anthropic
| Model ID | Retired |
|---|---|
claude-opus-4-1-20250805 | 5 August 2026 |
claude-opus-4-20250514 | 15 June 2026 |
claude-sonnet-4-20250514 | 15 June 2026 |
claude-3-haiku-20240307 | 20 April 2026 |
claude-3-7-sonnet-20250219 | 19 February 2026 |
claude-3-5-haiku-20241022 | 19 February 2026 |
claude-3-opus-20240229 | 5 January 2026 |
Current IDs are claude-fable-5, claude-opus-5, claude-sonnet-5, and claude-haiku-4-5-20251001. Two things to know: from the 4.6 generation onward the IDs are dateless but still pinned snapshots rather than evergreen pointers, and the nearest retirement floor on a currently active model is claude-sonnet-4-5-20250929, not before 29 September 2026. Anthropic commits to at least 60 days of notice for publicly released models, and Bedrock and Google Cloud run their own schedules that can differ.
Gemini
The 2.0 Flash family (gemini-2.0-flash, -001, -lite, -lite-001) shut down on 1 June 2026, replaced by 3.6 Flash and 3.1 Flash-Lite. gemini-3-pro-preview went on 9 March 2026 in favour of gemini-3.1-pro-preview, and the imagen-4.0-*-001 models went on 17 August 2026. Google's wording is worth internalising: the published dates "indicate the earliest possible dates on which a model might be retired", so treat them as a floor and not a promise.
Cause two and three: entitlement, and the wrong surface
The model exists. You still cannot call it. Two separate gates, and they are easy to confuse because both can produce a 404-shaped complaint.
Entitlement
- Project-level model access. An OpenAI project can be restricted to a subset of models. Calling one outside it returns 403 with
Project \`proj_id\` does not have access to model \`X\`. Fix it in the project's allowed-models setting, not in your code. - Approval-gated models.
gpt-5.6-cyberand the Daybreak family are the clear current example: the docs say plainly that the model "requires separate approval and provisioning" and point at an application form. No amount of correct spelling gets you in. - Organization verification. OpenAI has historically gated some capabilities, streaming on frontier models among them, behind ID verification of the organization. The current GPT-5.6 model pages list no verification requirement, unlike Cyber which states its gate explicitly, so treat this as a possibility to check rather than a certainty.
- Usage tier. Tiers move rate limits rather than model availability on the current lineup, but a very new model appearing for some accounts and not others is a normal rollout state, not a bug in your code.
The wrong API surface
A model can exist and simply not be served by the endpoint you called. On OpenAI all three GPT-5.6 text models work on /v1/chat/completions, /v1/responses, and /v1/batch, but gpt-5.6-cyber is Responses-only: the docs state that "only the v1/responses endpoint is supported".
There is a subtler version of the same thing that costs real capability rather than returning an error. On Chat Completions, OpenAI documents that function tools are "compatible with reasoning_effort: \"none\" only", while reasoning, persisted reasoning, and Pro mode live on Responses. A tool-calling agent left on Chat Completions therefore runs without reasoning and looks merely worse rather than broken, which is harder to notice than a 404.
Cause four: the gateway rewrote your model name
Every gateway maintains its own namespace, and the translation between yours and theirs is where the last category of these errors lives.
OpenRouter
- Slugs are
vendor/model, for examplegoogle/gemini-3.7-flashoranthropic/claude-haiku-4.5. The full list is public and unauthenticated athttps://openrouter.ai/api/v1/models, which makes a startup validation check trivial. - Aliases resolve silently. The docs give the example of
anthropic/claude-3-5-sonnetredirecting to the canonicalanthropic/claude-3.5-sonnet. Useful, and a trap: a wrong-punctuation slug can work for months and then stop when the alias is retired. - Each model has a
canonical_slugthat never changes, distinct from theidyou send. Pin against the canonical one if you need reproducibility. - Variants are suffixes on the slug:
:free,:thinking,:batch. A missing suffix is a different model, not a formatting nicety. A leading~marks a floating "latest" pointer. - The typed error code is
not_foundwith a 404. Other codes in the same family are worth knowing for a failover policy:provider_overloadedat 503,provider_unavailableat 502, andtimeoutat 504.
LiteLLM
LiteLLM does not return a 404 for an unrecognized name. It raises a BadRequestError because it could not work out which provider you meant, and the message is unusually helpful:
LLM Provider NOT provided. Pass in the LLM provider you are trying to call.
You passed model=gpt-5.6-sol
Pass model as E.g. For 'Huggingface' inference endpoints pass in
`completion(model='huggingface/starcoder',..)` Learn more:
https://docs.litellm.ai/docs/providers
Resolution runs in order: an explicit custom_llm_provider wins, then a split on the first / to take a provider prefix, then bare-name lookups in per-provider registries, then prefix rules, then a generalization fallback. Only after all of that does it raise. So the fix is nearly always to add the prefix: openai/gpt-5.6-sol rather than gpt-5.6-sol.
The base URL that is not a model problem at all
Worth its own paragraph because it produces a 404 and sends people straight to the model ID. The OpenAI SDK merges a request path onto the base URL's path rather than replacing it: the leading slash on /chat/completions is stripped and the result is appended. So base_url must include /v1.
# correct
OpenAI(base_url="https://gateway.example.com/v1")
# -> https://gateway.example.com/v1/chat/completions
# missing /v1: 404
OpenAI(base_url="https://gateway.example.com")
# -> https://gateway.example.com/chat/completions
# doubled /v1, because the gateway docs said to append it: 404
OpenAI(base_url="https://gateway.example.com/v1/v1")
# -> https://gateway.example.com/v1/v1/chat/completions
The tell is the body. These 404s usually return HTML from a web server rather than a JSON error object, and the HTML then fails to parse as JSON, so what surfaces in your logs is often a decoding exception rather than a 404 at all.
A diagnostic in four requests
List the models your credential can actually see
# OpenAI
curl -sS https://api.openai.com/v1/models \
-H "Authorization: Bearer $OPENAI_API_KEY" | jq -r '.data[].id' | sort
# Anthropic
curl -sS https://api.anthropic.com/v1/models \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" | jq -r '.data[].id'
# OpenRouter, no auth needed
curl -sS https://openrouter.ai/api/v1/models | jq -r '.data[].id' | grep claude
If your ID is absent from the list, it is retired or misspelled. If it is present and the call still fails, you have an entitlement or surface problem and the next steps apply.
Read the HTTP status, not just the code
404 means gone or wrong. 403 means the model is live and your project is not allowed to use it. They share code: model_not_found on OpenAI, so the status is the only thing separating them.
Check the deprecations page against today
Three pages, one habit: OpenAI at developers.openai.com/api/docs/deprecations, Anthropic at platform.claude.com/docs/en/about-claude/model-deprecations, Google at ai.google.dev/gemini-api/docs/deprecations. Better still, put the models-list assertion in your startup path and never do this manually again.
If a gateway is involved, test the provider directly
One call straight to the upstream API with the upstream ID. Working there and failing through the gateway localizes the problem to the mapping layer in a single request, which beats any amount of reading configuration.
Questions people ask
What does model_not_found mean?
That the model ID you sent was not recognized, or was recognized and is not available to you. On OpenAI it comes back as a 404 with code model_not_found and the message "The model X does not exist or you do not have access to it." The four causes are a retired ID, a project that lacks access, the wrong API surface, and a gateway name-mapping problem.
Why did my model ID stop working overnight?
Almost certainly a retirement date. 2026 was heavy: OpenAI shut down the GPT-5 Codex family on 23 July and gpt-5.2-chat-latest and gpt-5.3-chat-latest on 10 August, Anthropic retired claude-opus-4-1-20250805 on 5 August, and Google shut down the Gemini 2.0 Flash family on 1 June. Check the provider deprecations page for the exact ID you are sending.
What is the difference between a 404 and a 403 model_not_found?
A 404 means the ID is wrong or the model is gone. A 403 means the model exists and is live, and the project you are billing to is not entitled to use it, with a body reading "Project proj_id does not have access to model X". Both carry code model_not_found on OpenAI, so the HTTP status is the only thing that tells them apart.
How do I find the correct model ID?
Ask the API rather than a blog post. GET /v1/models on OpenAI and Anthropic returns exactly what your credential can reach, and OpenRouter publishes its full catalogue unauthenticated. The best version of this is a startup assertion that every configured model ID appears in that list, which turns a production 404 into a deploy-time failure.
Why does OpenRouter say my model is not found when the model exists?
Usually the slug format. OpenRouter uses vendor/model and adds variant suffixes such as :free, :thinking, and :batch that are part of the identifier rather than optional decoration. It also resolves some aliases silently, so a slug with the wrong punctuation can work for a while and then stop. Check your slug against openrouter.ai/api/v1/models and pin the canonical_slug if you need stability.
What does "LLM Provider NOT provided" mean in LiteLLM?
LiteLLM could not work out which provider a bare model name belongs to. It resolves the provider from an explicit custom_llm_provider, then from a prefix before the first slash, then from per-provider registries, and raises this BadRequestError when all of them miss. The fix is nearly always to add the prefix, so openai/gpt-5.6-sol rather than gpt-5.6-sol. On a LiteLLM proxy, also check that the alias exists in model_list.
Sources
Every figure above was read from these pages on August 2026. Vendors reprice without notice; if you find a stale number, tell us.
- OpenAI deprecations shutdown dates and replacement models
- Claude model deprecations retirement dates and the 60-day notice policy
- Gemini API deprecations shutdown dates as earliest-possible floors
- GPT-5.6 Cyber model reference Responses-only support and the approval gate
- OpenRouter API errors the typed error codes including not_found
- LiteLLM proxy configuration model_list, model_name aliases, and litellm_params.model