🚀 Ship faster with premium components 🚀
Search documentation v1.5.0

Content Entries

Manage individual pages of content

Content entries are the individual pieces of content that belong to a content type. If you have a content type called blog, each blog post is a content entry. If you have an author type, each author is an entry. Entries are where editors spend most of their time — creating, updating, and publishing content.

Browsing Entries

Each content type has its own entries page, accessible from the sidebar. The page lists all entries for that type, each showing its current state alongside its name. A search bar at the top lets you filter entries by name as you type. Entries are displayed to each user according to their permissions. Users with content:read see all entries. Users with only own:content:read see only entries they created themselves.

Content Entries

Use the New [type] button at the top right of the entries list to create a new entry. The entry is created immediately with a default state of Draft and added to the list, ready to be opened and edited.

Editing an Entry

Clicking an entry opens the entry editor. What you see depends on whether the content type supports blocks:

Entry Editor with Blocks
Entry with blocks support
Entry Editor without Blocks
Entry without blocks support

Deleting an Entry

The delete button is available at the bottom of the options pane. Deleting an entry is permanent. All blocks associated with the entry are deleted along with it.

Remove content entry confirmation

Using Entries on the Frontend

Entries are queried on the frontend using the getContentType helper inside getStaticPaths for dynamic routes. However, you can also query entries directly by their ID using the getContentEntryById helper in the following way:

Unlock CMS
How to query a single entry by ID
import { getContentEntryById } from '@utils/server'
const entry = await getContentEntryById<MyEntryFieldsType>(123)

Each entry exposes:

PropertyDescription
id The numeric ID of the entry.
state The system state of the entry: DRAFT, PUBLISHED, or ARCHIVED.
stateName The human-readable name of the assigned state, as defined in Content States.
entry.fields The typed field values for this entry, keyed by field name.
blocks All blocks assigned to this entry, in order, ready to be passed to ComponentMap.

Unlike in getContentType, entries returned by getContentEntryById are not filtered by state. This means you can query any entry by ID regardless of its current state, which is useful for previewing drafts or building custom interfaces.

Permissions

Content permissions support two scopes: global (all entries) and own (entries created by the current user). When a user has own:content:* permissions without the corresponding content:* permission, they are restricted to entries they created.

PermissionDescription
content:read View all entries across all content types.
own:content:read View only entries created by the current user. Mutually exclusive with content:read.
content:create Create new entries.
content:update Edit any entry's fields, blocks, name, and state.
own:content:update Edit only entries created by the current user. Mutually exclusive with content:update.
content:delete Delete any entry and its associated blocks.
own:content:delete Delete only entries created by the current user. Mutually exclusive with content:delete.

Content permissions are also scoped by content type. A role can be configured to grant access to specific content types only. For example, allowing a user to read and edit blog entries but not author entries. This is managed through role scopes on the Roles & Permissions page.