2026-10-13
Gemini 3.8 Flash now honors reasoning_effort on chat completions, and its thinking shows in usage
OnPOST /v1/chat/completions, the reasoning_effort you send to
gemini-3.8-flash (low, medium, high) now reaches the model. Before,
it was dropped and the model always thought at its default level.
reasoning.effort and reasoning.max_tokens work too. Gemini 3.8 Flash
cannot switch thinking off, so none and minimal run at low, its lowest
level. Thinking still counts toward max_tokens.
The thinking the model does is now billed as output. It appears in
usage.completion_tokens, with the split in
usage.completion_tokens_details.reasoning_tokens, the same shape as every
other reasoning model on Kyma. Before this fix those tokens were missing from
usage and from the charge.
Who: all plans
Learn more: gemini-3.8-flash on Kyma · Chat Completions API
2026-10-09
Generate images with GPT Image 2.5 Flare, which keeps a character consistent across reference images
gpt-image-2.5-flare, OpenAI’s GPT Image 2.5 in its everyday-generation
variant, is now on POST /v1/images/generations. It takes a prompt plus
optional image_url / image_urls references and the same quality
tiers as gpt-image-2; each reference image adds $0.012 once per request,
and up to 16 references are accepted.
- Keep one character across a series — pass a few reference photos and get the same face and details in new scenes
- Render exact text — wordmarks, slide titles and social cards spelled as written
- Edit from a reference — change setting, lighting or outfit while the subject stays the same
400 invalid_parameter — size is not available for gpt-image-2.5-flare; use 1024x1024, 1024x1536, 1536x1024 or auto.
Learn more: gpt-image-2.5-flare on Kyma · image-generation on Kyma · Images Generations API
Generate cinematic video clips with Kling 3 Pro, from a prompt or from a first-frame image
kling-3-pro, Kuaishou’s flagship Kling 3 Pro, is back on
POST /v1/videos/generations. Send a prompt for text-to-video, or add
image_url to use an image as the first frame. Clips are 3 to 15 seconds,
silent, billed per second and refunded in full if a job fails.
- Hero shots — photoreal people and smooth camera motion for brand video
- Animate a still — pass a product photo or portrait as
image_urland the prompt drives the motion - Predictable price — only
cfg_scaleis read fromextra, so the clip you get is the one the price was held for
Turn one portrait and one voice or song track into a lip-synced talking or singing clip
kling-avatar-v2-pro, Kuaishou’s Kling AI Avatar v2 Pro, is now on
POST /v1/videos/generations. Send image_url (the face), audio_url
(the speech or song, as PCM WAV for now) and duration_s (your audio’s length, rounded up).
The clip runs as long as the audio, plays it unchanged, and is billed per
second of the finished clip; duration_s caps the charge.
- Talking heads from a photo — a presenter or narrator speaking your recording
- Lip-synced singing — a character singing your own track, real vocal kept
- Any language — the mouth follows the audio itself, not a transcript
400 invalid_parameter — kling-avatar-v2-pro accepts WAV PCM only for now: audio_url must be an uncompressed PCM .wav file, not MP3, M4A, AAC or OGG.
Learn more: kling-avatar-v2-pro on Kyma · video-generation on Kyma · Videos Generations API
Generate a full song with vocals from a prompt and your own lyrics, in Vietnamese or any other language, with Lyria 3.5
lyria-3.5, Google’s music model, is now on POST /v1/audio/music. Send a
style prompt and optional lyrics; you get back an MP3 song with vocals,
up to a couple of minutes long, at a flat $0.108 per song. Length and
structure are steered in the prompt.
- Sing your own lyrics — Vietnamese lyrics come back sung in order
- One price per song — no per-second meter, so a longer take costs the same
- Not charged when no song comes back — a prompt the safety filter refuses costs nothing
400 invalid_request — lyria-3.5 returns MP3 only; omit response_format or pass “mp3”.
Learn more: lyria-3.5 on Kyma · audio on Kyma
Generate video again, including clips with native speech and sound, with Veo 3.1 Fast
Video generation is back onPOST /v1/videos/generations with veo-3.1-fast,
Google’s Veo 3.1 Fast: 720p clips of 4, 6 or 8 seconds with native audio,
including spoken dialogue. It takes an optional image_url as the first frame,
bills per second of footage, and refunds a failed job in full.
- Clips that talk — dialogue, ambient sound and lip-sync from one prompt
- Start from your own frame — pass
image_urlto animate a still - Vertical or wide —
aspect_ratio16:9or9:16
404 model_not_found — still returned for every other video id, which stay paused
Learn more: veo-3.1-fast on Kyma · video-generation on Kyma · Videos Generations API
A failed image, video or audio job on the Logs page now shows the same error code as GET on the job
GET /v1/auth/usage/logs returns, on a failed media row, the coded
error that GET on the job already returns (provider_unavailable,
provider_timeout, content_policy, provider_error, …), instead of
free text. A succeeded job carries no error.
Who: all plans
Learn more: Errors API
2026-10-08
Three media model ids that can no longer be served are retired, so no page, alias or example offers a model that cannot answer
nano-banana is retired: Google shut down the model behind it on 2026-10-02. Use nano-banana-3-flash, which the retired-model error names. minimax-music and minimax-music-pro, paused since 12 September, are retired because the music API behind them no longer serves new accounts. gemini-3-flash-audio, the only model on /v1/audio/understand, is retired after 90 days without a customer request; the audio-understand alias is removed with it, and the endpoint now answers every request with the retired-model error and charges nothing. Transcription is unchanged.
Who: all plans
Error: nano-banana, minimax-music, minimax-music-pro and gemini-3-flash-audio return the standard retired-model error (404 model_not_found); /v1/audio/understand returns it for every request, including one with no model
Learn more: nano-banana-3-flash on Kyma · audio on Kyma · Audio Understand API
2026-10-07
/v1/messages honours the Anthropic thinking parameter and returns the model’s reasoning as thinking content blocks, streamed and not
thinking: {"type": "enabled", "budget_tokens": N} on /v1/messages used to be ignored. It now asks the model to reason with a budget of N tokens ({"type": "adaptive"}, or enabled without a budget, asks without a cap). The budget is sent on the first turn of a conversation only: when the history already carries an assistant thinking, redacted_thinking or tool_use block, the request goes out exactly as it did before this change, because those thinking blocks cannot yet be handed back to the model. When the model returns its reasoning, the response carries it as a thinking block before the text and tool_use blocks, with an empty signature; a streamed response sends it as content_block_start / thinking_delta / content_block_stop ahead of the text and tool_use blocks, whose indexes shift by one. Models that do not expose their reasoning answer as before, with no thinking block. A reasoning budget, on /v1/messages or as reasoning.max_tokens on /v1/chat/completions, is now always lowered to one below the output cap actually sent to the model, so a budget larger than the output cap is no longer rejected. Reasoning tokens are billed as output tokens, as they already were.
Who: all plans
Learn more: Messages API
2026-10-06
Your unverified accounts and API keys are now strictly protected from unauthorized changes.
Signing in with an external provider now securely reclaims an unverified account instead of sharing it with whoever set the password. Additionally, attempting to toggle an API key you do not own correctly returns an error instead of silently succeeding. Who: all plans Error: 400 API key not found Learn more: Auth Keys API · Auth Login APIYou will no longer accidentally accumulate debt when running embeddings or reranking with an empty balance.
Embedding and reranking requests now check your credit balance before calling the provider. If your account lacks sufficient funds, the request is refused immediately instead of processing and adding to your debt. Who: all plans Error:402 insufficient_credits
Learn more: Credits Balance API · Embeddings API · Rerank API
2026-10-04
12 prices fall and 7 rise — every one computed from what the request actually costs to serve
12 models get cheaper.
7 models go up, because they now cost more to serve than their prices covered.
Prices are computed from real serving costs — they can fall, and never rise without notice.
Who: all plans
Numbers: 12 fall, 7 rise — table in the body
Learn more: Pricing
The default API key can now be disabled and deleted like any other, and the key list comes back newest first instead of in whatever order Postgres felt like
GET /v1/auth/keys had no ORDER BY on either runtime, so the dashboard list
reshuffled between reloads. It is created_at DESC, key DESC now, in one place
(src/api-keys.ts) that Bun and the Worker both call.
Deleting the default promotes the newest enabled key left; if the account has no
enabled key left, a fresh default is issued the way signup issues one. The
DELETE response names whichever it is, masked, as new_default. Deleting first
and promoting second is deliberate: uq_api_keys_default_per_user is a partial
unique index and PostgREST has no transaction to wrap the two writes in.
A disabled default is now skipped by every surface that resolves “the default
key” (chat, muse, the playground, MCP tool calls, and the billing attribution
for session-authenticated audio and media jobs) in favour of the newest enabled
key. Before, disabling the default pointed all of them at a credential that
would 401.
Who: every account, on the dashboard and the API
Error: 400 not_found — “Key not found”. The old 400 default_key_not_deletable (“The default API key cannot be deleted. Use Rotate to change its secret.”) is gone from both runtimes, and so is the Rotate action it pointed at, which never existed
Learn more: Auth Keys API
A kyma-gen run that takes longer than the sync wait now keeps going to its result instead of stopping with a timeout
POST /v1/genmedia/run waits up to 25 seconds for the image or video to finish. Most generations take longer than that, and until now the call then answered 504 while the job kept running and was charged when it finished, so kyma-gen run stopped with an error and never showed the result. The call now answers 202 with the job’s status (IN_QUEUE or IN_PROGRESS), its request_id, a hint pointing at GET /v1/genmedia/jobs/<request_id>, and estimated_cost (the hold) with charged_amount and refunded_amount still null. kyma-gen run keeps polling from there and prints the finished result. Nothing changes in what a job costs.
Who: all plans
Numbers: the sync wait on POST /v1/genmedia/run stays 25 seconds; after it you get the job’s request_id and status to poll
A refusal is never answered by another creator’s model under the name you asked for
When a route returns HTTP 403 for the model you named, Kyma still tries that model’s other routes. If it falls back further, it now only considers models from the same creator, so a refusal is never completed by a different creator’s model under the name you asked for. When nothing serves, the response is 403route_refused with up to three suggested_models.
Who: anyone whose request was refused (HTTP 403) by the model they asked for
Numbers: measured 14 days to 2026-09-12 — 213 requests from 13 accounts asked for one model and were answered by another after a 403
Error: 403 route_refused — error.suggested_models lists up to three other model ids, same creator preferred
Learn more: Routing guide
When Kyma falls back to another model, the bill follows that model’s price and never exceeds the price of the model you asked for
Layer 3 can answer with a different model when every route for the one you asked for fails. The ledger used to charge the requested model’s rate either way. It now charges the served model’s rate, capped at the requested model’s published price — an upgrade is on Kyma, a downgrade saves you money. Who: anyone whose request was answered by a different model than the one they asked for Numbers: a cheaper substitute costs less; a dearer one is capped at the requested list price Learn more: Routing guide2026-09-29
Creating, disabling and deleting API keys now requires a dashboard session, so a leaked API key cannot mint new keys that outlive it
POST /v1/auth/keys, PATCH /v1/auth/keys/{key}/toggle and DELETE /v1/auth/keys/{key} now accept a signed-in dashboard session only. An API key gets 403 with code session_required; manage keys at kymaapi.com/keys. GET /v1/auth/keys is unchanged: it still takes an API key and masks the secrets for it.
Who: all plans
Numbers: 3 key-management endpoints, on both backends
Error: 403 session_required when an API key creates, disables or deletes a key
Learn more: Auth Keys API
2026-09-28
Audio understanding is billed from the audio itself, so the price no longer depends on a duration you type
POST /v1/audio/understand used to take its billed length from the optional duration_sec field. It now measures the audio: the balance check reserves for the longest the uploaded file could be, and the charge is the input the model actually consumed, which includes your question. duration_sec is still accepted so existing clients keep working, and it is ignored. A 30-second clip with a short question still costs one minute. Questions longer than 4,000 characters are refused with a 400 before anything is charged. billing.duration_source now reads upstream_usage (or file_bound when the model reports no usage).
Who: all plans calling POST /v1/audio/understand
Numbers: same $0.002592 per minute; the billed length is the input the model consumed (audio plus question); question is capped at 4,000 characters
Error: 400 invalid_parameter (param question): question is too long; 402 insufficient_credits when the balance cannot cover the file’s maximum length
Learn more: Audio Understand API
2026-09-24
Every API error now carries a stable string code, a category, whether to retry, a link to its docs entry and a request id you can quote to support, and /v1/messages answers every error in Anthropic’s own format
API errors now share one shape.error.code is always a stable string, for example missing_api_key, insufficient_credits, rate_limit_exceeded or provider_unavailable; it used to be the HTTP status number on /v1/chat/completions. error.type is now the category (authentication_error, billing_error, rate_limit_error, upstream_error, …), where it used to hold the machine code on some endpoints. Each error also carries param, retryable, doc_url and request_id.
Every response carries an x-request-id header; quote it when you contact support. Error responses also carry x-should-retry, which the OpenAI and Anthropic SDKs read before deciding to retry.
A 402 has the same body on every endpoint: error.type is billing_error, error.code is model_requires_paid or insufficient_credits, and balance, required, topup_url, details and topup are present on /v1/chat/completions too. On /v1/messages every error, including 401, 404 and 503, now uses Anthropic’s envelope ("type": "error", an Anthropic error.type) with the Kyma code beside it.
If your client matched the old values, the mapping is: auth_required → missing_api_key, invalid_credentials → invalid_api_key, invalid_request → invalid_json, missing_parameter, invalid_parameter or wrong_endpoint, server_error → service_unavailable or internal_error, insufficient_balance → insufficient_credits.
Who: all plans
Error: error.code is a string from the published code list (never the HTTP status); error.type is the category (authentication_error, billing_error, rate_limit_error, …); new error.param, error.retryable, error.doc_url, error.request_id; headers x-request-id on every response and x-should-retry on errors
Learn more: Chat Completions API · Messages API · Error Handling guide
A stream that fails after it has started now ends with a clear, retryable error instead of passing through the upstream’s own message, and /v1/messages clients see a proper error event
When a model fails after a streamed response has started, the error chunk onPOST /v1/chat/completions now carries error.code: "stream_interrupted" and error.type: "upstream_error" with a fixed message; retry the whole request. On POST /v1/messages the same failure now arrives as an Anthropic event: error (overloaded_error, code: stream_interrupted), so Anthropic SDKs raise it instead of treating the stream as a short answer. A failed signup answers 500 signup_failed with a fixed sentence.
Who: all plans
Error: chat stream chunk error.code: stream_interrupted (type: upstream_error); /v1/messages stream event: error with error.type: overloaded_error, code: stream_interrupted; 500 signup_failed returns a fixed sentence
Learn more: Chat Completions API · Messages API
2026-09-22
Billing settings and admin now require a dashboard session, so an API key used for inference cannot change auto top-up, saved cards or billing details
/v1/billing/settings, /v1/billing/payment-methods, /v1/billing/setup-intent, /v1/stripe/portal, /v1/stripe/setup-checkout, /v1/stripe/receipt and /v1/stripe/verify now accept a signed-in dashboard session only. An API key gets 403 with code session_required; manage billing at kymaapi.com/billing. Inference, balance, usage and gift-code redemption are unchanged.
Who: all plans
Numbers: 9 billing endpoints, on both backends
Error: 403 session_required when an API key calls a billing settings endpoint
Learn more: Pricing
Tier rows in GET /v1/auth/limits report audio concurrency per capability, the same shape GET /v1/limits/tiers already uses, and four error answers now tell you what to do instead of carrying internal routing details
GET /v1/auth/limits now returns each rung in all_tiers and next_tier with audio_concurrent_per_capability (transcription, understanding, speech), matching GET /v1/limits/tiers. Every other tier field, including min_spend, is unchanged.
Four error answers were tightened. The 429 for a full audio pool keeps code: audio_concurrent_limit and retry_after_seconds: 5, and its message no longer names an internal pool. A model with no available route answers 503 model_unavailable on both /v1/chat/completions and /v1/messages, and points to GET /v1/models. GET /v1/audio/voices answers a fixed sentence when the voice list cannot be fetched. Responses on paths we forward internally, including WebSocket upgrades, no longer carry hosting headers.
Who: all plans
Error: 429 audio_concurrent_limit keeps its code and retry_after_seconds; 503 model_unavailable on POST /v1/chat/completions and POST /v1/messages when a model has no available route right now; 502 on GET /v1/audio/voices returns a fixed sentence
Learn more: Auth Limits API · Limits Tiers API · Audio Voices API
Request logs show which key made each call by its name and last six characters; logs no longer return full key strings
GET /v1/auth/usage/logs identifies the key behind each row with api_key_name and api_key_hint (its last six characters), plus key_source (api_key or session). The api_key_id field is gone from the response; logs no longer return full key strings. The Logs page and its CSV export read the new fields.
Who: all plans
cancelling tells you plainly when a job can no longer be stopped, instead of reporting it cancelled
Cancelling a job that has already started now returns 409 with the codejob_already_started, and the job finishes and is billed as usual. A job that is still waiting in the queue can be cancelled as before, and its hold is returned in full.
Who: all plans, anyone who cancels a media job with POST /v1/genmedia/jobs//cancel or kyma-gen status --cancel
Error: 409 This job has already started and can no longer be cancelled (code job_already_started)
Sending an embedding or reranking model to /v1/messages returns a clear 400 naming the right endpoint instead of a chat answer
/v1/chat/completions already refused embedding and reranking models by name. /v1/messages only refused decisions models that way, so an embedding or reranking model sent there went on to a chat call and could come back with a chat answer where a vector or a ranking belonged (W37-1799). It now answers 400 with the endpoint to use, before any model call and without a charge, using the same rule as /v1/chat/completions.
Who: all plans calling POST /v1/messages
Error: 400 invalid_request, “Model '' is an embedding model and does not produce chat completions. Use POST /v1/embeddings instead.” (POST /v1/rerank for a reranking model)
Learn more: Messages API
GET /v1/auth/limits now shows how many requests and tokens you have used this minute, ?tools=true on GET /v1/models lists only models that can call tools, and chat responses carry usage.cached_tokens on every call
Three answers from the API did not match what the docs promised:
- Know your headroom before you hit a 429 —
GET /v1/auth/limitsreturns this minute’srpm_usedandtpm_used, withrpm_remainingandtpm_remainingas the limit minus them andresets_atat the start of the next minute. Checking your limits does not use up a request. - Filter the catalogue by what a model can do —
GET /v1/models?tools=trueand?structured_outputs=truereturn exactly the models whosesupports_tools/supports_structured_outputsistrue. - Read cache hits in one place — every
/v1/chat/completionsresponse, streamed or not, carriesusage.cached_tokens: the cached input tokens the request was priced with,0when nothing was cached.prompt_tokens_detailsis still passed through as the model sent it. No price changed.
?tools=true drops from 97 rows to 67 and ?structured_outputs=true from 98 to 67 (the removed rows are image, embedding and speech models, which said supports_tools: false in the same response); rpm_used and tpm_used were always 0 and now read the live per-minute counters
Learn more: Auth Limits API · Models List API · Prompt Caching guide · Error Handling guide
2026-09-21
Grok 4.7, xAI’s newest flagship for coding, agentic tasks and knowledge work, is callable as grok-4.7 with a 500K context window and image and file input
grok-4.7 is xAI’s Grok 4.7, released 2026-09-21: a 500,000-token context window, text, image and file input, reasoning at low to xhigh effort, tool calling and structured outputs. It costs 6.48 per million tokens, and 12.96 once a single prompt passes 200,000 tokens. Cached input tokens cost $0.54 per million. Like grok-4.6, it needs a funded account: the signup credit does not cover it. grok-4.6 and grok-4.5 stay available.
- Move a Grok agent to the newest release: change the model id from
grok-4.6togrok-4.7 - Run a long coding task in one call: send up to 500,000 tokens of code, images or files in one request
- Pin an older release while you compare: keep
grok-4.6in production and route a test slice togrok-4.7
model_requires_paid for an account that has not topped up, the same gate grok-4.6 already has; no new error
Learn more: xai on Kyma
An image or video job now shows the same cost on every endpoint that returns it, and says how much of the hold came back
POST /v1/images/generations, POST /v1/videos/generations, GET /v1/jobs and GET /v1/jobs/:id now read estimated_cost and charged_amount from your account ledger, the same numbers /v1/genmedia/* reports, and add refunded_amount. Before, these endpoints showed the job’s price estimate at 6 decimals while the ledger held it at 4, so one job could read 0.0608 on /v1/genmedia/jobs/:id. estimated_cost is null while a job is queued and nothing is held yet.
Who: all plans
Numbers: three fields, estimated_cost (the hold), charged_amount and refunded_amount, in USD at the ledger’s 4 decimals
Learn more: Images Generations API · Videos Generations API
The catalogue, pricing, docs and llms.txt stop offering two models Google is shutting down, so nobody starts new work on them, while existing calls keep working until each retirement date
nano-banana and gemini-2.5-flash are no longer listed in /v1/models, /v1/pricing, the models pages, the docs or llms.txt. Google retires both: nano-banana on 2026-10-02 and gemini-2.5-flash on 2026-10-20. Until those dates both ids keep answering at the same prices, so existing integrations are unaffected. From each date the id returns the standard retired-model error naming its replacement: nano-banana-3-flash for image generation and editing, gemini-3.6-flash for text.
Who: anyone calling nano-banana (retires 2026-10-02) or gemini-2.5-flash (retires 2026-10-20)
Numbers: nano-banana retires 2026-10-02, use nano-banana-3-flash; gemini-2.5-flash retires 2026-10-20, use gemini-3.6-flash, or gemini-3-flash (the long-context alias)
Error: both ids keep answering until their dates; from each date the id returns the retired-model 404 naming its replacement
Learn more: nano-banana-3-flash on Kyma · gemini-3.6-flash on Kyma · gemini-3-flash on Kyma
2026-09-20
When every provider for a model is failing, you get 503 with Retry-After instead of a 500 with no guidance, and the failure shows up in your request log
When Kyma tries several providers for a model and every one of them fails with a retryable error, the answer is meant to be503 with Retry-After: 5 — enough for an SDK to back off and try again. Instead it was a bare 500 with no header, and the failure never reached your request log, so it could not be found afterwards. An SDK that honours Retry-After was retrying a provider outage immediately.
It only happened when every attempt was retryable; a request rejected on its own merits, such as a malformed body, broke the chain earlier and answered correctly. Those requests are unchanged: they still return their own status.
Who: all plans
Numbers: one retry hint, Retry-After 5 seconds, on both /v1/chat/completions and /v1/messages
Error: 503 provider_unavailable with Retry-After: 5 where an all-retryable chain used to answer 500 and no header; a request rejected on its own merits still returns its own status
Learn more: Routing guide
Every kyma-gen generation now tells you what it held, what it charged and what it gave back, including when you cancel it
POST /v1/genmedia/run, POST /v1/genmedia/jobs, GET /v1/genmedia/jobs/:id and POST /v1/genmedia/jobs/:id/cancel now carry estimated_cost, charged_amount and refunded_amount, read from your account ledger. estimated_cost is the hold placed when the job was accepted; charged_amount and refunded_amount appear once the job is settled, and are null while it is still running. A cancelled job reads charged_amount: 0 with the hold in refunded_amount. A finished run also sends the charge in the X-Kyma-Cost-USD header.
Who: all plans
Numbers: three fields, estimated_cost (the hold), charged_amount and refunded_amount, in USD at the ledger’s 4 decimals
POST /v1/messages now tells you what a non-streamed call cost, and browser code can finally read Kyma’s response headers
POST /v1/messages charged for a call and never said what it cost: Anthropic’s response shape has no field for a price, and no header carried one either. A non-streamed call now answers with X-Kyma-Cost-USD, the header the audio routes already use. It is the charge we compute for that call and hand to the ledger, shown to eight decimal places; the ledger records to four, so a sub-cent figure can differ slightly from the line that lands in your usage log. A call that fails over to our secondary runtime, which you can see in X-Kyma-Served-By, may not carry it. A streamed call still carries no price: its headers are sent before the first token and the final amount is only known after the last one, so read that one from GET /v1/auth/usage/logs.
Browser code could not read any of this. A CORS response hides every header but a handful unless the server lists them, and Kyma listed seven on the two chat paths and none anywhere else — so a web app could not see which model answered, what it paid, or how long to wait after a 429. Every endpoint now serves the same list — on both runtimes, so a failover does not change what your code can read — covering the model, the served model, the alias, the price, the balance, the routing counts and Retry-After.
Who: all plans
Numbers: one cost figure per call, up to 8 decimal places in USD; 17 headers listed for browser callers, where the chat paths listed 7 and every other endpoint listed none
Learn more: Routing guide
A request the fallback cannot serve now gets a clear 400 telling you to call the primary endpoint, instead of an unexplained 500
Three things this makes possible:- Know why the call failed — the answer names the reason and the fix (use
/v1/chat/completionsfor:onlinemodels, or drop:online) instead of a bare server error. - Stop retrying something that will never work — a 400 tells an SDK not to retry; a 500 invites it to try the same request again.
- Tell a real outage from a request the fallback does not support — a 500 used to mean both.
/v1/messages refused an unsupported :online model by calling a function that did not exist in the file, so the refusal itself crashed. The crash only reached callers that went to the fallback host directly; measured on production before the fix: 500.
Web search is served on /v1/chat/completions. It is not served on /v1/messages on either backend, and the refusal now says so and names the surface that does search.
Who: anyone calling /v1/messages with a web-search (:online) model on the fallback backend
Error: 400 invalid_request_error “web search is not available on the Messages API”, where it used to answer 500 Internal server error
Learn more: 1038
Kyma stops advertising video models it no longer serves — the description you read now lists exactly what the catalogue can do
The video models were retired on 12 September. The sentence describing Kyma — onGET /v1/config, the homepage, the compare page, the pricing page, the glossary and the press kit — still said “chat, reasoning, image, video and audio”, so six places were offering something no key could reach.
That sentence is now generated from the model list itself. If a kind of model has nothing behind it, it is not named; when one is added, it appears without anyone remembering to write it in. A check in the build fails if any public page starts advertising a kind the catalogue cannot serve.
Who: all plans
Numbers: six surfaces corrected; the sentence is generated from the live model list instead of written by hand
Learn more: Models List API
A public Muse share link no longer carries the account id of whoever shared it, and neither do the URLs of files you upload
Sharing a generation gives out a link anyone can open, and the response behind it is built to say nothing about who made it: no account field, no email, no key. The file’s own URL undid that, because it was stored under a path that began with the sharer’s account id — so the id travelled with every share, and with the URL of every file a customer uploaded. Files are now stored under the job id, or for uploads under a random id that means nothing on its own. Both were already enough to find the file; neither says whose it is. Links created before this change still work exactly as they did, and still carry the older path. Who: all plans Numbers: two storage paths changed, one segment shorter; existing links keep working unchanged Before:A streamed turn that answers with a tool call or with reasoning is now charged and logged like any other, instead of silently costing nothing and leaving no record
Most providers report token counts at the end of a stream. When one does not, Kyma estimates from the length of what the model wrote — and it was only counting prose. An agent turn writes its whole answer into a tool call, and a reasoning model can spend its output budget thinking before the first visible word, so both looked like empty streams: no charge, and no entry in your request log at all, which meant they could not be found afterwards by you, by us, or by the model health checks. Those turns are now measured like any other: the estimate counts the tool call’s name and arguments, the reasoning, and a refusal, alongside the text. If your traffic is agent-shaped and hits a provider that reports no usage, you will see those requests appear in your log and on your bill where previously they were missing. A stream where the model wrote nothing and the provider reported no tokens at all is not charged, and now leaves a $0 row so the request is visible rather than vanishing. Two things still cost: if the provider reported input tokens, those are charged as they always were, because your prompt reached the model whether or not an answer came back; and during a failover to our secondary runtime — which you can see inX-Kyma-Served-By — such a call is charged an estimate for the prompt rather than nothing.
Who: all plans
Numbers: tokens estimated at about 4 characters each when a provider sends no usage figures, marked token_source: content_length on the request log
Learn more: Routing guide
The welcome email, the repo’s front page and the fallback backend’s own description stop naming a kind of model nobody can buy
Video generation was paused on 2026-09-12 and no video model has been listed since. W37-636 fixed the six web surfaces that still advertised it; a cross-vendor review of that work found three more places nobody had walked, and this closes them. The welcome email — sent to every new account, on both runtimes — said “one endpoint for chat, images, video and audio”. The README said the catalogue held 10 video models.GET /v1/config and /health on the Bun fallback carried a hardcoded “chat, reasoning, image, video, and audio” tagline; the Workers copy of the same field already derives from the registry, so the two backends disagreed about what Kyma sells.
The tagline now derives from listModels(), which src/routes/system.ts already imports. It is inlined rather than taken from src/media-kinds.ts because check:no-new-railway-surface freezes which modules src/routes/* may import, and widening that manifest is an owner decision (W37-1223). The README’s counts are measured, dated, and point at GET /v1/models as the live answer.
Who: everyone who signs up, plus anyone reading the README or GET /v1/config on the fallback path
Numbers: the README’s model breakdown was wrong in both directions — it listed “10 video” (there are none listed) and its own categories summed to 123 while the sentence said 103; it now reads 70 language/reasoning, 11 embedding, 10 image, 5 speech, 4 transcription, 1 reranking, 1 audio-understanding, 1 decisions = 103
Learn more: 1397
2026-09-19
A model that answers a question with a choice and a confidence instead of prose, at POST /v1/decisions
Some calls are not writing tasks. Should this command run? Which model should serve this request? Is this ticket a bug or a feature? Those are choices, and a model that answers them in prose leaves you parsing the prose back into a choice.POST /v1/decisions answers them as choices. You send the state and your questions, each with its options; every question comes back with one of your options, a confidence between 0 and 1, and the probabilities across the options. The first model behind it is jev, now in the catalogue like any other model, with its price on /v1/models.
- Route a request — ask which tier should serve it, act on the answer above a confidence you pick, and send the rest to a full model.
- Gate an action — ask whether a command or a tool call should run, and escalate the uncertain ones to a human or a larger model.
- Rate or label — sort tickets, messages or documents into buckets you define in the request itself, with no fine-tuning.
/v1/chat/completions returns 400 for it. Billing is per input token at the published rate, rounded up to the nearest $0.0001 — the smallest amount the ledger holds, so short decisions cost that rather than rounding to nothing — output is free, the response quotes exactly what is taken, and a failed call is not charged.
Who: all plans
Numbers: 0.0001 (the ledger’s smallest unit); p50 144 ms measured over 10 real calls
Error: 400 when the body is not a state plus choice questions, or names a model other than jev; 502 when the upstream answer cannot be read, 503 when we cannot read your account to price the call, and neither is charged
Before:
Muse Spark 1.3, Meta’s release after 1.2, is callable as muse-spark-1.3 with a 1M context window and multimodal input
muse-spark-1.3 is Meta’s Muse Spark 1.3, released 2026-09-02: 1,048,576-token context, text, image, video, file and audio input, reasoning, tool calling and structured outputs. It costs 5.738 per million tokens, the same as muse-spark-1.2, and like 1.2 it needs a funded account: the signup credit does not cover it. muse-spark-1.2 and muse-spark-1.1 stay available.
- Move a Muse Spark agent to the newest release — change the model id from
muse-spark-1.2tomuse-spark-1.3and keep the same price - Reason over a long file set in one call — send up to 1,048,576 tokens of text, images, video, files or audio in one request
- Pin an older release while you compare — keep
muse-spark-1.2ormuse-spark-1.1in production and route a test slice tomuse-spark-1.3
model_requires_paid for an account that has not topped up, the same gate muse-spark-1.2 already has; no new error
Learn more: meta on Kyma
Transcription checks your balance against the file you sent, before the audio leaves Kyma, and a transcription Kyma has already paid for is always charged instead of being refused afterwards
POST /v1/audio/transcriptions checks your balance against the file in hand. Until now that check asked for one billing minute whatever the file’s length, because the six other audio endpoints read their body after it; a balance of a tenth of a cent could therefore start a two-hour transcription. The check now asks for the file’s own length: the containers that state their own length are read for it — a WAV header’s byte rate, FLAC’s STREAMINFO, the last page of an Ogg stream — from the file itself rather than from the content type. A header whose fields do not agree with each other is not trusted, and a declared length can only raise the amount reserved, never lower it, so editing one does not buy a cheaper admission. Anything else (WebM, MP4) is reserved at 6 kbps, the floor of the codecs Kyma accepts for speech; a file in one of those can still hold more audio than that implies, since silence costs almost nothing to encode, so the reservation there is a check rather than a guarantee. Short clips and uncompressed uploads are unaffected — they still reserve the one-minute minimum.
The second half is what happens after the provider has answered. Kyma used to re-read your balance at that point and, if it had fallen below the cost in the meantime, return 402 and charge nothing — so the work was done, Kyma had paid for it, and no record existed. That request is now charged like every other, which can take a balance slightly below zero exactly as it can on /v1/chat/completions; the next request is refused until you top up. What you are charged is unchanged: the duration the provider measures, at the model’s published per-minute rate. Sending a URL instead of a file still reserves one minute, since the length is not known until the provider fetches it.
Who: all plans
Numbers: WAV, FLAC and Ogg state their own length and are reserved exactly; anything else is reserved at 6 kbps; one minute is the floor either way, and the charge is still the duration the provider measures
Error: 402 insufficient_credits, naming need_usd and have_usd, returned before any upload
Learn more: Audio Transcriptions API
2026-09-13
A text document sent to /v1/messages now reaches the model, so the answer is about the document you sent instead of one the model never saw
POST /v1/messages now forwards Anthropicdocument blocks that have a text source to the model, together with the document’s title and context, including a text document returned inside a tool_result. Before this fix every document block was dropped on the way in: the model received the rest of the message only, answered as if there were no document, and usage.input_tokens left the document out. A document whose source is a PDF (base64 or url), a file reference or custom content now returns 400 invalid_request_error instead of being dropped. The balance check before the request counts a text document’s text like any other prompt text.
Who: all plans, anyone sending document blocks to POST /v1/messages from an Anthropic SDK or another Claude-compatible client
Error: 400 invalid_request_error when a document block has a PDF, url, file or custom-content source, which this endpoint cannot hand to a chat model; 402 insufficient_credits when the balance does not cover the document’s text, as for any other prompt text
Learn more: Claude Code guide
Images sent to /v1/messages now reach vision models, so the answer describes the picture you sent instead of one the model never saw
POST /v1/messages now forwards Anthropicimage blocks with a base64 or url source to the model, including images returned inside a tool_result. Before this fix those blocks were dropped on the way in: the model received only the text, answered as if there were no image, and usage.input_tokens counted the text alone. Text and images keep the order you sent them in. A model without vision (supports_vision: false on /v1/models) now returns 400 invalid_request_error naming the model instead of answering without the image, and GET /v1/models?input_modalities=image lists the models that accept images.
Who: all plans, anyone sending images to POST /v1/messages from an Anthropic SDK or another Claude-compatible client
Error: 400 invalid_request_error when a request carries an image and the model does not accept images, or when an image block uses a file reference instead of a base64 or url source
Learn more: Claude Code guide
A streamed /v1/messages response now ends with exactly one message_delta and one message_stop, and that message_delta reports input_tokens and output_tokens, so clients that track usage from the stream see the real numbers
A streamed POST /v1/messages response now closes with onemessage_delta and one message_stop. On some models the stream used to send that closing pair twice, the first time with output_tokens: 0, and on every model input_tokens stayed at 0 for the whole stream. The closing message_delta now carries both input_tokens and output_tokens from the model’s reported usage. Non-streaming responses are unchanged.
Who: all plans, anyone streaming POST /v1/messages from an Anthropic SDK, Claude Code or another Claude-compatible client
Learn more: Claude Code guide
tool_choice none and disable_parallel_tool_use now reach the model, so a request that says no tool calls, or one tool call at a time, gets that
POST /v1/messages now honourstool_choice: {"type": "none"} and disable_parallel_tool_use: true on any tool_choice. Before this fix both were dropped on the way to the model: a request with tool_choice set to none could still come back with a tool_use block, and a request that disabled parallel tool use could still get several tool calls in one turn. Requests without tools are unchanged.
Who: all plans, anyone sending tool_choice to POST /v1/messages from an Anthropic SDK or another Claude-compatible client
Learn more: Claude Code guide
during a promotion both endpoints now quote what the model costs today, with the list price beside it, instead of the list price alone
GET /v1/pricing now quotes each text model at the rate in force:input_per_1m and output_per_1m are the promotional rate while a promotion runs, and new list_input_per_1m and list_output_per_1m fields carry the list rate it returns to. They are always present and equal to the first pair when nothing is on offer, the same contract as GET /v1/credits/pricing. The cached input rate moves in the promotion’s proportion. GET /v1/models/recommend now prices each recommended model the way GET /v1/models does, with pricing at today’s rate and a promotion object (or null) beside it.
Who: all plans, anyone who reads prices from GET /v1/pricing or GET /v1/models/recommend
Numbers: gpt-5.6-sol read 27 per 1M on /v1/pricing while it sold at 13.50; no price changed, only what these two endpoints report
Learn more: Pricing Catalog API
A request the model rejects as invalid now returns that status (400, 413 or 422) instead of 503, so SDKs stop retrying a request that cannot succeed and the error says to change the request
When the model rejects a request as invalid, for example atemperature or top_p outside the range it accepts, POST /v1/chat/completions and POST /v1/messages now return that status (400, 413 or 422) with code: request_rejected and no Retry-After. They used to return 503 provider_unavailable with Retry-After: 5, which told clients to retry a request that fails the same way every time. A model that is actually unavailable still returns 503.
Who: all plans, anyone whose request to POST /v1/chat/completions or POST /v1/messages is rejected by the model as invalid
Error: 400, 413 or 422 with code request_rejected and no Retry-After, where the same request used to return 503 provider_unavailable with Retry-After
Learn more: Chat Completions API
turning parallel tool calls off now means at most one tool call per turn on every model, including models that ignored the setting
POST /v1/chat/completions withparallel_tool_calls: false, and POST /v1/messages with tool_choice.disable_parallel_tool_use: true, now return at most one tool call per turn. Kyma already passed the setting to the model, but some models ignored it and answered with two tool calls at once. Kyma now keeps the first tool call and drops the rest, in streaming and non-streaming responses. Requests that leave parallel tool calls on are unchanged.
Who: all plans, anyone who sends parallel_tool_calls false to POST /v1/chat/completions or disable_parallel_tool_use to POST /v1/messages
Learn more: Tool Calling guide
an oversized request is refused at once with a 413 that names its size, before Kyma reads the body, on every chat endpoint
POST /v1/chat/completions, /v1/messages and /v1/completions now answer 413 when the request declares a body larger than 25 MB, and they do it before reading the body. /v1/messages uses the Anthropic error shape. Requests under 25 MB are unchanged. Who: all plans, anyone who sends a request body over 25 MB to POST /v1/chat/completions, /v1/messages or /v1/completions Numbers: the cap is 25 MB, the same limit /v1/embeddings and the fallback runtime already applied Error: 413 Request body too large ( MB). Max 25 MB. Split your messages or downscale images. Learn more: Chat Completions API2026-09-12
Two new models — DeepSeek V4.1 Flash, the lab’s successor to both V4 Flash and V4 Pro with a 1M context window and image input at the Flash price band, and GPT-6 Astra, OpenAI’s GPT-6 flagship with a 1.05M context window. deepseek-v4-pro retires on 2026-09-14 in favour of deepseek-v4.1-flash, and from now on a model with an announced retirement date returns the retired-model error naming its replacement from that date
deepseek-v4.1-flash is DeepSeek’s V4.1 Flash, released 2026-09-10: 1M context, native image input, thinking and non-thinking modes, MIT weights. The lab routes V4 Pro requests onto it from 2026-09-14, so it is the DeepSeek id to pick for new work. Kyma serves it on three routes at 0.81 per million tokens. gpt-6-astra is OpenAI’s GPT-6 flagship (GA 2026-09-04): 1,050,000-token context, 128,000-token output, image input, reasoning, prompt caching; 67.50 per million tokens, doubling above 272K prompt tokens exactly as OpenAI prices it.
- Pin a DeepSeek id that will still be there next month — point an agent at
deepseek-v4.1-flashinstead ofdeepseek-v4-pro, which the lab reroutes on 2026-09-14 - Read a screenshot on a Flash budget — send an image to
deepseek-v4.1-flashand get a transcript or answer at 0.81 instead of a flagship rate - Run a hard reasoning task on OpenAI’s newest flagship — call
gpt-6-astrawith a 1.05M-token context and prompt caching, and read the exact cost inusage.cost - Move off
deepseek-v4-probefore 2026-09-14 — switch the id todeepseek-v4.1-flash; on the day the old id returns the retired-model error naming the replacement instead of silently answering with a different model
deepseek-v4-pro answers the standard retired-model error with replaced_by: deepseek-v4.1-flash; any model on its retires_on date does the same
Learn more: deepseek-v4.1-flash on Kyma · gpt-6-astra on Kyma
The catalogue now lists only the media models Kyma actually carries, so a model you can pick is a model that works; paused SKUs say so up front instead of failing at the provider
Twenty-four media models are paused. They are not deleted: their rows, prices and routes stay in place, and the endpoints are unchanged. A paused id returns404 model_not_found naming a replacement where one exists, rather than a 400 claiming it is not that kind of model.
Paused. Video generation in full (kling-2.5-pro, kling-3-pro, kling-3-pro-audio, seedance-2-pro, seedance-2-fast, veo-3, veo-3-fast, hailuo-02-512p, hailuo-02-768p, hailuo-02-1080p); music (minimax-music, minimax-music-pro, elevenlabs-music); sound effects (elevenlabs-sfx); voice clone and voice design (minimax-voice-clone, minimax-voice-design); realtime audio (gpt-realtime-translate, gemini-2.5-flash-native-audio-preview-12-2025, gemini-3.1-flash-live-preview, gemini-3.5-live-translate-preview); three image SKUs (recraft-v3, recraft-v4-vector-pro, flux-1.1-ultra); and one TTS SKU (eleven-v3).
Still available. Speech-to-text is untouched — whisper-v3-turbo, gpt-transcribe, gpt-4o-mini-transcribe-2025-12-15, gemini-3.5-transcribe. Text-to-speech continues on minimax-speech-turbo, minimax-speech-hd, eleven-multilingual-v2, eleven-flash-v2-5 and eleven-turbo-v2-5. Image generation continues on gpt-image-2, flux-2-pro, flux-kontext-pro, ideogram-v3, recraft-v4, recraft-v4-pro, recraft-v4-vector, minimax-image-01, nano-banana and nano-banana-3-flash. Audio understanding continues on gemini-3-flash-audio.
What to do instead.
- Keep generating images —
gpt-image-2for text-in-image,flux-2-profor photoreal,recraft-v4andrecraft-v4-vectorfor design and SVG,flux-kontext-proto edit an image you already have. - Keep generating speech — swap
eleven-v3foreleven-multilingual-v2, orminimax-speech-turbowhen cost per character matters more than expressiveness. - Keep transcribing — nothing changed:
whisper-v3-turbofor timestamps and captions,gpt-transcribeorgemini-3.5-transcribefor accuracy on conversational audio.
2026-09-11
Chat completions on the Bun runtime answer again instead of 500ing on every request
BunPOST /v1/chat/completions had been throwing on every request since 2026-09-06: the access-gate call used a shorthand webSearch property that was renamed to wantsWebSearch at the alias resolver and never rewired. Call api.kymaapi.com (Workers) as usual; the Railway fallback path is fixed for the same body.
Who: anyone calling POST /v1/chat/completions on the Railway fallback runtime
Error: 500 ReferenceError webSearch is not defined no longer fires on Bun /v1/chat/completions
Learn more: Chat API
Two model ids that were being answered by a different model are retired with a named replacement, one id is pinned to the build its route actually serves, and two retirement dates are corrected
kimi-k2.5 and claude-opus-5-fast are retired: the only route left for each had started answering with a different model under the old name (Kimi K2.6; Claude Opus 5 at the fast rate). Both ids now return the retired-model error naming the replacement. qwen-3.8-max runs on the 0902 build. gemini-2.5-flash retires on 2026-10-20 and nano-banana on 2026-10-02, per Google’s own ledgers.
Who: all plans
Numbers: kimi-k2.5 → kimi-k2.6; claude-opus-5-fast → claude-opus-5; qwen-3.8-max on the 0902 build; minimax-m2.5 list 1.62 (was 1.346); kimi-k3 list 20.6213 (was 20.25); gemini-2.5-flash retires 2026-10-20; nano-banana retires 2026-10-02
Error: kimi-k2.5 and claude-opus-5-fast now return the standard retired-model error with replaced_by
Learn more: kimi-k2.6 on Kyma · minimax-m2.5 on Kyma · gemini-3.6-flash on Kyma · nano-banana-3-flash on Kyma
An upload no longer fails on a generic Content-Type or a WebM/OGG/FLAC file; a segment format on a model without timestamps is refused up front instead of returning an empty file that was billed; a silent file is a 422, not a 502; every transcription error names a model that can serve the request
Measured on production 2026-09-11: a plain.mp3 from curl, Python requests or a browser Blob arrived as application/octet-stream and was refused with 415 on both runtimes; audio/webm was refused while the docs listed it; gemini-3.5-transcribe answered verbose_json with 200 and no segments, and srt with a 0-byte file that was still billed; a silent WAV came back 502 provider_error; and 47 requests that returned an empty transcript were settled anyway. One accepted-audio list (src/audio/audio-mime.ts) now serves both runtimes, the 415 message and the docs; the catalogue carries sttSegments (public supports_segments) and both handlers refuse verbose_json/srt/vtt on a model without it before any provider call; an empty transcript from any tier is 422 no_speech_detected and is not settled; and every transcription error that leaves the caller without a transcript carries suggested_models — model ids only, never a swap.
Who: anyone calling POST /v1/audio/transcriptions — default-client uploads, browser recordings, and every caller of gemini-3.5-transcribe / gpt-transcribe / gpt-4o-mini-transcribe-2025-12-15 with verbose_json, srt or vtt
Numbers: accepted formats are now mp3, wav, m4a, ogg, flac, webm — the measured intersection of every transcription model (was mp3, wav, m4a); nothing is charged on 400 segments_unsupported, 415 unsupported_audio_type or 422 no_speech_detected
Error: new codes 400 segments_unsupported, 415 unsupported_audio_type, 422 no_speech_detected; error.suggested_models on 400/415/422/429/502/503 transcription errors; /v1/models gains supports_segments on STT rows
Learn more: Audio Transcriptions API
A transcription call that omits response_format works again on every model; the default follows the model instead of assuming segment timestamps
Whenresponse_format is omitted on POST /v1/audio/transcriptions, the default is now verbose_json on models that return per-segment timestamps (supports_segments: true on /v1/models) and json on the others. Earlier the same day the omitted field defaulted to verbose_json on every model, which sent every plain call to gemini-3.5-transcribe, gpt-transcribe and gpt-4o-mini-transcribe-2025-12-15 into 400 segments_unsupported. Explicitly asking for verbose_json, srt or vtt on one of those models is still refused up front, with suggested_models naming a timestamp-preserving model, and nothing is charged.
Who: anyone calling POST /v1/audio/transcriptions without a response_format on gemini-3.5-transcribe, gpt-transcribe or gpt-4o-mini-transcribe-2025-12-15
Numbers: default response_format is verbose_json on models with supports_segments: true and json on the others; an explicit verbose_json, srt or vtt on a model without segment timestamps is still refused with 400 segments_unsupported and nothing is charged
Error: 400 segments_unsupported no longer fires when response_format is omitted
Learn more: Audio Transcriptions API
2026-09-08
Saving or updating a chat over 512 KB is refused up front with 413 instead of being stored, and an error while sharing or cancelling a job no longer carries internal database text
POST /v1/chats and PUT /v1/chats/:id read their body through one capped reader on both backends: over 512 KB is a 413 before anything is stored, and a body that is not a JSON object is a 400 rather than a 500. The share and cancel endpoints for generated media answer a fixed sentence when a database read or write fails; the database’s own message stays in the server log.
Who: all plans
Numbers: one cap, 512 KB per chats write, on both backends
Error: 413 Request body too large (max 512 KB) on POST /v1/chats and PUT /v1/chats/:id; 400 Request body must be a JSON object where a malformed body used to be a 500
Learn more: Images Generations API
2026-09-07
A comparison you build yourself now becomes a real, listed page. Pick any two to four models on a /compare page and the combination shows up on /compare under “Recently compared”, and once it has been opened on three separate days and every model in it has enough measurement behind it, it goes into the sitemap and can be found in search. Three and four model comparisons are no longer excluded from search on principle. The conclusion sentence on each page (“X is ahead at 99.4%”) now sits above the chart instead of under it, so the answer is the first thing read.
- Compare four models and keep the page — pick any two to four models on a comparison page; the combination gets a URL, appears on /compare under “Recently compared”, and can be shared like any other page.
- Find what other people compare — /compare now ranks the combinations opened in the last 30 days by how many times each has been opened, and
GET /v1/compare/popularreturns the same list to an agent with no authentication. - Read the answer first — each comparison states its conclusion in a sentence above the chart, so an answer engine quoting the page quotes the finding rather than a caption.
Every model on GET /v1/models now says whether an account that has never added credits can call it, so you can tell before you send a request instead of finding out from a 402
Signup credit is a free tier, not cash for the whole catalogue: a model above
the price line needs a funded balance. That rule has been enforced since
2026-09-07, but nothing published it. cost_tier and tier are editorial
labels with no enforcement behind them, so a client, an SDK or an agent had no
way to ask “may this key call this model?” other than by sending a request and
reading the refusal — and model_requires_paid appeared in no schema at all.
Every catalog row now carries free_tier: boolean. It is the same function the
access gate reads, not a second derivation and not a hand-kept list, so it
follows the catalogue: a model whose price crosses the line changes side the
same day, on both serving paths.
- Filter before you send —
curl "https://kymaapi.com/v1/models" | jq '[.data[] | select(.free_tier)] | map(.id)'lists everything a brand-new key can call, so a first request never spends a round trip on a refusal - Ship an onboarding that works on day one — point the free plan of your app at the free-tier ids and let paying users unlock the rest, instead of hard-coding a list that goes stale the next time a price moves
- Let an agent pick its own model — in the Kyma MCP server,
recommend_modelnow recommends only free-tier models to a key that has never been topped up and says why, so a coding agent configures itself with a model it can actually call
GET /v1/models/recommend carries the field on every model it names, and MCP’s
list_models and get_model pass it through.
Who: all plans
Numbers: 43 of 126 models are in the free tier today; one new boolean field, free_tier, on every catalog row and on every model GET /v1/models/recommend names
Error: 402 model_requires_paid and 402 insufficient_credits are now both documented in the OpenAPI spec on every endpoint that can return them (chat completions, completions, messages, images, videos, audio transcriptions/understand/speech/music/sfx), with the real bodies as examples. No error text, code or status changed
Learn more: Models List API · Error Handling guide
Signing in now also sets a session cookie, so the dashboard can render your sidebar and email on the server instead of waiting for JavaScript to read localStorage and ask who you are
- Stay signed in across a hard refresh without a flash — the browser presents the cookie on the first request, so the page can know who you are before any JavaScript runs
- Sign out everywhere it counts —
POST /v1/auth/logoutandDELETE /v1/auth/session/cookieboth clear the cookie, so a shared machine does not keep a signed-in shell - Keep using Bearer tokens exactly as before — curl, the SDKs and every agent send
Authorizationand are never asked for a CSRF header
POST /v1/auth/login, /v1/auth/register and /v1/auth/google now return two extra
Set-Cookie headers alongside the JSON they always returned:
session_token is still there and is still the credential to
store and send. Nothing that ignores cookies notices this at all.
__Host-kyma_session is host-only and HttpOnly: the browser refuses to store it if it
ever names a Domain, so it can only ever be sent to kymaapi.com. kyma_csrf is
readable by page scripts on purpose — a mutation authenticated by the cookie alone must
echo it back in an X-Kyma-CSRF header, or arrive with a same-site Origin. GET needs
neither, and a request carrying a Bearer token is never checked.
A cookie can only authenticate the dashboard: an allow-list of /v1/auth/,
/v1/credits/, /v1/billing/, /v1/referral/, /v1/admin/, four /v1/stripe/ paths,
and the public catalog reads. No inference endpoint and no money-spending endpoint is on
it, so a cookie cannot bill the account.
POST /v1/auth/session/cookie exchanges a session token you already hold for the cookie,
once, without signing you out. DELETE on the same path clears it, and so does
POST /v1/auth/logout.
All of it is behind SESSION_COOKIE_ENABLED, which is "false" on this deploy: with the
flag off no cookie is set, no cookie is read, and every response is the one that shipped
before. Clearing still works with the flag off, so turning it back off cannot strand a
browser holding a cookie an earlier deploy set.
Who: anyone signed in to the dashboard in a browser; no change for API clients, SDKs or agents
Error: csrf_failed (403) is new, and only reachable by a request authenticated by the cookie alone that carries neither a matching X-Kyma-CSRF header nor a same-site Origin; a request sending Authorization Bearer is never checked
Before:
Your per-model usage breakdown answers in a fraction of a second instead of seconds when you do not name a time window, because it now defaults to the last 30 days rather than scanning your whole account history
Wave 3 of.internal/plans/DASHBOARD-LOAD-STRATEGY-2026-09.md (KYM-109).
GET /v1/auth/usage/models with no days meant “all time”, which on the
heaviest account is 138,887 request rows. Nobody was asking for that: the
dashboard sends an explicit window for every range it offers, so the all-time
scan only ever ran for callers who named none — an SDK call, a curl, an MCP
tool. The default is now 30 days, written once and imported by both backends, so
it cannot drift. Pass days for anything longer; nothing about an explicit
window changed.
The rest of this wave is admin-only and invisible from the outside: the
classification that separates real customers from farm signups is computed once
when a request is logged instead of recomputed for every row on every admin
query, which is what made several admin panels time out.
Who: all plans
Numbers: /v1/auth/usage/models with no days parameter, heaviest account: 6.51 s → 0.18 s warm, 3.09 s cold
Every place that mentions the $0.50 signup credit now says which models it buys — the free tier — instead of implying it covers the whole catalogue, so you find out before a request that a video, image or frontier model needs a top-up
The free tier shipped on 2026-09-06 and the copy did not move with it. The welcome email — the most-sent Kyma email — offered the 0.50 free credit”, including video and image models the credit cannot buy. Both sentences were true the week before. Fixed on every surface at once, and the examples are no longer written by hand: the welcome email names the cheapest free-tier text model and the cheapest free-tier media model, read from the registry at send time, so they follow the threshold when it moves. Model pages ask the same function the 402 gate asks before deciding which sentence to print. A new check,check:free-tier-claims, fails the build when a “$0.50 free
credit” line does not say which models it buys, or when one sits in the same
sentence as a model outside the free tier.
Who: everyone with a Kyma account
Numbers: 43 of 126 models are in the free tier today; ~100 sentences across the site, docs, READMEs and both welcome-email runtimes rewritten; the welcome email’s example models are now read from the registry instead of typed
Before:
Every page now shows the price you are actually charged, to the digit
Every Kyma surface now prints a price the way the catalogue publishes it, and /pricing shows the same columns as /models. There were five places that turned a rate into text, rounding to five, four, four, three and two decimals. One number therefore reached readers as several different prices depending on which page they opened:gpt-4o-mini-transcribe is billed at 0.00405, 0.004 and $0.00. A rounded price is not a rounded chart
label — you cannot undo it to find the real one.
- One price, everywhere — /pricing, /models, each model page, /rankings and
the machine-readable
pricing.mdandmodels.mdall print the published rate to the digit - /pricing looks like /models — each row now carries the creator’s mark, the context window, and the model’s measured 30-day uptime, and links to its page
- “n/a”, not a dash — 45 of the 82 token models publish no cached-input rate. The cell now says which of the two reasons applies: the model does not support prompt caching, or it does and bills repeats at the full input rate
- No hand-assigned scores — the rankings cost tab ranked models by a “quality” number typed into the source for 26 of them and defaulted to 70 for the rest. It is gone; the tab sorts on measured cost
The rankings Performance board stops going blank when one leaderboard query fails
GET /v1/rankings no longer publishes a failed sub-query as an empty list, and
an incomplete board is no longer cached as if it were a complete one.
The endpoint runs eight queries in parallel. Six of them wrapped themselves in a
handler that catches a rejected promise but not an error object, so a query that
failed and a query that legitimately returned nothing produced the same empty
array, nothing was logged, and the result was cached for five minutes and then
held by the page’s own cache for five more. Measured on 2026-09-07, four of six
requests to the live endpoint came back with an empty performance while the
query behind it answered 51 rows in about 200 ms every time it was asked
directly. The Performance tab was blank.
- See the board — a leaderboard query that fails is retried on the next request instead of being pinned for five minutes
- Know when it is incomplete — a partial response carries
X-Kyma-Partial: <query names>andCache-Control: max-age=30, a complete one carriesmax-age=300 - Find it in the logs — every failed sub-query is logged with its name and the database’s error message, which none of them were before
performance: [] while get_model_performance answered 51 rows in 202-245 ms, six for six; an incomplete board is now cached 30 s instead of 300 s
The rankings page stops showing a blank Performance board for five minutes after the API has recovered
The /rankings page no longer keeps an incomplete leaderboard on screen after the API has a complete one.GET /v1/rankings already marks a board that is missing a query: it names the
missing part in X-Kyma-Partial and cuts its own Cache-Control from five
minutes to thirty seconds. The page read neither. Next.js honours the lifetime
its own code asks for and ignores the one the response states, so the page
asked for five minutes whatever came back — and then held the rendered result
for five minutes on top of that. Ten minutes of a blank board for one unlucky
recomputation, five of them after the API had already recovered.
- See a board that came back — an incomplete answer is re-read after 30 s, and the page that renders it expires with it
- Same for an outage — if the API cannot be reached at all, the empty state is no longer pinned for five minutes either
- Nothing slower when it works — a complete board is still read once and cached the full five minutes
The rankings board ranks on reliability, prices every model in the unit it is sold by, and reports the same uptime as the rest of the site
The/rankings Performance board now opens sorted by reliability, and the Usage
tab’s Uptime column reports uptime rather than the week’s request success rate.
Three things on that page said something other than what they meant. The board
opened sorted by volume, so the busiest model led it at a 63.1% success rate
while a model at 100% sat tenth. Embedding, transcription and speech models were
ranked in the same table as chat models on columns they cannot have, so 15 of 49
rows showed a dash for speed and time-to-first-byte, and four of them carried a
price that was the per-token default rather than their published per-minute or
per-character rate. And the column headed Uptime was
the share of the last seven days’ requests that returned 200, which is a
different number from the uptime /models, /status and /v1/models/uptime
publish; on qwen-3.6-plus the two disagreed by 25 points.
- Scan for what works — reliability is the first column and the default sort, with volume breaking ties
- Compare like with like — embeddings and audio have their own table below the board, showing only what is defined for them
- Read one uptime — the Usage tab reads the same measurement as every other Kyma surface, and says “no data yet” for the 31 of 117 ranked models with too few observations in the window instead of guessing
- Trust the prices — models sold by the minute or by the character are priced in that unit. Four audio models were showing a per-token default of 0.600 that was nobody’s real rate
- Read only measurements — the Value column is gone. It folded a hand-assigned quality score into speed, reliability and cost, so a column of Kyma measurements carried one number Kyma never measured
2026-09-06
The dashboard shell loads a 190-byte identity instead of a 14 KB key dump on every page, per-key spend lives on the keys endpoint, and the Usage and Logs pages answer in well under a second
Breaking for scripts that readapi_keys from GET /v1/auth/me: that endpoint now
returns identity only (user_id, email, display_name, email_verified, created_at).
Your keys, each with lifetime usage_cost and usage_requests, are on GET /v1/auth/keys.
Why: the dashboard requested /v1/auth/me on every page and read three fields while the
response carried every key with its spend — four sequential database hops and 14 KB, up
to 7 seconds on busy accounts. It also returned full key secrets to callers authenticated
with an API key; /v1/auth/keys masks them for those callers.
Also in this change:
- Admin pages accept the signed-in admin session; no separate admin key is required.
- The Usage page’s daily aggregate and the Logs page’s model list are indexed and computed in the database; both answer in well under a second.
- Each dashboard page reports when its data is on screen (
dashboard_data_ready), so slow loads are measured by what you waited for, not by when the heading painted.
The MCP sign-in screen now has Continue with Google, so accounts created with Google can connect Claude, Cursor, Codex and ChatGPT without a password
The sign-in screen that Claude, Cursor, Codex and ChatGPT open when you connecthttps://mcp.kymaapi.com/mcp now has a Continue with Google button, the same one the dashboard uses. Accounts created with Google never had a password, so they could not get past the email + password form and saw “Invalid email or password” instead. The screen also gained a “Forgot password?” link and the Kyma mark. Email + password sign-in is unchanged.
Who: all plans
Learn more: Mcp Server guide
2026-09-05
qwen-3.6-plus gets cheaper — the published rate follows what it actually costs to serve
One model gets cheaper.
Prices are computed from real serving costs — they can fall, and never rise without notice.
Who: all plans
Numbers: 0.4911 per 1M input, 2.947 per 1M output (25% cheaper)
Learn more: Pricing
The Usage page loads in well under a second, and 7d / 30d / 90d show the range they say
The Usage page computes its totals in the database now, in one call per panel, instead of walking every ledger row through the API. On a busy account the page went from 5–11 seconds to under one, and picking 30d or 90d no longer leaves the 7-day numbers on screen under the new label while it waits.- Daily buckets follow your browser’s timezone (they were UTC).
- By-model cost is exact on every range.
- While a new range loads, the tiles and chart dim instead of showing stale numbers.
2026-09-04
When the measurement query behind model uptime is unavailable, the endpoint now says so instead of reporting every model as unmeasured, and any unexpected failure at the edge comes back as readable JSON a browser can actually display
GET /v1/models/uptime used to swallow a failed measurement query and answer with every model reporting null — which on this endpoint means “not enough observations to publish”, so a database blip read as a catalogue where nothing had ever been measured, and it was cached that way. It now serves the last complete answer marked X-Kyma-Stale: 1, or 503 when there is none, matching what /v1/models/cost-per-session and /v1/rankings already did. Separately, an unexpected failure anywhere at the edge now returns {"error":{"message":…,"type":"server_error"}} with CORS headers rather than an opaque plain-text 500 that a browser could not read.
Who: all plans
Numbers: two failure paths; the uptime endpoint held a wrong answer for up to five minutes per edge location before this
Error: 503 with {"error":"uptime measurements unavailable"} when nothing can be served, or the last complete answer with X-Kyma-Stale: 1
Learn more: Models List API
Saved chats, one-click unsubscribe, sharing a generated image or video, and cancelling a kyma-gen job are now answered at the Cloudflare edge instead of being relayed to the origin
GET/POST /v1/chats, GET/PUT/DELETE /v1/chats/:id, GET/POST /v1/unsubscribe, POST/DELETE /v1/jobs/:id/share and POST /v1/genmedia/jobs/:id/cancel are served by the edge Worker that already answers chat, so one relay hop and its latency are gone from those calls. Nothing in the responses changed: a test boots both backends against the same recorded data, sends every one of these with and without credentials, and fails on any difference in status, body, the headers a caller acts on, or the writes each backend sends to the database.
Who: all plans
Numbers: ten authenticated or token-signed paths moved; the same status, body, headers and database writes on both backends, checked by a test that runs them against identical data
Learn more: Images Generations API
Rankings, model uptime, cost per session, model recommendations, public stats and badges, the media registry, generation pricing and public Muse shares are now answered at the Cloudflare edge instead of being relayed to the origin
GET /v1/rankings, /v1/models/uptime, /v1/models/recommend, /v1/models/cost-per-session, /api/stats, /api/badge/*.json, /registry/*-models.json, /v1/genmedia/pricing/:id and /v1/muse/public/:id are served by the edge Worker that already answers chat, so one relay hop and its latency are gone from those calls. Nothing in the responses changed: a test boots both backends against the same recorded data and fails on any difference in status or body.
Who: all plans
Numbers: nine public GET paths moved; the same JSON, byte for byte, checked by a test that runs both backends against identical data
Learn more: Models List API
2026-09-03
A request for a retired Imagen 4 model now names its replacement instead of failing upstream with nothing to act on
Google shut the Imagen 4 endpoints down on 17 August 2026, soimagen-4, imagen-4-fast and imagen-4-ultra have been taken off the catalogue. They are no longer listed on /models, /v1/models or the price list.
This changes what a request is told, not what it can get: the three had already stopped answering before this, and no request or job ran on them in the previous 30 days. Asking for one now returns 404 model_not_found naming the replacement — Model imagen-4 was retired. Use nano-banana-3-flash. — rather than a failure from upstream with no successor in it.
nano-banana-3-flash is Google’s own recommended replacement for the family, at $0.061 per image. Change the model field; nothing else about the request changes.
Who: all plans
Error: 404 model_not_found — “Model imagen-4 was retired. Use nano-banana-3-flash.
Before:
Gemini 3.8 Flash and Claude Fable 5.1 are available by name on the chat endpoints
Two new flagships, callable by their public names on/v1/chat/completions and /v1/messages. gemini-3.8-flash is Google’s newest Flash tier, generally available since September 2: 1M context, 64K output, text, image, audio, video and file input, reasoning and tool calling, with the strongest gains over 3.7 Flash on software-engineering and agentic work. claude-fable-5.1 is Anthropic’s newest Mythos-class model, released September 1: 1M context, 128K output, vision and file input, with the biggest gains in agentic coding and long-running agentic workflows. Both carry the same headers as every other model: X-Kyma-Model names the model that answered.
Three things people will actually do with them:
- Agentic coding at Flash cost — point a coding agent at
gemini-3.8-flashfor multi-step tool use over a large repository; 1M context and 64K output mean the whole task fits one request. - Long multimodal review — send video, audio, images and files to
gemini-3.8-flashin one call and get a long written analysis back. - The hardest reasoning and long-running agents — use
claude-fable-5.1where Fable 5 was the pick: long-horizon agentic workflows and agentic coding, with 1M context and 128K output.
Two open-weight multimodal models are available by name — Qwen 3.8 27B and DeepSeek V4 Flash Vision (experimental)
Two open-weight models with image input, callable by their public names on/v1/chat/completions and /v1/messages. qwen3.8-27b is Alibaba’s Apache-2.0 dense 27B vision-language model from the Qwen 3.8 line: 1M context, text, image and video input, reasoning, tool calling and structured outputs — the open checkpoint next to the closed Qwen 3.8 Max and Flash. deepseek-v4-flash-vision-exp is DeepSeek’s first multimodal V4 model (MIT, 305B MoE): the V4 Flash efficiency tier with image input. DeepSeek labels it experimental, and so does Kyma — the id may move when a stable release lands.
Three things people will actually do with them:
- Read screenshots and diagrams on a budget — send an image with the question to
deepseek-v4-flash-vision-expat the V4 Flash price tier. - Video and document understanding on open weights —
qwen3.8-27btakes video and image input at 1M context, with tool calling, on an Apache-2.0 checkpoint you can also run yourself. - An open alternative to the closed Qwen 3.8 tiers — same family, same API shape, open weights.
Promotional prices on five models now show as promotions with an end date, and GPT-5.6 Sol is listed at the price you were already being billed
Five models were carrying an upstream launch discount that the catalogue showed as if it were the permanent price. They are now shown as what they are: a promotional rate with the date it is promised through and the list rate it returns to. Billing is unchanged — every request has always been charged at the rate in force on the route that served it. The one visible correction is GPT-5.6 Sol: its shelf price had not followed the August 21 upstream price cut, so the page showed 40.50 while requests were billed at 13.50. The page now matches the bill. Who: all plans Numbers: gpt-5.6-sol and gpt-5.6-sol-pro 13.50 per 1M tokens through Nov 21 2026 (list 27.00, was shown as 40.50); gemini-3.7-flash and gemini-3.8-flash 5.06 through Dec 31 2026 (list 10.13); glm-5.3-flash 0.34 through Sep 9 2026 (list 0.68) Learn more: Pricingqwen-3.7-max is listed at the price of the route that now serves it, so the page and the bill agree again
qwen-3.7-max was listed at 5.06 per 1M tokens because its cheapest route carried a 50% launch discount. That discount ended on August 25, 2026, and the list price now follows the cheapest remaining route: 6.91. Requests were always billed at the rate of the route that served them, so nothing changes about what a request costs — what changes is that the published price no longer sits below what a fallback request was already being charged.
Who: all plans
Numbers: qwen-3.7-max 6.91 per 1M tokens (was 5.06)
Learn more: qwen-3.7-max on Kyma · Pricing
The 43 image, video, speech, music and transcription model pages now show the price in the unit the model bills in, and only the features it has
Every model page for an image, video, speech, music or transcription model used to carry a “Per 1M tokens: 0.60” table, plus “Tool calling: Yes”, “Structured outputs: Yes” and “Prompt caching: Yes”, and a chat-completions code example. None of that was true: those models do not bill per token, and the figure was a placeholder that the page generator published as a price. Each page now shows the real price in the model’s own unit — the same number/v1/models reports — states only the features the model declares, and shows the call that model is actually made with (audio.transcriptions, audio.speech, images.generate, /videos/generations, and so on). Per-token model pages are unchanged.
Who: all plans
Learn more: whisper-v3-turbo on Kyma · Pricing
August 14, 2026
Gemini 3.1 Pro is live at 16.20 per million tokens — the first Gemini Pro tier on Kyma — and Nano Banana 3 Flash is repaired after its upstream preview endpoint stopped answering
Kyma now serves a Gemini Pro tier. Until today every Gemini in the catalogue was a Flash or a Flash Lite, so anything those tiers could not carry had to leave the family entirely.gemini-3.1-pro fills that gap: a 1M-token context, a 64K output ceiling, and text, image, audio, video and file input on the same request.
It lists at 16.20 out per million tokens. Above 200,000 prompt tokens the rate steps to 24.30, because that is what it costs us there — the threshold is on the prompt, so you know which rate applies before you send. Google ships this as a preview build, and the model page says so; test before you put it on a critical path.
Separately, Nano Banana 3 Flash is fixed. It was routed to Google’s preview image endpoint, and that endpoint stopped resolving — every request to it was failing. It now runs on the generally available endpoint. The model id you call is unchanged and so is the price.
- Reach for a Pro tier without leaving Gemini — hard reasoning and long-horizon agentic work at 1M context, with the same OpenAI-compatible call and the same automatic failover as everything else
- Know the long-prompt rate up front — the 200K step is published next to the base rate on
/pricingand in/v1/models, not discovered on the invoice - Nano Banana 3 Flash answers again — the upstream endpoint swap was transparent: same
nano-banana-3-flashmodel id, same $0.061 per image
Gemini 3.7 Flash is live at 5.06 per million tokens — and half that, 2.53, while the launch promotion runs
Google shipped Gemini 3.7 Flash on 13 August and it is callable on Kyma now. It takes a 1M-token context like the rest of the Flash family, and raises the output ceiling from 8,192 tokens to 65,536 — the reply, not the prompt, is what got eight times bigger. It is on sale. The list price is 5.06 out per million tokens; while the launch discount holds upstream we publish 2.53, and the end date is on the model in/v1/models. The list price is the number the sale returns to, so nothing rises unannounced when it ends.
- Stop chunking long replies — a full document translation or a 40,000-token structured extraction now fits in one response instead of a loop that stitches pieces together
- Send video, audio and files to one model — the widest input set in the Flash family, with tool calling, reasoning and structured outputs on the same request
- Check what you actually pay before you commit —
/v1/modelspublishes the promotional rate, the list rate it returns to, and the date it ends, so a budget built on it does not go stale silently
7 prices fall and 14 rise — every one computed from what the request actually costs to serve
7 models get cheaper.
14 models go up, because they now cost more to serve than their prices covered.
Prices are computed from real serving costs — they can fall, and never rise without notice.
Learn more: Pricing
/v1/models now quotes the price you actually pay today, so a model on promotion no longer reads as twice its real cost
When promotional pricing shipped,/v1/models kept returning the list price under pricing and put the sale in a separate promotion field. For the four GPT-5.6 models on offer, that meant the endpoint advertised twice what it charged unless you knew to read a field released the same day.
pricing is now the rate in force — the promotional one while a promotion is running, the list rate otherwise. A new list_price field carries the stable rate a promotion returns to, and it is always present, equal to pricing when nothing is on offer, so you can read one field unconditionally and never branch. promotion is unchanged.
Billing never changed and was never affected: a bill follows the upstream invoice, which already carries the discount.
Learn more: Models List API
2026-08-13
Claude Fable 5 is live at 67.50 out per million tokens
You can call Claude Fable 5 asclaude-fable-5 through the same OpenAI-compatible endpoint.
It lists at 67.50 out per million tokens on GET /v1/models. Context is 1M tokens, with image and file input, tool calling, and structured outputs on the same request.
- Hard reasoning on one id — 1M context and extended reasoning without leaving the catalog
- Vision and files on the same call — image and file input without a second SKU
- Read the price before you commit —
/v1/modelspublishes the rate in force
Grok 4.6 is live at 8.10 out per million tokens
You can call Grok 4.6 through the same OpenAI-compatible endpoint as everything else.grok-4.6 lists at 8.10 out per million tokens on GET /v1/models. Above 200,000 prompt tokens the rate steps to 16.20. Context is 500K tokens, with image and file input on the same request.
- Long-horizon agents on one id — 500K context and tool calling without stitching a second model
- Know the long-prompt rate up front — the 200K step is published on
/v1/models, not discovered on the invoice - Vision and files on the same call — image and file input without switching SKUs
Qwen 3.8 Max is live at 6.684 out per million tokens
You can call Qwen 3.8 Max asqwen-3.8-max on the same catalog and the same chat endpoint.
It lists at 6.684 out per million tokens on GET /v1/models, with cached input at $0.2781. Context is 1M tokens, with image input and tool calling on the same request.
- Reason over a long document — 1M context without chunking the prompt by hand
- Send an image with the question — vision on the Max tier, same model id
- Read the cache rate before you commit —
/v1/modelspublishes the cached-input price next to the list rate
Qwen 3.8 Max is listed once, at the 6.684 rate
qwen-3.8-max appears once in the catalog, at the rate GET /v1/models quotes today.
A second listing of the same model at a higher price was removed. Nobody was charged the higher rate: the duplicate never carried traffic. The listing that stays carries cached-input pricing.
Who: all plans
Numbers: 6.684 out per 1M tokens; cached input $0.2781 per 1M
Learn more: overview on Kyma · Pricing
August 3, 2026
You are now billed at the exact rates published by the suppliers, eliminating incorrect pricing on several popular models.
We corrected twenty-seven cost rows that were previously estimated by hand and lacked a verified source. Several models had incorrect pricing that did not match the official supplier rates, which has now been aligned with the published catalogs. Learn more: Pricing Catalog API · PricingThe model uptime dashboard now accurately reflects supplier availability instead of showing false outages caused by our own probe limits.
Our health probes were occasionally hitting our own account limits, resulting in payment required errors that were incorrectly counted as model downtime. We updated the health rollup to classify these specific authentication and billing errors as unmeasured, ensuring the public uptime metrics only reflect actual supplier availability. Learn more: overview on KymaAugust 2, 2026
1 model got cheaper to call, effective immediately
One model gets cheaper.
Prices are computed from real serving costs — they can fall, and never rise without notice.
Learn more: Pricing
August 1, 2026
You can list everything one lab makes in a single request
GET /v1/models?creator=anthropic returns that lab’s models and nothing else.
Pass several — ?creator=anthropic,google — to compare labs side by side.
?owned_by= is accepted as the same filter, so you can filter by exactly the
value you just read in the response.
Asking for a lab Kyma does not carry returns an empty list rather than the whole
catalogue, so a typo tells you it was a typo.
- Compare two labs —
?creator=anthropic,googleputs them side by side before you commit to one - Audit a family — see every model one vendor makes, and what each costs, in a single call
- Build a vendor picker — group your model dropdown by lab without hard-coding the list
One click unsubscribes you from Kyma email, and it sticks
Every Kyma email carries a one-click unsubscribe that your mail client can act on directly, and the suppression is honoured across all future sends rather than per-campaign.You can add live web results to 25 models by appending one suffix to the model id
:online works on 25 models instead of 2. Call deepseek-v4-pro:online and the
model answers with current web results; drop the suffix and it does not.
No separate endpoint, no second request, no search vendor to sign up with.
- Answer from today — ask about a release that shipped this morning and get the release, not the training cutoff
- Keep your model — add
:onlineto the model you already tuned prompts for instead of switching to a search-native one - Turn it off per request — drop the suffix when the answer should come from the model alone, with no extra call
Grok, Meta’s newest line and Claude are all callable with the same key as everything else
The Grok family joins the catalogue, alongside Meta’s Muse Spark 1.1 and Llama 4 Maverick, and eight more models filling out families Kyma already sells. Claude is listed publicly. Listing Grok exposed four defects in how tool support was advertised, and those were fixed before it shipped rather than after.- Try a frontier model without a new account — Grok and Claude bill against the key you already have
- Swap in one line — change the model id; the request shape, the fallbacks and the receipts stay the same
- Compare on your own traffic — run the same prompt across labs and read the cost back from
usage
Published prices follow the cheapest route that can serve you, not whichever one happened to carry the last request
Nineteen prices were recomputed from real traffic on this day. The published price is now anchored on the cheapest route that can serve a model, so a cheaper route arriving lowers what you pay rather than changing nothing you can see. Learn more: PricingWhat a model says it can do now matches what its provider says it can do
Six models advertised capability flags that disagreed with the provider’s own specification — tool use, structured outputs and vision among them. A flag that is wrong in the optimistic direction fails at request time, on your side. Every flag in the catalogue is now checked against the provider spec on a schedule, and a disagreement fails the build. Learn more: Models List APISearching the models page no longer throws you somewhere else on the page
Filtering 99 models down to a handful made the page much shorter, and the browser had to put your scroll position somewhere — usually a long way from what you were reading. It looked like the page had reloaded. Results now stay where you can see them.July 31, 2026
You can compare models on measured speed and uptime instead of taking a claim on trust
Every model in the catalogue now shows Throughput, Latency and Uptime — measured, not quoted. The same prompt goes to every model through this API every six hours, so the numbers compare with each other rather than with a vendor’s benchmark. Uptime is every observation over 30 days, probes and real customer requests together, and counts a request as successful only if the model you asked for is the model that answered. A dash means we have not measured enough yet, and says so instead of guessing. The table also filters by capability, use case and creator, and sorts on any column.
- Pick on evidence — sort by throughput or uptime instead of trusting a launch post
- Rule a model out — a dash means it has not been measured enough, and says so rather than guessing
- Check before you migrate — see how a model has actually behaved over 30 days, not on the day it launched
When a supplier cuts its price, yours falls too — automatically, and within a day
Published prices are recomputed from what serving actually costs, in both directions. A cost that falls pulls the price down; a cost that rises can only push it up with notice. Long prompts are priced in steps, matching how suppliers charge above a threshold, so a large request is billed on the rate that actually applied to it rather than a flat average. Twenty prices were recomputed on this day. Learn more: PricingYour account is harder to attack, and a database read no longer yields anything replayable
Two changes to how sessions and sign-in work. Repeated failed logins are now rate-limited per account and per IP on the path production actually serves. Only failures count — signing in normally is never throttled, which matters where many people share one address. Session tokens are stored as a digest rather than in the clear, so what is at rest cannot be pasted into a request. Existing sessions were not invalidated; nobody was signed out. Learn more: Authentication guideThe cost in your streaming response is what you were charged, not what your request cost Kyma
usage.cost on a streamed response was not the amount billed to you. The number
was real, it was simply the wrong side of the transaction, and it could differ in
either direction.
Non-streaming responses were already correct. Both now report your price.
Learn more: Chat Completions API · Pricing
July 30, 2026
Older clients that speak the legacy completions shape work without changing your code
POST /v1/completions accepts the pre-chat request shape and translates it. It
is an adapter over the same routing, billing and never-die behaviour, not a
second pipeline — so a legacy client gets the same fallbacks and the same
receipts as everything else.
- Keep an old client — point it at Kyma without rewriting it for the chat shape
- Migrate on your own schedule — move to
/v1/chat/completionswhen it suits you, not because the API forced it - Get the same guarantees — an adapter over the same routing, so a legacy call still gets never-die fallbacks
You can build retrieval on Kyma without a second vendor for the embedding half
POST /v1/embeddings is live, OpenAI-compatible, billed on input tokens only —
there is no output side to charge for.
RAG needed two things and Kyma only had one of them. Now the retrieval half and
the generation half come from the same key.
- Index a corpus — embed your documents with the same key that answers questions about them
- Drop a vendor — retrieval and generation stop needing two accounts, two bills and two outage pages
- Pay for input only — there is no output side on an embedding, and you are not charged for one
Every model has its own page, with the whole price and a plain-markdown mirror an agent can read
Each model now has a page carrying its full price — input, output and cached, not a rounded headline — plus context window, capabilities and what it is good for. Every page has a.md twin at the same path, so an agent fetching it gets the
facts without parsing a web page.
- Read the whole price — input, output and cached, not a rounded headline
- Feed it to an agent — every page has a
.mdtwin at the same path, so a crawler gets facts, not layout - Check before you call — context window, capabilities and what it is good for, in one place
You are billed for the route that actually served you, and never above the published price
A model can be served by several suppliers at different costs. Billing used to assume one of them. It now records the endpoint that served, prices from that, and caps the result at the published price — so a fallback to a dearer route is Kyma’s cost to absorb, not yours. Learn more: PricingPages load faster, and the site stops rendering dark on a light theme
113KB of analytics that nothing used came off every page, and session replay moved off the critical path. Separately: choosing “system” was being read as “dark”, so the header rendered dark on every light page. It now follows the system.July 29, 2026
You have until 20 October to move off nano-banana, and Kyma stopped recommending it today
The endpoint behindnano-banana shuts down on 2026-10-20. It still serves
until then and nothing changes for existing calls.
It is no longer recommended anywhere in the catalogue or the docs, so nobody
starts a new project on a model with a date on it.
Learn more: nano-banana on Kyma
Six models joined the catalogue, including the cheapest one Kyma sells
- Kimi K3 — Moonshot’s 2.8T open-weight reasoning model, 1M context, vision in
- Gemini 3.6 Flash and Gemini 3.5 Flash Lite
- Qwen 3.7 Flash — the cheapest model in the catalogue
- GPT-5.6 Terra, priced on list rather than on a promotion that expires
- Gemini 3.1 Flash Live, the successor to the 2.5 voice SKU
- Reach for 1M context — Kimi K3 and Gemini 3.6 Flash both take a repository-sized conversation
- Cut the floor price — Qwen 3.7 Flash is the cheapest model in the catalogue
- Move a voice workload — Gemini 3.1 Flash Live succeeds the 2.5 voice SKU that is retiring
Five models were repriced against what they actually cost to serve — two of them had been sold below that
qwen-3.7-max and gemma-4-31b were priced under what the route serving them
charges. Three more were re-anchored against the dearest route in their chain
rather than whichever supplier happened to be written first.
Prices are computed from real serving costs. They can fall, and they do not rise
without notice.
Learn more: Pricing · qwen-3.7-max on Kyma
Multi-turn reasoning with Gemini 3 keeps its train of thought across turns
Gemini 3 returns a signature with its reasoning that must come back on the next turn. Kyma was dropping it, and the failure was invisible: the model simply reasoned from scratch each turn, and the answer looked plausible. The signature now survives the round trip on both paths, and a request that cannot carry it fails loudly instead of quietly degrading. Learn more: Tool Calling guideJuly 28, 2026
A long conversation is never rescued by a model too small to hold it
Never-die routing tries other models when one fails. It did not check whether the replacement could fit the conversation, so a 200k-token request could be handed to a model with a 32k window and fail a second time — slower, and for a different reason than the first. Fallbacks are now filtered by context window before they are attempted. Learn more: Routing guideJuly 27, 2026
You can ask the catalogue for exactly the models you need instead of reading all of them
GET /v1/models now filters on what a model is and what it is for:
?type=image,video, ?tags=tool-use,vision, ?use_cases=write-code.
Several values in type mean “either” — a model has one type. Several in tags
or use_cases mean “all of them”, because a model has many. Both serving paths
answer identically.
Learn more: Models List API
An error now tells you whose problem it is, so you know whether retrying will help
When an upstream failed, its status code came back as though Kyma had produced it. A 429 from somewhere else looked like your rate limit; a 401 looked like your key. Errors Kyma owns now carry Kyma’s status. And when a request is served through an alias, the response says which one resolved, soX-Kyma-Model and the id you
asked for can be reconciled.
Learn more: Error Handling guide
June 2026
Every model got a page with live numbers instead of a specification copied from a launch post
Model detail pages now carry measured data — what the model costs, what it supports, and how it has actually behaved — rather than a static description written on the day it was added. Rankings rows became clickable through to them, so a model that catches your eye in a table is one click from its own page.- Check before you switch — read a model’s real numbers rather than its announcement
- Follow a name from the rankings — the table rows lead somewhere now
- Compare two pages — the same fields, in the same order, for every model in the catalogue
Six models joined, including two flagship coding models and the strongest open-weight tier Kyma had carried
GLM-5.2 and Kimi K2.7-Code arrived as flagship coding models. Alongside them: qwen-3.7-plus, minimax-m3, nemotron-3-ultra-550b and step-3.7-flash, plus ElevenLabs v3 for speech and a Gemini 3.5 Live Translate voice SKU.- Put a coding model behind an agent — GLM-5.2 and Kimi K2.7-Code were added for exactly that shape of work
- Reach 550B open weights — nemotron-3-ultra is the largest open-weight model in the catalogue
- Translate in a live call — the Live Translate SKU runs on the realtime path, not as a batch job
Speech and transcription stopped failing outright when one supplier did
Chat has had four layers of never-die routing for months. Audio had none: one supplier failing meant your request failed. Transcription now retries, then falls back to a second model, then a third. Speech gained cross-pool failover on a rate limit rather than surfacing it to you. Both paths behave the same on either backend, which had to be checked rather than assumed. Learn more: Audio Transcriptions API · Routing guideJune 19, 2026
2 new flagship models: GLM 5.2 and Kimi K2.7 Code
Two new open-weight coding models, both live-verified across their serving paths before launch:glm-5.2— Zhipu’s newest frontier-open flagship. 744B MoE, 1M-token context (up from ~200K on GLM 5.1), #1 open-weight on the Intelligence Index v4.1. 5.94 per 1M tokens. Theglm-flagshipalias now resolves here.kimi-k2.7-code— Moonshot’s coding specialist. +21.8% on Kimi Code Bench v2 vs K2.6 with ~30% fewer reasoning tokens, 262K context, text+image input, always-on thinking. 5.40 per 1M tokens.
glm-5.1 and kimi-k2.6 are still callable by model ID, and agent/best-agent still resolve to kimi-k2.6.
June 10, 2026
4 new models: Qwen 3.7 Plus, MiniMax M3, Nemotron 3 Ultra, Step 3.7 Flash
Four new text models, all with tool calling and live-verified before launch:qwen-3.7-plus— successor to qwen-3.6-plus. 1M context, adds vision, 2.16 per 1M tokensminimax-m3— agentic coding focus, 1M context, text+image+video input, 1.62 (same price as M2.5)nemotron-3-ultra-550b— largest US open-weight model (550B MoE), 1M context, 3.375step-3.7-flash— cheap multimodal flash tier, 256K context, tool calling, 1.553
- Reliability: per-attempt upstream timeout — a hung provider now fails over instead of hanging your request
- Billing hardening: settle idempotency, usage estimation fallback, and time-to-first-byte now measured on every request
deepseek-r1input price adjusted to $0.74/1M (output unchanged)
June 4, 2026
ElevenLabs v3 — most expressive TTS + low-latency streaming
AddedModeleleven-v3— the most expressive text-to-speech model on Kyma. Audio tags and emotional range for character voices and dialogue, lifelike delivery across 70+ languages. Same$0.405/1K charas Multilingual v2. Call it onPOST /v1/audio/speechwith any ElevenLabs voice.
FeatureOpt-in low-latency TTS streaming — pass"stream": trueonPOST /v1/audio/speechto receive audio progressively as it’s synthesized. Time-to-first-audio drops to ~0.4s (from ~1.8s). The response is still a single completeaudio/mpegstream, so existing clients keep working unchanged. Currently applies to the MiniMax speech models.
May 2026
Speech, music and sound effects arrived, so an audio app no longer needs a second vendor and a second bill
May was the month Kyma stopped being text-and-pictures. Text-to-speech landed first, then music, then sound effects, then voice cloning and voice design — each as an ordinary endpoint behind the key you already had.GET /v1/audio/voices lists every voice across the catalogue in one call, so a
picker does not have to know which house a voice comes from.
- Narrate something long — send a chapter to
/v1/audio/speechand get a file back, billed per character - Score a video —
/v1/audio/musicwrites to a prompt and bills per second, so a 30-second bed costs what 30 seconds costs - Clone a voice once and reuse it — upload a sample, get an id, and pass that id anywhere a voice is accepted
Image and video generation grew a real catalogue, and pricing that matches how each one actually charges
Recraft v4 arrived with a print-ready 4MP tier and native SVG output, alongside flux-2-pro, gpt-image-2 and MiniMax’s image-01. Video came with Hailuo 02 at three resolutions. Pricing grew to match: some of these bill per megapixel, some per image, some per second of output. The catalogue now prices each one the way its supplier does, instead of flattening everything into a token count that never applied.- Ship vector art — Recraft v4 Vector returns SVG, not a raster you have to trace
- Print at 4MP — the Pro tier exists for output that has to survive being printed
- Generate video by the second — Hailuo 02 at 512p, 768p or 1080p, billed for what it produced
Web-grounded answers became callable models rather than a separate search product to integrate
Perplexity Sonar and Sonar Pro joined the catalogue. They answer from the live web and cite what they used, through the same request shape as every other chat model. They also introduced a billing primitive Kyma did not have: a per-request fee on top of tokens, because that is how search is actually charged. It is shown separately rather than folded into a token rate that would misprice short and long requests in opposite directions.- Ask about this week — a question whose answer changed yesterday gets yesterday’s answer
- Keep one client — same endpoint, same key, same fallback behaviour as the rest of the catalogue
- See the search fee — the per-request charge appears as itself, not hidden in a token price
Signing up got harder to abuse and easier for real users on shared connections
Signup gained a Turnstile challenge and email verification before free credit is granted, which closed four ways the rate limit could be walked around. The same month fixed the opposite problem. A large share of Vietnamese traffic sits behind carrier-grade NAT, so many genuine users present one address: the per-IP signup cap went from 10 to 30 per day, Google sign-in stopped counting against it, and the login limiter was changed to count only FAILED attempts. Signing in correctly has never been the thing worth throttling. Learn more: Authentication guideMay 17, 2026 (later)
Google media models — 7 new SKUs + public pricing catalog
Google’s media models (Imagen 4, Veo 3, Nano Banana) are now available on Kyma. All seven SKUs ship behind the existing/v1/images/generations and /v1/videos/generations endpoints — no client change needed beyond picking the new model value.
Added — image models
Modelimagen-4-fast— Google Imagen 4 fast tier, $0.027/imageModelimagen-4— Google Imagen 4 default, $0.054/image (recommended)Modelimagen-4-ultra— Google Imagen 4 print-ready, $0.081/imageModelnano-banana— Gemini 2.5 Flash Image with native edit-mode (image-in + prompt → image-out), $0.046/imageModelnano-banana-3-flash— Gemini 3.1 image preview, $0.046/image
Modelveo-3-fast— Google Veo 3 fast tier, 720p no-audio, $0.135/sec (recommended budget)Modelveo-3— Google Veo 3 flagship, 1080p with native audio (dialogue + ambient + lip-sync), $0.540/sec
APIGET /v1/pricing— full catalog: text + image + video + audio in one round-trip. Replaces the partial/v1/credits/pricing(kept for backward compat). Cache-Control 60s.APIGET /v1/limits/tiers— full 5-tier matrix, public, cache-Control 300s. Drives the Rate Limits guide and dashboard signup flow.
May 17, 2026
Audio infrastructure refresh
Eight changes shipped over two days. Headline: realtime audio now serves up to 5000 concurrent sessions per project (a 100× lift), and STT gains a URL-fetch mode + automatic fallback. AddedFeatureRealtime audio WebSocket proxy — scales to 5000 concurrent sessions (was 50). See Realtime Audio.FeatureSTT URL mode —POST /v1/audio/transcriptionsaccepts JSON{"audio_url": "https://..."}up to 100 MB. Multipart upload remains capped at 25 MB. See Audio Transcriptions.FeatureSTT never-die failover — when the primarywhisper-v3-turbohits a transient hiccup, Kyma transparently retries, then routes to a timestamp-preserving secondary (whisper-1), and for plain-text transcripts a final tertiary (gemini-3-flash-audio) — same request, same price. Response carriesX-Kyma-Fallback(serving model) andX-Kyma-Fallback-Layerwhen it fires. See Audio Transcriptions.FeatureTier override for heavy users — partners and enterprises can request Tier 4 limits without the $1000 lifetime deposit. See Rate Limits — Need higher limits?.
UpdateAudio rate limits split into per-capability sub-pools (transcription, understanding, speech). Saturating one no longer blocks the others. See Rate Limits — Audio limits.UpdateAudio concurrency caps raised across all tiers — Tier 4 now 100 total audio slots (was lower).Updateminimax-music-probacked bymusic-2.6(wasmusic-2.5). API contract and pricing unchanged.
OpsIn-process audio load_factor monitor with Telegram alerts when sustained utilization exceeds 0.70 / 0.85 thresholds.
May 1, 2026
- [Model]
gpt-image-2— OpenAI’s flagship image model live on Kyma. Near-perfect text-in-image (multilingual: Japanese, Korean, Hindi, Bengali), reasoning-augmented composition, photoreal output. Quality dropdownlow | medium | high: $0.014 / $0.081 / $0.297 per 1024² image. 4 sizes supported (1024², 1024×1536, 1536×1024, 2048²). Single SKU, no-proderivative — keeps OpenAI’s exact model ID. - [API] Unified picker taxonomy across image, video, and audio composers. Three top-level tiers (
Quality / Fast / Cheap) replace the prior ad-hoc grouping; capability sub-axis surfaces SVG (image) and Speech / Music / SFX / STT / Audio-understand (audio). Hailuo 02 1080p moved Quality → Fast; Quality is now reserved for SOTA-class output (Kling 3 Pro, Seedance 2 Pro, gpt-image-2, flux-2-pro, ideogram-v3, recraft-v4-pro)./v1/modelsexposes newtierandcapabilityfields with?tier=qualityand?capability=vectorfilter params. Backward-compat:cost_tier,quality_tier,latency_tierstill returned. - [Pricing] New
per-qualitypricing mode inIMAGE_COSTS. Hold and settle thread thequalityparam end-to-end so aquality=highrequest books the right amount on the hold (no refund-and-rebill drift on finalize). - [Reliability] Recovery for multimodal jobs after worker death. Hailuo / Image-01 / gpt-image-2 jobs that exceeded their poll budget after the worker died were leaking forever in
processingand holding credits hostage; they now refund cleanly within ~12 minutes for video and ~7 minutes for image. Heartbeat ticker (~1.5 s) keeps in-flight OpenAI calls visible to the sweep so multi-minute high-quality requests don’t get prematurely failed. - [Fix]
not_multimodalvalidator allowlist now reads from a singleMULTIMODAL_PROVIDERSset (was a hardcoded chain). Adding a new model source is one line — same regression that bit MiniMax onboarding before. - [Fix] Audio composer prompt counter NFC-normalizes Vietnamese (and other stacked-diacritic) text before measuring length. Telex-encoded Vietnamese was inflating UTF-16 code units 3× and tripping false
prompt_too_longrejections at ~660 visible characters on 2000-char-cap models. - [Fix] Per-model audio character limits matching upstream provider caps (MiniMax music: prompt ≤ 200 / lyrics ≤ 600; ElevenLabs music prompt ≤ 2000; SFX prompt ≤ 500). Errors now name the SKU and which field overflowed.
April 30, 2026
MiniMax bundle — 9 new SKUs across audio, image, video
Audio, image, and video coverage all expanded under MiniMax’s PAYG pricing — typically 2× to 90× cheaper than comparable hosted equivalents at matching quality tiers. Audio (TTS + music + voice services):- New model
minimax-speech-hd— $0.140/1K char — production multilingual voice, ~2.9× cheaper thaneleven-multilingual-v2. - New model
minimax-speech-turbo— $0.090/1K char — lowest-latency voice on Kyma, ~2.2× cheaper thaneleven-flash-v2-5. - New model
minimax-music— $0.045/song flat — Music-2.0 family, ~90× cheaper thanelevenlabs-musicfor non-hero tracks. - New model
minimax-music-pro— $0.210/song flat — Music-2.5+ richer arrangements at production fidelity. - New endpoint
POST /v1/audio/voice-clone+ model — $2.10/voice flat — clone from 10s-5min reference audio (multipart). - New endpoint
POST /v1/audio/voice-design+ model — $4.20/voice flat — generate a voice from a text description, no reference needed.
- New model
minimax-image-01— $0.005/image flat — cheapest image SKU on Kyma, ~11× cheaper thanrecraft-v4.
- New model
hailuo-02-512p— $0.140/clip — cheapest video tier on Kyma, ~4× cheaper than Kling 2.5 Pro at 6s. - New model
hailuo-02-768p— $0.420/clip — mid tier, balanced quality vs cost. - New model
hailuo-02-1080p— $0.780/clip — full HD hero output, less than half the cost of Kling 3 audio at 10s.
per-song (music), per-call (voice services), per-video (Hailuo) — all flat per request, no duration metering. Image flat-mode SKUs gained an optional listPrice override for safety-buffer rounding.
Sharing a cloned voice_id with another account is rejected
You cannot speak with another account’s cloned voice.POST /v1/audio/speech rejects a voice_id owned by someone else instead of synthesizing it.
Who: all plans
Error: 403 voice_not_owned — voice_id {id} belongs to another account
GET /v1/audio/voices lists only Kyma preset voices plus voices you cloned.
Learn more: Audio Speech API · Audio Voices API
Image catalog refresh — 5 new SKUs
The image lineup grew from 4 → 9 active SKUs. Better defaults, cheaper hero shots, native SVG output.- New model
recraft-v4— $0.054 — replacesrecraft-v3as the daily default. #1 on the HuggingFace Text-to-Image Arena, beats Midjourney V8 / DALL-E 3 / FLUX in human preference. Same price as V3. - New model
recraft-v4-pro— $0.338 — V4 quality at 4MP for print-ready / large-scale assets. - New model
recraft-v4-vector— $0.108 — native SVG output with editable paths and layers. The only generation models on the market shipping true vector files. - New model
recraft-v4-vector-pro— $0.405 — V4 vector at 4MP for print-ready logos and large-scale signage. - New model
flux-2-pro— 0.101 — BFL’s 32B flagship (3× larger than Flux 1.1). Photoreal, ~60% accurate text-in-image, unified gen+edit. Cheaper thanflux-1.1-ultraat 1MP. - New API param
image_urls: string[]— multi-reference blending for FLUX.2 Pro, up to 10 source images merged into a single output. - New per-megapixel pricing mode — FLUX.2 Pro bills a flat base for the first megapixel plus a per-extra-MP rate, rounded to the nearest whole MP. Hold uses the requested size; finalize uses the actual output dimensions.
recraft-v3andflux-1.1-ultraare now marked legacy. Existing API contracts continue to work; new projects should userecraft-v4andflux-2-pro.
April 29, 2026
Audio - 2 new endpoints + 2 SKUs
Kyma now hears. Two synchronous audio endpoints behind the same single-key gate as text, image, and video.- New endpoint
POST /v1/audio/transcriptions- speech-to-text, multipart upload, OpenAI Whisper API compatible - New endpoint
POST /v1/audio/understand- audio scene Q&A (tone, music, SFX, language, emotion), custom Kyma endpoint - New models:
whisper-v3-turboat 0.000648/min - Per-minute pricing - both endpoints bill in 1-minute increments, rounded up. 1-hour file: 0.039 understand = $0.093 total
- New aliases -
model: "transcribe"andmodel: "audio-understand"ride forward when underlying SKUs change - Audio rows now flow through the same V2 ledger as text - visible on
/logs,/rankings, and admin scorecards - Companion CLI
watch-cli- open-source orchestrator that gives any agent eyes and ears for any social video URL (~50x cheaper than full multimodal LLM analysis)
April 26, 2026
Video Generation - 5 new models
Five video models now live behind a single async endpoint.- New endpoint
POST /v1/videos/generations- async, returns 202 with ajob_id; pollGET /v1/jobs/{id}for the result - New models:
kling-2.5-pro,kling-3-pro,kling-3-pro-audio,seedance-2-pro,seedance-2-fast - Per-second pricing - 0.410 per second of video, billed against actual clamped duration
- Per-SKU duration caps - Kling 3 family and Seedance support up to 15s; Kling 2.5 stays at 10s
- Hold-and-finalize billing - failures refund in full; idempotency keys supported end-to-end
- T2V or I2V from a single endpoint - pass
image_urlto switch any video model into image-to-video mode
April 25, 2026
DeepSeek V4 — Pro and Flash
DeepSeek’s V4 lineup now live on Kyma. Both variants are MIT-licensed, MoE, with 1M context and native reasoning.deepseek-v4-pro— 1.6T (49B active) flagship for top reasoning and complex coding. 4.70 per 1M.deepseek-v4-flash— 284B (13B active) value tier. Same family behavior at the lowest V4 price. 0.38 per 1M.- 1M context window, 65K max output, tool calling and structured outputs supported on both.
deepseek-v3stays available as the previous-gen stable baseline; older workloads do not need to migrate.
Image Generation — Week 1
Four image-generation models now live behind a single async endpoint.- New endpoint
POST /v1/images/generations— async, returns 202 with ajob_id; pollGET /v1/jobs/{id}for the result - New models:
flux-1.1-ultra,flux-kontext-pro(image-edit),ideogram-v3,recraft-v3 - Pay-per-image billing with hold-and-finalize semantics — failures are refunded in full
- Idempotency key supported end-to-end; safe to retry POSTs without double-charging
April 23, 2026
API Reliability and Platform Changes
This release bundles billing and rate-limit changes, model/provider updates, agent/runtime improvements, dashboard and product polish, API behavior updates with a focus on user-visible improvements.- Per-model soft weight + latency tracking (#8)
- Ship Kimi K2.6 + fix kyma-agent auto-update EACCES (#9)
- /models nav link + response sanitization fix (#14)
- Routing — broadened fallback chain for deepseek-v3 (#7)
- Sync Kimi K2.6 across docs, landing pages, integrations (#11)
April 21, 2026
Product and Dashboard Updates
This release bundles billing and rate-limit changes, model/provider updates, agent/runtime improvements, dashboard and product polish, API behavior updates with a focus on user-visible improvements.- AI discoverability + models SEO + billing fixes (#3)
- Public model detail — tabbed code blocks like dashboard
- Tuned deepseek-v3 fallback chain for better latency
- AI agent discoverability + public /models SEO pages (#2)
- Admin_top_users RPC — power user analytics without row limit
April 19, 2026
Product and Dashboard Updates
This release bundles billing and rate-limit changes, model/provider updates, agent/runtime improvements, dashboard and product polish, API behavior updates with a focus on user-visible improvements.- Chat playground — searchable model picker, model ID copy, cost per message
- Billing page redesign — Anthropic-style single input, price breakdown, auto top-up inputs
- Billing page redesign — Anthropic-style layout
- Billing page — card editing, invoice links, tier display, unified layout
- Billing — inline card modal, invoice creation, estimated taxes, setup checkout
April 17, 2026
Agent, Install, and Runtime Improvements
This release bundles billing and rate-limit changes, model/provider updates, agent/runtime improvements, dashboard and product polish, API behavior updates with a focus on user-visible improvements.- Switch tier system from spend-based to deposit-based
- Added a new fallback layer for qwen-3.6-plus
- Correct pricing link to docs.kymaapi.com/pricing
- Bump kyma-agent to 0.1.6 and ter bootstrap to 0.1.1
- Qwen-3.6-plus routing tuned to serve the real closed-weight model
April 16, 2026
Kyma Agent v0.1.12 — KYMA.md context + MCP servers
- KYMA.md body injection — project rules now prepend to every turn’s system prompt, not just the initial one. Precedence:
~/.kyma/agent/KYMA.md→./KYMA.md→./KYMA.local.md, withCLAUDE.mdandAGENTS.mdas project fallbacks. Edits apply on the next turn — no restart needed. /init— scaffoldKYMA.mdin one step. Detects JS/TS, Python, Rust, Go, Ruby, PHP and their frameworks, then proposes a starter file with frontmatter (model, thinking) + Stack / Conventions / Key files / Agent behavior sections. Preview before write./mcp— Model Context Protocol servers — bring any MCP-compatible tool server into Kyma. Configure in~/.kyma/agent/mcp.json(user) or./.kyma/mcp.json(project). Subcommands:/mcpto list,/mcp enable <name>,/mcp disable <name>,/mcp test <name>. Tools register automatically at session start asmcp__<server>__<tool>./statusconsolidation — merged/doctor,/balance,/usageinto a single/status. It now shows account, credits, tier limits, lifetime spend, session totals, API latency, local diagnostics, and MCP health in one view.
GLM family from Z.AI
- 3 new models added, bringing the active catalog to 16 models:
glm-5.1— flagship long-running coding agent, repo-scale engineering, 203K contextglm-4.5-air— cheap agentic bulk tasks, 131K contextglm-4.7-flash— cheap long-context throughput, 203K context
- Implicit caching — 50% off on cache hits where the underlying infrastructure supports it.
- Kyma Agent v0.1.11 — the
/modelsslash command now lists GLM 5.1, GLM 4.5 Air, and GLM 4.7 Flash alongside the existing 9 curated models. - Auto-failover — every GLM model has multi-layer fallbacks so requests keep flowing even if a backend is unavailable.
April 15, 2026
Kyma Agent v0.1.8
- Fixed
/doctordiagnostics inkymaafter the0.1.7bridge release. kyma-terremains pinned to0.1.7; this was a package-only hotfix for the bundled ESM diagnostics path.
April 11, 2026
Kyma CLI v0.3
- Historical note: this entry describes the April 11 launch state. Kyma Agent and Kyma Ter have since been retired.
kymacommand — At that time, install was described asnpm install -g kyma-api, then just typekymato start an interactive chat session from your terminal. This CLI has since been retired.- Interactive model picker — Type
/modelin chat to browse active models with arrow keys. Or/model deepseek-r1to switch instantly. - Slash commands —
/model,/models,/balance,/clear,/help,/exit— manage your session without leaving the chat. - Pipe mode —
cat error.log | kyma "fix this"orgit diff | kyma "review this". Auto-detects non-TTY and outputs clean text. - Device code login —
kyma loginopens your browser, auto-fills the code, copies to clipboard. Supports Google OAuth. - JSON mode —
kyma models --jsonfor scripts and CI. Auto-quiet in non-TTY environments.
April 10, 2026
Higher Limits, Better Emails
- 2.5x higher token limits — Free tier now gets 200K tokens/minute (was 80K) and 30 RPM (was 20). Your coding agents can run longer sessions without hitting walls. Tier 1+ also increased proportionally.
- Transactional emails — You’ll now receive a welcome email on signup, a receipt after every purchase, and a heads-up when your balance is running low. Auto top-up failures also notify you immediately.
- Model expansion — Added MiniMax M2.7, Nemotron 3 Super, Step 3.5 Flash, GLM 4.5 Air, Gemma 4 26B MoE at that time. Model grid reorganized into Recommended / Coding & Agents / Fast & Long Context categories.
- Compare page — New
/comparepage with honest Kyma vs other LLM gateways and direct APIs comparison, including benchmark data and migration snippets. - Prompt caching as USP — 48% cache hit rate on heavy users, 23% average cost savings. Now highlighted on homepage.
April 8, 2026
Models & Pricing
- DeepSeek V3 + R1 — added as primary models with multi-layer fallbacks. DeepSeek V3 is GPT-5 class quality. DeepSeek R1 is a reasoning model 96% cheaper than o1.
- Expanded backend redundancy — additional infrastructure for DeepSeek, Llama, and Qwen models. Adds redundancy and lower latency.
- 4 models disabled — removed a low-yield Qwen 3 235B variant (high failure rate),
gpt-oss-20b,llama-3.1-8b,gemma-3-27b(superseded by better models). - Pricing audit — corrected 8 model prices so every listed price covers full multi-route redundancy. If a backup route is too expensive, we remove it rather than raise your price.
- 19 active models at that time with multi-layer infrastructure redundancy.
April 7, 2026
⚡ Reliability & Performance
- Auto-failover — if a model’s primary infrastructure is down, requests automatically retry on backup providers. Most failures are invisible to you.
- Faster responses — reduced internal overhead by ~250ms per request through smarter caching.
- Better rate limiting — rate limits are now shared across our infrastructure (no more inconsistent counts).
- Fallback headers — responses include
X-Kyma-Fallback: truewhen a backup was used, plusX-Kyma-Fallback-Layer: 1|2|3indicating how deep the fallback went. - More models available — expanded backup infrastructure means models stay available even during provider outages.
April 4, 2026
🚀 Launch
- Launch model set — Llama 3.3 70B, Llama 4 Scout, Qwen 3 32B/235B, Gemma 4, Kimi K2, GPT-OSS, Gemini
- Dashboard — API keys, usage stats, playground, model browser
- Google Sign-In — one-click login
- OpenAI compatible — drop-in replacement for any OpenAI SDK
- Tier-based rate limits: Tier 0 (free) = 30 RPM, up to Tier 4 = 300 RPM
- Streaming support
- Supabase PostgreSQL backend