# [Additive] OpenAI: 2 new response fields

> Source: <https://driftwatch.et/apis/openai#cmvfa562o00010ci9lt6j1s3p-fields>
> Published: 2026-10-19 05:35:43+00:00

[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
