Developers
Module catalogue
Use the versioned, fixed module contract instead of inventing unsupported components.
On this page
Get the specification
GET /api/v1/modulesThe catalogue returns version 1, limits, field values and module definitions. Use this response as the contract for external draft composition. The exact machine names differ from some display labels.
Registered modules
| Type | Accepted fields |
|---|---|
| text | heading, text |
| hero | heading, text, image, alt, link, button |
| image | image, alt, caption, ratio, position |
| service | heading, text, link, button |
| team | heading, text, image, alt |
| faq | heading, text |
| notice | heading, text |
| contact | heading, text, link, button |
| hours | heading, text |
| columns | columns; may contain child modules |
Example document
{
"version": 1,
"modules": [{
"type": "columns",
"fields": {"columns": 2},
"children": [
{"type": "text", "fields": {"heading": "Your visit", "text": "Fictional practice information."}},
{"type": "service", "fields": {"heading": "Learn more", "text": "See our services.", "link": "/services/", "button": "Our services"}}
]
}]
}Validation limits
- At most 80 modules per document, including nested modules; nesting depth is limited to five.
- Each string field is at most 5,000 characters; text is plain text, not executable HTML.
- Columns accept one, two or three. Only columns can have child modules.
- Ratios: auto, 1/1, 4/3, 3/2 or 16/9. Positions: center, top, bottom, left or right.
- Images must use validated local raster paths under assets, uploads, demo-media or optimized-images.
- Links are limited to accepted local, fragment, HTTPS, email or telephone forms. Unknown fields and module names are rejected.
Import boundary
The administrator-only editor composer validates JSON and returns rendered draft HTML with published: false. It has a 250,000-byte request limit and requires the editor session and CSRF protection. Importing does not publish or install code.
Something unclear? Contact me about this guide.