# [Additive] OpenAI: 2 new request properties

> Source: <https://driftwatch.et/apis/openai#cmvpuhjd5000737jdvelsh6bp-request-fields>
> Published: 2026-10-26 20:31:32+00:00

[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
