Usage
Content types and entries
Section titled “Content types and entries”GET /contentapp/list apps visible to the tenantPOST /app/:app/contenttype define a typeGET /app/:app/contenttype/:id fetch a typeGET /app/:app/type/:type list entries of a typeGET /app/:app/type/:type/:id one entryA content type declares its fields and their validation. Entries are validated against the type on write, so malformed content fails at authoring time rather than rendering time — which is the main reason to model content rather than store free-form JSON.
GraphQL
Section titled “GraphQL”POST /app/:app/graphqlEach content app exposes a GraphQL endpoint derived from its content types. This is usually the right surface for a front end: one request fetches a page’s entries and their referenced entries, instead of a REST waterfall that gets slower the richer your content model gets.
Use REST for authoring tools and back-office work, where you are operating on one entry at a time and want the simpler surface. Use GraphQL for delivery.
Assets
Section titled “Assets”Assets are managed per content store and can be attached to a field on an entry:
GET /contentstore/list stores availableGET /store/:store/list browse a storePOST /store/:store/folder create a folderPOST /store/:store/asset uploadGET /store/:store/asset/id/:id fetch metadata
POST /app/:app/type/:type/:id/asset/id/:id/upload attach to an entry fieldGET /app/:app/type/:type/:id/asset/:field/download/id/:idSeparating stores from apps means the same asset library can back several content apps without duplicating files — and it makes asset retention a storage decision rather than a content one.
Templates
Section titled “Templates”POST /app/:app/templateGET /app/:app/template/id/:idTemplates are reusable content structures — a standard page layout, a recurring block — so editors compose from known-good shapes instead of rebuilding structure per entry.
- Operations — pre-auth access, storage and monitoring