Skip to main content

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.