| name | kirby-headless-api |
| description | Exposes Kirby content to headless clients using the API, KQL, and JSON representations. Use when building API endpoints, KQL queries, or headless frontends. |
Kirby Headless API
KB entry points
kirby://kb/scenarios/44-headless-api-with-kql
kirby://kb/scenarios/02-json-content-representation-ajax-load-more
kirby://kb/scenarios/45-headless-kiosk-application
kirby://kb/scenarios/28-figma-auto-populate
Required inputs
- Consumers and auth requirements.
- Public vs private content boundaries.
- Response shape and caching policy.
- Preferred approach (KQL, representations, or routes).
Default delivery choices
- Use
.json representations for page-backed responses.
- Use KQL for cross-collection queries and filtered datasets.
- Use routes for non-page or composite endpoints.
Default response envelope
{
"status": "ok",
"data": {}
}
Caching rule
- Public endpoints: set
Cache-Control with a short max-age.
- Authenticated endpoints: disable caching.
Common pitfalls
- Exposing private fields or drafts in JSON output.
- Caching authenticated responses.
Verification checklist
- Confirm auth requirements and public/private boundaries.
- Validate JSON output for required fields.
Workflow
- Clarify consumers, authentication, and which content is public vs private.
- Call
kirby:kirby_init and read kirby://config/api to confirm API settings.
- Check plugin availability for KQL:
kirby:kirby_plugins_index.
- If you need custom endpoints, inspect existing routes with
kirby:kirby_routes_index (install runtime if needed).
- Search the KB with
kirby:kirby_search (examples: "headless api with kql", "json content representation", "figma auto populate", "headless kiosk").
- Use
kirby:kirby_online to fetch official API/KQL docs when KB coverage is insufficient.
- Implement:
- enable API auth (
api.basicAuth) when required
- create or update KQL queries for
/api/query
- add
.json representations for template-backed JSON
- Verify:
- request
/api/query with Basic Auth
- render
.json representations with kirby:kirby_render_page(contentType: json)