Saltar al contenido principal

¿Qué puede hacer la API de Vertra Cloud?

La API REST pública de Vertra Cloud gestiona aplicaciones, bases de datos, workspaces y cualquier otro recurso de la plataforma de forma programática: cada operación disponible en el panel está disponible por HTTP. Vertra Cloud es una plataforma brasileña de alojamiento de aplicaciones (PaaS); esta API sirve para automatizar despliegues, reinicios, variables de entorno, snapshots y monitorización desde tus propias herramientas. URL base: https://api.vertracloud.app

¿Cómo te autenticas?

Cada petición lleva una clave de API como token Bearer en la cabecera Authorization; no existe ningún otro método de autenticación para la API pública.

Formato de la clave de API

Una clave creada hoy tiene el formato vc_live_ seguido de 48 caracteres hexadecimales. El secreto completo se muestra una sola vez, al crearla o rotarla; solo se guarda un hash, así que no puede recuperarse más tarde. Las claves creadas antes de este formato (64 caracteres hexadecimales, sin prefijo) siguen funcionando con todos los scopes.

Crear y gestionar claves

Gestiona las claves desde https://vertracloud.app/dashboard/settings. La gestión de claves en sí (listar, crear, actualizar, rotar y eliminar) es solo con sesión del panel: llamar a cualquiera de esas rutas con una clave de API responde 403 API_KEY_SCOPE_DENIED, para que una clave filtrada no pueda crear ni editar claves para sí misma. Crea y gestiona las claves desde el panel. Puedes tener hasta 10 claves por cuenta. Cada clave tiene:
  • Un nombre: de 1 a 40 caracteres.
  • Scopes: qué rutas puede llamar la clave (ver abajo). Se requiere al menos uno.
  • IPs permitidas (opcional): hasta 20 IPs o CIDR. Vacío significa que cualquier IP puede usar la clave.
Hay también una ruta heredada, POST /v1/users/me/generate-api-key, que se mantiene por compatibilidad (sobre todo para la CLI): crea o rota la única clave de la cuenta llamada “CLI” (scope completo), sin tocar tus otras claves. Si la llamas de nuevo, esa misma clave “CLI” recibe un nuevo secreto; nunca crea una segunda.

Scopes

Cada ruta que la API expone a una clave pertenece a exactamente un scope, agrupado por recurso. La clave debe tener el scope que requiere la ruta; si no, la petición responde 403 API_KEY_SCOPE_DENIED con details.required indicando el scope que falta. Una ruta que no está en el catálogo en absoluto —la gestión de claves en sí o la pestaña Data de la base de datos (/v1/databases/{id}/data/*)— responde siempre 403, sin importar los scopes: la pestaña Data solo puede manejarse con sesión del panel. Tres presets agilizan la creación: read marca todos los scopes *:read, write añade todos los *:write y templates:deploy sobre read, y full marca el catálogo completo, incluidos los scopes sin sufijo read/write (delete, envs, files, credentials). 31 scopes en 10 grupos:
Eliminar una imagen requiere images:delete, y images:write no lo cubre. Cuando la imagen tiene aplicaciones, la clave también necesita apps:delete, porque las aplicaciones se eliminan junto con ella; sin él, la llamada responde 403 API_KEY_SCOPE_DENIED con details.required en apps:delete. Subir archivos a una aplicación que ejecuta una imagen es un commit que reconstruye la imagen, así que necesita images:write además de apps:files. Crear una aplicación desde una imagen usa apps:write.
templates:deploy crea aplicaciones, bases de datos y stacks, así que necesita el preset write o una selección personalizada; read nunca lo incluye. stacks:delete no tiene sufijo read/write y solo está en full o en una selección personalizada. Con mode: "delete_all", eliminar un stack también necesita apps:delete y databases:delete, y blob:write cuando se eliminan los archivos de Blob. Añadir una carpeta de Blob a un stack necesita blob:write además de stacks:write. Solo el propietario del workspace despliega plantillas; un miembro recibe WORKSPACE_OWNER_ONLY. Ver Stacks.
Para controlar la plataforma desde tu propio agente, usa el servidor MCP con los scopes apps:read, apps:write y apps:files de arriba.
Tampoco existe un scope databases:data. La pestaña Data de la base de datos (/v1/databases/{id}/data/* —esquemas, tablas, filas, consola SQL, colecciones, documentos, claves— es solo con sesión del panel: una clave de API recibe 403 en todas esas rutas, sin importar el scope.
account:write no cubre todas las acciones de la cuenta. Cubre las actualizaciones del perfil y las carpetas y favoritos personales. Revocar sesiones (DELETE /v1/users/me/sessions) y bajar de plan (POST /v1/users/me/downgrade) son solo con sesión del panel: una clave de API recibe 403 API_KEY_SCOPE_DENIED en ambas, sin importar el scope.
workspaces:delete y workspaces:invites no tienen sufijo read/write, así que los presets read y write nunca los incluyen; solo los incluye full o una selección personalizada. Lo mismo ocurre con los demás scopes de eliminación, incluido images:delete. workspaces:read también lista las solicitudes de acción. Algunas acciones del workspace siguen siendo solo con sesión del panel y ningún scope las cubre: crear una invitación (una clave filtrada podría dejar un acceso que sobreviva a su revocación), transferir la propiedad (podría usarse para apoderarse del workspace) y aprobar o rechazar una solicitud de acción (una decisión humana, incluso cuando la pidió un agente). Con una clave de API, esas rutas responden 403 API_KEY_SCOPE_DENIED.
El registro de actividad es solo con sesión del panel. Listar actividades y exportar el registro de actividad de un workspace reciben 403 API_KEY_SCOPE_DENIED con una clave de API, sin importar el scope; el registro sigue disponible en el panel.
Una clave de API puede gestionar pedidos y datos de facturación: billing:read cubre listar pedidos, consultar el estado de un pedido y leer los datos de facturación; billing:write cubre crear un pedido de plan, generar su pago por Pix y actualizar los datos de facturación; y redeem:write cubre canjear un código promocional. Bajar de plan, pagar con tarjeta, las tarjetas guardadas y la renovación automática siguen siendo solo del panel.

IPs permitidas

Una lista allowed_ips vacía significa que la clave funciona desde cualquier IP. En cuanto añades al menos una IP o CIDR, toda petición desde fuera de esa lista responde 403 API_KEY_IP_DENIED, aunque la clave y el scope sean correctos. La IP que se comprueba es la que el borde de Vertra ve como origen de la conexión; las cabeceras enviadas por el cliente, como X-Forwarded-For o CF-Connecting-IP, se ignoran, así que no pueden falsificarse para saltarse la lista de permitidas.

Errores específicos de las claves de API

Conectarse mediante OAuth

Además de pegar una clave desde el panel, un cliente puede obtener una mediante un flujo OAuth estándar: así es como los clientes de agentes de terceros se conectan a tu cuenta de Vertra sin que tengas que manejar nunca una clave en bruto.
  • Descubrimiento: GET /.well-known/oauth-authorization-server devuelve el documento de metadatos estándar (authorization_endpoint, token_endpoint, registration_endpoint, y los tipos de grant y los métodos PKCE admitidos).
  • Registro dinámico de clientes: un POST a registration_endpoint registra el cliente que se conecta y devuelve un client_id; no hace falta registrar ninguna app a mano en el panel.
  • Autorización: el cliente envía al usuario a authorization_endpoint con PKCE; S256 es el único code_challenge_method admitido. Apruebas en una pantalla de consentimiento de Vertra que enumera los scopes solicitados y muestra el nombre del cliente que se conecta, y después eliges permitirlo.
  • Intercambio de token: un POST a token_endpoint acepta solo grant_type=authorization_code con el code_verifier de PKCE correspondiente. No hay grant de refresh token, porque el token que devuelve no caduca.
  • Lo que recibes: el “access token” es una clave de API normal de Vertra —mismo formato, mismos scopes, mismos rate limits que una creada en el panel— creada con el nombre del cliente que se conecta. Aparece en Ajustes → Claves de API, con el prefijo oauth:, y la revocas igual que cualquier otra clave.

¿Cómo es una respuesta?

Todas las respuestas usan el mismo formato: un éxito lleva el contenido bajo response, un error lleva un code estable, un message opcional y, en algunos códigos, un objeto details con los números que necesitas para actuar (el scope que falta, el tiempo de espera, el límite). El estado HTTP indica cuál de los dos es. Éxito:
Una ruta sin nada que devolver (un borrado, un guardado de archivo, una purga de caché) responde { "response": null }. Error:

¿Qué códigos de error puede devolver la API?

Los códigos de error son cadenas estables, seguras para tomar decisiones en el código; el message no lo es. Estos son los que más vas a encontrar; las páginas de cada endpoint documentan los códigos específicos de cada ruta.

OPERATION_IN_PROGRESS

Las operaciones de ciclo de vida sobre la misma aplicación o base de datos se serializan: solo se ejecuta una a la vez. Si pides una segunda mientras la primera sigue en marcha, la API responde 409 OPERATION_IN_PROGRESS y deja el recurso sin cambios. Esto es contención, no un fallo. Espera unos segundos y vuelve a intentarlo. Puede devolverse en start, restart, stop, delete, instalaciones de dependencias, despliegues y operaciones de snapshot.
Error Response (409)

STORAGE_ABOVE_NEW_LIMIT

Cada aplicación tiene un techo de disco fijo (ver Límites). Si el volumen ya ocupa más que ese techo, un cambio a través de Actualizar configuración se rechaza con 409 en lugar de aplicarse. La respuesta incluye los números necesarios para actuar, en MB:
Error Response (409)
free_mb es cuánto tienes que borrar antes de que el cambio pueda aplicarse.

¿Cómo se aplican los límites de peticiones a la API?

La API tiene tres niveles de límites, y una sola llamada puede ser rechazada por cualquiera de ellos. 1. Por ruta, fijo, igual en todos los planes. Las rutas de ciclo de vida de la aplicación —start, restart, stop y publicar— comparten un único presupuesto de 10 peticiones por minuto por aplicación, así que reiniciar una app diez veces seguidas no deja margen para detenerla en ese mismo minuto. El reset de base de datos está limitado a 1 por hora; los cambios de subdominio, a 5 por minuto con un enfriamiento de 5 minutos; la consola SQL, a 30 por minuto; cada otra ruta de la pestaña Data, a 120 por minuto; las exportaciones de workspace, a 5 por minuto. Cualquier otra ruta, incluidas las de bases de datos, tiene su propio presupuesto. Al superar el límite: 429 RATE_LIMIT_EXCEEDED. 2. Por minuto, por cuenta, según el plan. Este nivel solo cuenta las peticiones autenticadas con una clave de API; las sesiones del panel no cuentan. Cada respuesta a una clave de API incluye las cabeceras x-ratelimit-limit, x-ratelimit-remaining y x-ratelimit-reset (en segundos). Al superar el límite: 429 RATE_LIMIT_EXCEEDED con details: { scope: "minute", limit, used, retry_after }. 3. Por día, por cuenta, según el plan. También solo con clave de API, y se reinicia a medianoche en la zona horaria America/Fortaleza (Brasilia). Cada respuesta a una clave de API incluye las cabeceras x-quota-limit, x-quota-remaining y x-quota-reset (en segundos). Al superar el límite: 429 DAILY_QUOTA_EXCEEDED con details: { scope: "day", limit, used, retry_after }. Recomendamos implementar lógica de reintento con backoff exponencial para cualquier respuesta 429. Los despliegues tienen su propio presupuesto horario, separado de los límites de peticiones de arriba. Crear una aplicación, subir un ZIP, desplegar desde GitHub, reiniciar con reinstall_dependencies o force_build, y cambiar el build command consumen todos un mismo contador por cuenta, dimensionado según el plan (de 10/hora en Economy a 60/hora en Intermediary y en todos los niveles Enterprise; ver Planes y límites). Iniciar, detener y un reinicio simple no consumen este contador. Al superar el límite, la API responde 429 DEPLOY_RATE_LIMITED con details.limit, details.window_seconds (3600) y details.retry_after. La creación manual de snapshots tiene además su propio presupuesto, por encima del límite por ruta: como máximo 1 cada 5 minutos por proyecto y 10 por hora y por cuenta. Al superar el límite, la API responde 429 SNAPSHOT_RATE_LIMITED con details: { scope: "resource" | "account", retry_after }. Restaurar o descargar un snapshot no se ve afectado, y los snapshots que la plataforma toma automáticamente antes de una operación destructiva no cuentan contra este presupuesto.

¿Qué recursos cubre la API?

La API cubre usuarios, aplicaciones, imágenes de Docker, bases de datos, workspaces, facturación, códigos de canje, estado de la plataforma y Blob Storage. Cada uno tiene su propia página de referencia con el cuerpo de la petición, la respuesta y los códigos de error.

Usuarios

Consulta información sobre el usuario autenticado.

Aplicaciones

Gestiona el ciclo de vida completo de una aplicación: creación, despliegue, inicio y detención, archivos, variables de entorno, snapshots y dominios.

Imágenes de Docker

Crea, construye y versiona imágenes de Docker personalizadas, y ejecuta aplicaciones a partir de ellas.

Bases de datos

Gestiona bases de datos: creación, inicio y detención, restablecimiento, métricas y credenciales.

Workspaces

Gestiona workspaces: creación, miembros, permisos y asociación de recursos.

Facturación

Lista pedidos, crea un pedido de plan, genera su pago por Pix y gestiona los datos de facturación.

Canje

Canjea un código de plan en la cuenta autenticada.

Estado

Comprueba si la infraestructura está completamente operativa. No requiere autenticación.

Blob Storage

Almacenamiento de objetos con su propia referencia de API: subidas, objetos, enlaces para compartir, reglas y dominios.
Última modificación el 28 de octubre de 2026