[Additive] OpenAI: 2 new response fields OpenAI added two additive response fields, UsageCompletionsResult.input_cache_write_30m_tokens and DecisionsUsageResult.input_cache_write_30m_tokens, to its API, according to an API change tracker. The same tracker lists breaking changes shipped alongside them, including the removal of the spend_control response field and the spend_control parameter no longer being accepted in CreateAgentSessionParams and UpdateAgentSessionParams, plus new enum values such as "prompt" for VoiceResource.type and "degraded" for ExternalStorageStatus that break exhaustive switches and strict parsers. WebSearchActionFind.url and BetaWebSearchActionFind.url are no longer guaranteed present and can now be null. OpenAI https://driftwatch.et/apis/openai 2 additive 2 new response fields - UsageCompletionsResult.input cache write 30m tokens - DecisionsUsageResult.input cache write 30m tokens APIs https://driftwatch.et/providers / OpenAI Breaking changes, deprecations and new fields in the OpenAI API, as they ship. - Breakingdirection flip: their tools call this safe spend control is no longer accepted https://driftwatch.et/changes/openai-2026-10-16-dd257ddb Usually ignored rather than rejected, so the call succeeds and does something subtly different. 2 places: CreateAgentSessionParams.spend control, UpdateAgentSessionParams.spend control Code that breaks await client.post "/…", { // spend control is now ignored, not rejected spend control: value, } ; - Breaking Response field spend control removed https://driftwatch.et/changes/openai-2026-10-16-35e44462 Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call. SessionResource.spend control · reachable from 5 operations Code that breaks js // response.spend control is now undefined const spend control = response.spend control; - Breakingdirection flip: their tools call this safe type can now return "prompt" https://driftwatch.et/changes/openai-2026-10-16-08a1b1f2 Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. VoiceResource.type · reachable from 1 operation Code that breaks switch response.type { // existing branches … // no branch for "prompt" default: throw new Error "unexpected type" ; } - Additive Response field prompt added https://driftwatch.et/changes/openai-2026-10-16-4d61e329 No action needed unless you validate responses against a closed schema. VoiceResource.prompt · reachable from 1 operation - Breakingdirection flip: their tools call this safe value can now return "degraded" https://driftwatch.et/changes/openai-2026-10-16-cf106caa Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. ExternalStorageStatus · reachable from 4 operations Code that breaks switch response { // existing branches … // no branch for "degraded" default: throw new Error "unexpected value" ; } - Breakingdirection flip: their tools call this safe Response field url is no longer guaranteed https://driftwatch.et/changes/openai-2026-10-15-a8bd6f1b Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. no longer guaranteed present; can now be null 2 places: BetaWebSearchActionFind.url, WebSearchActionFind.url Code that breaks js // response.url may now be absent or null const url = response.url ?? fallback; - WebSearchActionFind.url - BetaWebSearchActionFind.url - ImagesResponse.safety identifier - ImageGenCompletedEvent.safety identifier - ImageEditCompletedEvent.safety identifier - CreateImageEditRequest.safety identifier - CreateImageRequest.safety identifier - EditImageBodyJsonParam.safety identifier - Additive Request property phase added https://driftwatch.et/changes/openai-2026-10-15-24c50cb9 No action needed unless it is required. DecisionInputMessage.phase · reachable from 1 operation - Error-2.param - Error-2.type - VideoResource.error.param - VideoResource.error.type - BetaResponseError.param - BetaResponseError.type - ResponseError.param - ResponseError.type - Breakingdirection flip: their tools call this safe value can now return "AU STORAGE PROCESSING", "IN STORAGE PROCESSING", "JP STORAGE PROCESSING" https://driftwatch.et/changes/openai-2026-10-14-673db448 Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. PublicProjectResidency · reachable from 5 operations Code that breaks switch response { // existing branches … // no branch for "AU STORAGE PROCESSING" // no branch for "IN STORAGE PROCESSING" // no branch for "JP STORAGE PROCESSING" default: throw new Error "unexpected value" ; } - Additive Request property scopes added https://driftwatch.et/changes/openai-2026-10-14-0d1fb9cc No action needed unless it is required. UpdateProjectApiKeyBody.scopes · reachable from 1 operation - ImageGenToolCall.error - BetaImageGenToolCall.error - Additive POST /organization/projects/{project id}/api keys/{api key id} added https://driftwatch.et/changes/openai-2026-10-13-65364adb No action needed. POST /organization/projects/{project id}/api keys/{api key id} - Additive /organization/usage/decisions added https://driftwatch.et/changes/openai-2026-10-09-275974de No action needed. /organization/usage/decisions - Breakingdirection flip: their tools call this safe value can now return "suspended" https://driftwatch.et/changes/openai-2026-10-08-4a7c1371 Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. EnvironmentStatusResource · reachable from 3 operations Code that breaks switch response { // existing branches … // no branch for "suspended" default: throw new Error "unexpected value" ; } - Breakingdirection flip: their tools call this safe value can now return "expired", "suspended" https://driftwatch.et/changes/openai-2026-10-08-c7102a8f Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. SessionEnvironmentStatusResource · reachable from 2 operations Code that breaks switch response { // existing branches … // no branch for "expired" // no branch for "suspended" default: throw new Error "unexpected value" ; } - Additive Response field detailed explanation added https://driftwatch.et/changes/openai-2026-10-08-4e4137cb No action needed unless you validate responses against a closed schema. SafetyAlertResource.detailed explanation · reachable from 1 operation - Breakingdirection flip: their tools call this safe value can now return "ready" https://driftwatch.et/changes/openai-2026-10-08-3c4525d9 Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. EnvironmentStatusResource · reachable from 3 operations Code that breaks switch response { // existing branches … // no branch for "ready" default: throw new Error "unexpected value" ; } - Additive /agents/environments added https://driftwatch.et/changes/openai-2026-10-08-6bbce226 No action needed. /agents/environments - Additive Request property environment id added https://driftwatch.et/changes/openai-2026-10-08-9178d58c No action needed unless it is required. EnvironmentParamOpenaiHosted.environment id · reachable from 1 operation - Additive Response field spend control added https://driftwatch.et/changes/openai-2026-10-08-04d767ea No action needed unless you validate responses against a closed schema. SessionResource.spend control · reachable from 5 operations - CreateAgentSessionParams.spend control - UpdateAgentSessionParams.spend control - Breaking limit changed type https://driftwatch.et/changes/openai-2026-10-08-2e11d1d1 Serialization mismatch. Integer-to-string moves are the usual cause and the usual outage. GET /agents · limit · 5 call sites Code that breaks // payload.limit // was: integer|null // now: integer - Breaking after changed type https://driftwatch.et/changes/openai-2026-10-08-fd21b283 Serialization mismatch. Integer-to-string moves are the usual cause and the usual outage. GET /agents/sessions/{session id}/artifacts · after Code that breaks // payload.after // was: null|string // now: string - Breakingdirection flip: their tools call this safe Response values are no longer constrained https://driftwatch.et/changes/openai-2026-10-08-3ab40de9 The documented set of values is gone, so anything can appear. Every exhaustive switch and generated enum over this field is now incomplete. VoiceResource.type · reachable from 1 operation - Breaking voice no longer accepts "shitan" https://driftwatch.et/changes/openai-2026-10-07-ac28513e A value you may have hardcoded is now rejected. LiveInitialSessionAudioOutputParam.voice · reachable from 2 operations Code that breaks // sending "shitan" for voice is now rejected - Breakingdirection flip: their tools call this safe value can now return "billing not active" https://driftwatch.et/changes/openai-2026-10-06-9f7b5d71 Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. SessionTurnErrorCodeResource · reachable from 6 operations Code that breaks switch response { // existing branches … // no branch for "billing not active" default: throw new Error "unexpected value" ; } - Behavioral 429 is now documented on /agents/environments/{environment id}/files https://driftwatch.et/changes/openai-2026-10-06-d1da5762 An unhandled branch in your error handling. POST /agents/environments/{environment id}/files · 2 call sites - Breaking Response field compute units removed https://driftwatch.et/changes/openai-2026-10-06-64c9db86 Reads of this field return undefined, and the failure surfaces wherever that value is used rather than at the call. ResponseUsageResource.compute units · reachable from 1 operation Code that breaks js // response.compute units is now undefined const compute units = response.compute units; - Additive metadata is now optional https://driftwatch.et/changes/openai-2026-10-06-88f529d4 No action needed. GET /vaults · metadata · 2 call sites - Additive POST /vaults/{vault id} added https://driftwatch.et/changes/openai-2026-10-06-aa14b04b No action needed. POST /vaults/{vault id} - Additive /decisions added https://driftwatch.et/changes/openai-2026-10-06-7d856756 No action needed. /decisions - Additive Response field cache write tokens added https://driftwatch.et/changes/openai-2026-10-06-9eb48b0f No action needed unless you validate responses against a closed schema. InputTokensDetailsResource.cache write tokens · reachable from 1 operation - Breaking environment changed type https://driftwatch.et/changes/openai-2026-10-06-2c55ed5d Serialization mismatch. Integer-to-string moves are the usual cause and the usual outage. LiveHostedShellToolInputParam.environment · reachable from 3 operations Code that breaks // payload.environment // was: null|object // now: null - MisalignmentErrorDetailsResource.review target - BetaMisalignmentErrorDetailsResource.review target - Additive Request field now accepts null https://driftwatch.et/changes/openai-2026-10-06-f83267a6 A relaxation. Existing payloads are unaffected. LiveHostedShellToolInputParam.environment · reachable from 3 operations - Breakingdirection flip: their tools call this safe Response field bytes is no longer guaranteed https://driftwatch.et/changes/openai-2026-10-06-46bcd119 Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. can now be null 2 places: OpenAIFile.bytes, Upload.file.bytes Code that breaks js // response.bytes may now be absent or null const bytes = response.bytes ?? fallback; - Breakingdirection flip: their tools call this safe Response field finish reason is no longer guaranteed https://driftwatch.et/changes/openai-2026-10-06-abbdcd05 Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. CreateChatCompletionStreamResponse.choices .finish reason · reachable from 1 operation Code that breaks js // response.choices 0 .finish reason may now be absent or null const finish reason = response.choices 0 .finish reason ?? fallback; - Additive Response field audio added https://driftwatch.et/changes/openai-2026-10-06-c63cc849 No action needed unless you validate responses against a closed schema. ChatCompletionStreamResponseDelta.audio · reachable from 1 operation - Breaking voice no longer accepts "aube" https://driftwatch.et/changes/openai-2026-10-05-c76c343c A value you may have hardcoded is now rejected. LiveInitialSessionAudioOutputParam.voice · reachable from 2 operations Code that breaks // sending "aube" for voice is now rejected - Behavioral 201 is now documented on /organization/invites https://driftwatch.et/changes/openai-2026-10-03-428f1138 An unhandled branch in your error handling. POST /organization/invites · 4 call sites - Breakingdirection flip: their tools call this safe value can now return "organization spend limit exceeded", "organization usage limit exceeded", "project spend limit exceeded" https://driftwatch.et/changes/openai-2026-10-02-1a3a14dc Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. SessionTurnErrorCodeResource · reachable from 6 operations Code that breaks switch response { // existing branches … // no branch for "organization spend limit exceeded" // no branch for "organization usage limit exceeded" // no branch for "project spend limit exceeded" default: throw new Error "unexpected value" ; } - Additive Response field user id added https://driftwatch.et/changes/openai-2026-10-02-ac4c7218 No action needed unless you validate responses against a closed schema. CostsResult.user id · reachable from 11 operations - Additive /agents/sessions/{session id}/turns/{turn id}/items added https://driftwatch.et/changes/openai-2026-10-02-f3ef76e7 No action needed. /agents/sessions/{session id}/turns/{turn id}/items - UsageWebSearchCallsResult.api source - CostsResult.api source - UsageCompletionsResult.api source - Breaking type no longer accepts "consent" https://driftwatch.et/changes/openai-2026-10-01-5e5bddbe A value you may have hardcoded is now rejected. CreateVoiceFromConsentRequest.type · reachable from 1 operation Code that breaks // sending "consent" for type is now rejected - Behavioral Default value changed https://driftwatch.et/changes/openai-2026-10-01-dc584209 Behavior shifts for every call that omits the field. CreateVoiceFromConsentRequest.type · reachable from 1 operation - Additive Response field type added https://driftwatch.et/changes/openai-2026-10-01-065ca125 No action needed unless you validate responses against a closed schema. VoiceResource.type · reachable from 1 operation - Breakingdirection flip: their tools call this safe Response field refusal is no longer guaranteed https://driftwatch.et/changes/openai-2026-10-01-c1ca1489 Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. ChatCompletionResponseMessage.refusal · reachable from 4 operations Code that breaks js // response.refusal may now be absent or null const refusal = response.refusal ?? fallback; - Breakingdirection flip: their tools call this safe Response field first id is no longer guaranteed https://driftwatch.et/changes/openai-2026-10-01-61bc1937 Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. ChatCompletionList.first id · reachable from 1 operation Code that breaks js // response.first id may now be absent or null const first id = response.first id ?? fallback; - Breakingdirection flip: their tools call this safe Response field last id is no longer guaranteed https://driftwatch.et/changes/openai-2026-10-01-b7e3dc08 Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. ChatCompletionList.last id · reachable from 1 operation Code that breaks js // response.last id may now be absent or null const last id = response.last id ?? fallback; - Breakingdirection flip: their tools call this safe audio sample is no longer accepted https://driftwatch.et/changes/openai-2026-10-01-de6dea06 Usually ignored rather than rejected, so the call succeeds and does something subtly different. CreateVoiceRequest.audio sample · reachable from 1 operation Code that breaks await client.post "/…", { // audio sample is now ignored, not rejected audio sample: value, } ; - Breakingdirection flip: their tools call this safe consent is no longer accepted https://driftwatch.et/changes/openai-2026-10-01-1be14473 Usually ignored rather than rejected, so the call succeeds and does something subtly different. CreateVoiceRequest.consent · reachable from 1 operation Code that breaks await client.post "/…", { // consent is now ignored, not rejected consent: value, } ; - Breakingdirection flip: their tools call this safe name is no longer accepted https://driftwatch.et/changes/openai-2026-10-01-9b7060f5 Usually ignored rather than rejected, so the call succeeds and does something subtly different. CreateVoiceRequest.name · reachable from 1 operation Code that breaks await client.post "/…", { // name is now ignored, not rejected name: value, } ; - Breaking value no longer accepts "ultrafast" https://driftwatch.et/changes/openai-2026-10-01-eecd749d A value you may have hardcoded is now rejected. no longer accepts "ultrafast" 5 places: ServiceTierParam, CreateAgentParams.service tier, SessionAgentConfigParam.service tier, UpdateAgentParams.service tier, UpdateSessionAgentParam.service tier Code that breaks // sending "ultrafast" for undefined is now rejected - Breaking model is now required https://driftwatch.et/changes/openai-2026-09-30-24f4bbee Partial payloads are rejected. 2 places: CreateImageEditRequest.model, CreateImageRequest.model Code that breaks await client.post "/…", { // … model: / now required /, } ; - Deprecation POST /images/variations deprecated https://driftwatch.et/changes/openai-2026-09-30-47293aa2 Still works today. This is the earliest warning you will get before it is removed. POST /images/variations - Behavioral Default value changed https://driftwatch.et/changes/openai-2026-09-30-8ae860a5 Behavior shifts for every call that omits the field. CreateImageEditRequest.size · reachable from 1 operation - Behavioral Default value changed https://driftwatch.et/changes/openai-2026-09-30-84eaa692 Behavior shifts for every call that omits the field. EditImageBodyJsonParam.model · reachable from 1 operation - Breaking POST /evals/{eval id}/runs/{run id} removed https://driftwatch.et/changes/openai-2026-09-30-5e4cd2c7 This verb now 405s. The path still resolves, so a health check on the URL will not catch it. POST /evals/{eval id}/runs/{run id} Code that breaks // Was: await client.request "POST", "/evals/{eval id}/runs/{run id}" ; // Now: 405 - Additive /evals/{eval id}/runs/{run id}/cancel added https://driftwatch.et/changes/openai-2026-09-30-7492acd1 No action needed. /evals/{eval id}/runs/{run id}/cancel - Behavioral 502 is now documented on /live/sessions https://driftwatch.et/changes/openai-2026-09-30-23cbb44c An unhandled branch in your error handling. POST /live/sessions - Behavioral 504 is now documented on /live/sessions https://driftwatch.et/changes/openai-2026-09-30-e5384bba POST /live/sessions - Additive Response field input cache write 12h tokens added https://driftwatch.et/changes/openai-2026-09-30-0d80c0fa No action needed unless you validate responses against a closed schema. UsageCompletionsResult.input cache write 12h tokens · reachable from 11 operations - Additive /agents/sessions/{session id}/traces added https://driftwatch.et/changes/openai-2026-09-30-6333742a No action needed. /agents/sessions/{session id}/traces - Breakingdirection flip: their tools call this safe Response field model is no longer guaranteed https://driftwatch.et/changes/openai-2026-09-29-0b8f9e75 Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. EvalRun.model · reachable from 4 operations Code that breaks js // response.model may now be absent or null const model = response.model ?? fallback; - Breakingdirection flip: their tools call this safe Response field name is no longer guaranteed https://driftwatch.et/changes/openai-2026-09-29-0dd028d5 Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. EvalRun.name · reachable from 4 operations Code that breaks js // response.name may now be absent or null const name = response.name ?? fallback; - Breakingdirection flip: their tools call this safe Response field per model usage is no longer guaranteed https://driftwatch.et/changes/openai-2026-09-29-6e07444c Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. EvalRun.per model usage · reachable from 4 operations Code that breaks js // response.per model usage may now be absent or null const per model usage = response.per model usage ?? fallback; - Breakingdirection flip: their tools call this safe Response field per testing criteria results is no longer guaranteed https://driftwatch.et/changes/openai-2026-09-29-b8930d6c Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. EvalRun.per testing criteria results · reachable from 4 operations Code that breaks js // response.per testing criteria results may now be absent or null const per testing criteria results = response.per testing criteria results ?? fallback; - Breaking token usage changed type https://driftwatch.et/changes/openai-2026-09-29-18c44c4d Parse failure, or silent coercion depending on your client. RunGraderResponse.metadata.token usage · reachable from 1 operation Code that breaks // payload.metadata.token usage // was: integer|null // now: null|object - Breakingdirection flip: their tools call this safe Response field finish reason is no longer guaranteed https://driftwatch.et/changes/openai-2026-09-29-e58403fa Producer-side tools call this non-breaking. For a consumer it is a null dereference on an unknown future date. CreateCompletionResponse.choices .finish reason · reachable from 1 operation Code that breaks js // response.choices 0 .finish reason may now be absent or null const finish reason = response.choices 0 .finish reason ?? fallback; - RunGraderResponse.metadata.token usage.completion tokens - RunGraderResponse.metadata.token usage.cached tokens - RunGraderResponse.metadata.token usage.total tokens - RunGraderResponse.metadata.token usage.prompt tokens - EnvironmentResourceOpenaiHosted.desktop - EnvironmentTemplateResource.desktop - NetworkPolicyParam.blocked domains - EnvironmentParamOpenaiHosted.network.blocked domains - CreateEnvironmentTemplateParams.desktop - UpdateEnvironmentTemplateParams.network.blocked domains - UpdateEnvironmentTemplateParams.desktop - CreateEnvironmentTemplateParams.network.blocked domains - EnvironmentParamOpenaiHosted.desktop - Breakingdirection flip: their tools call this safe value can now return "gpt-6.1-sol" https://driftwatch.et/changes/openai-2026-09-29-57bcdfd1 Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. can now return "gpt-6.1-sol" 2 places: BetaModelIdsShared, ModelIdsShared Code that breaks switch response { // existing branches … // no branch for "gpt-6.1-sol" default: throw new Error "unexpected value" ; } - Additive Response field container size added https://driftwatch.et/changes/openai-2026-09-29-72d27112 No action needed unless you validate responses against a closed schema. EnvironmentResourceOpenaiHosted.container size · reachable from 5 operations - Additive Request property container size added https://driftwatch.et/changes/openai-2026-09-29-b6896b6e No action needed unless it is required. EnvironmentParamOpenaiHosted.container size · reachable from 1 operation