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, POST invitar ({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ás GET /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? } (locked es solo para el propietario). DELETE409 project_locked si está bloqueado.

  • /modules — el gestor de plugins: GET / lista los módulos que no son del núcleo con un indicador enabled por tenant; POST /{slug}/enable / /disable los 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.