Crea y usa un token de API con permisos granulares
Los tokens de API permiten que scripts, bots y tareas de CI llamen a la API de Zaroz Cloud sin guardar la contraseña de tu cuenta ni tu sesión del navegador. Todo token deniega por defecto: tú eliges los permisos exactos que tiene y, en un token personal, los recursos exactos que puede tocar.
La lista completa de rutas está en la referencia de la API. Las convenciones que comparten todas las llamadas (URL base, errores, paginación) están en Usar la API de Zaroz.
Token personal o de organización
| Token personal | Token de organización | |
|---|---|---|
| Actúa como | Tú | La organización |
| Alcance de cada permiso | Global, un tipo de recurso, un recurso, o un recurso y sus descendientes | Toda la organización |
| Se revoca cuando | Lo revocas o pierdes el acceso | Lo revocas; con membership_tied también cuando su creador se va |
| Se crea en | POST /me/api-tokens | POST /organizations/{id}/api-tokens (requiere Owner o Admin) |
| Ideal para | Un script, un servicio, mínimo privilegio | El CI de un equipo o un bot que debe sobrevivir a una persona |
Un token nunca tiene más autoridad que la persona u organización que lo creó, y se comprueba de nuevo en cada petición: si pierdes un rol, tus tokens lo pierden también.
Antes de crear uno
Trata el token como una contraseña. Quien lo consiga puede hacer todo lo que permite hasta que caduque o lo revoques.
- Crea un token distinto para cada integración.
- Concede solo los permisos imprescindibles.
- Prefiere un servicio concreto a todos (solo tokens personales).
- Añade
expires_atsiempre que la integración pueda rotar el secreto. - Nunca pongas un token en JavaScript de frontend, una app móvil, un repositorio público o un mensaje de soporte.
Consulta qué puedes conceder
Solo puedes conceder lo que tú mismo tienes. Pregúntaselo a la API para no fijar una lista a mano:
curl
Code
TypeScript
Code
Python
Code
Los permisos que importan a la mayoría de clientes:
| Permiso | Permite |
|---|---|
services.read | Toda lectura de un servicio que no sea secreta |
services.power | Iniciar, detener, reiniciar |
services.deploy | Fijar el origen y crear despliegues, nada más |
services.manage | Cambiar el servicio (entorno, copias, archivos, cortafuegos...) y todo lo de services.deploy |
services.console | Flujo de logs, consola de comandos, SSH |
services.files.read | Explorar y descargar archivos |
services.external_access.manage | Abrir y cerrar puertos públicos |
services.schedules.manage | Tareas programadas |
services.databases.read | Explorar bases de datos conectadas |
organizations.read, projects.read | Leer organizaciones y proyectos |
organizations.members.manage | Añadir, quitar y cambiar roles de miembros |
organizations.manage, projects.manage | Renombrar una organización; crear, renombrar y borrar proyectos |
organizations.purchase | Comprar una suscripción facturada a la organización |
organizations.wallet.spend, organizations.wallet.top_up | Pagar facturas con el monedero; añadir fondos |
subscriptions.renewal.manage, subscriptions.cancel, subscriptions.resize.manage | Activar o desactivar la renovación; terminar una suscripción; redimensionar o cambiar de plan |
organizations.api_tokens.manage | Crear, listar y revocar los tokens de la organización |
wallet.read | Leer saldos y movimientos del monedero |
No hay comodines: services.read no implica services.power.
Crea un token personal
Crearlo requiere una sesión iniciada (la consola o las rutas de login), no otro token de API. El secreto se devuelve una sola vez, con la forma zaroz_pat_<id>_<secreto>; solo se guarda un resumen.
Cada concesión es un permiso más un alcance:
kind del alcance | Alcanza |
|---|---|
global | El permiso allí donde lo tengas |
resource_type | Todos los recursos de un tipo (resource_type) |
resource | Exactamente un recurso (resource_type, resource_id) |
resource_tree | Un recurso y lo que desciende de él (resource_type, root_resource_id) |
curl
Code
TypeScript
Code
Python
Code
Una lista grants vacía crea un token que se autentica y no puede hacer nada. La ausencia deniega.
Crea un token de organización
Quien lo crea debe ser Owner o Admin de la organización. Los permisos se aplican a toda la organización.
curl
Code
TypeScript
Code
Python
Code
lifetime es membership_tied por defecto: el token se revoca solo cuando su creador deja la organización. Usa organization_owned si debe seguir funcionando después. Los permisos exclusivos de personal de Zaroz no pueden ir nunca en un token de organización.
Úsalo
Envíalo como token bearer. Esto lee un servicio con un token que solo tiene services.read:
curl
Code
TypeScript
Code
Python
Code
Prueba una ruta que el token no tiene (por ejemplo POST /service-instances/{id}/restart con el token anterior): responde 403. Ese es el objetivo.
No llames a la API directamente desde una web pública
El código del navegador lo ve cualquier visitante. Guarda el token en un servidor, un bot, el almacén de secretos del CI u otro backend de confianza.
Errores que debes manejar
401: el token falta, está mal formado, caducó o fue revocado.403: el token, su propietario o ambos carecen del permiso para ese recurso.404: el id es incorrecto, o el recurso está deliberadamente oculto para esta identidad.429: esperaRetry-Aftery reintenta.5xx: temporal; reintenta un número limitado de veces y registra la respuesta sin registrar el token.
Listar, rotar y revocar
curl
Code
TypeScript
Code
Python
Code
Para rotar: crea el reemplazo, actualiza la integración, comprueba que funciona y revoca el antiguo. Revocar es inmediato, y revocar un token personal requiere una sesión iniciada, no un token. Las acciones hechas con un token aparecen en la actividad de la organización con el nombre del token, así que ponles nombres que reconozcas durante un incidente.
Siguiente
- Despliega desde CI/CD: el token estrecho
services.deployen la práctica. - Principales de servicio: credenciales para el código que corre dentro de un Workload, en lugar de un token tuyo.
- Monitor de estado de Minecraft
