[Additive] OpenAI: 2 new request properties OpenAI added two new request properties and two new response fields, PromptCacheBreakpointConfig.ttl and BetaPromptCacheBreakpointConfig.ttl, to its API, an additive change requiring no action from developers. The same API changelog also flagged breaking changes: the ModelIdsShared and BetaModelIdsShared enums can now return "gpt-6.1-terra," which breaks exhaustive switches and strict parsers, and DecisionInputMessage fields type, role, content and phase are now ignored rather than rejected. Default values also changed for ImageGenTool.model, reachable from 14 operations, and BetaImageGenTool.model, reachable from 6 operations. OpenAI https://driftwatch.et/apis/openai 4 additive 2 new response fields - PromptCacheBreakpointConfig.ttl - BetaPromptCacheBreakpointConfig.ttl 2 new request properties - PromptCacheBreakpointConfig.ttl - BetaPromptCacheBreakpointConfig.ttl 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 value can now return "gpt-6.1-terra" https://driftwatch.et/changes/openai-2026-10-26-a9965108 Producer-side tools call this additive. It breaks exhaustive switches, strict parsers and generated client enums. can now return "gpt-6.1-terra" 2 places: BetaModelIdsShared, ModelIdsShared Code that breaks switch response { // existing branches … // no branch for "gpt-6.1-terra" default: throw new Error "unexpected value" ; } - Behavioral Default value changed https://driftwatch.et/changes/openai-2026-10-23-a4e25820 Behavior shifts for every call that omits the field. ImageGenTool.model · reachable from 14 operations - Behavioral Default value changed https://driftwatch.et/changes/openai-2026-10-23-8d3a0a56 Behavior shifts for every call that omits the field. BetaImageGenTool.model · reachable from 6 operations - Additive /agents/automations added https://driftwatch.et/changes/openai-2026-10-23-b2f47f23 No action needed. /agents/automations - Additive /agents/automations/{automation id}/invocations added https://driftwatch.et/changes/openai-2026-10-23-3e55c4da No action needed. /agents/automations/{automation id}/invocations - Additive /agents/automations/{automation id}/invocations/{invocation id} added https://driftwatch.et/changes/openai-2026-10-23-5ccffe70 No action needed. /agents/automations/{automation id}/invocations/{invocation id} - Additive /agents/automations/{automation id} added https://driftwatch.et/changes/openai-2026-10-23-9561d6fc No action needed. /agents/automations/{automation id} - Additive /agents/automations/{automation id}/pause added https://driftwatch.et/changes/openai-2026-10-23-96cc224c No action needed. /agents/automations/{automation id}/pause - Additive /agents/automations/{automation id}/resume added https://driftwatch.et/changes/openai-2026-10-23-a3553161 No action needed. /agents/automations/{automation id}/resume - Breakingdirection flip: their tools call this safe type is no longer accepted https://driftwatch.et/changes/openai-2026-10-22-b82c52fa Usually ignored rather than rejected, so the call succeeds and does something subtly different. DecisionInputMessage.type · reachable from 1 operation Code that breaks await client.post "/…", { // type is now ignored, not rejected type: value, } ; - Breakingdirection flip: their tools call this safe role is no longer accepted https://driftwatch.et/changes/openai-2026-10-22-2da3ff9c Usually ignored rather than rejected, so the call succeeds and does something subtly different. DecisionInputMessage.role · reachable from 1 operation Code that breaks await client.post "/…", { // role is now ignored, not rejected role: value, } ; - Breakingdirection flip: their tools call this safe content is no longer accepted https://driftwatch.et/changes/openai-2026-10-22-9c66bcd9 Usually ignored rather than rejected, so the call succeeds and does something subtly different. DecisionInputMessage.content · reachable from 1 operation Code that breaks await client.post "/…", { // content is now ignored, not rejected content: value, } ; - Breakingdirection flip: their tools call this safe phase is no longer accepted https://driftwatch.et/changes/openai-2026-10-22-2abec8de Usually ignored rather than rejected, so the call succeeds and does something subtly different. DecisionInputMessage.phase · reachable from 1 operation Code that breaks await client.post "/…", { // phase is now ignored, not rejected phase: value, } ; - Behavioral Status code no longer documented https://driftwatch.et/changes/openai-2026-10-22-c6a81ff4 Dead branch, or an undocumented response you still receive. POST /organization/projects/{project id}/service accounts/{service account id}/api keys - Additive /audio/voices/{voice id} added https://driftwatch.et/changes/openai-2026-10-21-6bc18955 No action needed. /audio/voices/{voice id} - PromptCacheBreakpointParam.ttl - InputImageContentParamAutoParam.prompt cache breakpoint.ttl - InputFileContentParam.prompt cache breakpoint.ttl - InputTextContentParam.prompt cache breakpoint.ttl - BetaInputTextContentParam.prompt cache breakpoint.ttl - BetaInputFileContentParam.prompt cache breakpoint.ttl - BetaInputImageContentParamAutoParam.prompt cache breakpoint.ttl - BetaPromptCacheBreakpointParam.ttl - PromptCacheBreakpointParam.ttl - InputFileContentParam.prompt cache breakpoint.ttl - InputImageContentParamAutoParam.prompt cache breakpoint.ttl - InputTextContentParam.prompt cache breakpoint.ttl - BetaInputFileContentParam.prompt cache breakpoint.ttl - BetaInputImageContentParamAutoParam.prompt cache breakpoint.ttl - BetaInputTextContentParam.prompt cache breakpoint.ttl - BetaPromptCacheBreakpointParam.ttl - UsageCompletionsResult.input cache write 30m tokens - DecisionsUsageResult.input cache write 30m tokens - 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 - ImageEditCompletedEvent.safety identifier - ImageGenCompletedEvent.safety identifier - EditImageBodyJsonParam.safety identifier - CreateImageEditRequest.safety identifier - CreateImageRequest.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/sessions/{session id}/artifacts · 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 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 service tier 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: CreateAgentParams.service tier, ServiceTierParam, SessionAgentConfigParam.service tier, UpdateAgentParams.service tier, UpdateSessionAgentParam.service tier Code that breaks // sending "ultrafast" for service tier 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