---
title: 2026 API changelog for CMP
slug: content-marketing-platform/release-notes/pflC-2026-cmp-changelog
docTags: 
createdAt: 2026-06-29T18:59:08.427Z
---

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

## 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.

:::hint{type="info"}
**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](https://docs.optimizely.com/content-marketing-platform/api/get-taskstaskidstructured-contentscontentidversions) for more details.

## October 15, 2026 – New endpoints

:::hint{type="info"}
**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`](https://docs.optimizely.com/content-marketing-platform/api/get-composecontent-schemas) and [`GET /compose/content-schemas/{schema_id}`](https://docs.optimizely.com/content-marketing-platform/api/get-composecontent-schemasschemaid) to list and get your organization's content schemas.
- Added [`POST /tasks/{task_id}/compose-contents`](https://docs.optimizely.com/content-marketing-platform/api/post-taskstaskidcompose-contents) to create compose content on a task from a `schema_id`.
- Added [`GET`](https://docs.optimizely.com/content-marketing-platform/api/get-taskstaskidcompose-contentscontentid), [`PATCH`](https://docs.optimizely.com/content-marketing-platform/api/patch-taskstaskidcompose-contentscontentid), and [`DELETE`](https://docs.optimizely.com/content-marketing-platform/api/delete-taskstaskidcompose-contentscontentid) on `/tasks/{task_id}/compose-contents/{content_id}` to get, update, and remove a task's compose content.
- Added [`GET /compose-contents/{content_id}`](https://docs.optimizely.com/content-marketing-platform/api/get-compose-contentscontentid) 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](https://docs.optimizely.com/content-marketing-platform/api/get-assets).

:::hint{type="info"}
**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

:::hint{type="info"}
**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](https://docs.optimizely.com/content-marketing-platform/api/post-fieldsidchoices) for more details.

## October 13, 2026 – API update

- Added an optional `is_active`to `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.

:::Paragraph{indent="1"}
See the API reference for [PATCH /fields/&#x7B;field\_id}/choices/&#x7B;choice\_id}](docId\:B5uwtChqrn8q9_7Cgo13c) and [DELETE /fields/&#x7B;field\_id}/choices/&#x7B;choice\_id}](docId:7WJXDK1CVeGk2wW4fgkgn) for more details.
:::

## October 11, 2026 – New endpoint

:::hint{type="info"}
**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.

:::Paragraph{indent="1"}
See the API reference for [POST /tasks/&#x7B;task\_id}/structured-contents/&#x7B;content\_id}/previews](docId:2eccvlztADSSEW3cSM7Xn) for more 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.

:::Paragraph{indent="1"}
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.
:::

:::Paragraph{indent="1"}
See the API reference for [POST /work-requests/&#x7B;id}/campaigns](docId\:y7gYCk_a3KDSV_SA-JLBM) and [POST /work-requests/&#x7B;id}/tasks](docId\:tcIXMiPqHDoHZgc1_yyT5) for more details.
:::

## September 21, 2026 – API update

:::hint{type="info"}
**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.

:::Paragraph{indent="1"}
`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.
:::

:::Paragraph{indent="1"}
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.
:::

:::Paragraph{indent="1"}
A malformed date value on any of these params now returns a 400 error instead of a 500.
:::

:::Paragraph{indent="1"}
See the [API reference](docId:1qejHThYiSavae7LXj2Vr) 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](docId\:N8EEwwCUgVRsuo2gwVzmO).
  - POST /structured-contents – [API reference](docId\:lsQRxkRIIln3YYcORM_O6).

## 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](docId\:Msoe1TMXvLZ3gpSSX3qvX) for more details.

## August 20, 2026 – New endpoints

:::hint{type="info"}
**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](docId\:eYs6B69MoXl3Z9ymHGcCX) 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](docId\:bAFcwrRXoE6fRm2M4KfBV) 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, including`Archived`, `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](docId:1qejHThYiSavae7LXj2Vr) 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](docId\:lm1WuDc3EVw6iENZAI-hH) 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](docId\:sR54qPHi9IzqbGxPBeeNI) 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](docId\:qxxSuJr_CoJurEZ4aoZ5d) 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](docId\:avyQ2SJzEGHWb7v9BQO5G) 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.

:::Paragraph{indent="1"}
See [GET /assets/&#x7B;asset\_id}/related-assets](docId:8aBjHoLTBuZIYyJwmKoAH) 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](docId:2kP8tf2aYm59jfzf96lCn) 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/&#x7B;id}/tasks](docId\:RqcAq9fF5kcou2WpxwhYy) 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/&#x7B;workflow\_id}](docId\:z29pI9TOTcCLyHw0RYEAm).

## January 26, 2026 – New endpoint

- Added a [GET /milestones](docId\:M80xe_PWUNxQ17SGeDcWb) 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.
