API de Plak
Alcance por usuario, estado de implementación y convenciones de la API de sitios y servidores de Plak.
La API para usuarios de Plak está destinada a trabajar con los sitios y servidores asociados a su propia cuenta, dentro de sus permisos. La gestión de usuarios y paquetes queda fuera del acceso con claves personales y de esta referencia pública de endpoints.
Alcance del acceso personal
| Recurso | Acceso permitido en el contrato personal |
|---|---|
| Sitios | Solo los asociados al usuario autenticado y autorizados por sus permisos |
| Servidores | Solo los asociados al usuario autenticado y autorizados por sus permisos |
Estas restricciones deben aplicarse en el backend, tanto a listados como a consultas por identificador y a cualquier operación futura. La paginación y sus totales también deben calcularse sobre los recursos del usuario. Conocer el identificador de un recurso ajeno no debe permitir consultarlo ni modificarlo.
La identidad se obtiene de la API key. El cliente no puede elegir otro usuario mediante user_id. Un endpoint de identidad como el /api/v1/me propuesto devolvería únicamente la propia cuenta, sin habilitar la administración de usuarios.
La retirada de endpoints de esta documentación no cambia los permisos del código existente. El aislamiento y el rechazo de claves personales en las operaciones administrativas son requisitos pendientes de implementación.
Entornos y comprobación HTTP
| Entorno | Base de API | Verificación realizada |
|---|---|---|
| Desarrollo | https://panel.plak.work/api |
Petición de lectura sin credenciales a /api/sites |
| Producción | https://cloud.plak.io/api |
URL derivada del dominio del panel y el prefijo del código; no verificada en esta revisión |
En desarrollo, GET /api/sites con Accept: application/json respondió 302 hacia el inicio de sesión de Cloudflare Access. La raíz del sitio también respondió 302. No se alcanzó una respuesta autenticada de Laravel ni se utilizaron credenciales.
Cloudflare Access es una capa anterior a la API. Su redirección no demuestra que la API esté deshabilitada ni que una API key sea incorrecta. Para probar el futuro CLI en este entorno habrá que resolver también el acceso autorizado a esa capa; la clave personal de Plak no la sustituye.
Autenticación administrativa existente
Todas las rutas de routes/api.php reciben el prefijo /api y los middleware api y global.api.authenticated desde app/Providers/RouteServiceProvider.php.
El middleware GlobalApiAuthenticated comprueba:
- Que el ajuste
enable_apiesté activo y existaapi_token. - Que el Bearer token coincida con el valor descifrado de
api_token.
El administrador gestiona estos ajustes desde la página de configuración de Filament, implementada en app/Filament/Pages/Settings.php. El token se almacena cifrado de forma reversible. El botón de generación utiliza una cadena aleatoria de 20 caracteres.
Cabeceras para consumir la API actual:
Authorization: Bearer <TOKEN_GLOBAL>
Accept: application/json
Content-Type: application/json
Content-Type corresponde a peticiones con cuerpo JSON. Los ejemplos de esta documentación utilizan datos ficticios.
La clave global concede acceso administrativo a estos endpoints. No tiene un usuario propietario, permisos por token, caducidad por dispositivo ni revocación individual. Cambiarla afecta a los clientes que la utilizan. No es la credencial apropiada para distribuir entre usuarios del CLI.
El guard api declarado en config/auth.php no es el mecanismo usado por estas rutas. Tampoco deben confundirse el token global de Plak y la credencial que el backend utiliza para llamar a Ploi.
Operaciones de sitios y servidores existentes
La siguiente tabla describe el código administrativo revisado, no un acceso personal ya disponible:
| Recurso | Operaciones |
|---|---|
| Sitios | Listar, crear y consultar |
| Servidores | Crear |
Consulta sus parámetros, respuestas y estado de adaptación en la referencia de sitios y servidores.
Respuestas y paginación
En los endpoints administrativos de sitios y servidores, las consultas individuales y creaciones devuelven un objeto bajo data. El listado de sitios devuelve:
{
"data": [],
"links": {
"first": "https://panel.plak.work/api/sites?page=1",
"last": "https://panel.plak.work/api/sites?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"from": null,
"last_page": 1,
"links": [],
"path": "https://panel.plak.work/api/sites",
"per_page": 15,
"to": null,
"total": 0
}
}
El ejemplo ilustra la estructura; meta.links contiene los enlaces de navegación generados por Laravel. Se avanza mediante ?page=2 o links.next. Los controladores usan paginate() sin tamaño explícito, y las pruebas esperan 15 elementos por página. No hay un parámetro per_page implementado en esos controladores.
Estados HTTP
| Estado | Comportamiento del código actual |
|---|---|
200 |
Consulta o listado de sitios correctos |
201 |
Creación de sitio o servidor |
403 |
Bearer token ausente o incorrecto, si la API está habilitada |
404 |
API deshabilitada/sin token configurado, recurso no encontrado o ruta inexistente |
422 |
Error de validación, cuando se solicita JSON |
429 |
Límite de peticiones excedido |
5xx |
Error de aplicación o de alguna dependencia; no hay un contrato propio uniforme para todos esos fallos |
El middleware global utiliza 403, no 401, para las credenciales incorrectas. La tabla describe Laravel; un proxy como Cloudflare Access puede responder antes, como ocurrió con el 302 observado en desarrollo.
El grupo api en app/Http/Kernel.php aplica throttle:60,1: 60 peticiones por minuto. Con estas llamadas sin identidad de usuario, el middleware estándar agrupa por dominio/IP, sujeto a la configuración de proxies. No hay una cuota por API key personal. El limitador nombrado api del proveedor de rutas no es el que referencia ese grupo.
Lo que todavía no existe
- Endpoint de identidad
/api/meo/api/v1/me. - Emisión, listado o revocación de tokens personales.
- Filtrado automático de sitios por el usuario de la credencial.
- Listado, consulta, actualización o eliminación de servidores en esta API.
- Catálogo API de proveedores, planes o regiones para preparar una creación de servidor.
- Endpoints API para las funciones web de WordPress, DNS, bases de datos, SSH o certificados.
- Flujo de autorización de dispositivo o intercambio navegador–CLI.
Las rutas web de esas funciones usan sesión y respuestas de interfaz; no constituyen una API pública Bearer equivalente.
Fuentes y alcance
Archivos del repositorio del panel consultados:
routes/api.phpyapp/Providers/RouteServiceProvider.php.app/Http/Kernel.php,app/Http/Middleware/GlobalApiAuthenticated.phpyapp/Exceptions/Handler.php.app/Http/Controllers/Api/yapp/DataTransferObjects/.tests/Feature/Http/Controllers/Api/ytests/Feature/Http/Middleware/GlobalApiAuthenticatedTest.php.
Se leyeron las pruebas, pero no se ejecutaron ni se realizaron operaciones de escritura contra el panel. Para el flujo futuro, consulta conexión del CLI con el panel.