# La API del admin del CMS de Total.js: gestiona un sitio desde código, copia de seguridad y restauración

> La API JSON que hay detrás del admin del CMS en /admin/: el formato de las llamadas, las acciones de cada plugin y sus permisos, la subida de archivos y las tres rutas de copia de seguridad, restauración y borrado, incluido lo que hace de verdad clear.

Framework: cms
Product: CMS (cms@8071e48)
Language: es
Content-SHA256: e14c9f5bfe83e95fa81f38fb62e1268efa5ebb1b1e6a7610bf69e07568d9e60a
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Todo lo que hace la interfaz del admin pasa por un único endpoint: `POST /admin/` con el cuerpo `{ "schema": "<name>", "data": { ... } }` (las rutas API de Total.js, consulta [rutas API](/en/total5/api-routes/)). La dirección sale de la línea `$api : /admin/` del archivo `config`. Autentícate con la cookie de sesión (`POST /admin/` con `schema: "login"` y el `login` y el `password`), con la cabecera `x-token` o mediante OpenPlatform ([instalación y primer arranque](/en/cms/install-and-first-start/)).

## Las acciones

| Plugin | Llamadas (`schema`) | Permiso |
|---|---|---|
| Account | `login`, `logout`, `admin_read`, `admin_save` (nombre, login, contraseña), `account` | la sesión |
| Pages | `pages_list`, `pages_read`, `pages_save`, `pages_clone`, `pages_remove`, `pages_links`, `pages_html` (lee el HTML), `pages_save_html` (`id`, `html`, hasta 5 MB), `pages_copy` (`from`, `to`) | `pages` |
| Layouts | `layouts_list`, `layouts_read`, `layouts_save`, `layouts_clone`, `layouts_remove`, `layouts_html`, `layouts_save_html`, `layouts_import` | `layouts` |
| Widgets | `widgets_list`, `widgets_read`, `widgets_save`, `widgets_remove`, `widgets_detail` | `widgets` |
| Navigation | `nav_list`, `nav_read`, `nav_save`, `nav_remove`, `nav_editor` | `navigation` |
| Redirects | `redirects_list`, `redirects_read`, `redirects_save` (`url`, `target`, `permanent`), `redirects_remove` | `redirects` |
| Variables | `variables_read`, `variables_save` (`vars`) | `variables` |
| Posts | `posts`, `posts_read`, `posts_create`, `posts_update`, `posts_remove`, `posts_clear`, `posts_categories` | `posts` |
| Files | `files_list`, `files_rename`, `files_clear`, `files_remove`, y las subidas de más abajo | `files` |
| Settings | `settings_read`, `settings_save`, `settings_test` (prueba los ajustes SMTP), `chatgpt` | `settings` |
| Dashboard | `dashboard_online`, `dashboard_referers`, `dashboard_browsers`, `dashboard_pages`, `dashboard_stats` | ninguno |

El permiso `admin` (y todo usuario con la marca `sa`, incluido el *Bot* del token) tiene acceso a todos. Una llamada sin permiso recibe un error, y `login` es la única llamada que no necesita sesión.

Crea una página y su contenido:

```json
{ "schema": "pages_save", "data": { "name": "About", "layoutid": "<layout id>", "url": "/about/", "title": "About us" } }
{ "schema": "pages_save_html", "data": { "id": "<page id>", "html": "<h1>About us</h1>" } }
```

`pages_save` responde `{ "success": true }`; lee el id con `pages_list`. En un layout, `layouts_save` responde el id del layout en `value`. Cuando falta un campo en una actualización, el campo se borra (un `title` que no envíes se guarda vacío), así que envía el registro completo.

## Subir archivos

`POST /admin/upload/` acepta una subida multipart (hasta 10 MB) y `POST /admin/upload/base64/` un cuerpo JSON con un data URI (png, jpeg o gif). Ambos responden una lista de `{ id, name, type, ext, size, url }`, donde `url` es `/download/<id>.<ext>`.

## Copia de seguridad, restauración y borrado

Tres rutas de `controllers/api.js` actúan sobre todo el sitio y necesitan el permiso `admin`:

| Ruta | Qué hace |
|---|---|
| `GET /admin/backup/` | descarga todo el almacén de archivos (metadatos, HTML de páginas y layouts, archivos y posts) como un archivo de texto con el nombre del sitio y la fecha |
| `POST /admin/restore/` | sube un archivo así (hasta 100 MB) y lo carga. |
| `GET /admin/clear/` | **borra el contenido del sitio.** Descarta el almacén de archivos y lo vuelve a cargar, así que páginas, layouts, widgets y el resto se eliminan

Haz una copia de seguridad antes de probar cualquiera de ellas, no abras nunca `/admin/clear/` en un navegador por curiosidad y mantén el token privado: con él, un solo `GET` vacía el sitio.
