Container API

dotCMS templates are built out of containers, which define display behaviors for different Content Types in the context of different page layouts. This document details the endpoints of a REST API for manipulating containers with create, read, update, and delete (CRUD) operations, utilizing and returning JSON objects.

Containers can exist either as database entities or as file system entities — directories containing VTL files. The latter case offers advantages such as easy storage on remote repositories, synchronization through dotCLI — or WebDav on older versions — or other similar conveniences. By the same measure, there are also some Container API calls that can only be performed on the database-entity type of Container.

All examples use the dotCMS demo site as their target. Used on another host, the Authentication header must change accordingly: For Basic authorization, use base64 encoding of a username:password string; for more secure Bearer authorization, use an API token.

Retrieving a Container#


The endpoint offers several methods to retrieve containers, individually or collectively. Please note:

  • Containers located in the database must be requested by identifier.
  • Containers located in the file system must be referenced by path.

To retrieve the working version of a container, use /working:

curl --location --request GET 'https://demo.dotcms.com/api/v1/containers/working?containerId=REPLACE_THIS_UUID' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg=='

To retrieve the live version of a container, call /live:

curl --location --request GET 'https://demo.dotcms.com/api/v1/containers/live?containerId=/application/containers/system' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg==' \

Finally, to retrieve all containers:

curl --location --request GET 'https://demo.dotcms.com/api/v1/containers/' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg=='

To adjust the displayed results, the Container API uses standard pagination parameters such as per_page, filter, etc.

A successful call returns containers as JSON objects, which may look, in part, like the following data:

{ "entity": { "archived": false, "categoryId": "27d80ebe-c9f1-4dd9-8cae-f15e644df708", "deleted": false, "friendlyName": "TestContainer description", "iDate": 1647630014297, "idate": 1647630014297, "identifier": "567416cee048a876d4c60172421832ba", "inode": "27d80ebe-c9f1-4dd9-8cae-f15e644df708", "live": false, "locked": false, "map": { "deleted": false, "friendlyName": "TestContainer description", "hasLiveVersion": false, "iDate": 1647630014297, "identifier": "567416cee048a876d4c60172421832ba", "inode": "27d80ebe-c9f1-4dd9-8cae-f15e644df708", "live": false, "locked": false, "modDate": 1647630014309, "modUser": "dotcms.org.1", "modUserName": "Admin User", "showOnMenu": false, "sortOrder": 0, "title": "TestContainer", "type": "containers", "working": true } ... } }

Adding a Container#


Adding a container by API call is only possible with a database-style container. A container that exists in the file system must instead be created by adding a folder containing the necessary VTL files within the application/containers folder, either manually or by one of the methods detailed at the top of the page.

To add a container, make a POST call with the Container as a JSON payload:

curl --location --request POST 'https://demo.dotcms.com/api/v1/containers' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg==' \ --data-raw '{ "title":"TestContainer", "friendlyName":"TestContainer description", "maxContentlets":1, "notes":"Notes", "preLoop":"<h1>Some Title</h1>", "postLoop":"<span>Some Footer</span>", "containerStructures":[ { "structureId":"webPageContent", "code":"<div> $!{body} </div>" }, { "structureId":"DotAsset", "code":" <img src ='\''./contentAsset/image/${ContentIdentifier}/asset'\'' />" } ] }'

Updating a Container#


The call to update a container is similar to creating one; it only functioning with database containers, and it has a very similar structure. However, there are two key differences:

  • It uses the PUT method instead of POST.
  • It includes the container's identifier in the payload data.
curl --location --request PUT 'https://demo.dotcms.com/api/v1/containers' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg==' \ --data-raw '{ "identifier":"567416cee048a876d4c60172421832ba", "title":"TestContainer", "friendlyName":"TestContainer description", "maxContentlets":1, "notes":"Notes 1", "preLoop":"preLoop xxxx", "postLoop":"postLoop xxxx", "containerStructures":[ { "structureId":"webPageContent", "code":" code xxxx" }, { "structureId":"DotAsset", "code":" tags: $!{tags}" } ] }'

Publishing or Unpublishing a Container#


Publishing or unpublishing a container are similar PUT operations, distinguished by the use of /_publish or /_unpublish. Both operations take either a path or an identifier.

Publishing:

curl --location --request PUT 'https://demo.dotcms.com/api/v1/containers/_publish?containerId=567416cee048a876d4c60172421832ba' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg=='

Unpublishing:

curl --location --request PUT 'https://demo.dotcms.com/api/v1/containers/_unpublish?containerId=567416cee048a876d4c60172421832ba' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg=='

Archiving or Unarchiving a Container#


Archiving and unarchiving works similarly to publishing or unpublishing. Note: Before archiving, containers should be unpublished.

To archive:

curl --location --request PUT 'https://demo.dotcms.com/api/v1/containers/_archive?containerId=/application/containers/system' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg=='

To unarchive an archived container:

curl --location --request PUT 'https://demo.dotcms.com/api/v1/containers/_unarchive?containerId=/application/containers/system' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg=='

Deleting a Container#


Finally, you can use the call below to delete a container. Note: A container should be archived (see above) before deletion.

curl --location --request DELETE 'https://demo.dotcms.com/api/v1/containers?containerId=567416cee048a876d4c60172421832ba' \ --header 'Content-Type: application/json' \ --header 'Authorization: Basic YWRtaW5AZG90Y21zLmNvbTphZG1pbg=='