---
title: Feature Experimentation API changelog – 2026
slug: feature-experimentation/release-notes/feature-experimentation-api-changelog-2026
docTags: 
createdAt: 2026-10-13T12:00:00.000Z
---

Subscribe to updates on this page using the notification and RSS feed options.

## October 13, 2026 – API updates

Updated the Optimizely Feature Experimentation API and the Optimizely Flags Scheduling API to support change approvals, cross-project holdouts, flag lifecycle management, and richer experiment and custom field details.

### Change approvals

Introduced the following endpoints to the Optimizely Flags Scheduling API to support change approvals, which route flag changes to designated reviewers before the changes reach production.

Approval policies:

- [List approval policies for an environment](https://docs.optimizely.com/feature-experimentation/api/list-approval-policies-for-an-environment)
- [Create an approval policy](https://docs.optimizely.com/feature-experimentation/api/create-an-approval-policy)
- [List all approval policies for a project across all environments](https://docs.optimizely.com/feature-experimentation/api/list-all-approval-policies-for-a-project-across-all-environments)
- [Get an approval policy](https://docs.optimizely.com/feature-experimentation/api/get-an-approval-policy)
- [Update an approval policy](https://docs.optimizely.com/feature-experimentation/api/update-an-approval-policy)
- [Delete an approval policy](https://docs.optimizely.com/feature-experimentation/api/delete-an-approval-policy)

Environment approval settings:

- [List Environment Approval Settings](https://docs.optimizely.com/feature-experimentation/api/list-environment-approval-settings)
- [Update Environment Approval Settings](https://docs.optimizely.com/feature-experimentation/api/update-environment-approval-settings)

Approvals:

- [List Approvals](https://docs.optimizely.com/feature-experimentation/api/list-approvals)
- [Create a Approval for a flag in an environment](https://docs.optimizely.com/feature-experimentation/api/create-a-approval-for-a-flag-in-an-environment)
- [Get Approval](https://docs.optimizely.com/feature-experimentation/api/get-approval)
- [Update approval status for a flag in an environment](https://docs.optimizely.com/feature-experimentation/api/update-approval-status-for-a-flag-in-an-environment)
- [Archive Approval](https://docs.optimizely.com/feature-experimentation/api/archive-approval)

Change requests:

- [List project change requests](https://docs.optimizely.com/feature-experimentation/api/list-project-change-requests)
- [Get change request details](https://docs.optimizely.com/feature-experimentation/api/get-change-request-details)
- [Archive a change request](https://docs.optimizely.com/feature-experimentation/api/archive-a-change-request)
- [List change requests for a flag in an environment](https://docs.optimizely.com/feature-experimentation/api/list-change-requests-for-a-flag-in-an-environment)
- [Create a change request for a flag in an environment](https://docs.optimizely.com/feature-experimentation/api/create-a-change-request-for-a-flag-in-an-environment)
- [Update the status of a change request](https://docs.optimizely.com/feature-experimentation/api/update-the-status-of-a-change-request)

Updated the following endpoints to expose approval information on flag schedules and environments:

- [Get Environment Approval Settings](https://docs.optimizely.com/feature-experimentation/api/get-environment-approval-settings)
  - Added the `approver_assignment_mode`, `description`, and `default_preferences` fields to the response. The `default_preferences` field includes the `audiences`, `metrics`, `ramp_perc`, `rules`, `ruleset`, and `variations` values.
- [Create a Schedule Change for a flag in an environment](https://docs.optimizely.com/feature-experimentation/api/create-a-schedule-change-for-a-flag-in-an-environment)
  - Added the `approval_required` and `reason` body parameters.
  - Added the `approval_status` field to the response.
- [List Scheduled changes of a flag](https://docs.optimizely.com/feature-experimentation/api/list-scheduled-changes-of-a-flag)
  - Added the `approval_status` field to the response.
- [Update the Scheduled Change for a flag in an environment](https://docs.optimizely.com/feature-experimentation/api/update-the-scheduled-change-for-a-flag-in-an-environment)
  - Added the `approval_status` field to the response.

Updated the following endpoints to return a `409` response when a change requires approval or conflicts with an open approval request:

- [Update the Ruleset for a Flag in an Environment](https://docs.optimizely.com/feature-experimentation/api/update-the-ruleset-for-a-flag-in-an-environment)
  - Added the `409` response with the `approval_settings`, `environment_key`, `error`, `flag_key`, and `reason` fields.
- [Enable the Ruleset for a Flag in an Environment](https://docs.optimizely.com/feature-experimentation/api/enable-the-ruleset-for-a-flag-in-an-environment)
  - Added the `409` response with the `approval_settings`, `environment_key`, `error`, `flag_key`, and `reason` fields.
- [Disable the Ruleset for a Flag in an Environment](https://docs.optimizely.com/feature-experimentation/api/disable-the-ruleset-for-a-flag-in-an-environment)
  - Added the `409` response with the `approval_settings`, `environment_key`, `error`, `flag_key`, and `reason` fields.
- [Archive Flags](https://docs.optimizely.com/feature-experimentation/api/archive-flags)
  - Updated the description to explain that the request is rejected with a `409` response when any flag in the batch has an open approval request. Nothing is archived in this case.
  - Added the `409` response with the `error`, `flag_keys`, and `message` fields.
- [Unarchive Flags](https://docs.optimizely.com/feature-experimentation/api/unarchive-flags)
  - Added the `409` response with the `error`, `flag_keys`, and `message` fields.

### Holdouts

Introduced the following cross-project holdout endpoints to the Optimizely Feature Experimentation API so that a single holdout can cover rules in more than one project:

- [List holdouts across projects](https://docs.optimizely.com/feature-experimentation/api/list-holdouts-across-projects)
- [Create a cross-project Holdout](https://docs.optimizely.com/feature-experimentation/api/create-a-cross-project-holdout)
- [Fetch a cross-project Holdout](https://docs.optimizely.com/feature-experimentation/api/fetch-a-cross-project-holdout)
- [Update a cross-project Holdout](https://docs.optimizely.com/feature-experimentation/api/update-a-cross-project-holdout)
- [Delete a cross-project Holdout](https://docs.optimizely.com/feature-experimentation/api/delete-a-cross-project-holdout)

Updated the following holdout endpoints:

- [Create a new Holdout](https://docs.optimizely.com/feature-experimentation/api/create-a-new-holdout)
  - Added the `exclude_targeted_deliveries`, `project_ids`, and `rule_ids` body parameters. Use `exclude_targeted_deliveries` to keep Targeted Delivery rules out of the holdout, because Targeted Deliveries represent permanent ship decisions.
  - Removed the `scope_type` body parameter.
  - Added the `environment_name`, `exclude_targeted_deliveries`, `projects`, `rules`, and `url` fields to the response.
  - Removed the `scope_type` field from the response.
  - Added the `display_title` field to each metric in the request and response.
  - Updated the description to remove the reference to MetricsHub.
- [List Holdouts for a project](https://docs.optimizely.com/feature-experimentation/api/list-holdouts-for-a-project)
  - Added the `environment_name`, `exclude_targeted_deliveries`, `projects`, `rules`, and `url` fields to the response.
  - Removed the `scope_type` field from the response.
  - Added the `display_title` field to each metric in the response.
- [Fetch a single Holdout](https://docs.optimizely.com/feature-experimentation/api/fetch-a-single-holdout)
  - Added the `environment_name`, `exclude_targeted_deliveries`, `projects`, `rules`, and `url` fields to the response.
  - Removed the `scope_type` field from the response.
  - Added the `display_title` field to each metric in the response.
- [Update a Holdout using JSON Patch](https://docs.optimizely.com/feature-experimentation/api/update-a-holdout-using-json-patch)
  - Added the `display_title` field to the metrics in the request body.
  - Updated the description to explain that audience conditions cannot be set on a holdout whose targeted rules span more than one project.
- [Delete a Holdout](https://docs.optimizely.com/feature-experimentation/api/delete-a-holdout)
  - Updated the description to remove the references to MetricsHub.
- [Fetch holdouts for a specific rule\_key](https://docs.optimizely.com/feature-experimentation/api/fetch-holdouts-for-a-specific-rulekey)
  - Added the `environment_name`, `exclude_targeted_deliveries`, `projects`, `rules`, and `url` fields to the response.
  - Removed the `scope_type` field from the response.
  - Added the `display_title` field to each metric in the response.
- [Fetch experiments associated with a holdout](https://docs.optimizely.com/feature-experimentation/api/fetch-experiments-associated-with-a-holdout)
  - Added the `deployed_variation_key` and `deployed_variation_name` fields to the response.

### Flags

Introduced the following endpoints to the Optimizely Feature Experimentation API:

- [Duplicate a Flag](https://docs.optimizely.com/feature-experimentation/api/duplicate-a-flag)
- [Get Flag Status](https://docs.optimizely.com/feature-experimentation/api/get-flag-status)
- [Validate a Ruleset update payload](https://docs.optimizely.com/feature-experimentation/api/validate-a-ruleset-update-payload). Use this endpoint to run the same validation as the ruleset update endpoint without saving any changes.

Updated the following endpoints:

- [List Flags](https://docs.optimizely.com/feature-experimentation/api/list-flags)
  - Added the `flag_status` query parameter to filter flags by lifecycle status. Prefix a value with `!` to exclude that status.
  - Updated the descriptions of the `team_ids` and `owner_user_id` query parameters.
  - Added the `is_permanent` field to the response.
  - Removed the `custom_fields` field from the response.
- [Create a New Flag](https://docs.optimizely.com/feature-experimentation/api/create-a-new-flag)
  - Added the `is_permanent` body parameter. Set `is_permanent` to `true` to mark a flag, such as a kill switch, as permanent so that governance tools exclude it from stale scoring and archive recommendations.
  - Added the `is_permanent` field to the response.
  - Removed the `custom_fields` field from the response.
- [Fetch a Single Flag](https://docs.optimizely.com/feature-experimentation/api/fetch-a-single-flag)
  - Added the `is_permanent` field to the response.
  - Removed the `custom_fields` field from the response.
- [Archive Flags](https://docs.optimizely.com/feature-experimentation/api/archive-flags)
  - Added the `override_code_references` body parameter.
- [Update the Ruleset for a Flag in an Environment](https://docs.optimizely.com/feature-experimentation/api/update-the-ruleset-for-a-flag-in-an-environment)
  - Added the `restore` and `restored_from_revision_id` query parameters. Use these parameters to record an update as a version restore in the History log.
  - Added the `display_title` field to the metrics in the request body.
- [Update Variable Definitions](https://docs.optimizely.com/feature-experimentation/api/update-variable-definitions)
  - Added the `display_title` field to the metrics in the request body.
- [Update Variations](https://docs.optimizely.com/feature-experimentation/api/update-variations)
  - Added the `display_title` field to the metrics in the request body.
- [Update Exclusion Groups](https://docs.optimizely.com/feature-experimentation/api/update-exclusion-groups)
  - Added the `display_title` field to the metrics in the request body.

### Rules and experiments

Updated the following endpoints to expose experiment planning details:

- [List Rules](https://docs.optimizely.com/feature-experimentation/api/list-rules)
  - Added the `custom_fields`, `hypothesis`, `test_plan_name`, `test_plan_type`, and `test_plan_url` fields to the response.
  - Added the `display_title` field to each metric in the response.
- [Fetch a Rule for a specific experiment\_id](https://docs.optimizely.com/feature-experimentation/api/fetch-a-rule-for-a-specific-experimentid)
  - Added the `custom_fields`, `hypothesis`, `test_plan_name`, `test_plan_type`, and `test_plan_url` fields to the response.
  - Added the `display_title` field to each metric in the response.
- [Fetch the Rule for a Ruleset in an Environment](https://docs.optimizely.com/feature-experimentation/api/fetch-the-rule-for-a-ruleset-in-an-environment)
  - Added the `custom_fields`, `hypothesis`, `test_plan_name`, `test_plan_type`, and `test_plan_url` fields to the response.
  - Added the `display_title` field to each metric in the response.

### Files and variation screenshots

Introduced the following endpoints to the Optimizely Feature Experimentation API so that you can attach files, such as test plans and variation screenshots:

- [Upload a file](https://docs.optimizely.com/feature-experimentation/api/upload-a-file)
- [Download a file](https://docs.optimizely.com/feature-experimentation/api/download-a-file)

Updated the following endpoints:

- [Create a New Variation](https://docs.optimizely.com/feature-experimentation/api/create-a-new-variation)
  - Added the `screenshot_name` and `screenshot_url` body parameters.
  - Added the `screenshot_name` and `screenshot_url` fields to the response.
- [List Variations](https://docs.optimizely.com/feature-experimentation/api/list-variations)
  - Added the `screenshot_name` and `screenshot_url` fields to the response.
- [Fetch a Single Variation](https://docs.optimizely.com/feature-experimentation/api/fetch-a-single-variation)
  - Added the `screenshot_name` and `screenshot_url` fields to the response.

### Custom fields

Updated the following endpoints to support validation rules and default values for custom fields:

- [Create a new Custom Field](https://docs.optimizely.com/feature-experimentation/api/create-a-new-custom-field)
  - Added the `archived`, `default_value`, and `validation` body parameters. The `validation` object includes the `allow_multi_select`, `decimal_places`, `field_options`, `max`, `max_length`, `min`, `regex`, and `use_thousand_separator` values.
  - Added the `created_by_user_id`, `default_value`, and `validation` fields to the response.
  - Removed the `archive_url`, `unarchive_url`, `update_url`, and `url` fields from the response.
- [Update an existing Custom Field](https://docs.optimizely.com/feature-experimentation/api/update-an-existing-custom-field)
  - Added the `validation` body parameter with the `allow_multi_select` and `field_options` values.
  - Removed the `required` body parameter.
  - Added the `created_by_user_id`, `default_value`, and `validation` fields to the response.
  - Removed the `archive_url`, `unarchive_url`, `update_url`, and `url` fields from the response.
- [List Custom Fields for a project](https://docs.optimizely.com/feature-experimentation/api/list-custom-fields-for-a-project)
  - Added the `created_by_user_id`, `default_value`, and `validation` fields to the response.
  - Removed the `archive_url`, `unarchive_url`, `update_url`, and `url` fields from the response.
- [Archive a Custom Field](https://docs.optimizely.com/feature-experimentation/api/archive-a-custom-field)
  - Updated the description to explain that archived fields are excluded from required-value enforcement and that the `required` setting is preserved so that it is restored on unarchive.
  - Added the `created_by_user_id`, `default_value`, and `validation` fields to the response.
  - Removed the `archive_url`, `unarchive_url`, `update_url`, and `url` fields from the response.
- [Unarchive a Custom Field](https://docs.optimizely.com/feature-experimentation/api/unarchive-a-custom-field)
  - Added the `created_by_user_id`, `default_value`, and `validation` fields to the response.
  - Removed the `archive_url`, `unarchive_url`, `update_url`, and `url` fields from the response.

### Reports

Added the `flag_state` field to the responses of the following endpoints:

- [List Reports](https://docs.optimizely.com/feature-experimentation/api/list-reports)
- [Fetch a Single Report](https://docs.optimizely.com/feature-experimentation/api/fetch-a-single-report)
- [Reset the results for a Report](https://docs.optimizely.com/feature-experimentation/api/reset-the-results-for-a-report)
