Continue.dev: connecting to the gateway
Continue.dev is configured through a config.yaml file rather than a settings form, which is exactly how a stale apiBase or an extra slash survives unnoticed. Here is a working config.
4 min · · Updated · IDE
Continue.dev is a VS Code and JetBrains extension configured through a config.yaml file rather than a settings form. That's convenient for versioning your config, but it also creates its own class of bug: a leftover apiBase from a previous provider can silently break every request.
Where the config lives
Open Continue → gear icon → Open Assistant Configuration, or find the file directly: ~/.continue/config.yaml. Models are defined as a list under the models section.
Anthropic provider
models:
- name: Claude Opus 5.5
provider: anthropic
model: claude-opus-5-5
apiKey: fetch_your_key
apiBase: https://api.zukko.pro/v1/For the Anthropic provider, apiBase includes /v1/ (with the trailing slash): Continue only appends messages to it and adds the anthropic-version header itself. Without /v1/, requests miss /v1/messages and come back 404.
OpenAI-compatible provider
models:
- name: GPT 5.6 Sol
provider: openai
model: gpt-5.6-sol
apiKey: fetch_your_key
apiBase: https://api.zukko.pro/v1
- name: GLM 5.3
provider: openai
model: glm-5.3
apiKey: fetch_your_key
apiBase: https://api.zukko.pro/v1Here apiBase includes /v1 as well: the openai provider in Continue calls /chat/completions relative to whatever base URL you give it, and doesn't add or strip anything on its own.
You can keep both blocks in one config.yaml and switch between models right in the Continue UI without touching the file.
Testing the key outside Continue
If Continue stays silent after you save the config, hit the key directly:
curl https://api.zukko.pro/v1/messages \
-H "Authorization: Bearer fetch_your_key" \
-H "Content-Type: application/json" \
-H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-sonnet-5","max_tokens":64,"messages":[{"role":"user","content":"ping"}]}'The anthropic-version: 2023-06-01 header is required for /v1/messages — without it the request can be rejected before your fetch_... key is even checked, so a 401 or 400 in that case is about the missing header, not the key.
YAML — a source of silent bugs
Indentation in YAML is significant: if apiKey ends up one level too high or too low, Continue either won't pick up the model at all, or will send the request without a key, in which case you get a 401 about a missing key rather than an invalid one. Check the syntax locally:
python3 -c "import yaml, sys; yaml.safe_load(open('config.yaml'))"If that command fails, Continue never even gets involved — fix the indentation first.
Reading the errors
401— key rejected or not sent:{"error":{"message":"Invalid API key. Use Authorization: Bearer fetch_*","type":"authentication_error"}}.402— empty balance:{"error":{"message":"Недостаточно средств на балансе","code":"insufficient_balance"}}. The charge is checked before the model is called, so a failed attempt is free.404— almost always a missing or extra/v1inapiBase, less often a typo inmodel.400 model_retired— the model has been retired, and the replacement is named directly in the error text.503 model_disabled— the model is disabled in the catalog; replace it inconfig.yamlwith a current one.429— from Zukko this only means a per-key limit (key_daily_limit_reached, which resets at 00:00 UTC, orkey_monthly_limit_reached), if you set one on the key's page in the dashboard; the gateway has no general rate limit, and any other 429 comes from the model provider.
The currently available models are claude-opus-5-5, claude-sonnet-5, gpt-5.6-sol, gpt-5.6-luna, glm-5.3 and glm-5.3-flash; the current list is at GET https://api.zukko.pro/v1/models. Prices and limits, no key needed:
curl https://api.zukko.pro/v1/models/infoUnlike /v1/models, this endpoint also returns limits and prices — worth checking before writing a model id into your config.
Extra things worth setting up
For long Continue sessions, response caching helps — there's no direct header field for it in config.yaml, but if the model is called with temperature: 0 (typically true for code autocomplete; this doesn't apply to Claude models, which may reject a temperature other than 1), fully identical requests from the same user (the whole body matches) are cached anyway for up to 7 days, and the repeat answer comes back instantly and free.
On the key's page at https://zukko.pro/app/api-keys you can set a daily or monthly spend cap in dollars and restrict the allowed models list — worth doing right away if the key lives in a config that syncs across multiple machines.
Top up via SBP, a card through PayPear, crypto, or a foreign Mastercard EU card through Fride (about 13% fee, amounts $2–$594); the minimum is $1. A one-time $0.50 bonus is credited for subscribing to the Telegram channel @zukkopro — link Telegram in the dashboard, subscribe, and press "Check" (once per Telegram account). A plain signup carries no starting balance.
For anything else, support is at https://t.me/zukkopro?direct.
Free token counting for the Anthropic model
If config.yaml has a model set up through the anthropic provider, you can check a request's token weight ahead of time without spending anything — the /v1/messages/count_tokens endpoint only counts, it doesn't run the request:
curl https://api.zukko.pro/v1/messages/count_tokens \
-H "Authorization: Bearer fetch_your_key" \
-H "Content-Type: application/json" \
-H "anthropic-version: 2023-06-01" \
-d '{"model":"claude-sonnet-5","messages":[{"role":"user","content":"the request text"}]}'Useful when Continue assembles context from several open files at once — you see the final size before sending, not after a context-limit error.
Web search for models that lack it
If the configured model has no built-in web search — say, GLM — and a Continue chat task needs current information, you can call POST /v1/web-search with the same key separately and paste the result into the conversation by hand. It's a standalone endpoint, unrelated to whichever model is set in config.yaml.
If the config is shared across a team
Continue's config.yaml is easy to check into a shared team repo alongside other project settings, so everyone gets the same model list. In that case, set spend limits on the key in the dashboard and check GET /v1/usage — the cursor-paginated charge history (account-wide, covering all keys) shows what the whole team spent, not just you.
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
- 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.
- DeepSeek in VS Code: connecting through Cline, Kilo Code and ContinueWe connect DeepSeek to Cline, Kilo Code and Continue with a single key, choose between Flash and Pro, and estimate the cost of a working day with an agent in the editor.
- GitHub Copilot alternatives with your own API key: what to chooseCline, Kilo Code, Continue and Cursor work with your own key. We compare where they live, how they connect to a gateway and how to estimate spend.
- Invalid API key in opencode: why the key is rejected and how to checkThe Invalid API key error in opencode almost always comes down to four causes. We test the key outside opencode and find where the chain breaks.