Reference

Changelog

Every change to the public API that could affect your code. Model ids, prices, response fields and error shapes, newest first.

Breaking changes are marked. Everything else is additive.

31 July 2026

Speech, on OpenAI’s own paths. POST /v1/audio/transcriptions and POST /v1/audio/speech are live. An existing OpenAI audio client needs a new base URL and nothing else.

Two models: whisper-large-v3-turbo (MIT) for transcription, kokoro-82m (Apache-2.0) for synthesis. See Transcriptions and Speech.

Additive — pricing.unit now returns second and character, not only token. Transcription bills per second of audio submitted, rounded up; synthesis bills per character of input. If you parse GET /v1/models, do not assume unit is token — it always carried the unit, and now it carries three of them.

Additive — modality on GET /v1/models. text, stt or tts, so you can pick the right endpoint before calling one.

Additive — context_window is now null for speech models rather than 0. Audio models have no context window; their limits are file size and duration. Text models are unaffected.

30 July 2026

Breaking — dawnstack.credits is now dawnstack.cost_micros and dawnstack.cost_usd. Credits were US dollars multiplied by 100,000 and nothing else, so the unit carried no information the dollar figure did not. The additive block now reads:

"dawnstack": { "cost_micros": 6, "cost_usd": 0.000006, "request_id": "req_8f2a1c" }

One micro-dollar is $0.000001. An existing balance was migrated exactly; nothing changed in value. See Pricing and billing.

Breaking — errors on /v1 now use OpenAI’s envelope. They previously returned {"ok": false, "error": {"code", "message"}}, which has no type and puts message one level from where the SDKs read it, so e.message was empty on every failure. Now:

{ "error": { "message": "…", "type": "insufficient_quota", "param": null, "code": "INSUFFICIENT_BALANCE" } }

If you wrote a workaround for empty error messages, you can delete it. See Errors.

Fixed — tool calls now stream. delta.tool_calls was dropped by the frame rewriter, so a streamed tool call arrived as an empty stream ending in finish_reason: "stop". If you concluded tool calling did not work with stream: true, it does now. finish_reason is also no longer flattened to "stop", so length and tool_calls come through.

Added — stream_options: { include_usage: true }. It was silently stripped before, so a stream never carried token counts. See Streaming.

Added — GET /v1/models/{id}, OpenAI’s retrieve-model endpoint. client.models.retrieve() used to 404.

Added — response headers. Retry-After and X-RateLimit-Reset on 429, WWW-Authenticate on 401, and the leading delta: {"role": "assistant"} frame on every stream.

Changed — x-request-id is the header name everywhere. The playground used x-dawnstack-request-id.

Changed — session-authenticated requests to /v1/chat/completions are now rate limited at 20 a minute per account. They were unlimited. Key-authenticated requests are unaffected at 60 a minute.

Changed — the docs. This reference replaced a single page. Old #anchor links still land on the reference, though not on the exact section.

30 July 2026, earlier

Changed — prices fell 53% to 86% on output across the catalogue, at unchanged margin, when supply moved to a different provider. The catalogue grew from 9 models to 45.

Changed — GET /v1/models is now public. It required an API key, so nobody could read the catalogue or the prices before signing up and no third-party tool could discover us. It also now publishes supported_parameters, quantization, the maker, and measured speed.

Fixed — tools and response_format were being silently dropped. The request schema listed five fields and everything else was stripped, so a caller who sent tools got a 200 with prose and no explanation. The full OpenAI parameter set is forwarded now, and tool_calls is returned in the response. If you tried tool calling before this date and it appeared to do nothing, that is why.

26 July 2026

POST /v1/chat/completions went live.