API de administración
Todo lo que hace la consola es HTTP bajo /admin/. Cada ruta necesita un JWT de sesión o una clave de API (Authorization: Bearer sk_live_…). Las rutas de proyecto resuelven {ref} y aplican un permiso por verbo. La envoltura de éxito es { "data": … }; las eliminaciones devuelven 204.
Nodos
POST /admin/p/{ref}/nodes/
Crea un nodo (node:write). Cuerpo: { parent_id?, slug, type, title, kind?("page"|"entry"), locale?, template_id?, blocks?, meta? }. Si blocks está vacío y template_id está definido, los bloques se clonan de la plantilla. 409 conflict si el slug colisiona.
PATCH /admin/p/{ref}/nodes/{id}
Actualiza (node:write). Cuerpo NodePatch (todo opcional): { parent_id?, slug?, title?, status?, kind?, locale?, blocks?, meta? }. Un cambio de status necesita un permiso extra para la transición: node:publish (draft→published), node:unpublish, node:archive — si no, 403 publish_forbidden.
DELETE /admin/p/{ref}/nodes/{id}
Elimina (node:delete).
GET /admin/p/{ref}/nodes/{id}/preview
Vista previa en HTML renderizada en el servidor de los bloques del nodo (node:read).
GET /admin/p/{ref}/nodes/{id}/entries
Entradas paginadas bajo un nodo de colección.
Instantáneas
Versiones puntuales de un nodo bajo /nodes/{id}/snapshots: GET / (línea temporal, snapshot:read), POST / ({label}, snapshot:write), GET /{sid}, DELETE /{sid}, y POST /{sid}/restore (snapshot:restore).
Plantillas y arranques
Formas reutilizables. /templates (nodo único) y /starters (varios nodos) ofrecen ambos CRUD; POST /starters/{id}/instantiate materializa los nodos de un arranque en el proyecto.
Miembros, roles y ACL
/members— GET,POSTinvitar ({email, role_id?|role?}— envía por correo un enlace mágico a los usuarios nuevos),PATCH /{userId},DELETE /{userId}. El rol de propietario no se puede asignar ni eliminar aquí./roles— CRUD másGET /roles/catalog(cada cadena de permiso conocida). Un rol es{ slug, label, permissions:[] }.ACLs— denegación a nivel de nodo por rol (/roles/{id}/acls) o por usuario (/members/{userId}/acls):{ node_id, scope:"this"|"subtree" }.
Proyectos y plugins
GET/POST /admin/projects— listar / crear (el creador pasa a ser propietario).PATCH /{id}modifica{ name?, default_locale?, enabled_locales?, public_base_url?, custom_domain?, locked? }(lockedes solo para el propietario).DELETE→409 project_lockedsi está bloqueado./modules— el gestor de plugins:GET /lista los módulos que no son del núcleo con un indicadorenabledpor tenant;POST /{slug}/enable//disablelos activan o desactivan.
Claves de API
POST /admin/api-keys { name, scopes? } devuelve el sk_live_… en texto plano una sola vez; GET lista (sin texto plano); DELETE /{id} revoca.