Provides a structured checklist to help you track and validate each required change when migrating from the preview3 Content API to the v1 API.
Preview3 CMS REST API reaches end-of-life on August 1, 2026The Preview3 CMS REST API endpoints retire on August 1, 2026. After this date, Optimizely begins disabling access, and applications that still call Preview3 endpoints (URLs containing
/preview3/) may experience failed requests and service interruptions. Migrate to CMS REST API v1 before August 1, 2026. Mixing Preview3 and v1 endpoints is supported until the retirement date.
This checklist helps you systematically migrate an existing integration from the preview3 Content API to the v1 API. It breaks down required updates across endpoints, authentication, schemas, request and response structures, and validation rules. Use this checklist to ensure no breaking change is missed and to verify that your integration fully complies with the v1 API before going to production.
URL and Endpoints
- Update base URL from
preview3tov1 - Remove
/experimentalprefix from all content endpoints - Update Packaging API base URL (paths remain under
/experimental/) - Update manifest operations to use the new
/v1/manifestendpoint - Update delete locale calls to use path-based locale:
/v1/content/{key}/locales/{locale} - Remove any Changesets API usage
Security
- Remove use of
act_asparameter in OAuth token endpoint requests
Schema and Type Changes
- Update schema references in generated client code (OpenAPI spec changes):
ContentItemtoContentVersionContentItemPagetoContentVersionPageContentMetadatatoContentNodeContentMetadataPagetoContentNodePage- Rename pagination field
totalItemCounttototalCount
- Update
ContentComponentfield names:nametodisplayNamecontenttoproperties
- Update property group name references:
InformationtoContentAdvancedtoSettings
- Update boolean field names to use
is/hasprefix:localizedtoisLocalizedrequiredtoisRequireddisabledtoisDisabledenabledtoisEnableddeletedtoisDeletedsuccesstoisSuccess
Request Changes
- Restructure create content requests to use
NewContentwithinitialVersion - Move
allowDeletedfrom query param tocms-allow-deletedheader - Remove usage of the
localequery parameter on version endpoints - Remove unknown/unsupported fields from all request bodies
- Update property values to use nested
{ "value": ... }structure - Update
richTextproperty values to use{ "value": { "html": ... } }structure - Replace any request passing
cms-skip-validation: truewithcms-skip-validation: * - Remove any usage of
cms-skip-validation: approval(theapprovalvalue is no longer supported)
Response Changes
- Expect
204 No Contentresponse status from successfully executed commands - Include the
Prefer: return=representationheader with command requests when a resource is expected in the response body.
Required Fields
- Ensure all
ContentTypeobjects have a non-emptydisplayName - Ensure all
PropertyGroupobjects have a non-emptydisplayName
Validation Changes
- Ensure choice property values match defined choices
- Ensure locales exist before creating content in that locale
Status Transitions
- Replace all
PATCHcalls that setstatuswith the corresponding transition endpoint:"status": "draft"→POST /content/{key}/versions/{version}:draft"status": "ready"→POST /content/{key}/versions/{version}:ready"status": "published"→POST /content/{key}/versions/{version}:publish"status": "scheduled"withdelayPublishUntil→POST /content/{key}/versions/{version}:publishwith{ "delayUntil": "..." }
- Remove
statusfrom create content and create version request bodies (new content is always created indraftstatus) - Update scheduled publishing to use
:publishwithdelayUntilinstead of patching status - Note that
delayPublishUntilis now read-only — use:publishwithdelayUntilto schedule publication - Replace use of
keepPublishedStatus: truein:copycall with an explicit call to the:publishendpoint
Behavior Changes
- Handle non-primary locale versions not including merged properties
- Update code that patches published versions to create a new version first
- Only
draftversions can be updated viaPATCH— versions in any other status return an error
Response Handling
- Update code parsing
localesin content nodes (now array instead of object map) - Update code reading property values (now nested in
{ "value": ... }objects) - Update code reading
richTextproperties (value changed from string to{ "html": ... }object)
Testing
- Test all API integrations with the v1 endpoint
Example: Before and After
Creating Content
POST /preview3/experimental/content
Content-Type: application/json
{
"contentType": "ArticlePage",
"displayName": "My Article",
"container": "articles-folder",
"locale": "en",
"status": "draft",
"routeSegment": "my-article",
"properties": {
"heading": "Welcome",
"body": "Article content here"
}
}POST /v1/content
Content-Type: application/json
{
"contentType": "ArticlePage",
"container": "articles-folder",
"initialVersion": {
"displayName": "My Article",
"locale": "en",
"routeSegment": "my-article",
"properties": {
"heading": {
"value": "Welcome"
},
"body": {
"value": "Article content here"
}
}
}
}Deleting a Locale
DELETE /preview3/experimental/content/my-article/versions?locale=svDELETE /v1/content/my-article/locales/svChanging Version Status
PATCH /preview3/experimental/content/my-article/versions/1
Content-Type: application/json
{
"status": "ready"
}POST /v1/content/my-article/versions/1:readyScheduling a Version
PATCH /preview3/experimental/content/my-article/versions/1
Content-Type: application/json
{
"status": "scheduled",
"delayPublishUntil": "2026-03-01T09:00:00Z"
}POST /v1/content/my-article/versions/1:publish
Content-Type: application/json
{
"delayUntil": "2026-03-01T09:00:00Z"
}Getting a Deleted Content Item
GET /preview3/experimental/content/my-article?allowDeleted=trueGET /v1/content/my-article
cms-allow-deleted: true