Skip to main content

2026-10-13

Gemini 3.8 Flash now honors reasoning_effort on chat completions, and its thinking shows in usage

On POST /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
Who: paid accounts Numbers: 0.009low⋅0.009 low · 0.019 medium · 0.285highperimage,plus0.285 high per image, plus 0.012 per reference image once per request; sizes up to 1536 px a side Error: 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_url and the prompt drives the motion
  • Predictable price — only cfg_scale is read from extra, so the clip you get is the one the price was held for
Who: paid accounts Numbers: 0.1512persecond,3–15sclips,silent;a5sclipis0.1512 per second, 3–15 s clips, silent; a 5 s clip is 0.756 Learn more: kling-3-pro on Kyma · video-generation on Kyma · Videos Generations API

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
Who: paid accounts Numbers: $0.15525 per second of the finished clip; PCM WAV audio, 5 to 60 seconds Error: 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
Who: paid accounts Numbers: $0.108 per song, whatever its length Error: 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 on POST /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_url to animate a still
  • Vertical or wide — aspect_ratio 16:9 or 9:16
Who: paid accounts Numbers: veo-3.1-fast $0.135 per second; 4, 6 or 8 s; 720p; audio on Error: 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 API

You 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 403 route_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 guide

2026-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 on POST /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 code job_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/limits returns this minute’s rpm_used and tpm_used, with rpm_remaining and tpm_remaining as the limit minus them and resets_at at 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=true and ?structured_outputs=true return exactly the models whose supports_tools / supports_structured_outputs is true.
  • Read cache hits in one place — every /v1/chat/completions response, streamed or not, carries usage.cached_tokens: the cached input tokens the request was priced with, 0 when nothing was cached. prompt_tokens_details is still passed through as the model sent it. No price changed.
Accounts on a custom rate-limit tier are now limited at that tier on every endpoint. Who: all plans Numbers: ?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 2.16/2.16 / 6.48 per million tokens, and 4.32/4.32 / 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.6 to grok-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.6 in production and route a test slice to grok-4.7
Who: funded accounts — the $0.50 signup credit does not cover it, so an account needs a top-up first, the same as grok-4.6 Numbers: grok-4.7 2.16/2.16 / 6.48 per M tokens, stepping to 4.32/4.32 / 12.96 above 200,000 prompt tokens; cached input $0.54 per M; 500,000-token context Error: 402 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.06075hereand0.06075 here and 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 be 503 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/completions for :online models, 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.
The fallback backend’s /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 — on GET /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 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:
After:
Learn more: Images Generations API

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 in X-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.
It writes no prose, reads no images and calls no tools; /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.0567permillioninputtokens,outputfree,roundeduptothenearest0.0567 per million input tokens, output free, rounded up to the nearest 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:
After:
Learn more: Decisions API

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 1.688/1.688 / 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.2 to muse-spark-1.3 and 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.2 or muse-spark-1.1 in production and route a test slice to muse-spark-1.3
Who: funded accounts — the $0.50 signup credit does not cover it, so an account needs a top-up first, the same as muse-spark-1.2 Numbers: muse-spark-1.3 1.688/1.688 / 5.738 per M tokens, the same price as muse-spark-1.2; 1,048,576-token context Error: 402 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 Anthropic document 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 Anthropic image 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 one message_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 honours tool_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 5.40/5.40 / 27 per 1M on /v1/pricing while it sold at 2.70/2.70 / 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 a temperature 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 with parallel_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 API

2026-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.27/0.27 / 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; 13.50/13.50 / 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-flash instead of deepseek-v4-pro, which the lab reroutes on 2026-09-14
  • Read a screenshot on a Flash budget — send an image to deepseek-v4.1-flash and get a transcript or answer at 0.27/0.27 / 0.81 instead of a flagship rate
  • Run a hard reasoning task on OpenAI’s newest flagship — call gpt-6-astra with a 1.05M-token context and prompt caching, and read the exact cost in usage.cost
  • Move off deepseek-v4-pro before 2026-09-14 — switch the id to deepseek-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
Who: all plans Numbers: deepseek-v4.1-flash 0.27/0.27 / 0.81 per M tokens, three routes; gpt-6-astra 13.50/13.50 / 67.50 per M tokens (27/27 / 101.25 above 272K prompt tokens), cached input $1.35 Error: from 2026-09-14 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 returns 404 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-2 for text-in-image, flux-2-pro for photoreal, recraft-v4 and recraft-v4-vector for design and SVG, flux-kontext-pro to edit an image you already have.
  • Keep generating speech — swap eleven-v3 for eleven-multilingual-v2, or minimax-speech-turbo when cost per character matters more than expressiveness.
  • Keep transcribing — nothing changed: whisper-v3-turbo for timestamps and captions, gpt-transcribe or gemini-3.5-transcribe for accuracy on conversational audio.
Why. Each paused SKU served zero customer requests over the 30 days to 11 September 2026, while continuing to cost maintenance: price rows to keep honest, health to track, docs to keep true. Three had already stopped answering upstream. Carrying a model that does not work, or that nobody uses, makes the catalogue harder to choose from without making it more useful. If you need one of these back, say so — unpausing is a one-line change, and volume is the argument that moves it. Who: anyone calling video generation, music, sound effects, voice clone / design, realtime audio, or the three image and one TTS SKUs named below Numbers: 24 media SKUs paused — none of them served a single customer request in the 30 days to 2026-09-11, and three (minimax-music, minimax-music-pro, elevenlabs-sfx) had stopped answering at the upstream entirely Error: a paused id returns 404 model_not_found; four of them name a live replacement (recraft-v3 → recraft-v4, recraft-v4-vector-pro → recraft-v4-vector, flux-1.1-ultra → flux-2-pro, eleven-v3 → eleven-multilingual-v2), the rest say there is no direct replacement Learn more: overview on Kyma

2026-09-11

Chat completions on the Bun runtime answer again instead of 500ing on every request

Bun POST /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 0.405/0.405/1.62 (was 0.3826/0.3826/1.346); kimi-k3 list 4.1243/4.1243/20.6213 (was 4.05/4.05/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

When response_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/popular returns 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.
Comparison pages have always answered any combination whose model ids resolve, not only the 27 curated pairs, so a reader who picked four models got a real page with a real canonical URL. Nothing recorded that the page had been asked for, and three surfaces were built on that silence: the sitemap listed the curated pairs and nothing else, /compare was a static index of the same set, and three and four model pages were marked noindex unconditionally on a URL-count argument. The counter behind the fix records a slug, the model ids in it, a count and two timestamps. No user id, no IP address, no session, no referrer. The index rule now lives in one module that both the page metadata and the sitemap read, so a URL can no longer be in the sitemap while its own page asks not to be indexed. Its measurement half comes from the same source /models and /status publish, so nothing here introduces a second definition of uptime. Comparison pages also gained structured data describing what they measure: the models compared, the technique behind the numbers (a fixed probe every six hours, plus real customer requests), and the three variables published. Every value in it is a Kyma measurement. No borrowed benchmark scores, on the pages or in their structured data. Who: all plans — anyone comparing models on kymaapi.com, and anyone whose agent looks up a comparison Numbers: index rule = curated always, otherwise every model at 100+ observations in 30 days AND opened on 3+ separate days; comparison URLs in the sitemap capped at 2,000 with lastmod from real last-opened time; /compare refreshes every 5 minutes; sitemap every hour; GET /v1/compare/popular cached 5 minutes; both /v1/compare endpoints limited to 60 per IP per minute Error: POST /v1/compare/view answers 400 on a slug that is not two to four catalogue models in sorted order, 429 over the per-IP ceiling, 204 on success. GET /v1/compare/popular answers 503 rather than an empty 200 when the query fails. No existing endpoint changed its status codes or fields. Before:
After:
![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.](https://kymaapi.com/compare — the page gains “Most compared” and “Recently compared” below the curated groups, and each comparison page moves its conclusion sentence above the availability chart) Learn more: Compare · Model Comparisons guide

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_model now 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
  • 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/logout and DELETE /v1/auth/session/cookie both 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 Authorization and 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:
The body is unchanged — 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:
After:
Learn more: Auth Login API

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.50creditonaClaudeflagship,whichthecreditgaterefuses.Everyoneofthe126modelpagesprinted"0.50 credit on a Claude flagship, which the credit gate refuses. Every one of the 126 model pages printed "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:
After:
Learn more: Pricing#Free Tier · Pricing#Free Tier

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.00405aminuteandappearedas0.00405 a minute and appeared as 0.00405, 0.0041,0.0041, 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.md and models.md all 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
Who: all plans Numbers: five formatters printed one catalogue at five precisions — gpt-4o-mini-transcribe is published at 0.00405/minandreachedreadersas0.00405/min and reached readers as 0.00405, 0.0041,0.0041, 0.004 and 0.00dependingonthepage;seedance−2−fast0.00 depending on the page; seedance-2-fast 0.32656 -> 0.326565,gpt−transcribe0.326565, gpt-transcribe 0.00607 -> 0.006075,gemini−3−flash−audio0.006075, gemini-3-flash-audio 0.00259 -> $0.002592 Every page now shows the price you are actually charged, to the digit Learn more: Pricing.Md

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> and Cache-Control: max-age=30, a complete one carries max-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
Who: all plans Numbers: four of six cache-busted requests to /v1/rankings returned 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 Performance board stops going blank when one leaderboard query fails

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
Who: all plans Numbers: an incomplete rankings board is now held by the page for 30 s instead of 300 s — the same number the API already published in its own Cache-Control The rankings page stops showing a blank Performance board for five minutes after the API has recovered

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.200/0.200 / 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
Who: all plans Numbers: qwen-3.6-plus read 99.6% under “Uptime” and its measured uptime is 74.0%; deepseek-v3 read 98.4% and measures 81.3%; the board opened with a 63.1%-reliability model at #1; four audio models printed 0.200/0.200/0.600 against published rates of 0.0009/min,0.0009/min, 0.00405/min, 0.07and0.07 and 0.04 per 1K characters 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

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 read api_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.
Who: all plans Numbers: GET /v1/auth/me 14,437 B → 190 B and 0.35–7.3 s → 0.2–0.3 s; /logs model list 493 → 90 ms; usage daily aggregate 100–300 → 25 ms in Postgres

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 connect https://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.655→0.655 → 0.4911 per 1M input, 3.93→3.93 → 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.
Who: all plans Numbers: usage aggregates 5–31 s → 0.1–0.3 s on a busy account (measured in Postgres); 30-day by-model cost was $32.80 high, now exact

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, so imagen-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:
After:
Learn more: nano-banana-3-flash on Kyma · image-generation on Kyma

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-flash for 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-flash in one call and get a long written analysis back.
  • The hardest reasoning and long-running agents — use claude-fable-5.1 where Fable 5 was the pick: long-horizon agentic workflows and agentic coding, with 1M context and 128K output.
Who: all plans Numbers: gemini-3.8-flash 1.01/1.01 / 5.06 per 1M tokens through Dec 31 2026 (list 2.03/2.03 / 10.13); claude-fable-5.1 13.50/13.50 / 67.50 per 1M tokens Learn more: gemini-3.8-flash on Kyma · claude-fable-5.1 on Kyma

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-exp at the V4 Flash price tier.
  • Video and document understanding on open weights — qwen3.8-27b takes 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.
Who: all plans Numbers: qwen3.8-27b 0.57/0.57 / 4.05 per 1M tokens; deepseek-v4-flash-vision-exp 0.30/0.30 / 0.89 per 1M tokens Learn more: qwen3.8-27b on Kyma · deepseek-v4-flash-vision-exp on Kyma

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 6.75/6.75 / 40.50 while requests were billed at 2.70/2.70 / 13.50. The page now matches the bill. Who: all plans Numbers: gpt-5.6-sol and gpt-5.6-sol-pro 2.70/2.70 / 13.50 per 1M tokens through Nov 21 2026 (list 5.40/5.40 / 27.00, was shown as 6.75/6.75 / 40.50); gemini-3.7-flash and gemini-3.8-flash 1.01/1.01 / 5.06 through Dec 31 2026 (list 2.03/2.03 / 10.13); glm-5.3-flash 0.10/0.10 / 0.34 through Sep 9 2026 (list 0.20/0.20 / 0.68) Learn more: Pricing

qwen-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 1.69/1.69 / 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: 2.30/2.30 / 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 2.30/2.30 / 6.91 per 1M tokens (was 1.69/1.69 / 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.20/0.20 / 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 2.70/2.70/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 2.70in/2.70 in / 16.20 out per million tokens. Above 200,000 prompt tokens the rate steps to 5.40/5.40 / 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 /pricing and in /v1/models, not discovered on the invoice
  • Nano Banana 3 Flash answers again — the upstream endpoint swap was transparent: same nano-banana-3-flash model id, same $0.061 per image
Learn more: Pricing · gemini-3.1-pro on Kyma · nano-banana-3-flash on Kyma

Gemini 3.7 Flash is live at 1.01/1.01/5.06 per million tokens — and half that, 0.51/0.51/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 1.01in/1.01 in / 5.06 out per million tokens; while the launch discount holds upstream we publish 0.51/0.51 / 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/models publishes 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
Learn more: Pricing · overview on Kyma

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 13.50inand13.50 in and 67.50 out per million tokens

You can call Claude Fable 5 as claude-fable-5 through the same OpenAI-compatible endpoint. It lists at 13.50in/13.50 in / 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/models publishes the rate in force
Who: all plans Numbers: 13.50in/13.50 in / 67.50 out per 1M tokens; 1M context Learn more: overview on Kyma · Pricing

Grok 4.6 is live at 2.70inand2.70 in and 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 2.70in/2.70 in / 8.10 out per million tokens on GET /v1/models. Above 200,000 prompt tokens the rate steps to 5.40/5.40 / 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
Who: all plans Numbers: 2.70in/2.70 in / 8.10 out per 1M tokens; 5.40/5.40 / 16.20 above 200K prompt tokens; 500K context Learn more: overview on Kyma · Pricing

Qwen 3.8 Max is live at 2.2275inand2.2275 in and 6.684 out per million tokens

You can call Qwen 3.8 Max as qwen-3.8-max on the same catalog and the same chat endpoint. It lists at 2.2275in/2.2275 in / 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/models publishes the cached-input price next to the list rate
Who: all plans Numbers: 2.2275in/2.2275 in / 6.684 out per 1M tokens; cached input $0.2781 per 1M; 1M context Learn more: overview on Kyma · Pricing

Qwen 3.8 Max is listed once, at the 2.2275/2.2275 / 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: 2.2275in/2.2275 in / 6.684 out per 1M tokens; cached input $0.2781 per 1M Learn more: overview on Kyma · Pricing

August 3, 2026

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 · Pricing

The 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 Kyma

August 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,google puts 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
Learn more: Models List API

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 :online to 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
Learn more: Chat Completions API · Models guide

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
Learn more: Models guide

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: Pricing

What 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 API

Searching 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. You can compare models on measured speed and uptime instead of taking a claim on trust
  • 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
Learn more: Models guide · Routing guide

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: Pricing

Your 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 guide

The 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/completions when 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
Learn more: Completions API

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
Learn more: Embeddings API

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 .md twin 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
Learn more: Models guide

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: Pricing

Pages 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 behind nano-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
Every one arrived through the same launch path: verified against the provider, priced from the dearest route that serves it, and its capability flags checked against what the provider publishes rather than what we assumed.
  • 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
Learn more: kimi-k3 on Kyma · gemini-3.6-flash on Kyma

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 guide

July 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 guide

July 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, so X-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
Learn more: Models guide

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
Learn more: Models guide · Pricing

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 guide

June 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. 1.89/1.89/5.94 per 1M tokens. The glm-flagship alias 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. 1.28/1.28/5.40 per 1M tokens.
Both keep their predecessors available: 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, 0.54/0.54/2.16 per 1M tokens
  • minimax-m3 — agentic coding focus, 1M context, text+image+video input, 0.405/0.405/1.62 (same price as M2.5)
  • nemotron-3-ultra-550b — largest US open-weight model (550B MoE), 1M context, 0.675/0.675/3.375
  • step-3.7-flash — cheap multimodal flash tier, 256K context, tool calling, 0.27/0.27/1.553
Also in this release:
  • 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-r1 input price adjusted to $0.74/1M (output unchanged)

June 4, 2026

ElevenLabs v3 — most expressive TTS + low-latency streaming

Added
  • Model eleven-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 char as Multilingual v2. Call it on POST /v1/audio/speech with any ElevenLabs voice.
Changed
  • Feature Opt-in low-latency TTS streaming — pass "stream": true on POST /v1/audio/speech to receive audio progressively as it’s synthesized. Time-to-first-audio drops to ~0.4s (from ~1.8s). The response is still a single complete audio/mpeg stream, 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/speech and get a file back, billed per character
  • Score a video — /v1/audio/music writes 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
Learn more: Audio Speech API · Audio Music API · Audio Sfx API

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
Learn more: Images Generations API · Videos Generations API · Pricing

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
Learn more: Models guide · Pricing

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 guide

May 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
  • Model imagen-4-fast — Google Imagen 4 fast tier, $0.027/image
  • Model imagen-4 — Google Imagen 4 default, $0.054/image (recommended)
  • Model imagen-4-ultra — Google Imagen 4 print-ready, $0.081/image
  • Model nano-banana — Gemini 2.5 Flash Image with native edit-mode (image-in + prompt → image-out), $0.046/image
  • Model nano-banana-3-flash — Gemini 3.1 image preview, $0.046/image
Added — video models (async LRO, ~30–180s)
  • Model veo-3-fast — Google Veo 3 fast tier, 720p no-audio, $0.135/sec (recommended budget)
  • Model veo-3 — Google Veo 3 flagship, 1080p with native audio (dialogue + ambient + lip-sync), $0.540/sec
Added — public pricing & limits endpoints
  • API GET /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.
  • API GET /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. Added
  • Feature Realtime audio WebSocket proxy — scales to 5000 concurrent sessions (was 50). See Realtime Audio.
  • Feature STT URL mode — POST /v1/audio/transcriptions accepts JSON {"audio_url": "https://..."} up to 100 MB. Multipart upload remains capped at 25 MB. See Audio Transcriptions.
  • Feature STT never-die failover — when the primary whisper-v3-turbo hits 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 carries X-Kyma-Fallback (serving model) and X-Kyma-Fallback-Layer when it fires. See Audio Transcriptions.
  • Feature Tier override for heavy users — partners and enterprises can request Tier 4 limits without the $1000 lifetime deposit. See Rate Limits — Need higher limits?.
Changed
  • Update Audio rate limits split into per-capability sub-pools (transcription, understanding, speech). Saturating one no longer blocks the others. See Rate Limits — Audio limits.
  • Update Audio concurrency caps raised across all tiers — Tier 4 now 100 total audio slots (was lower).
  • Update minimax-music-pro backed by music-2.6 (was music-2.5). API contract and pricing unchanged.
Internal (not user-visible — for the curious)
  • Ops In-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 dropdown low | medium | high: $0.014 / $0.081 / $0.297 per 1024² image. 4 sizes supported (1024², 1024×1536, 1536×1024, 2048²). Single SKU, no -pro derivative — 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/models exposes new tier and capability fields with ?tier=quality and ?capability=vector filter params. Backward-compat: cost_tier, quality_tier, latency_tier still returned.
  • [Pricing] New per-quality pricing mode in IMAGE_COSTS. Hold and settle thread the quality param end-to-end so a quality=high request 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 processing and 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_multimodal validator allowlist now reads from a single MULTIMODAL_PROVIDERS set (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_long rejections 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 than eleven-multilingual-v2.
  • New model minimax-speech-turbo — $0.090/1K char — lowest-latency voice on Kyma, ~2.2× cheaper than eleven-flash-v2-5.
  • New model minimax-music — $0.045/song flat — Music-2.0 family, ~90× cheaper than elevenlabs-music for 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.
Image (sub-cent tier):
  • New model minimax-image-01 — $0.005/image flat — cheapest image SKU on Kyma, ~11× cheaper than recraft-v4.
Video (Hailuo 02 family, 6s or 10s clips):
  • 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.
New pricing modes: 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 — replaces recraft-v3 as 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.041–0.041–0.101 — BFL’s 32B flagship (3× larger than Flux 1.1). Photoreal, ~60% accurate text-in-image, unified gen+edit. Cheaper than flux-1.1-ultra at 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-v3 and flux-1.1-ultra are now marked legacy. Existing API contracts continue to work; new projects should use recraft-v4 and flux-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-turbo at 0.0009/min,[‘gemini−3−flash−audio‘](/models/gemini−3−flash−audio)at0.0009/min, [`gemini-3-flash-audio`](/models/gemini-3-flash-audio) at 0.000648/min
  • Per-minute pricing - both endpoints bill in 1-minute increments, rounded up. 1-hour file: 0.054transcribe+0.054 transcribe + 0.039 understand = $0.093 total
  • New aliases - model: "transcribe" and model: "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 a job_id; poll GET /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.0945to0.0945 to 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_url to 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. 2.35/2.35 / 4.70 per 1M.
  • deepseek-v4-flash — 284B (13B active) value tier. Same family behavior at the lowest V4 price. 0.19/0.19 / 0.38 per 1M.
  • 1M context window, 65K max output, tool calling and structured outputs supported on both.
  • deepseek-v3 stays 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.

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, with CLAUDE.md and AGENTS.md as project fallbacks. Edits apply on the next turn — no restart needed.
  • /init — scaffold KYMA.md in 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: /mcp to list, /mcp enable <name>, /mcp disable <name>, /mcp test <name>. Tools register automatically at session start as mcp__<server>__<tool>.
  • /status consolidation — merged /doctor, /balance, /usage into 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 context
    • glm-4.5-air — cheap agentic bulk tasks, 131K context
    • glm-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 /models slash 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 /doctor diagnostics in kyma after the 0.1.7 bridge release.
  • kyma-ter remains pinned to 0.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.
  • kyma command — At that time, install was described as npm install -g kyma-api, then just type kyma to start an interactive chat session from your terminal. This CLI has since been retired.
  • Interactive model picker — Type /model in chat to browse active models with arrow keys. Or /model deepseek-r1 to 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" or git diff | kyma "review this". Auto-detects non-TTY and outputs clean text.
  • Device code login — kyma login opens your browser, auto-fills the code, copies to clipboard. Supports Google OAuth.
  • JSON mode — kyma models --json for 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 /compare page 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: true when a backup was used, plus X-Kyma-Fallback-Layer: 1|2|3 indicating 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