Show examples in:
Publish a record

When the draft/published system is enabled for a model, records will remain in a Draft status until they are Published.

When publishing a record, you can choose to either publish the whole record, or just some of its locales / non-localized content. This is similar to how the "Publish" dropdown button in the UI works.

Example Publish entire record (all locales & non-localized content)
Example Selective publishing (only specified locales or non-localized content)

Query parameters

recursive  Optional  boolean  Examples: true, false

When recursive is true, if the record belongs to a tree-like collection, and any of the parent records aren't published, those parent records will published as well. When recursive is false or not specified, an UNPUBLISHED_PARENT error will occur in such cases.

Body Parameters

For this endpoint, the body is not required and can be entirely omitted
content_in_locales  Required  Array<string>  Examples: ["en"], ["en","it"]
non_localized_content  Required  boolean  Examples: true, false

Whether non-localized content will be published


Returns a item resource object.

Other examples

Example Known issue with legacy client: 'id' is not a permitted key

If you're using the the older, now-deprecated datocms-client instead of the current @datocms/cma-client, there is a known issue with the item.publish() method. It will return an error like:

"data": [
"id": "abcdef",
"type": "api_error",
"attributes": {
"details": {
"messages": [
"#/data: failed schema #/definitions/item/links/13/schema/properties/data: \"id\" is not a permitted key."

The workaround is to add {serializeRequest: false} as the third parameter of that method, like:

await client.item.publish(
"1234567890", // record ID
{}, // body
{}, // query string
{ serializeRequest: false } // this is the actual workaround

This tells the deprecated client to skip some of its internal serialization rules (which used to work, but no longer) and instead just send the raw syntax that you provide.

While this should allow that method to continue working for the time being, it is important that you upgrade to the modern client as soon as possible. As of 2024, the old client has been deprecated for more than 2 years and will not receive any further updates. It is possible that this method and others will further break over time, possibly impacting production workflows.

import { buildClient } from "@datocms/cma-client-node";
async function run() {
const client = buildClient({ apiToken: "API_TOKEN" });
const itemId = "WxrWMPl3TjeSJYcl6lNCbg";
const publishedRecord = await client.items.publish(
{}, // body
{}, // query string
{ serializeRequest: false }, // this is the actual workaround