Pages
Pages are durable documents a space publishes outside its post feed: an about
page, a code of conduct, documentation. GET /v1/spaces/{space}/pages lists a
space's published pages and GET /v1/spaces/{space}/pages/{page} fetches one.
Only enabled pages in a publicly resolvable space are served; a missing or
private space, a missing page, and a disabled page all return the same
404 Not Found.
Listing a space's pages
The listing returns a cursor-paginated envelope ordered by sortOrder
ascending, then id ascending. Pass nextCursor back as after to move
forward, or previousCursor as before to move backward; treat cursors as
opaque and keep limit constant. See Conventions.
curl 'https://api.dfos.com/v1/spaces/home/pages?limit=20'
curl 'https://api.dfos.com/v1/spaces/home/pages?limit=20&after=eyJzb3J0T3JkZXIiOjAsImlkIjoicGFnZV9jN2RuZmhjM3puMmVoN2ZycmMzbmhjIn0'
Each item is a lean navigation projection: id (the stable page_... entity
ID), slug (the mutable URL alias), title, sortOrder (its position in the
space's page navigation), and updatedAt (ISO 8601 UTC). The envelope carries
the standard items, nextCursor, previousCursor, and optional totalCount.
Fetching a single page
The single fetch accepts either the page's stable id or its slug, and both
addresses return the same body:
curl 'https://api.dfos.com/v1/spaces/home/pages/page_c7dnfhc3zn2eh7frrc3nhc'
curl 'https://api.dfos.com/v1/spaces/home/pages/about'
Store id as the durable identifier; slug may change. A page ID used under
the wrong space returns the same 404 Not Found as an unknown page.
The full page adds its markdown body, optional cover, and optional
bodyMedia. Inline media stays in the markdown as attachment://<mediaId>
tokens; resolve each by matching <mediaId> to the id of its bodyMedia
entry. A mention of a DFOS user arrives as a markdown link to
mention:identity_… — fetch that id from Users — or as the plain
@name text when the user has no public profile. Public images use permanent,
unsigned CDN URLs and have no urlExpiresAt; private audio, video, and files
use time-limited signed URLs and include it. Never persist a signed URL —
re-fetch the page after urlExpiresAt for a fresh one. See
Compatibility → Media URLs.