--- title: Changelog --- In the Public API Changelog you’ll find an overview of all significant changes to our API, including new features, deprecations, and breaking changes. Our goal is to provide a clear and structured update history, helping you stay informed about improvements and necessary adjustments. Please consult the [API Versioning Strategy](/reference/public-api/versioning/llms.txt) for more information on how we manage API versions. Bug fixes are not listed here. If you encounter issues, please report them to the Livingdocs Customer Solutions team. ## May 2026 ### 🎁 Get Usage Log of Media Library Entry A new endpoint has been added, `GET /api/:apiVersion/mediaLibrary/:id/usageLog`, which returns all usage log entries for the specified media library entry. Further details can be found in the [Get the Usage Log of a Media Library Entry](/reference/public-api/media-library/llms.txt#get-the-usage-log-of-a-media-library-entry) endpoint documentation. ### 🎁 Add Usage Log Operations to Media Library Patch The Media Library Entry patch endpoint in the public API has been extended to allow external systems (e.g. print system) to report the usage of a media library entry and provide the details. The new operations are `addUsageLogEntry`, `updateUsageLogEntry` and `removeUsageLogEntry`. Further details can be found in the [Patch a Media Library Entry](/reference/public-api/media-library/llms.txt#patch-a-media-library-entry) endpoint documentation. ## March 2026 ### 🎁 Preserve Updated At on Document Command API and Media Library Patch ``` PATCH /api/:apiVersion/documents/{documentId}/commands {preserveUpdatedAt: true, commands: [...]} PATCH /api/:apiVersion/mediaLibrary/{id} {preserveUpdatedAt: true, patches: [...]} ``` A new optional `preserveUpdatedAt` boolean parameter has been added to the [Document Command API](/reference/public-api/document-command-api/llms.txt) and the [Media Library](/reference/public-api/media-library/llms.txt) patch endpoint. When set to `true`, the `updated_at` timestamp of the document or media library entry is not modified by the operation. By default (`false`), `updated_at` is set to the current time as before. For the Document Command API, when combined with a `publish` command, the `lastPublicationDate` will also be set to the preserved `updated_at` timestamp instead of the current time. This is useful for imports and migrations where the original timestamps should be preserved to maintain correct dashboard sort order. ### 🎁 Get All Media Library Entry Keys A new endpoint has been added, `GET /api/:apiVersion/mediaLibrary/:id/keys`, which returns all asset keys (including variants) for the specified media library entry. This is useful for cache purging when image caches are handled by external systems. Further details can be found in the [Get All Media Library Entry Keys](/reference/public-api/media-library/llms.txt#get-all-media-library-entry-keys) endpoint documentation. ## January 2026 ### 🔥 Stricter Validation for Imported Documents Documents imported via the Public API were previously validated too loosely, allowing imports with incorrect content structures. This could cause issues later when editing these documents in the Livingdocs Editor, where content validation is more strict. Importing documents with an invalid content schema via the Public API is no longer possible and will now result in a failed import. ### 🔥 Revoke State Conflict Errors Revoking an already revoked media library entry will now throw a `ConflictError`, and return a 409 status for requests. Throwing an error is important to preserve the exising revoke note. It also matches the new unrevoke behaviour where calling unrevoke on an entry which is not revoked will throw an error. ### 🎁 Revoke Note ``` PATCH /api/:apiVersion/mediaLibrary/:id {patches: [{operation: 'revokeAsset', note: 'Case #1'}]} ``` The revoke action has been extended with a `note` property. `note` is a string which has a maximum length of 200 characters. This is only available with the media library's [2025 Behavior](/guides/media-library/2025-behavior/llms.txt). ### 🎁 Unrevoke ``` PATCH /api/:apiVersion/mediaLibrary/:id {patches: [{operation: 'unrevokeAsset'}]} ``` A new unrevoke action has been added which can be used to revert a revoke action. This can be useful when a legal case has been resolved and the use of the asset is allowed again. This is only available with the media library's [2025 Behavior](/guides/media-library/2025-behavior/llms.txt). ### 🎁 Return objects with `results` array instead of directly returning arrays Starting with `/api/2026-01/*` the Public API endpoints which previously returned an array now return an object containing a `results` property with this array. There can also be a `total` number of results and a `cursor` for pagination depending on whether or not the endpoint supports it. To improve the accuracy of the pagination the `cursor` can be passed back to the endpoints or functions using the `after` parameter, for example: `/api/2026-01/publications/search?filters=${filters}&limit=10&after=${cursor}`. The following endpoints return `{results: [], total: 0, cursor: ''}`: - `GET /api/2026-01/publications/search` - `GET /api/2026-01/documents/:documentId/incomingDocumentReferences` - `GET /api/2026-01/documents/:documentId/incomingMediaReferences` - `GET /api/2026-01/mediaLibrary/:mediaId/incomingDocumentReferences` - `GET /api/2026-01/mediaLibrary/:mediaId/incomingMediaReferences` - `GET /api/2026-01/drafts/:documentId/incomingDocumentReferences` The following endpoints return `{results: []}`: - `GET /api/2026-01/documents/latestPublications` - `GET /api/2026-01/publicationEvents{/:channelHandle}` - `GET /api/2026-01/document-lists` - `GET /api/2026-01/categories` - `GET /api/2026-01/mediaLibrary` - `POST /api/2026-01/import/mediaLibrary` To achieve the same effect when working directly with the Public API feature in downstream code you can pass `apiVersion: '2026-01'` (or greater once supported) within the main parameter object, for example: `publicApi.searchPublications({projectId, filters, apiVersion: '2026-01'})`. The following methods return `{results: [], total: 0, cursor: ''}`: - `publicApi.searchPublications()` - `publicApi.getIncomingPublicationReferencesForDocument()` - `publicApi.getIncomingMediaReferencesForDocument()` - `publicApi.getIncomingPublicationReferencesForMedia()` - `publicApi.getIncomingMediaReferencesForMedia()` - `publicApi.getIncomingDocumentReferencesForDraft()` The following methods return `{results: []}`: - `publicApi.getLatestDraftsBeta()` - `publicApi.getLatestPublications()` - `publicApi.getPublicationEvents()` - `publicApi.findDocumentLists()` - `publicApi.getCategories()` - `publicApi.getMediaLibraryEntries()` - `publicApi.createMediaLibraryEntries()` To continue to return the array directly you can still use the `/api/2025-11/*` (or earlier) endpoints, or omit the `apiVersion` when calling the methods. ## September 2025 ### ⚠️ Deprecation of `renditions` endpoints and query parameters The following endpoint is no longer available in newer api versions anymore: ❌ `GET` `/api/2025-09/documents/{documentId}/latestPublication/renditions/{renditionHandles}` The following endpoints don't support the `?renditions` query parameter anymore: ❌ `GET` `/api/2025-09/documents/{documentId}/latestDraft?renditions=web` ❌ `GET` `/api/2025-09/documents/{documentId}/latestPublication?renditions` There's no replacement for renditions in livingdocs as all transforms should be done when aggregating content for your frontends. But all three endpoints still support the old logic in v1 to 2025-05: ✅ `GET` `/api/2025-07/documents/{documentId}/latestPublication/renditions/{renditionHandles}` ✅ `GET` `/api/2025-07/documents/{documentId}/latestDraft?renditions=web` ✅ `GET` `/api/2025-07/documents/{documentId}/latestPublication?renditions` ## July 2025 ### ⚠️ Deprecation of `/project`, `/channelConfig` and `/channels/{channelHandle}` endpoints The following endpoints are no longer available in newer api versions anymore: ❌ `GET` `/api/2025-07/project` ❌ `GET` `/api/2025-07/channels/{channelHandle}` ❌ `GET` `/api/2025-07/channelConfig` ❌ `POST` `/api/2025-07/channelConfig` Please use the following endpoints instead, which are available since v1: ✅ `GET` `/api/2025-07/projectConfig` ✅ `POST` `/api/2025-07/projectConfig` All the 4 legacy endpoints are still available in v1 to 2025-05: ✅ `GET` `/api/v1/project` to `/api/2025-05/project` ✅ `GET` `/api/v1/channels` to `/api/2025-05/channels` ✅ `GET` `/api/v1/channelConfig` to `/api/2025-05/channelConfig` ✅ `POST` `/api/v1/channelConfig` to `/api/2025-05/channelConfig` ### 🎁 Document Command API: New Publish Control Commands We have extended the [Document Command API](/reference/public-api/document-command-api/llms.txt) with new publish control commands. #### `setEmbargo` ```js { operation: 'setEmbargo', reason: 'Some reason', until: '2021-11-04T00:00:00Z' } ``` #### `removeEmbargo` ```js { operation: 'removeEmbargo' } ``` #### `addPublishSchedule` ```js { operation: 'addPublishSchedule', date: '2021-11-04T00:00:00Z' } ``` #### `cancelPublishSchedule` ```js { operation: 'cancelPublishSchedule' } ``` #### `addUnpublishSchedule` ```js { operation: 'addUnpublishSchedule', date: '2021-11-04T00:00:00Z' } ``` #### `cancelUnpublishSchedule` ```js { operation: 'cancelUnpublishSchedule' } ``` ## May 2025 ### ⚠️ Kordiam Rebranding: Remove Desknet endpoints in newer versions The public API endpoints of the version `2025-05` do not support `desknet` in the path anymore. That means the following api prefixes should get changed: `/api/v1/desknet/` > `/api/2025-05/kordiam/` `/api/v1/desknet-integration/` > `/api/2025-05/kordiam-integration/` The Desknet endpoints are supported in api versions `v1` till `2025-03`, but not in any versions after that: ❌ `POST` `/api/2025-05/desknet/element` ❌ `PUT` `/api/2025-05/desknet/element` ❌ `PUT` `/api/2025-05/desknet/element/:documentId` ❌ `DELETE` `/api/2025-05/desknet/element/:documentId` We suggest to migrate to the new versions that use `kordiam` in the path: ✅ `POST` `/api/2025-05/kordiam/element` ✅ `PUT` `/api/2025-05/kordiam/element` ✅ `PUT` `/api/2025-05/kordiam/element/:documentId` ✅ `DELETE` `/api/2025-05/kordiam/element/:documentId` The same goes for the legacy kordiam integration (not the global integration). Just change the path from `/desknet-integration` to `/kordiam-integration`: ❌ `POST` `/api/2025-05/desknet-integration/oauth/token` ❌ `POST` `/api/2025-05/desknet-integration/statuses` ❌ `PUT` `/api/2025-05/desknet-integration/publication` ❌ `PUT` `/api/2025-05/desknet-integration/publication/:documentId` ❌ `DELETE` `/api/2025-05/desknet-integration/publication/:documentId` ✅ `POST` `/api/2025-05/kordiam-integration/oauth/token` ✅ `POST` `/api/2025-05/kordiam-integration/statuses` ✅ `PUT` `/api/2025-05/kordiam-integration/publication` ✅ `PUT` `/api/2025-05/kordiam-integration/publication/:documentId` ✅ `DELETE` `/api/2025-05/kordiam-integration/publication/:documentId` ### 🔥 Removal of Menu Tool The Menu Tool has been removed, along with its [public API endpoint](/reference/public-api/menus/llms.txt#get-menus-for-a-channel). As a result, the following endpoints no longer exist: ❌ `GET` `/api/v1/menus/:channelHandle?` ❌ `GET` `/api/beta/menus/:channelHandle?` ❌ `GET` `/api/2025-03/menus/:channelHandle?` We suggest migrating your menus to data records. For detailed instructions on setting them up, refer to our [guide](/guides/editor/menus/llms.txt). ## March 2025 ### 🎁 API Versioning We're introducing a new [API Versioning Strategy](/reference/public-api/versioning/llms.txt) that allows us to iterate on the API without breaking existing integrations. With the introduction of a new versioning strategy, the `v1` and `beta` versions are now available as `2025-03` version. If you use any of those versions, you can safely change your integration to the `2025-03` version, which now contains both functionalities without any other changes. ### 🎁 Media Library: Serve Image We’ve added a new public API endpoint: `/api/2025-03/mediaLibrary/serve-image/:key` This endpoint provides access to an image in its original dimensions, as long as it has not been revoked or marked as invalid. It can serve as a source for proxies or image processing services. Please check the [API reference](/reference/public-api/media-library/llms.txt#serve-image) for more details. ## January 2025 ### 🎁 Brand Conditions Conditional components provide the ability to render a component in the delivery based on a `brands` or `dateTime` condition. The conditions are stored with the component data and can be input in the Livingdocs Editor. To support country- or brand-specific content, we are introducing a new component condition: the `brands` condition. This allows downstreams to configure a set of brands, from which one or more can be selected on components to define for which brands a component should be included. This condition works alongside the already existing `dateTime` condition. ![Brands component condition](/operations/releases/release-2025-01-brands-condition.png) For more information, please refer to our [conditional components documentation](/reference/project-config/content-types/llms.txt#conditional-components). The `brands` condition is supported by all API endpoints where the existing `dateTime` component condition is supported: - `GET /api/v1/documents/:documentId/latestPublication` - `GET /api/v1/documents/latestPublications` - `GET /api/v1/documents/:documentId/latestPublication/renditions/:renditionHandles` - `GET /api/v1/publications/search` - `GET /api/v1/document-lists/:id` - `GET /api/beta/documents/:documentId/latestDraft` - `GET /api/beta/documents/:documentId/latestPublication` - `GET /api/beta/documents/latestPublications` - `POST /api/beta/composition/:documentId` ## November 2024 ### ⚠️ Deprecate Menu Tool The Menu Tool is deprecated and will be removed in release-2025-05. Please migrate your menus to data records, using the `li-tree` plugin and, if needed, the `li-unique-id` metadata plugin. For detailed instructions on [setting up menus with data records](/guides/editor/menus/llms.txt), refer to our guide. We are here to assist with the migration as needed. ### 🎁 Document Command API: New Commands We have extended the [Document Command API](/reference/public-api/document-command-api/llms.txt) with five new commands, which are also available for [Assistants](/customising/assistants/llms.txt). Each command supports an optional `oldValue` parameter. When specified, the system verifies that the value being updated matches the provided `oldValue`. This prevents accidental overwrites that might occur due to changes made between reading a document and issuing the command. If the `oldValue` does not match, a conflict error is thrown. #### `setComponentCondition` ```js { operation: 'setComponentCondition', componentId: 'doc-123', conditionName: 'dateTime', value: { gte: '2025-01-01T10:30:00.000Z', lt: '2025-02-02T14:30:00.000Z' }, oldValue: { gte: '2024-01-01T10:30:00.000Z', lt: '2024-02-02T14:30:00.000Z' } } ``` #### `setComponentStyle` ```js { operation: 'setComponentStyle', componentId: 'doc-123', propertyName: 'background', value: '#1fc47a', oldValue: '#000' } ``` #### `setStyleDirective` ```js { operation: 'setStyleDirective', componentId: 'doc-123', directiveName: 'appearance', propertyName: 'background', value: '#1fc47a', oldValue: '#000' } ``` #### `setLinkDirective` ```js { operation: 'setLinkDirective', componentId: 'doc-123', directiveName: 'link', value: { href: 'https://livingdocs.io/article/123', target: '_blank', $ref: 'document', reference: {id: '123'} }, oldValue: { href: 'https://livingdocs.io/' } } ``` #### `setIncludeDirective` The `setIncludeDirective` command supports updating both include `params` and `overrides`. These properties depend on each other: if only `params` are provided, any existing `overrides` are removed. Conversely, specifying `overrides` without `params` is invalid and will return a validation error. To update `overrides`, both the `params` and `overrides` properties must be provided. ```js { operation: 'setIncludeDirective', componentId: 'doc-123', directiveName: 'related-article', value: { params: { teaser: { $ref: 'document', reference: {id: '3'} }, }, overrides: [{ id: 'teaser-normal-3', content: { link: {href: 'https://livingdocs.io'}, title: 'Changed title', }, originalSnapshot: {...}, contentProperties: [...] }] }, oldValue: null } ``` ## July 2024 ### 🎁 Document Command API: New Commands We have extended the [Document Command API](/reference/public-api/document-command-api/llms.txt) with two new commands, which are also available for [Assistants](/customising/assistants/llms.txt). #### `removeComponent` ```js { operation: 'removeComponent', componentId: 'doc-4a2b3g4d5' } ``` #### `unpublish` ```js { operation: 'unpublish' } ```