Base URL with or without /v1 — which client needs what
The same gateway needs different base URLs in different clients. Getting the suffix wrong yields a 404 with no useful explanation.
2 min · · Updated · setup · errors · cursor · claude-code
The single most common mistake when connecting to any API gateway is the /v1 suffix in the base URL. It produces a 404 whose wording gives no hint about the cause, and people spend half an hour suspecting their key.
Why clients disagree
It comes down to what each client considers the "base".
The Anthropic SDK, and Claude Code built on top of it, treat the service root as the base and append /v1/messages themselves. Give them a URL ending in /v1 and you get /v1/v1/messages.
The OpenAI SDK, and everything built on it — Cursor, Codex, many IDE extensions — treat the versioned prefix as the base and append only /chat/completions. Give them a URL without /v1 and you get /chat/completions at the root.
Both mistakes look identical: a 404 from a server that simply does not know that path.
The table
| Client | Base URL |
|---|---|
| Claude Code | https://api.zukko.pro |
| Anthropic SDK (Python, TypeScript) | https://api.zukko.pro |
| Cursor | https://api.zukko.pro/v1 |
| Codex, OpenAI SDK | https://api.zukko.pro/v1 |
| Continue, Cline and similar extensions | https://api.zukko.pro/v1 |
| curl by hand | the full path: https://api.zukko.pro/v1/messages |
An easier rule to remember: if the client calls itself Anthropic-compatible, drop /v1; if OpenAI-compatible, keep it.
Telling the errors apart
Make a request and read the response.
A 404 about an unknown path is almost certainly the suffix. Check the URL.
A 404 about a model (The model ... does not exist) means the URL is right — you reached the service — but you asked for a model that is not in the catalogue. That is a different problem. A disabled model, by the way, returns not a 404 but a 503 with the code model_disabled; the current list is GET https://api.zukko.pro/v1/models.
A 401 means the URL is right and the key is at fault.
So the text of the 404 distinguishes one failure from the other without guesswork.
A quick URL check
curl -s -o /dev/null -w "%{http_code}\n" https://api.zukko.pro/v1/modelsA 200 confirms the service is reachable and that the versioned prefix is /v1. All that remains is whether your client appends that prefix itself — check its documentation, or simply try both, which takes a minute and costs nothing.
zukko
Pay 25×
less
for Claude Code & ChatGPT
One fetch_* key and base URL api.zukko.pro — for Cursor, Claude Code, Codex, and any SDK.
Related articles
- OpenAI API Keys in the Open: Why You Should Not Use ThemWhere free keys on GitHub come from, why using them is dangerous for you and for the owner, and how to protect your own key from the same leak.
- GLM API Errors: Why the Request Fails and How to Fix ItA wrong model id, an overflowing 128K context, the key, the balance, limits: the typical causes of GLM API errors and a quick way to find yours.
- This organization has been disabled in the Claude API: What to DoAn Anthropic key suddenly answers "organization has been disabled". What the error is, what to check, and how to move the SDK and Claude Code to another provider.
- JetBrains AI Assistant not working: causes and workaroundsAI Assistant will not activate, stays silent or is off for some files. We go through the causes in the JetBrains docs and connect your own models via a gateway.