2026 API changelog for CMP
Subscribe to updates on this page using the notification and RSS feed options.
October 27, 2026 – API update
- Added the optional dependent_tasks body parameter to PATCH /tasks/{id}. Use it to choose what happens to tasks that depend on the updated task when due_at moves the task by one or more business days. The value is one of the following:
- keep – Move only the updated task. Dependent tasks keep their dates.
- shift – Move each dependent task by the same number of business days. Business days follow your organization's working days, and organization-specific blocked dates are not taken into account. Completed dependent tasks and dependent tasks you cannot edit are left unchanged.
- Added the 409 response to PATCH /tasks/{id}. The endpoint returns it when a due_at change affects dependent tasks and dependent_tasks is not set. Nothing is updated. The details field lists the affected tasks and the number of business days the task moves (business_days_moved). Previously, this request returned a 500 error.
- Added the status body parameter to the documentation for PATCH /tasks/{id}. The API already accepted this parameter. The accepted values are not-started, in-progress, completed, on-hold, archived, unarchive, and resume. The unarchive and resume values take the task out of the archived or on-hold status and restore the status that matches its progress.
- Added the 422 response to the documentation for PATCH /tasks/{id}. The API already returned this response.
See the API reference for PATCH /tasks/{ id } for more details.
October 25, 2026 – API update
- Added the optional focal_point body parameter to PATCH /images/{id}. Use it to set the focal point of an image, which is used when cropping renditions. The value is an object with required x and y integers from 0 to 100, which are percentages of the image width and height. For example, {"x": 50, "y": 50} is the center of the image.
- The asset_modified webhook event now triggers when the focal_point of an image changes.
See the API reference for PATCH /images/{ id } for more details.
October 18, 2026 – New endpoint
Added GET /tasks/{task_id}/structured-contents/{content_id}/versions to list the versions of a task structured content, newest first. Each version includes a web URL (links.web_urls.self) that opens that version in Content Marketing Platform (CMP), so you can link users to a specific version. The endpoint supports offset and page_size pagination.
Note
The version_guid in this response identifies a version as CMP lists it. It is not the field version ID. The latest_fields_version.version_guid field and the /structured-content/contents/{content_id}/versions/{version_id}/* endpoints use the field version ID and do not accept this value. This endpoint does not return the content of a version.
See the API reference for GET /tasks/{ task_id }/structured-contents/{ content_id }/versions for more details.
October 15, 2026 – New endpoints
Note
The Compose endpoints are experimental.
Added Compose endpoints and the compose_content asset type. Compose stores structured content as entries of a content schema. Use these endpoints to read content schemas and manage compose content on tasks. Compose must be enabled for your organization. The update includes the following changes:
- Added GET /compose/content-schemas and GET /compose/content-schemas/{schema_id} to list and get your organization's content schemas.
- Added POST /tasks/{task_id}/compose-contents to create compose content on a task from a schema_id.
- Added GET /compose-contents/{content_id} to get compose content released to the library.
- Added the compose_content asset type to GET /assets (including the type filter), related assets, and task asset responses. See the API reference for GET /assets.
Note
All Compose endpoints return 403 when Compose is not enabled for your organization. Task write requests (POST, PATCH, and DELETE) return 422 when the task is completed.
October 14, 2026 – API update
Note
Clarified the response documentation for field choices. This is a documentation change only, so no client updates are required.
- The 201 response of POST /fields/{id}/choices is now described as the list of all the field's choices, including the newly created ones, rather than the field itself.
- Field choices in the GET /fields and POST /fields/{id}/choices responses now share one documented definition (SettingsFieldChoiceResponse) with id, name, and is_active. Label field choices add a nullable color (LabelTypeSettingsFieldChoiceResponse).
- The POST /fields/{id}/choices response no longer documents a minLength on name. The id description and example now match the other field choice responses.
See the API reference for POST /fields/{ id }/choices for more details.
October 13, 2026 – API update
- Added an optional is_activeto PATCH /fields/{field_id}/choices/{choice_id}. Send false to make a choice inactive, or true to make it active again. Inactive choices stay on the field, but users cannot select them in the app. The name value is now optional, so a request can contain only is_active.
- Each choice in the responses of GET /fields and POST /fields/{field_id}/choices now includes an is_active value.
- A request that makes the last active choice of a field inactive now fails with a 400 error. A request to DELETE /fields/{field_id}/choices/{choice_id} that deletes the last active choice also fails with a 400 error.
See the API reference for PATCH /fields/{field_id}/choices/{choice_id} and DELETE /fields/{field_id}/choices/{choice_id} for more details.
October 11, 2026 – New endpoint
Note
The POST /tasks/{task_id}/structured-contents/{content_id}/previews endpoint is experimental.
- Added the experimental POST /tasks/{task_id}/structured-contents/{content_id}/previews endpoint. Use it to add a preview URL to the latest version of a structured content in a task. The request requires a url and returns 201 Created with an empty body. The preview is created as already completed, so you do not need to acknowledge or complete it. The request fails with 404 if the task or content cannot be found, and with 422 if the task is archived, completed, or the preview URL cannot be reached.
See the API reference for POST /tasks/{task_id}/structured-contents/{content_id}/previews for more details.
October 7, 2026 – New endpoints
Added endpoints to post and list progress updates for a publishing event. Use them to report what is happening while a publishing event is processed, for example during a long-running publish to an external destination.
- Added POST /publishing-events/{publishing_event_id}/progress-updates to post a progress update. The request requires a message of 1 to 500 characters and accepts an optional level of info (default) or error. The request returns 204 No Content with an empty body.
- Added GET /publishing-events/{publishing_event_id}/progress-updates to list the updates posted for a publishing event, newest first. Each update includes id, level, message, and created_at. The endpoint supports offset and page_size pagination.
Note
Do not include internal identifiers, such as job keys, instance IDs, or stack traces, in the message.
See the POST /publishing-events/{publishing_event_id}/progress-updates and GET /publishing-events/{publishing_event_id}/progress-updates API references for details.
September 30, 2026 – API update
- Added an optional exclude_empty_fields boolean (default true) to POST /work-requests/{id}/campaigns and POST /work-requests/{id}/tasks. Work request custom fields and labels with no value (for example, hidden by form logic) are no longer copied to the campaign or task created from the work request. Send "exclude_empty_fields": false to keep the previous behavior and copy every work request field, including empty ones.
For tasks created with inherit_fields_from=workflow, an empty work request value now falls back to the workflow field's default instead of being copied as empty.
See the API reference for POST /work-requests/{id}/campaigns and POST /work-requests/{id}/tasks for more details.
September 21, 2026 – API update
Note
The GET /tasks APIs are experimental.
- Added start_date__from, start_date__to, due_date__from, and due_date__to range filters to GET /tasks, letting you filter tasks by an explicit, inclusive date range.
start_date and due_date are now deprecated. They apply a fixed 24-hour window starting at the value you send (for example, start_date=2026-07-01T09:00:00.000Z matches tasks starting between 09:00 UTC on July 1 and 09:00 UTC on July 2) rather than matching a calendar date. This is existing behavior, now documented accurately. Nothing about how these two params work has changed.
A request must use either the old parameters (start_date, due_date) or the new ones (start_date__from , start_date__to, due_date__from, due_date__to). Combining them returns a 400 error naming the conflicting parameters and showing the new-style equivalent.
A malformed date value on any of these params now returns a 400 error instead of a 500.
See the API reference for more details.
September 3, 2026 – API update
- Added simple and withReferenceField request examples to POST /tasks/{task_id}/structured-contents and POST /structured-contents.
- Documented that root_content is true for the top-level content and false for any content embedded through a reference field, consistent across the RecursiveStructuredContent, TaskStructuredContentCreateRequest, and LibraryStructuredContentCreateRequest schemas.
- Clarified the request shape for creating structured content that embeds other content through reference fields, on both POST /tasks/{task_id}/structured-contents and POST /structured-contents, with the following rules:
- Field values must be nested under a fields object at every level (on the top-level content and on each embedded content_details) and has_embedded: true must be set on the top-level fields when creating new embedded items through a reference field.
- Server-managed fields such as content_guid and created_by should not be sent. The server assigns them and returns each embedded item inline as expanded content_details. See the API reference for more details.
- See the following API references for more details:
- POST /tasks//structured-contents – API reference.
- POST /structured-contents – API reference.
September 3, 2026 – API update
Renamed the cg_instance_id path parameter to instance_id on POST /content-graphs//query, matching the instance_id field returned by GET /content-graphs. This is a documentation/naming change only: the path parameter's position and value are unchanged, so no client updates are required. See the API reference for more details.
August 20, 2026 – New endpoints
Note
The Content Graph endpoints are experimental.
Added a new Content Graph section with two endpoints. Optimizely Graph indexes an organization's library assets and structured contents and exposes them over GraphQL. These endpoints let you discover the Content Graph instances provisioned for an organization and run GraphQL queries against them.
- GET /content-graphs – Lists the Content Graph instances provisioned for your organization. Filter by type (dam or sc). Returns the standard {data, pagination} envelope.
- POST /content-graphs/{cg_instance_id}/query – Runs a GraphQL query against a Content Graph instance; for example, to check whether an asset has synced to the graph. On a 200, it returns the Graph's GraphQL response unchanged, including data and any extensions.
See the API reference for more details.
July 22, 2026 – API update
- Added the allow_se_indexing boolean field to the PATCH /images/{id}, PATCH /videos/{id}, and PATCH /raw-files/{id} endpoints. This field controls whether a Library asset is allowed to be indexed by search engines. It is optional in the request body and is included in the response of the corresponding GET and PATCH endpoints. See the API reference for more details.
July 19, 2026 – API update
- Added a status query parameter to the GET /tasks endpoint, letting you filter tasks by one or more statuses. It accepts an array of status values, includingArchived, Completed, Overdue, Not Started, In Progress, and On Hold, and matches tasks in any of the statuses provided (for example, ?status=In%20Progress&status=On%20Hold). See the API reference for more details.
July 15, 2026 – API update
- Added an is_protected boolean field to the marketing work request form-field response (GET work request and GET template endpoints). The field is true when a form field is read-only and can only be modified by organization admins. It is absent or false for editable fields. See the API reference for more details.
July 2, 2026 – API update
Added structured_content as a supported related-asset type on the GET /assets/{asset_id}/related-assets endpoint. See the API reference for more information.
- Related assets of type structured_content return content.type: api_url, with the URL pointing to the structured content API endpoint for the asset.
July 1, 2026 – API update
- Added a new library_guid field to the GET /tasks/{id}/assets endpoint response. See the API Reference for more information.
- library_guid returns the Library GUID for a task asset after it is published to the Library.
- library_guid is null if the asset is not published to the Library.
- Added GET /publishing-channels and POST /tasks/{task_id}/publishing-intents endpoints to support creating a publishing intent from a task. See the API reference for more information.
- GET /publishing-channels – Returns a paginated list of the organization's publishing channels (offset or page_size). Each channel includes id, name (nullable), and disabled (nullable).
- POST /tasks/{task_id}/publishing-intents – Creates a publishing intent linking the specified task to a channel. Takes a channel_id in the request body and returns the created publishing intent's id.
June 7, 2026 – API update and bugfixes
- Added a new library_guid field to the GET /tasks//assets endpoint response. See the API Reference for more information.
- library_guid returns the Library GUID for a task asset after it is published to the Library.
- library_guid is null if the asset is not published to the Library.
- Added GET /publishing-channels and POST /tasks//publishing-intents endpoints to support creating a publishing intent from a task. See the API reference for more information.
- GET /publishing-channels – Returns a paginated list of the organization's publishing channels (offset or page_size). Each channel includes id, name (nullable), and disabled (nullable).
- POST /tasks//publishing-intents – Creates a publishing intent linking the specified task to a channel. Takes a channel_id in the request body and returns the created publishing intent's id.
May 24, 2026 – New endpoint
- Added GET /assets/{asset_id}/related-assets and PUT /assets/{asset_id}/related-assets endpoints.
- GET – Returns a paginated list of assets related to the specified asset.
- PUT – Replaces all related assets for the specified asset with the provided list.
See GET /assets/{asset_id}/related-assets for details.
April 8, 2026 – New endpoint
- Introduced GET /events endpoint. You can now retrieve a paginated list of events. Use the start_date, end_date and campaign_id query parameters to filter results. See GET /events for information.
February 25, 2026 – API update
- Added a new optional field inherit_fields_from to the POST /work-requests/{id}/tasks endpoint's request body. This lets users control where task fields are created from. When set to workflow, fields are inherited from the workflow instead of the work request. The default value (work_request) creates fields from the work request to maintain backward compatibility. See POST /work-requests/{id}/tasks for information.
February 9, 2026 – API update
- Updated GET /workflows/{workflow_id} to include the fields property in the response, which now returns the fields of a workflow. See the GET /workflows/{workflow_id}.
January 26, 2026 – New endpoint
- Added a GET /milestones endpoint to retrieve a paginated list of milestones with optional filtering by campaign_id, due_date__from, and due_date__to query parameters. The milestone response now includes a campaign field containing the campaign ID associated with the milestone.