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:

  1. Open Settings → Model Providers.
  2. Click the Add Provider button next to the provider list.
  3. In the Add Custom Provider dialog, choose the API format OpenAI-compatible (the default).
  4. Fill in the fields: Provider name — Zukko, Base URL — https://api.zukko.pro/v1, API key — your fetch_... key.
  5. Click Create.
  6. Check the model list. On save, Jan requests {base_url}/models; Zukko serves the list at GET /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 example claude-sonnet-5.
  7. Start a new chat and pick a model from the Zukko provider in the model list.
FieldValue
API formatOpenAI-compatible
Provider nameZukko
Base URLhttps://api.zukko.pro/v1
API keyfetch_your_key
Modelsclaude-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 modelsCloud models via Zukko
Costtokens are free, uses your computer's resourcesper token, from a dollar balance
Internetnot neededneeded
Datastays on your computergoes to Zukko and the model provider
Contextdepends on the model and your RAM1M for Claude and GPT, 128K for GLM
Speeddepends on hardwaredepends 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

ModelInput / output, $ per 1M tokensContext
claude-opus-5-50.3 / 0.31M
claude-sonnet-50.3 / 0.31M
gpt-5.6-sol0.3 / 0.31M
gpt-5.6-luna0.1 / 0.11M
glm-5.30.1 / 0.1128K
glm-5.3-flash0.04 / 0.04128K

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.

Get API keyDocumentation

api.zukko.pro · fetch_*

Jan AI: connect cloud models through your own API provider · Zukko