Define your own content types and structures beyond the default post model
In Publive (a headless CMS), Custom Entities let you define your own content types and structures beyond the default post model. Each custom entity is driven by a schema that describes its fields, and each entry is a document that holds values for those fields.
Schema – Defines the content type: its name, API identifiers, fields, groups, and settings (e.g. entry title, searchable/filter fields, allowed states, access control, custom URL rule (Coming soon)).
Entry – A single record for that content type, with values for each field defined in the schema.
Published entry – The version of an entry that is exposed via APIs for consumption by apps and websites.
Custom Entities = schema-defined content types + entries whose structure is flexible and defined by you.
Availability
This feature is available on the Custom Enterprise plan only. To enable it for your workspace, contact support@thepublive.com.
How Custom Entities Can Be Used
Structured content types – e.g. “Product”, “Event”, “Recipe”, “Team Member” with a fixed set of fields and validation.
Multi-channel content – Same content type used by web, app, or other clients via APIs (e.g. JSON, HTML, XML, or plain text).
Relations – Link entries to Categories, Tags, Members, Forms, or other custom content types via Related fields.
Rich layouts – Use Components and Dynamic Zones to build modular blocks (hero, CTA, FAQ, etc.) inside an entry.
Filtered lists – Use Dynamic List fields to show lists of related content filtered by relations (e.g. “Posts in this Category” or “Products in this Collection”).
Single-page vs collection – Schemas can represent a collection (many entries) or a single content type (e.g. one “About Us” page); some schemas are used as reusable building blocks (e.g. shared with posts).
Example Scenarios
Product catalog – A “Product” content type with name, SKU, price, category, image, and description. Entries are products; APIs return them for storefront or app.
Landing page builder – A “Landing Page” content type with a Dynamic Zone where each section can be a different block type (Hero, Features, Testimonials, CTA). Each entry is a page; order and mix of blocks are flexible.
Event listing – An “Event” content type with title, start/end date and time, venue (related entity), and a Dynamic List for “Related events” filtered by category or tag.
Core Concepts
Schema
The schema is the definition of a content type: name, API slugs, response format, fields, groups, and settings.
Fields – Each field has a name, a type (e.g. short text, number, relation, component, dynamic zone, dynamic list), optional metadata (e.g. label, default), and validation rules.
Groups – Logical grouping of fields (e.g. “Content”, “SEO”) for organisation and UI.
Settings – Include which field is used as the entry title, which fields are searchable, which can be used as filters, allowed states, access control, custom URL patterns (Coming soon), and optional component preview.
Entries and Field Values
An entry belongs to one schema and holds one value per field.
Values are typed according to the field type (text, number, date, media, relation, component(s), or dynamic list configuration).
Relations and Taxonomies
Related fields link to other content: Categories, Tags, Members, Forms, or other custom content types (and posts).
Dynamic List – Lets you define a list by content type and filters (e.g. by category or tag). The list is resolved when the entry is delivered via the API. System taxonomies (Category, Tag, Member, Form) cannot be used as the main content type for a dynamic list; the list is based on custom content types (or posts).
Field Types
Type
Description
Example use
Limitations / notes
Short text
Short string
Title, name, slug
Maximum length applies.
Long text
Long string
Summary, description
Rich text
Formatted long text (e.g. HTML)
Body content
Integer
Whole number
Count, year
Decimal
Decimal number
Price, rating
Date
Date only
Event date
Date and time
Date and time
Publish time
Optional display format.
Boolean
Yes/no
Featured, active
Email
Email address
Contact email
URL
Web address
Link
Phone number
Phone number
Contact number
Publive media
Image or file from Publive media library
Image, attachment
References a single media item (id, url, type, filename in API).
JSON
Arbitrary JSON
Config, metadata
Related
Link to another content item or taxonomy
Author, category, related post
Single or multiple relations depending on configuration.
Embed
Embedded content (e.g. oEmbed / iframe)
Video, social embed
Component
One reusable block (single or repeatable)
Author card, feature list
See Components section. Can be limited to one instance or allow multiple instances of the same block.
Dynamic zone
Ordered list of blocks; each block can be a different type
List of related content defined by type and filters
Related posts, products in collection
See Dynamic List section. Cannot use system taxonomies as the list’s content type.
Validation (e.g. required, format) is configured per field in the schema.
Components
What a Component Is
A Component is a reusable content block with its own structure: a component schema defines the fields (text, number, media, relation, or even another component). An instance of a component is a single “block” that fills in those fields.
Show Component details
Component schema – Defines the block’s structure: name, slug, and field types (and optional settings such as filter fields). It is not a standalone content type; it is only used inside entities or other components.
Component instance – One filled-in block: it follows one component schema and holds values for that schema’s fields. It can be placed in a component field or as one item in a dynamic zone.
How the Component Field Works
In a content-type schema (or in another component schema), you add a field of type Component.
You choose which component schemas are allowed for that field.
You set the limit:
Single – The field holds exactly one component instance (e.g. one “Author card”).
Multi – The field holds multiple instances of the same component type (e.g. several “Feature” items in one block).
So: Component field = one block type, either once (single) or repeated (multi).
Nesting and Limits
Components can contain other components (nested blocks).
Maximum nesting depth is enforced (e.g. up to a few levels) so that structures stay manageable and performant.
Circular references are not allowed (e.g. Component A cannot contain Component B if B contains A). The system validates this when you save the schema.
Content type “Article” has a field “Author” of type Component, limit Single, allowed type “Author Card”.
An article entry then has one “Author” block with name, email, and avatar.
Dynamic Zone
What a Dynamic Zone Is
A Dynamic Zone is an ordered list of blocks where each block can be a different type. You define which block types (component schemas) are allowed; for each entry, editors choose which blocks to add and in what order.
Show Dynamic Zone details
In the schema, the field type is Dynamic Zone.
You configure the list of allowed component schemas (e.g. Hero, Feature Grid, Testimonials, CTA).
When editing an entry, the value is an ordered list of blocks; each block specifies its type and its field values.
Component vs Dynamic Zone
Aspect
Component
Dynamic Zone
What it holds
One block type, once (single) or repeated (multi)
A list of blocks
Block types per field
One schema (single or multi instances)
Each item can be a different allowed schema
Typical use
Fixed or repeatable block (e.g. author, features)
Page builder: hero, then CTA, then FAQ, etc.
Example
Content type “Landing Page” has a field “Sections” of type Dynamic Zone, with allowed types: Hero, Feature Grid, Testimonials, CTA.
One page’s “Sections” might be: [Hero, Feature Grid, CTA]. Order and mix are flexible per entry.
Dynamic List
What a Dynamic List Is
A Dynamic List field does not store the actual list of items. It stores configuration: which content type to list and how to filter it (e.g. by category, tag, or other relation). When the entry is delivered via the API, the system uses this configuration to resolve and return the list of matching items.
Show Dynamic List details
You configure:
Content type (model) – Which custom content type (or posts) to list. System taxonomies (Category, Tag, Member, Form) cannot be used as this content type.
Related fields – Which relation fields to use for filtering (e.g. category, tag).
Filters – For each chosen relation, the selected items (e.g. which categories or tags). Optionally a heading or similar display options.
So: Dynamic List = “list of content of type X filtered by these relation criteria.” Useful for “Related posts”, “Products in this collection”, etc., without storing the full list of IDs in the entry.
Configuration and Validation
Content type (model) is required and must be a custom content type (or post type), not a system taxonomy.
Filters – When used, you specify which relation(s) to filter by and the selected IDs (or equivalent).
Related fields – When you use filters, you specify which relation fields those filters apply to.
Example
Content type “Article” has a Dynamic List field “Related articles”.
Configuration: content type = “Article”; filter by “Primary category” with one or more categories selected.
When the article is returned via the API, “Related articles” is resolved to the list of articles in those categories (and can optionally include “related to this post” behaviour depending on product behaviour).
Last modified on October 21, 2026
Was this page helpful?
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Publive Docs","description":"Docs for Publive DXP and AXP: the headless CMS for digital publishers, and the platform that makes brands visible and citable in ChatGPT, AI Overviews, Perplexity, and Gemini.","colors":{"primary":"#146EF5","light":"#146EF5","dark":"#15171a"},"logo":{"light":"https://cdn.prod.website-files.com/66826ebfedcc2d4a07df740c/6682747dedcc2d4a07e30c0e_publive-logo.svg","dark":"https://img-cdn.publive.online/publive/logo/publive-white-full-logo.svg"},"favicon":"https://img-cdn.publive.online/thepublive/media/media_files/2026/07/27/favicon-2026-07-27-13-26-45.svg","api":{"openapi":["openapi/content-delivery.json","openapi/content-management.json","openapi/media-register-url.json","openapi/media-upload-file.json"],"mdx":{"auth":{"method":"basic"}}},"appearance":{"default":"light","strict":false},"navbar":{"links":[{"href":"mailto:support@thepublive.com","label":"Support"}],"primary":{"type":"button","label":"Dashboard","href":"https://dashboard.thepublive.com/v2"}},"footer":{"socials":{"website":"https://thepublive.com","x":"https://x.com/the_Publive","github":"https://github.com/ThePublive","linkedin":"https://in.linkedin.com/company/the-publive"}},"search":{"prompt":"Search Publive docs..."},"seo":{"metatags":{"og:site_name":"Publive Docs","twitter:card":"summary_large_image","twitter:site":"@the_publive"},"indexing":"all"},"fonts":{"family":"Poppins"},"styling":{"eyebrows":"breadcrumbs","latex":false},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"navigation":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://www.thepublive.com/blog"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"publive","hasAudioNarration":false,"actualSubdomain":"publive","customDomains":["docs.thepublive.com"],"gitSource":{"type":"github","owner":"thepublive","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6af6f82a3522466a5b8114b9","clientVersion":"0.0.4143","searchFilterCounts":[{"language":"default","tag":"Publive DXP","count":153},{"language":"default","tag":"API Reference","count":116},{"language":"default","tag":"Content Management API","count":61},{"language":"default","tag":"Documentation","count":34},{"language":"default","tag":"Content Delivery API","count":31},{"language":"default","tag":"Publive AXP","count":26},{"language":"default","tag":"Build your site","count":17},{"language":"default","tag":"Posts","count":11},{"language":"default","tag":"Guides","count":10},{"language":"default","tag":"Deprecated","count":10}],"searchSettings":{"maxResults":8,"showContentSnippets":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"custom.css","content":"#body-content,#content-container{max-width:100%!important}nav-dropdown-products-selector-trigger span.truncate,.nav-dropdown-products-selector-trigger span.truncate,button.nav-dropdown-products-selector-trigger span.truncate{display:none!important}nav-dropdown-products-selector-item-title,.nav-dropdown-products-selector-item-title,nav-dropdown-products-selector-item-description,.nav-dropdown-products-selector-item-description{display:none!important}.nav-dropdown-products-selector-trigger img,.nav-dropdown-products-selector-item-icon img{height:1.375rem!important;width:auto!important;object-fit:contain!important}.nav-dropdown-products-selector-item>svg{display:none!important}.nav-dropdown-products-selector-trigger{margin-left:-1.5rem!important}html[data-current-path=\"/\"] .nav-dropdown-products-selector-trigger,html[data-current-path=\"/\"] :has(>.nav-tabs){display:none!important}"}],"page":{"pagePath":"dxp/documentation/concepts-features/custom-entities","slug":"/dxp/documentation/concepts-features/custom-entities","pageMetadata":{"title":"Custom Entities","description":"Define your own content types and structures beyond the default post model","href":"/dxp/documentation/concepts-features/custom-entities"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Define your own content types and structures beyond the default post model\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,hr:`hr`,li:`li`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Expandable,Heading,Table}=_components;if(!Expandable)_missingMdxReference(`Expandable`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`In Publive (a headless CMS), `,_jsx(_components.strong,{children:`Custom Entities`}),` let you define your own content types and structures beyond the default post model. Each custom entity is driven by a `,_jsx(_components.strong,{children:`schema`}),` that describes its fields, and each `,_jsx(_components.strong,{children:`entry`}),` is a document that holds values for those fields.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Schema`}),` – Defines the content type: its name, API identifiers, fields, groups, and settings (e.g. entry title, searchable/filter fields, allowed states, access control, custom URL rule (Coming soon)).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Entry`}),` – A single record for that content type, with values for each field defined in the schema.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Published entry`}),` – The version of an entry that is exposed via APIs for consumption by apps and websites.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Custom Entities = schema-defined content types + entries whose structure is flexible and defined by you.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`availability`,children:`Availability`}),`\n`,_jsxs(_components.p,{children:[`This feature is available on the `,_jsx(_components.strong,{children:`Custom Enterprise`}),` plan only. To enable it for your workspace, contact `,_jsx(_components.a,{href:`mailto:support@thepublive.com`,children:`support@thepublive.com`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`how-custom-entities-can-be-used`,children:`How Custom Entities Can Be Used`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Structured content types`}),` – e.g. “Product”, “Event”, “Recipe”, “Team Member” with a fixed set of fields and validation.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Multi-channel content`}),` – Same content type used by web, app, or other clients via APIs (e.g. JSON, HTML, XML, or plain text).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Relations`}),` – Link entries to Categories, Tags, Members, Forms, or other custom content types via `,_jsx(_components.strong,{children:`Related`}),` fields.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Rich layouts`}),` – Use `,_jsx(_components.strong,{children:`Components`}),` and `,_jsx(_components.strong,{children:`Dynamic Zones`}),` to build modular blocks (hero, CTA, FAQ, etc.) inside an entry.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Filtered lists`}),` – Use `,_jsx(_components.strong,{children:`Dynamic List`}),` fields to show lists of related content filtered by relations (e.g. “Posts in this Category” or “Products in this Collection”).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Single-page vs collection`}),` – Schemas can represent a `,_jsx(_components.strong,{children:`collection`}),` (many entries) or a `,_jsx(_components.strong,{children:`single`}),` content type (e.g. one “About Us” page); some schemas are used as reusable building blocks (e.g. shared with posts).`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`example-scenarios`,children:`Example Scenarios`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Product catalog`}),` – A “Product” content type with name, SKU, price, category, image, and description. Entries are products; APIs return them for storefront or app.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Landing page builder`}),` – A “Landing Page” content type with a `,_jsx(_components.strong,{children:`Dynamic Zone`}),` where each section can be a different block type (Hero, Features, Testimonials, CTA). Each entry is a page; order and mix of blocks are flexible.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Event listing`}),` – An “Event” content type with title, start/end date and time, venue (related entity), and a `,_jsx(_components.strong,{children:`Dynamic List`}),` for “Related events” filtered by category or tag.`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`core-concepts`,children:`Core Concepts`}),`\n`,_jsx(Heading,{level:`3`,id:`schema`,children:`Schema`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The `,_jsx(_components.strong,{children:`schema`}),` is the definition of a content type: name, API slugs, response format, `,_jsx(_components.strong,{children:`fields`}),`, `,_jsx(_components.strong,{children:`groups`}),`, and `,_jsx(_components.strong,{children:`settings`}),`.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Fields`}),` – Each field has a name, a `,_jsx(_components.strong,{children:`type`}),` (e.g. short text, number, relation, component, dynamic zone, dynamic list), optional metadata (e.g. label, default), and validation rules.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Groups`}),` – Logical grouping of fields (e.g. “Content”, “SEO”) for organisation and UI.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Settings`}),` – Include which field is used as the entry title, which fields are searchable, which can be used as filters, allowed states, access control, custom URL patterns (Coming soon), and optional component preview.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`entries-and-field-values`,children:`Entries and Field Values`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`An `,_jsx(_components.strong,{children:`entry`}),` belongs to one schema and holds one value per field.`]}),`\n`,_jsx(_components.li,{children:`Values are typed according to the field type (text, number, date, media, relation, component(s), or dynamic list configuration).`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`relations-and-taxonomies`,children:`Relations and Taxonomies`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Related`}),` fields link to other content: Categories, Tags, Members, Forms, or other custom content types (and posts).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Dynamic List`}),` – Lets you define a list by `,_jsx(_components.strong,{children:`content type`}),` and `,_jsx(_components.strong,{children:`filters`}),` (e.g. by category or tag). The list is resolved when the entry is delivered via the API. System taxonomies (Category, Tag, Member, Form) cannot be used as the main content type for a dynamic list; the list is based on custom content types (or posts).`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`field-types`,children:`Field Types`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Type`}),_jsx(_components.th,{children:`Description`}),_jsx(_components.th,{children:`Example use`}),_jsx(_components.th,{children:`Limitations / notes`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Short text`})}),_jsx(_components.td,{children:`Short string`}),_jsx(_components.td,{children:`Title, name, slug`}),_jsx(_components.td,{children:`Maximum length applies.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Long text`})}),_jsx(_components.td,{children:`Long string`}),_jsx(_components.td,{children:`Summary, description`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Rich text`})}),_jsx(_components.td,{children:`Formatted long text (e.g. HTML)`}),_jsx(_components.td,{children:`Body content`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Integer`})}),_jsx(_components.td,{children:`Whole number`}),_jsx(_components.td,{children:`Count, year`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Decimal`})}),_jsx(_components.td,{children:`Decimal number`}),_jsx(_components.td,{children:`Price, rating`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Date`})}),_jsx(_components.td,{children:`Date only`}),_jsx(_components.td,{children:`Event date`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Date and time`})}),_jsx(_components.td,{children:`Date and time`}),_jsx(_components.td,{children:`Publish time`}),_jsx(_components.td,{children:`Optional display format.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Boolean`})}),_jsx(_components.td,{children:`Yes/no`}),_jsx(_components.td,{children:`Featured, active`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Email`})}),_jsx(_components.td,{children:`Email address`}),_jsx(_components.td,{children:`Contact email`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`URL`})}),_jsx(_components.td,{children:`Web address`}),_jsx(_components.td,{children:`Link`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Phone number`})}),_jsx(_components.td,{children:`Phone number`}),_jsx(_components.td,{children:`Contact number`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Publive media`})}),_jsx(_components.td,{children:`Image or file from Publive media library`}),_jsx(_components.td,{children:`Image, attachment`}),_jsx(_components.td,{children:`References a single media item (id, url, type, filename in API).`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`JSON`})}),_jsx(_components.td,{children:`Arbitrary JSON`}),_jsx(_components.td,{children:`Config, metadata`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Related`})}),_jsx(_components.td,{children:`Link to another content item or taxonomy`}),_jsx(_components.td,{children:`Author, category, related post`}),_jsx(_components.td,{children:`Single or multiple relations depending on configuration.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Embed`})}),_jsx(_components.td,{children:`Embedded content (e.g. oEmbed / iframe)`}),_jsx(_components.td,{children:`Video, social embed`}),_jsx(_components.td,{})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Component`})}),_jsx(_components.td,{children:`One reusable block (single or repeatable)`}),_jsx(_components.td,{children:`Author card, feature list`}),_jsxs(_components.td,{children:[`See `,_jsx(_components.a,{href:`#components`,children:`Components`}),` section. Can be limited to one instance or allow multiple instances of the same block.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Dynamic zone`})}),_jsx(_components.td,{children:`Ordered list of blocks; each block can be a different type`}),_jsx(_components.td,{children:`Page sections (hero, CTA, FAQ)`}),_jsxs(_components.td,{children:[`See `,_jsx(_components.a,{href:`#dynamic-zone`,children:`Dynamic Zone`}),` section.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Dynamic list`})}),_jsx(_components.td,{children:`List of related content defined by type and filters`}),_jsx(_components.td,{children:`Related posts, products in collection`}),_jsxs(_components.td,{children:[`See `,_jsx(_components.a,{href:`#dynamic-list`,children:`Dynamic List`}),` section. Cannot use system taxonomies as the list’s content type.`]})]})]})]}),`\n`,_jsx(_components.p,{children:`Validation (e.g. required, format) is configured per field in the schema.`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`components`,children:`Components`}),`\n`,_jsx(Heading,{level:`3`,id:`what-a-component-is`,children:`What a Component Is`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`Component`}),` is a reusable content block with its own structure: a `,_jsx(_components.strong,{children:`component schema`}),` defines the fields (text, number, media, relation, or even another component). An instance of a component is a single “block” that fills in those fields.`]}),`\n`,_jsxs(Expandable,{title:`Component details`,children:[_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Component schema`}),` – Defines the block’s structure: name, slug, and field types (and optional settings such as filter fields). It is not a standalone content type; it is only used inside entities or other components.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Component instance`}),` – One filled-in block: it follows one component schema and holds values for that schema’s fields. It can be placed in a `,_jsx(_components.strong,{children:`component`}),` field or as one item in a `,_jsx(_components.strong,{children:`dynamic zone`}),`.`]}),`\n`]}),_jsx(Heading,{level:`3`,id:`how-the-component-field-works`,children:`How the Component Field Works`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`In a content-type schema (or in another component schema), you add a field of type `,_jsx(_components.strong,{children:`Component`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`You choose which `,_jsx(_components.strong,{children:`component schemas`}),` are allowed for that field.`]}),`\n`,_jsxs(_components.li,{children:[`You set the `,_jsx(_components.strong,{children:`limit`}),`:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Single`}),` – The field holds exactly one component instance (e.g. one “Author card”).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Multi`}),` – The field holds multiple instances of the same component type (e.g. several “Feature” items in one block).`]}),`\n`]}),`\n`]}),`\n`]}),_jsxs(_components.p,{children:[`So: `,_jsx(_components.strong,{children:`Component field = one block type, either once (single) or repeated (multi).`})]}),_jsx(Heading,{level:`3`,id:`nesting-and-limits`,children:`Nesting and Limits`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Components can contain other components (nested blocks).`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Maximum nesting depth`}),` is enforced (e.g. up to a few levels) so that structures stay manageable and performant.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Circular references`}),` are not allowed (e.g. Component A cannot contain Component B if B contains A). The system validates this when you save the schema.`]}),`\n`]}),_jsx(Heading,{level:`3`,id:`example`,children:`Example`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Component schema “Author Card”: name, email, avatar image.`}),`\n`,_jsxs(_components.li,{children:[`Content type “Article” has a field “Author” of type `,_jsx(_components.strong,{children:`Component`}),`, limit `,_jsx(_components.strong,{children:`Single`}),`, allowed type “Author Card”.`]}),`\n`,_jsx(_components.li,{children:`An article entry then has one “Author” block with name, email, and avatar.`}),`\n`]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`dynamic-zone`,children:`Dynamic Zone`}),`\n`,_jsx(Heading,{level:`3`,id:`what-a-dynamic-zone-is`,children:`What a Dynamic Zone Is`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`Dynamic Zone`}),` is an `,_jsx(_components.strong,{children:`ordered list of blocks`}),` where `,_jsx(_components.strong,{children:`each block can be a different type`}),`. You define which block types (component schemas) are allowed; for each entry, editors choose which blocks to add and in what order.`]}),`\n`,_jsxs(Expandable,{title:`Dynamic Zone details`,children:[_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`In the schema, the field type is `,_jsx(_components.strong,{children:`Dynamic Zone`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`You configure the list of `,_jsx(_components.strong,{children:`allowed component schemas`}),` (e.g. Hero, Feature Grid, Testimonials, CTA).`]}),`\n`,_jsx(_components.li,{children:`When editing an entry, the value is an ordered list of blocks; each block specifies its type and its field values.`}),`\n`]}),_jsx(Heading,{level:`3`,id:`component-vs-dynamic-zone`,children:`Component vs Dynamic Zone`}),_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Aspect`}),_jsx(_components.th,{children:`Component`}),_jsx(_components.th,{children:`Dynamic Zone`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`What it holds`}),_jsx(_components.td,{children:`One block type, once (single) or repeated (multi)`}),_jsx(_components.td,{children:`A list of blocks`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Block types per field`}),_jsx(_components.td,{children:`One schema (single or multi instances)`}),_jsx(_components.td,{children:`Each item can be a different allowed schema`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Typical use`}),_jsx(_components.td,{children:`Fixed or repeatable block (e.g. author, features)`}),_jsx(_components.td,{children:`Page builder: hero, then CTA, then FAQ, etc.`})]})]})]}),_jsx(Heading,{level:`3`,id:`example-2`,children:`Example`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Content type “Landing Page” has a field “Sections” of type `,_jsx(_components.strong,{children:`Dynamic Zone`}),`, with allowed types: Hero, Feature Grid, Testimonials, CTA.`]}),`\n`,_jsx(_components.li,{children:`One page’s “Sections” might be: [Hero, Feature Grid, CTA]. Order and mix are flexible per entry.`}),`\n`]})]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`dynamic-list`,children:`Dynamic List`}),`\n`,_jsx(Heading,{level:`3`,id:`what-a-dynamic-list-is`,children:`What a Dynamic List Is`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`Dynamic List`}),` field does not store the actual list of items. It stores `,_jsx(_components.strong,{children:`configuration`}),`: which content type to list and `,_jsx(_components.strong,{children:`how to filter it`}),` (e.g. by category, tag, or other relation). When the entry is delivered via the API, the system uses this configuration to resolve and return the list of matching items.`]}),`\n`,_jsxs(Expandable,{title:`Dynamic List details`,children:[_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`You configure:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Content type (model)`}),` – Which custom content type (or posts) to list. System taxonomies (Category, Tag, Member, Form) cannot be used as this content type.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Related fields`}),` – Which relation fields to use for filtering (e.g. category, tag).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Filters`}),` – For each chosen relation, the selected items (e.g. which categories or tags). Optionally a heading or similar display options.`]}),`\n`]}),`\n`]}),`\n`]}),_jsxs(_components.p,{children:[`So: `,_jsx(_components.strong,{children:`Dynamic List = “list of content of type X filtered by these relation criteria.”`}),` Useful for “Related posts”, “Products in this collection”, etc., without storing the full list of IDs in the entry.`]}),_jsx(Heading,{level:`3`,id:`configuration-and-validation`,children:`Configuration and Validation`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Content type (model)`}),` is required and must be a custom content type (or post type), not a system taxonomy.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Filters`}),` – When used, you specify which relation(s) to filter by and the selected IDs (or equivalent).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Related fields`}),` – When you use filters, you specify which relation fields those filters apply to.`]}),`\n`]}),_jsx(Heading,{level:`3`,id:`example-3`,children:`Example`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Content type “Article” has a `,_jsx(_components.strong,{children:`Dynamic List`}),` field “Related articles”.`]}),`\n`,_jsx(_components.li,{children:`Configuration: content type = “Article”; filter by “Primary category” with one or more categories selected.`}),`\n`,_jsx(_components.li,{children:`When the article is returned via the API, “Related articles” is resolved to the list of articles in those categories (and can optionally include “related to this post” behaviour depending on product behaviour).`}),`\n`]})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Custom Entities","description":"Define your own content types and structures beyond the default post model","href":"/dxp/documentation/concepts-features/custom-entities"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Availability","slug":"availability","depth":2,"children":[]},{"title":"How Custom Entities Can Be Used","slug":"how-custom-entities-can-be-used","depth":2,"children":[{"title":"Example Scenarios","slug":"example-scenarios","depth":3,"children":[]}]},{"title":"Core Concepts","slug":"core-concepts","depth":2,"children":[{"title":"Schema","slug":"schema","depth":3,"children":[]},{"title":"Entries and Field Values","slug":"entries-and-field-values","depth":3,"children":[]},{"title":"Relations and Taxonomies","slug":"relations-and-taxonomies","depth":3,"children":[]}]},{"title":"Field Types","slug":"field-types","depth":2,"children":[]},{"title":"Components","slug":"components","depth":2,"children":[{"title":"What a Component Is","slug":"what-a-component-is","depth":3,"children":[]}]},{"title":"Dynamic Zone","slug":"dynamic-zone","depth":2,"children":[{"title":"What a Dynamic Zone Is","slug":"what-a-dynamic-zone-is","depth":3,"children":[]}]},{"title":"Dynamic List","slug":"dynamic-list","depth":2,"children":[{"title":"What a Dynamic List Is","slug":"what-a-dynamic-list-is","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"subdomain":"publive","siteName":"Publive Docs","title":"Custom Entities - Publive Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-13T11:44:50.145Z","gitLastModified":"2026-10-21T13:00:07.000Z","originalFileLocation":"dxp/documentation/concepts-features/custom-entities.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Define your own content types and structures beyond the default post model\">\u003cmeta data-mint-head name=\"application-name\" content=\"Publive Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/svg+xml\" sizes=\"180x180\" href=\"https://img-cdn.publive.online/thepublive/media/media_files/2026/07/27/favicon-2026-07-27-13-26-45.svg\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"32x32\" href=\"https://img-cdn.publive.online/thepublive/media/media_files/2026/07/27/favicon-2026-07-27-13-26-45.svg\">\u003clink data-mint-head rel=\"icon\" type=\"image/svg+xml\" sizes=\"16x16\" href=\"https://img-cdn.publive.online/thepublive/media/media_files/2026/07/27/favicon-2026-07-27-13-26-45.svg\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/svg+xml\" href=\"https://img-cdn.publive.online/thepublive/media/media_files/2026/07/27/favicon-2026-07-27-13-26-45.svg\">\u003cmeta data-mint-head property=\"og:title\" content=\"Custom Entities - Publive Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Define your own content types and structures beyond the default post model\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Publive Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://publive.mintlify.site/_mintlify/api/og/v2?division=Content+modelling\u0026amp;title=Custom+Entities\u0026amp;description=Define+your+own+content+types+and+structures+beyond+the+default+post+model\u0026amp;theme=0360cb73e77ad3ed301ee7a8\u0026amp;signature=af3a0657e03720462415fb32a935428540f555e9d76bb0552bfb1189e8464834\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Custom Entities - Publive Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Define your own content types and structures beyond the default post model\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://publive.mintlify.site/_mintlify/api/og/v2?division=Content+modelling\u0026amp;title=Custom+Entities\u0026amp;description=Define+your+own+content+types+and+structures+beyond+the+default+post+model\u0026amp;theme=0360cb73e77ad3ed301ee7a8\u0026amp;signature=af3a0657e03720462415fb32a935428540f555e9d76bb0552bfb1189e8464834\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"https://mintlify.s3.us-west-1.amazonaws.com/publive/_generated/favicon/browserconfig.xml?v=3\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Publive Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#146EF5\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/dxp/documentation/concepts-features/custom-entities.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.thepublive.com/#organization\",\"name\":\"Publive Docs\",\"url\":\"https://docs.thepublive.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://cdn.prod.website-files.com/66826ebfedcc2d4a07df740c/6682747dedcc2d4a07e30c0e_publive-logo.svg\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.thepublive.com#website\",\"name\":\"Publive Docs\",\"url\":\"https://docs.thepublive.com\",\"publisher\":{\"@id\":\"https://docs.thepublive.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities#webpage\",\"url\":\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities\",\"name\":\"Custom Entities\",\"description\":\"Define your own content types and structures beyond the default post model\",\"dateModified\":\"2026-10-21T13:00:07.000Z\",\"isPartOf\":{\"@id\":\"https://docs.thepublive.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Publive Docs\",\"item\":\"https://docs.thepublive.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Custom Entities\",\"item\":\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities#article\",\"headline\":\"Custom Entities\",\"name\":\"Custom Entities\",\"description\":\"Define your own content types and structures beyond the default post model\",\"url\":\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities\",\"mainEntityOfPage\":{\"@id\":\"https://docs.thepublive.com/dxp/documentation/concepts-features/custom-entities#webpage\"},\"dateModified\":\"2026-10-21T13:00:07.000Z\",\"publisher\":{\"@id\":\"https://docs.thepublive.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.thepublive.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Publive Docs\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Publive Docs\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/dxp/documentation/concepts-features/custom-entities.md","siteName":"Publive Docs","nav":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://www.thepublive.com/blog"}]},"products":[{"product":"Publive DXP","icon":"https://img-cdn.publive.online/thepublive/media/media_files/2026/07/20/dxp-only-logo-2026-07-20-18-23-08.png","tabs":[{"tab":"Documentation","groups":[{"group":"Overview","pages":[{"title":"Publive DXP overview","sidebarTitle":"Introduction","description":"What Publive DXP does, and where to start for your use case","href":"/dxp"}]},{"group":"Content modelling","pages":[{"title":"Custom Entities","href":"/dxp/documentation/concepts-features/custom-entities"},{"title":"Forms","description":"Collect data from your readers with forms that you define in Publive DXP","href":"/dxp/documentation/concepts-features/forms"},{"title":"Media Library","href":"/dxp/documentation/concepts-features/media-library"}]},{"group":"Editor features","pages":[{"group":"AI Features","pages":[{"title":"AI Features","href":"/dxp/documentation/concepts-features/ai-features"},{"title":"AI Copilot","href":"/dxp/documentation/concepts-features/ai-copilot"},{"title":"AI Tag Suggestion","href":"/dxp/documentation/concepts-features/ai-tag-suggestion"}]},{"title":"Content Scoring \u0026 Rules Engine","href":"/dxp/documentation/concepts-features/content-scoring"},{"title":"Google Discover Headline","href":"/dxp/documentation/concepts-features/google-discover-headline"},{"title":"Changes to X (Twitter) distribution","sidebarTitle":"X Distribution Change (Sept 2026)","href":"/dxp/documentation/distribution/x-distribution-change"}]},{"group":"Content Workflows","pages":[{"title":"Content Workflows","sidebarTitle":"Overview","href":"/dxp/documentation/content-workflows/overview"},{"title":"Configure workflows","href":"/dxp/documentation/content-workflows/configure-workflows"},{"title":"Review and move content","href":"/dxp/documentation/content-workflows/review-and-move-content"},{"title":"Notifications and audit trail","href":"/dxp/documentation/content-workflows/notifications-and-audit-trail"}]},{"group":"Account security","pages":[{"group":"Multi-Factor Authentication (MFA)","pages":[{"title":"Multi-Factor Authentication (MFA)","sidebarTitle":"Overview","href":"/dxp/documentation/getting-started/mfa"},{"title":"Why MFA Is Now Enforced on Every Publive Dashboard","sidebarTitle":"MFA Enforcement (Aug 2026)","href":"/dxp/documentation/getting-started/mfa/why-mfa-is-enforced"}]},{"title":"Single sign-on (SSO)","href":"/dxp/documentation/getting-started/sso"}]},{"group":"Workspace administration","pages":[{"title":"Content Access Policies","href":"/dxp/documentation/concepts-features/content-access-policies"},{"title":"Audit logs","href":"/dxp/documentation/concepts-features/audit-logs"}]}]},{"tab":"Build your site","pages":[{"title":"Build your site","href":"/dxp/documentation/guides/frontend-integration/README"}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/dxp/api-reference/README"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/dxp/changelog"}]}]},{"product":"Publive AXP","icon":"https://img-cdn.publive.online/thepublive/media/media_files/2026/07/20/axp-only-logo-2026-07-20-18-23-01.png","pages":[{"title":"Publive AXP","href":"/axp/overview"}]}]},"basePath":"","title":"Custom Entities - Publive Docs","buildId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","deploymentId":"dpl_Fyv1NbzwP68g2bEH2Roy98uY1zmE","dynamics":[],"chunks":[]}