dotCMS Content Delivery API

Content retrieval and manipulation endpoints

Operations 8

Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay

PUT /api/content/canLock/{params} Check if a contentlet can be locked (legacy) · Check if a contentlet can be locked (deprecated) #
Ask an LLM
“Before editing, can I check whether I'm allowed to lock a piece of content and who holds the lock now?”
“Which deprecated content endpoint reports lock status and the lock owner?”
Tell an agent
Check whether I can lock the contentlet given by {params}.
Report the current lock status and owner for content {params} using the legacy canLock route.
GET /api/content/{params} Retrieve content by ID, inode or query · Retrieve content by ID, inode, query, or related content #
Ask an LLM
“Can I pull a contentlet by its identifier and include related content two levels deep?”
“How do I fetch only the live version of content in a specific language?”
Tell an agent
Get content using the path parameters {params}.
Fetch the live contentlet described by {params}, rendering its widgets.
PUT /api/content/{params} Create or update content via PUT (deprecated) · Create or update content via PUT (deprecated) #
Ask an LLM
“Can the old /api/content PUT endpoint update an existing contentlet as well as create one?”
“Which deprecated endpoint accepts form-encoded or XML data to save content?”
Tell an agent
Create or update the contentlet described by {params} with the deprecated PUT endpoint.
Save changes to existing content {params} through the legacy PUT content route.
POST /api/content/{params} Create content via POST (deprecated) · Create content via POST (deprecated) #
Ask an LLM
“Can I still create new content by POSTing JSON to the old content endpoint?”
“Which legacy POST route adds a brand-new contentlet?”
Tell an agent
Create a new contentlet using the deprecated POST endpoint with {params}.
Add brand-new content via the legacy POST content route, passing {params}.
GET /api/content/indexcount/{query} Count content matching a Lucene query · Count content matching a Lucene query #
Ask an LLM
“How many contentlets match a Lucene query?”
“Can I get just a total count of search matches as plain text?”
Tell an agent
Count the content matching Lucene query {query}.
Tell me how many items match {query} in the content index.
GET /api/content/indexsearch/{query}/sortby/{sortby}/limit/{limit}/offset/{offset} Search the content index with Lucene · Search content index by Lucene query #
Ask an LLM
“Can I search content with a Lucene query and get back identifiers and inodes?”
“How do I page through index search results with a sort field, limit and offset?”
Tell an agent
Search the content index for {query}, sorted by {sortby}, returning {limit} results from offset {offset}.
Find identifiers of content matching {query} ordered by {sortby}, {limit} at a time starting at {offset}.
PUT /api/content/lock/{params} Lock a contentlet (deprecated) · Lock a contentlet (deprecated) #
Ask an LLM
“How do I lock content so nobody else edits it at the same time?”
“Is there a legacy endpoint to lock a contentlet by inode or identifier?”
Tell an agent
Lock the contentlet given by {params}.
Lock content {params} to prevent concurrent edits using the legacy lock route.
PUT /api/content/unlock/{params} Unlock a contentlet (deprecated) · Unlock a contentlet (deprecated) #
Ask an LLM
“How do I release a lock on content so others can edit it?”
“Which older endpoint unlocks a previously locked contentlet?”
Tell an agent
Unlock the contentlet given by {params}.
Release the edit lock on content {params} via the legacy unlock route.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/dotcms:dotcms-content-delivery-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

dotcms-content-delivery-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: dotCMS REST Content Delivery API
  version: '3'
  description: Content retrieval and manipulation endpoints
servers:
- url: /
  description: dotCMS Server
tags:
- name: Content Delivery
  description: Content retrieval and manipulation endpoints
paths:
  /api/content/canLock/{params}:
    put:
      tags:
      - Content Delivery
      summary: Check if a contentlet can be locked (deprecated)
      description: Checks whether the current user can lock a contentlet identified by inode or identifier. Returns lock capability information including current lock status and lock owner details. Parameters are passed as semicolon-delimited path segments (e.g., id:abc123/language:1). This endpoint is deprecated - use the v1 ContentResource canLockContent endpoint instead.
      operationId: canLockContentLegacy
      parameters:
      - name: params
        in: path
        description: Semicolon-delimited parameters (e.g., inode:abc123/language:1/live:true)
        required: true
        schema:
          pattern: .*
          type: string
      responses:
        '200':
          description: Lock capability check completed successfully
          content:
            application/json:
              schema:
                type: object
                description: Lock capability check result
        '401':
          description: Unauthorized access
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
        '404':
          description: Contentlet not found
          content:
            application/json: {}
      deprecated: true
  /api/content/{params}:
    get:
      tags:
      - Content Delivery
      summary: Retrieve content by ID, inode, query, or related content
      description: 'Retrieves contentlets using various lookup strategies. Parameters use a slash-delimited key:value format in the URL path (e.g., /api/content/inode:abc123/live:true/language:1). Supported parameters include: id (identifier), inode, query (Lucene query), type (json or xml), orderby, limit, offset, language, live, depth (0-3 for relationship traversal), render (true to render widgets), related (ContentType.Field:identifier format), and allCategoriesInfo. When ''depth'' is set: 0 returns related content identifiers, 1 returns full related content objects, 2 returns related content with their related identifiers, 3 returns related content with their fully hydrated related content.'
      operationId: getContentLegacy
      parameters:
      - name: params
        in: path
        description: Slash-delimited key:value parameters (e.g., inode:abc123/live:true/language:1)
        required: true
        schema:
          pattern: .*
          type: string
      responses:
        '200':
          description: Content retrieved successfully
          content:
            application/json:
              schema:
                type: object
                description: Content data in the requested format
        '400':
          description: Invalid parameters or malformed query
          content:
            application/json: {}
        '401':
          description: Unauthorized access
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
        '404':
          description: Content not found
          content:
            application/json: {}
        '500':
          description: Internal server error
          content:
            application/json: {}
    put:
      tags:
      - Content Delivery
      summary: Create or update content via PUT (deprecated)
      description: Creates or updates a contentlet using JSON, XML, or form-encoded data. This endpoint is deprecated - use the v1 WorkflowResource fireActionDefault endpoint instead.
      operationId: singlePutContent
      parameters:
      - name: params
        in: path
        description: Slash-delimited key:value parameters for content operation
        required: true
        schema:
          pattern: .*
          type: string
      requestBody:
        description: Content data in JSON, XML, or form format
        content:
          application/json: {}
          application/xml: {}
          application/x-www-form-urlencoded: {}
        required: true
      responses:
        '200':
          description: Contentlet created or updated successfully
          content:
            application/json:
              schema:
                type: object
                description: Created or updated contentlet data
        '400':
          description: Bad request - invalid input data
          content:
            application/json: {}
        '401':
          description: Unauthorized access
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
      deprecated: true
    post:
      tags:
      - Content Delivery
      summary: Create content via POST (deprecated)
      description: Creates a contentlet using JSON, XML, or form-encoded data. This endpoint is deprecated - use the v1 WorkflowResource fireActionDefault endpoint instead.
      operationId: singlePostContent
      parameters:
      - name: params
        in: path
        description: Slash-delimited key:value parameters for content operation
        required: true
        schema:
          pattern: .*
          type: string
      requestBody:
        description: Content data in JSON, XML, or form format
        content:
          application/json: {}
          application/xml: {}
          application/x-www-form-urlencoded: {}
        required: true
      responses:
        '200':
          description: Contentlet created successfully
          content:
            application/json:
              schema:
                type: object
                description: Created or updated contentlet data
        '400':
          description: Bad request - invalid input data
          content:
            application/json: {}
        '401':
          description: Unauthorized access
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
      deprecated: true
  /api/content/indexcount/{query}:
    get:
      tags:
      - Content Delivery
      summary: Count content matching a Lucene query
      description: Performs an index count using the specified Lucene query and returns the total number of matching contentlets as a plain text string.
      operationId: indexCountContent
      parameters:
      - name: query
        in: path
        description: Lucene query string to count matching content
        required: true
        schema:
          type: string
      - name: type
        in: query
        description: Response format type (optional)
        schema:
          type: string
      - name: callback
        in: query
        description: JSONP callback function name (optional)
        schema:
          type: string
      responses:
        '200':
          description: Count of matching contentlets returned successfully
          content:
            text/plain:
              schema:
                type: string
                description: The count of contentlets matching the query
        '400':
          description: Invalid query syntax
          content:
            application/json: {}
        '401':
          description: Unauthorized access
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
        '500':
          description: Internal server error during count operation
          content:
            application/json: {}
  /api/content/indexsearch/{query}/sortby/{sortby}/limit/{limit}/offset/{offset}:
    get:
      tags:
      - Content Delivery
      summary: Search content index by Lucene query
      description: Performs an index search using the Lucene query and returns an array of JSON objects, each containing the inode and identifier of matching content.
      operationId: indexSearchContent
      parameters:
      - name: query
        in: path
        description: Lucene query string to search the index
        required: true
        schema:
          type: string
      - name: sortby
        in: path
        description: Field name to sort results by
        required: true
        schema:
          type: string
      - name: limit
        in: path
        description: Maximum number of results to return
        required: true
        schema:
          type: integer
          format: int32
      - name: offset
        in: path
        description: Number of results to skip for pagination
        required: true
        schema:
          type: integer
          format: int32
      - name: type
        in: query
        description: Response format type (optional)
        schema:
          type: string
      - name: callback
        in: query
        description: JSONP callback function name (optional)
        schema:
          type: string
      responses:
        '200':
          description: Index search results returned successfully
          content:
            application/json:
              schema:
                type: object
                description: Array of content identifiers or inodes matching the search criteria
        '400':
          description: Invalid query syntax or parameters
          content:
            application/json: {}
        '401':
          description: Unauthorized access
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
        '500':
          description: Internal server error during index search
          content:
            application/json: {}
  /api/content/lock/{params}:
    put:
      tags:
      - Content Delivery
      summary: Lock a contentlet (deprecated)
      description: Locks a contentlet identified by inode or identifier to prevent concurrent edits. Parameters are passed as semicolon-delimited path segments (e.g., id:abc123/language:1). This endpoint is deprecated - use the v1 ContentResource lockContent endpoint instead.
      operationId: lockContentLegacy
      parameters:
      - name: params
        in: path
        description: Semicolon-delimited parameters (e.g., inode:abc123/language:1/live:true)
        required: true
        schema:
          pattern: .*
          type: string
      responses:
        '200':
          description: Contentlet locked successfully
          content:
            application/json:
              schema:
                type: object
                description: Lock status result
        '401':
          description: Unauthorized access
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
        '404':
          description: Contentlet not found
          content:
            application/json: {}
      deprecated: true
  /api/content/unlock/{params}:
    put:
      tags:
      - Content Delivery
      summary: Unlock a contentlet (deprecated)
      description: Unlocks a previously locked contentlet identified by inode or identifier. Parameters are passed as semicolon-delimited path segments (e.g., id:abc123/language:1). This endpoint is deprecated - use the v1 ContentResource unlockContent endpoint instead.
      operationId: unlockContentLegacy
      parameters:
      - name: params
        in: path
        description: Semicolon-delimited parameters (e.g., inode:abc123/language:1/live:true)
        required: true
        schema:
          pattern: .*
          type: string
      responses:
        '200':
          description: Contentlet unlocked successfully
          content:
            application/json:
              schema:
                type: object
                description: Unlock operation result
        '401':
          description: Unauthorized access
          content:
            application/json: {}
        '403':
          description: Forbidden - insufficient permissions
          content:
            application/json: {}
        '404':
          description: Contentlet not found
          content:
            application/json: {}
      deprecated: true