A page type is the record that decides what a page of that kind has, where it lives and how it renders. This page is the field list. Page Types is the concept, and Configuring a Page Type is the walkthrough in screen order.
The reference is separate for three reasons that the walkthrough cannot carry: several of these fields have no UI at all on some kinds, several are read only by the site build and change nothing until you publish, and a handful are derived by the server and cannot be set at any price.
How to read the tables
Applies to names which of the three kinds — Posts, Documentation, API — show the field.
Default is what a newly created page type gets. For several fields that differs per kind, and the row says so.
Read by names the actual consumer: the CMS, the site build through the page type’s own {slug}.11tydata.json, or the site build through the shared _data/pageTypeList.json. A field that only the build reads will not change anything until you publish; a field only the CMS reads will never appear in your repository no matter how many times you publish.
A blank value usually means inherit. The grayed text in an empty box is the company default rendered as placeholder text, not a stored value.
Three fields are not settable at all. They are listed rather than omitted, because a developer reading the API or an MCP response will see them and wonder.
Identity and URL
| Field | Type | Default | Applies to | Read by | Notes / where it is explained |
|---|---|---|---|---|---|
name | string | — (required) | All | CMS · build via pageTypeList.json | Display name in the CMS and available to templates |
slug | string, max 150 | — (required) | All | CMS · build via pageTypeList.json | Lowercase segments, dashes and dots, and / for nested API roots such as docs/api/1.2.0 |
isSlugLocked | boolean | false | All | CMS | Server-managed. Set once a page of the type has been scheduled or published, which disables the Slug field |
description | string | — | All | CMS · build via pageTypeList.json | Free text describing the section |
aliases | string array | — | All | CMS · build via pageTypeList.json | Additional paths that resolve to this set — Aliases and Redirects |
redirectIndex | string | — | All | CMS · build via pageTypeList.json | Accepts first, last, a relative path starting with /, or a remote URL |
labels | string array | — | All | CMS · build via pageTypeList.json | Labels applied at the type level — Labels and Series |
Two facts a reader otherwise learns the hard way. The slug is the URL root for every page of the type, so changing it moves the whole section — and once any of its pages has been scheduled or published, the CMS locks the field to protect those URLs. And how the rest of a page’s path is composed below that root is URL Paths and Slugs, which for a menu-bound documentation set is decided by the folder tree rather than by the page.
Kind and layout
| Field | Type | Default | Applies to | Read by | Notes / where it is explained |
|---|---|---|---|---|---|
type | documentation | api | posts | posts | All |
layout | string | {slug}.hbs for Posts; leed-documentation.hbs for Documentation and API | All | CMS · build via pageTypeList.json | The CMS creates the layout file for a Posts type and deliberately does not for the documentation layout, which is a system file — Layouts and Page Types |
noRender | boolean | false | All | CMS · build via pageTypeList.json | Labeled Do Not Render. The site build skips these pages; a developer can still render them from a template |
Content rules
| Field | Type | Default | Applies to | Read by | Notes / where it is explained |
|---|---|---|---|---|---|
requiredFields.featureImage | boolean | true on Posts, false on Documentation and API | All | CMS | Enforced at publish and at scheduling |
requiredFields.form | NotAllowed | Optional | Required | NotAllowed on all three kinds | All |
requiredFields.summary | boolean | true on Posts and Documentation, false on API | All | CMS | The one most readers meet, because documentation pages require it by default |
requiredFields.keywords | boolean | true on Posts, false on Documentation and API | All | CMS | Enforced at publish and at scheduling |
editorFormattingOptions | object of nine booleans | See the table below | Posts only | CMS · the content API | Pointer row — Formatting by Page Type |
A missing required field is a 400 with a list, not a warning you can dismiss: publishing or scheduling returns {"error":"Missing required fields","missingFields":["summary"]} naming every field that is empty. The exact shape is on Common Error Messages.
Required fields by kind
| Field | Posts | Documentation | API |
|---|---|---|---|
| Feature Image | ✓ | — | — |
| Form Attachment | NotAllowed | NotAllowed | NotAllowed |
| Summary | ✓ | ✓ | — |
| Keywords | ✓ | — | — |
Editor formatting options
Nine flags, and codeBlock is the only one that defaults on — which is why a brand-new Posts page type has a short toolbar. Every one of them applies to Posts page types only.
{
"codeBlock": true,
"diagrams": false,
"mathBlock": false,
"alert": false,
"icons": false,
"tabGroup": false,
"iframe": false,
"collapsibleBlock": false,
"table": false
}| Key | Default | Applies to | Documented in |
|---|---|---|---|
codeBlock | true | Posts only | Formatting by Page Type |
diagrams | false | Posts only | Formatting by Page Type |
mathBlock | false | Posts only | Formatting by Page Type |
alert | false | Posts only | Formatting by Page Type |
icons | false | Posts only | Formatting by Page Type |
tabGroup | false | Posts only | Formatting by Page Type |
iframe | false | Posts only | Formatting by Page Type |
collapsibleBlock | false | Posts only | Formatting by Page Type |
table | false | Posts only | Formatting by Page Type |
The second fact, which no other page states and this reference must: the flags are inert on documentation and api page types on all three surfaces, and there is no UI to set them there. The content API returns early unless the type is posts, the toolbar’s resolver returns nothing for a non-Posts type so every control shows, and Settings renders the toggle block for Posts types only. A documentation author looking for the switch that hid their tab button will not find one, because it does not exist for their page type.
Site behavior
| Field | Type | Default | Applies to | Read by | Notes / where it is explained |
|---|---|---|---|---|---|
autolink | boolean | true | All | Build via pageTypeList.json | Labeled Enable Autolinking. Consumed by the autolink build plugin — Autolinks |
includeInFeeds | boolean | true | All | Build via pageTypeList.json | Labeled Show In Feeds. Consumed by the feed templates — Feeds, Sitemaps and Robots |
autopostNewPages | boolean | true | All | Build via pageTypeList.json | Labeled Autopost New Pages. Arms the connected distribution channels — Release Notes and Auto-Posting |
allowRecommendations | boolean | true | All | Build via pageTypeList.json | Labeled Enable Recommendations. Feeds the recommendation index — Recommendations |
sitemapPriority | number | inherits the company value | All | Build via pageTypeList.json | Consumed by the sitemap template |
labelSiteMapPriority | number | inherits the company value | All | Build via pageTypeList.json | Consumed by the sitemap template for label index pages |
Autopost New Pages defaults to on, which surprises people because the behavior behind it is a Growth feature. The setting is configurable on every plan and activates on your published site once your plan includes automatic social posting — it is not “off by default”, it is armed and waiting.
Shared settings
The same nine values that live at the bottom of Settings → General appear on every page type as Configuration Overrides. Leave one blank and the page type inherits the company value; fill it in and the page type wins for its own pages.
| Field | Type | Default | Applies to | Read by | Notes / where it is explained |
|---|---|---|---|---|---|
paging.minimum | number | company value, seeded at 6 | All | CMS | Labeled Page Minimum — Default Content Configuration |
paging.size | number | company value, seeded at 9 | All | CMS | Labeled Page Size |
sitemapPriority | number | company value, seeded at 1 | All | Build via pageTypeList.json | Also listed under Site behavior above |
labelSiteMapPriority | number | company value, seeded at 0.8 | All | Build via pageTypeList.json | Also listed under Site behavior above |
ogCard.title | string, max 70 | company value | All | Build via {slug}.11tydata.json | Labeled Social Title — Social Cards and Structured Data |
ogCard.description | string, max 240 | company value | All | Build via {slug}.11tydata.json | Labeled Social Description |
readingWpm | number | company value, seeded at 250 | All | CMS | Labeled Reading Speed |
dateFormat | string | company value | All | Build via {slug}.11tydata.json | Labeled Date Format |
aiTheme | string | company value | All | CMS | Labeled AI Image Theme Guide — AI Image Generation |
Which of these actually reach the site when you override them on a page type is the question the Read by column answers per row, and Default Content Configuration works through it end to end. It is worth reading before you override Page Size and wonder why the built listing did not change.
Locks
| Field | Type | Default | Applies to | Read by | Notes / where it is explained |
|---|---|---|---|---|---|
locked | boolean | false | All | CMS | Content Locked: no new pages, and existing pages are read-only |
navMenuLocked | boolean | false | All | CMS | Navigation Menu Locked: this type’s pages cannot change URL through its docs menu. Icon, tooltip and expanded state stay editable |
Either lock may be set or cleared only by an Administrator or a Content Publisher, and the guard is shared by the create and the update route so they cannot drift. Each refusal has an exact message, cataloged on Common Error Messages — This page type is Content Locked; existing pages are read-only. on a write, This page type is locked; no new pages can be added. on a create, and Only an Administrator or Content Publisher can lock or unlock a page type. when you lack the role.
Note the reach of Content Locked: it makes existing pages read-only, not merely the section closed to new ones. If you want a section frozen against new pages but still editable, that is not what this flag does.
Documentation and API fields
documentationConfiguration is one object on the page type, and every key in it is defined in full on Documentation Configuration Reference. It appears here as a pointer table with the four cells that no other page will state.
| Key | What it controls | Documented in |
|---|---|---|
layoutName | Which documentation layout renders the set. Not customizable — alpha, bravo or charlie only, because the builder turns the value into a Handlebars partial path. It is also the one key whose absence from the merged config renders documentationConfiguration is missing! on every page of the set | Documentation Layouts |
colorTheme | The color theme class name | Themes, Fonts and Code Themes |
codeTheme | The syntax-highlighting theme class name | Themes, Fonts and Code Themes |
font | The documentation font class name | Themes, Fonts and Code Themes |
logo.light | Nav logo for light backgrounds | Documentation Header, Footer and Logos |
logo.dark | Nav logo for dark backgrounds | Documentation Header, Footer and Logos |
header.button.text | Label on the docs header button | Documentation Configuration Reference |
header.button.href | Destination of that button | Documentation Configuration Reference |
menus.top · menus.left · menus.bottom | Each holds a menu id, not a menu name. Only the left slot classifies a menu as a docs menu, which is why an existing site header or footer menu can be reused in top or bottom without triggering folder-path derivation or href-stripping | Left Navigation Menu |
searchIndexId | Which search index powers the set’s search box | Search for Your Documentation |
startingPage | The entry page used for breadcrumbs and navigation | Documentation Configuration Reference |
tabGroups | The only key that must be set in two places for two different reasons: the page-type copy is what the site build reads, the company copy is what the editor’s Tab Group dropdown reads. Applies to both — set both | Tab Groups for Consistent Examples |
openAPI.snippetLanguages | The languages generated API pages emit snippets for. This is the same object as the reserved api-languages tab group, auto-created and self-repaired at company level and filtered out of the editor’s Tab Group menu — do not rename, trim or restyle it, the code will fight the edit | API Reference Pages |
highlighter.extraLanguages | Read by nothing. The build reads the top-level company key extended.highlighter.extraLanguages, not this one. The row exists because the key is in the schema and a developer reading the API will see it | Known Limitations |
Three of those keys carry a plan condition rather than a plan gate: colorTheme, codeTheme and font accept any of the built-in names on every plan, and need Starter only when you introduce a name of your own. The gate fires on change, so re-saving a stored custom value, clearing it, or swapping one built-in for another passes on any plan — Themes, Fonts and Code Themes has the built-in list.
| Field | Type | Default | Applies to | Read by | Notes / where it is explained |
|---|---|---|---|---|---|
documentationConfiguration | object | — | Documentation and API | CMS · build via {slug}.11tydata.json | The table above |
navMenuId | string | derived | Documentation and API | CMS · build via pageTypeList.json | See the note below |
Fields you cannot set
System and read-only fields
These exist on the record, appear in API and MCP responses, and are not yours to write.
| Field | Type | What it is for |
|---|---|---|
pageTypeId | string | The record’s id, minted server-side at creation |
companyId | string | The workspace the record belongs to |
appVersion | string | The Leed version that last wrote the record |
navMenuId | string | Derived from documentationConfiguration.menus.left |
isSlugLocked | boolean | Set once a page of the type has been scheduled or published |
isDirty | boolean | Whether this page type has unpublished changes. It is what draws the amber dot |
createdAt · createdBy | timestamp · user id | When the type was created, and by whom |
modifiedAt · modifiedBy | timestamp · user id | When it last changed, and by whom |
deletedAt · disabledAt | timestamp | Soft-delete and disable markers |
What reaches your repository
Three destinations, and knowing which one a field takes is the answer to “I changed it and my template still can’t see it”.
src/{slug}/{lastSegment}.11tydata.json — the page type’s own Eleventy directory data file, written on publish. It carries exactly three things: dateFormat, ogCard and documentationConfiguration. The file is named after the last segment of the slug, because an Eleventy directory data file must be named for the directory it sits in — so a page type at docs/api/1.2.0 writes src/docs/api/1.2.0/1.2.0.11tydata.json.
{
"dateFormat": "MMM D, YYYY h:mma z",
"ogCard": {
"title": "Leed Documentation",
"description": "Everything you can do with Leed."
},
"documentationConfiguration": {
"layoutName": "charlie",
"colorTheme": "color-theme-leed",
"codeTheme": "code-theme-leed",
"menus": { "left": "leeddocs" },
"startingPage": "/docs/start-here/what-is-leed/"
}
}src/_data/pageTypeList.json — one shared file, keyed by page type id, holding the list-level fields: slug, name, layout, description, labels, aliases, redirectIndex, noRender, includeInFeeds, autolink, autopostNewPages, allowRecommendations, sitemapPriority, labelSiteMapPriority and navMenuId. This is what a template reads when it needs to know something about a different section than the one it is rendering — Global Site Data.
Everything else stays in the CMS. type, requiredFields, editorFormattingOptions, both locks, paging, readingWpm and aiTheme are never written to your repository, so no template and no build plugin can read them. If you overrode Page Size on a page type and the built listing did not change, this paragraph is why.
What lands in a page’s front matter — as opposed to its page type’s — is a separate contract, enumerated at Front Matter Reference.