Jan AI with cloud models: Zukko as a remote provider
Jan runs both local and cloud models. Here is how to add Zukko as a custom endpoint, pick a model by price and fix the most common errors.
6 min · · development
Jan is a desktop app for language models: local ones that run on your computer, and cloud ones over an API. You can connect cloud models in Jan not only through the built-in providers but also through your own address, and that's how Zukko is added: the address https://api.zukko.pro/v1 and a fetch_... key give you Claude, GPT and GLM models next to your local ones. Below is the setup based on the official Jan docs, the choice of API format, sampling settings, a cost estimate and troubleshooting.
How to connect Jan to cloud models through your own provider
The Jan docs call this scenario Custom Endpoints. The steps:
- Open Settings → Model Providers.
- Click the Add Provider button next to the provider list.
- In the Add Custom Provider dialog, choose the API format OpenAI-compatible (the default).
- Fill in the fields: Provider name —
Zukko, Base URL —https://api.zukko.pro/v1, API key — yourfetch_...key. - Click Create.
- Check the model list. On save, Jan requests
{base_url}/models; Zukko serves the list atGET /v1/models, so the models should appear on their own. If they don't, add them manually with the+button in the provider's Models section, entering the exact ID, for exampleclaude-sonnet-5. - Start a new chat and pick a model from the Zukko provider in the model list.
| Field | Value |
|---|---|
| API format | OpenAI-compatible |
| Provider name | Zukko |
| Base URL | https://api.zukko.pro/v1 |
| API key | fetch_your_key |
| Models | claude-sonnet-5, gpt-5.6-sol, glm-5.3-flash and others |
The Jan docs specifically warn that the Base URL must include the API version path the server expects. A common mistake is an address without /v1, which makes every request fail with a 404. Jan strips a trailing slash automatically.
Model capabilities are set manually
For custom providers, Jan doesn't detect whether a model supports tools, images or audio. Capabilities are configured per model. Enable them only if you're sure the model supports them, and verify with a test request.
For the current list of IDs, call GET https://api.zukko.pro/v1/models (see the models documentation) or open the "Models" page in the dashboard.
OpenAI-compatible or Anthropic-compatible
Jan supports both formats, and Zukko accepts both. The Jan docs stress that the format must match what the server speaks: pick the wrong one and requests will fail even with the right address and key.
The simplest choice is OpenAI-compatible with https://api.zukko.pro/v1: the gateway converts requests, and Claude models work the same way as GPT and GLM. If you do choose Anthropic-compatible, use the address without /v1 — https://api.zukko.pro — as with other clients that add the version to the path themselves (the Jan docs show the LiteLLM Anthropic-mode example the same way). If you get a 404, switch back to OpenAI-compatible. The difference between formats is explained in the format selection docs.
Fallback keys and key testing
For remote providers, Jan supports several keys. Key #1 is the primary, the rest are fallbacks: Jan moves to the next key only on 401, 403 or 429 responses. You set this up in the provider settings: API keys section → Advanced → + Add key.
There's also a Test keys button: Jan calls {base_url}/models for each key and shows the result — OK, Invalid/revoked (401), Forbidden (403), Rate limited (429) or Network error. It's a quick way to confirm your Zukko key was copied correctly.
Note: at Zukko, a 403 with the code model_not_allowed_for_key means the model isn't on the key's allowed list. If a fallback key has a broader list, Jan will silently switch to it, and spending will go to the other key. If you don't want that, keep the same model lists on all keys of the provider.
Sampling parameters: careful with Claude
For custom providers, Jan exposes the full set of parameters — temperature, top-K, top-P, min-P, repetition penalty and more — and sends whatever you set. The Jan docs warn that a server may silently ignore parameters it doesn't support.
claude-sonnet-5 and claude-opus-5-5 have a restriction: a request may be rejected with a 400 error if temperature is anything other than 1 or top_p is below 0.99. For these models, don't change temperature and top-P. For GPT and GLM you can tune parameters, checking the results on test requests.
Local and cloud models in one window
Jan's main convenience is having local and cloud models in one interface. The practical differences:
| Local models | Cloud models via Zukko | |
|---|---|---|
| Cost | tokens are free, uses your computer's resources | per token, from a dollar balance |
| Internet | not needed | needed |
| Data | stays on your computer | goes to Zukko and the model provider |
| Context | depends on the model and your RAM | 1M for Claude and GPT, 128K for GLM |
| Speed | depends on hardware | depends on the model and load |
A practical approach: sensitive data and offline work on a local model, everything else wherever the results satisfy you. Check which model handles your tasks yourself: ask the same 10–20 questions to a local model and one or two cloud models and compare the answers.
Choosing a cloud model by price
| Model | Input / output, $ per 1M tokens | Context |
|---|---|---|
claude-opus-5-5 | 0.3 / 0.3 | 1M |
claude-sonnet-5 | 0.3 / 0.3 | 1M |
gpt-5.6-sol | 0.3 / 0.3 | 1M |
gpt-5.6-luna | 0.1 / 0.1 | 1M |
glm-5.3 | 0.1 / 0.1 | 128K |
glm-5.3-flash | 0.04 / 0.04 | 128K |
A monthly example: 20 requests a day for 30 days, each with 2,000 input and 600 output tokens. That's 600 × 2,600 = 1,560,000 tokens:
claude-sonnet-5: 1,560,000 × $0.3 / 1,000,000 = $0.468;gpt-5.6-luna: 1,560,000 × $0.1 / 1,000,000 = $0.156;glm-5.3-flash: 1,560,000 × $0.04 / 1,000,000 = $0.0624.
You can top up from $1 via SBP, a Russian bank card or crypto.
Troubleshooting
Requests fail immediately
Per the Jan docs, this points to the wrong API format. For https://api.zukko.pro/v1, choose OpenAI-compatible.
404 on every request
Base URL is missing /v1. It must be exactly https://api.zukko.pro/v1.
401 or 403
401 means the key was copied partially or deleted in the dashboard; check it with Test keys. 403 model_not_allowed_for_key means the model isn't on the key's allowed list; add it in the key settings.
400 on Claude models
Temperature or top-P was changed. Restore the defaults (see the sampling section).
Models didn't appear in the list
If Jan couldn't fetch the model list, add the IDs manually with the + button.
402, 429, network error
402 means the balance ran out. 429 means too many requests; wait or retry later. Network error — check your internet connection and whether a firewall blocks api.zukko.pro. Details are in Jan's logs.
FAQ
Can I use Jan offline?
Yes, but only with local models. Zukko's cloud models need access to api.zukko.pro.
Does Zukko see my local chats?
No. Only requests to cloud models go to Zukko; conversations with local models stay on your computer.
How do I cap spending?
Set daily and monthly limits and an allowed-models list on the key in the dashboard. How limits work is described in the key limits documentation.
Where do I get a key?
Create one in the Zukko dashboard. The full key is shown only once, so paste it into Jan right away.
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
- Prompt Injection: What It Is and How to Protect a Bot and an AgentHow prompt injection works through user input and third-party documents, and which measures limit the damage: data isolation, tool permissions, key limits.
- Your Own Neural Network Proxy on Node.js: Keep the API Key Off the FrontendA small Express server between your frontend and the model API: the key stays on the server, and models, request size and rate are capped.
- DeepSeek API in Python: Requests, Streaming, JSON and Error HandlingReady code for DeepSeek V4.1 Flash and V4 Pro on the OpenAI SDK: a request, streaming, JSON parsing and careful error handling.
- Prompt Engineering Examples: 12 Ready-Made Templates for WorkTwelve prompt templates for everyday tasks: what each one says, why it is built that way, and what a single API call costs.