← Changelog

Markdown as data, drafts over the API, one-call ordering, icons and site theme drafts

2026.10.14-api-authoring
The Forumulate team
2 min read
apidocssites

New endpoints and parameters. All of them are additive and work on every API version.

Added

GET /docs/markdown-dialect — the Markdown dialect the importer understands, as data: every directive, its attributes, and the block each one becomes. Every markdown field in the API reference links to it, and GET /docs/block-schema names the directive for each block.

?form=body on page Markdown — the page body with no H1 title and no footer, ready to paste back into a source file. It sits beside ?form=source.

GET /orgs/{orgId}/spaces/{spaceId}/pages/{pageId}/draft/markdown — read a page's unpublished draft as Markdown (requires docs.write).

Markdown in more places — a space's home document, space and site front pages, status incidents, and the opening post of a forum topic (PATCH …/forum/{topicId}) now take markdown as well as block content.

POST /orgs/{orgId}/spaces/{spaceId}/collections/{collectionId}/order — set the order of a collection's pages in one call: { "pageIds": [ … ] }, with optional parentId, version and locale. It replaces one reorder call per page.

GET /icons?for=header|page|card — the icon names each place accepts, as data. They are also published as HeaderIconName, PageIconName and CardIconName enums in the API reference, so you can validate icons before publishing.

Site theme drafts — GET, PUT and PATCH /orgs/{orgId}/sites/{siteId}/theme/draft, plus POST …/theme/draft/publish. You can stage a site's theme and publish it when it is ready, the same way a space's theme draft already works.

siteId on space create — POST /orgs/{orgId}/spaces takes siteId to choose the site a new space joins, or null for none.

Changed

Collection page listings show nesting. Each row of a collection's page tree carries childCount, and the answer carries total. Rows also carry a filled status, as blog and forum rows do.

The OpenAPI importer builds the same tree every run. An unset landing keeps the landing page if it exists, and the outcome lists createdSlugs and deletedSlugs.