Pages
Pages are standalone publication content. They have no category, tags, authors, excerpt, or scheduling workflow. New pages start as drafts; lifecycle changes use dedicated routes.
Authentication
All routes require a bearer token and the listed publication capability. Use
page_id for an existing page, or use publication_id or publication_slug
with slug where a page selector is accepted.
Routes
| Route | Methods | Capability | Required input | Optional input and behavior | Success result |
|---|---|---|---|---|---|
/page/list |
GET, POST |
page.list |
Publication selector | status, visibility, archived, pagination |
Paginated pages. |
/page/get |
POST |
page.list |
Page selector | — | Full page. |
/page/save |
POST |
page.save |
Create: publication selector and title; update: page_id |
title, slug, body, body_format, visibility |
Saved page. |
/page/preview |
POST |
page.preview |
page_id |
— | Rendered preview. |
/page/publish |
POST |
page.publish |
Page selector | — | Published page. |
/page/unpublish |
POST |
page.unpublish |
Page selector | — | Draft page. |
/page/archive |
POST |
page.archive |
Page selector | — | Archived page. |
/page/restore |
POST |
page.restore |
Page selector | — | Restored page. |
/page/delete |
POST |
page.delete |
Page selector | — | Deleted page_id. |
Save fields
| Field | Required | Type | Description |
|---|---|---|---|
page_id |
No | UUID | Updates this page. Omit to create. |
publication_id / publication_slug |
Required on create | UUID / String | Selects the publication. |
title |
Required on create | String | Page title. Omit it on update to retain the stored value. |
slug |
No | String | Unique in the publication. Omit or send an empty value to derive it from title. |
body |
No | String | Source content. Omit it on update to retain the stored body. |
body_format |
No | markdown or html |
Defaults to markdown for a new page. |
visibility |
No | public, unlisted, or private |
Defaults to public for a new page. |
curl -sS https://api.blog.service.m7.org/v1/page/save \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"publication_slug":"engineering-notes",
"title":"About us",
"body":"# About us",
"body_format":"markdown"
}'
List, preview, and lifecycle
/page/list defaults to archived: 0 and accepts status (draft or
published), visibility (public, unlisted, or private), and the
standard pagination fields. /page/preview requires page_id and renders the
stored source only; preview.body is HTML and source_body_format identifies
the stored source format.
/page/publish changes a draft, unarchived page to published and sets
published_at if it has not been set. /page/unpublish returns a published page to draft.
Archive and restore preserve lifecycle state. A page must be archived before
/page/delete; otherwise the route returns 409.
Public availability
GET or POST /read/page accepts a publication selector and page_slug.
It returns an unarchived published page with public or unlisted visibility;
the returned body is HTML. Private, draft, and archived pages return 404.