A headless CMS content model for every client site.
No fixed schema and no tables to set up. Build each website’s pages from sections and fields, or make a page with many items, where every service, property or course gets its own detail page. Its API comes with it.
Fields
Fields your clients fill in. JSON your code reads.
Give each section and each item the fields it needs, from 23 types. Your client gets a form made from them; your frontend gets every value as JSON, in the shape its type promises. Pick a type to see both sides.
"values": {"about": {"json": { "type": "doc", "content": [ … ] },"html": "<p>We check <strong>speed</strong>, search and forms.</p>"}}A label for them, a key for you
Your client reads “Opening hours”. Your code reads opening_hours: snake_case, unique among its neighbours, and never changed on its own.Opening hours→opening_hoursRequired, when it counts
Required fields can stay empty while you work in Development. A page can't be released until they're filled in.RequiredFill in before releaseNo silent breaking changes
Renaming, retyping or removing a field your site already reads is flagged Breaking, and its Release says so.items→highlightsBreakingNested as deep as you need
Groups and Repeaters hold other fields, even each other: a list of branches, each with its address and its opening hours.branchesaddressopening_hours
Pages with many items
Every item gets its page. The list gets its API.
Services, properties, courses: each item has its own address and detail page, and the page lists them through one endpoint. Tick which fields the list carries and which ones filter and sort. The parameters follow, with nothing to code.
Only types that can filter or sort get a box: numbers and dates as a range, choices and yes / no by value, and text, numbers and dates as sorts.
Query parameters
- price_minPrice, at least
- price_maxPrice, at most
- featuredFeatured: true or false
- sort-updated_at, title, -title, price, -price. Default -updated_at.
- pagePage number, from 1
- per_pageUp to 100, default 12
Each item in the list
One item, /v1/pages/services/website-audit, always returns every field and its sections. Unknown parameters are ignored.
Content, not layout
Model what it is. Show it anywhere.
A content model says what a service is, never where it goes or how it looks. The same item fills a card on the home page, its own page and a screen in your app, each one designed in your own code.
The item
Services · website-audit
- TitleWebsite audit
- Price12000
- Duration2 weeks
- Cover imagecover.jpg
Point at a field to see where each design uses it.
A card on the home page
GET /v1/pages/home
Its own page
GET /v1/pages/services/website-audit
A screen in your app
Same endpoints, any app
Safe changes
Change the model without breaking the site.
Fields change in Development, like everything else, and reach the live site only through a Release, which says what each change does to your API.
Add a field
Every existing item gets it empty, and your site reads null (or an empty list) until it's filled in. Make it required and the Release waits until every item has a value.durationAdded"duration": nullRename or remove one
A change your site would notice (a new key, a new type, a field gone) is flagged Breaking, with the endpoints it touches, before anyone releases it.items→highlightsBreakingChange an address
Give an item a new slug and the old one is kept as a redirect, so shared links and search rankings still find it./services/workshop→ /services/team-workshop
FAQ
Questions about content models.
Short answers on modelling, your clients and how your code reads it.
Get started
Build your next client site on mywebcms.
Start from a screenshot, give your client one simple place to run it, and ship it on any stack you like.
- Two steps to your first website:
- 1Create your workspace
- 2Add a client website
Everything that comes with mywebcms
Tap any feature to learn more.