Ir al contenido

CaaS

POST /v1/caas/{id}/apps · scope caas:write · reversible · idempotente

Crea la app y configura su origen, pero no la despliega: queda en idle hasta que llames a POST /v1/caas/{id}/apps/{app_id}/deploy. Separar las dos cosas es lo que permite crear la app, cargarle las variables y recién ahí desplegar — el orden inverso arrancaría la aplicación sin su configuración.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps \
-X POST \
-H "Authorization: Bearer $TRUO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"api"}'

operationId: caas.apps.create

DELETE /v1/caas/{id}/apps/{app_id} · scope caas:write · destructiva — no tiene vuelta atras · idempotente

Destructivo. Borra la app, sus variables y sus dominios. Los datos de las bases del servicio no se tocan: viven aparte.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e \
-X DELETE \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.apps.delete

POST /v1/caas/{id}/apps/{app_id}/deploy · scope caas:deploy · reversible · asincrona · idempotente

Devuelve 202 en cuanto el despliegue arranca. La operación se resuelve buscando ese despliegue en el historial de la app, que es el único lugar donde el backend reporta en qué quedó. Esperá con GET /v1/operations/{id}; el detalle de un fallo está en GET /v1/caas/{id}/apps/{app_id}/logs.

Vive en su propio scope (caas:deploy) porque desplegar ejecuta el código que haya en el origen configurado — es distinto de editar la configuración de la app.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e/deploy \
-X POST \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.apps.deploy

GET /v1/caas/{id}/apps/{app_id} · scope caas:read

Devuelve solo los campos declarados. El backend responde con el objeto interno completo del motor de despliegue —que incluye las variables de entorno en claro—; nada de eso sale por acá. Para los nombres de las variables, GET /v1/caas/{id}/apps/{app_id}/env.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.apps.get

GET /v1/caas/{id}/apps · scope caas:read

source viene en null: el backend no lo trae en el listado.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.apps.list

GET /v1/caas/{id}/apps/{app_id}/logs · scope caas:read

Es una foto, no un stream. Devuelve lo que el backend tenga en el momento de la llamada y no hay forma de pedir “lo que vino después”: el backend acepta un cursor pero nunca emite el siguiente, así que este endpoint no publica ninguno. Para seguir una aplicación en vivo, volvé a llamar.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e/logs \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.apps.logs

POST /v1/caas/{id}/apps/{app_id}/restart · scope caas:write · reversible · idempotente

Reinicia el proceso sin volver a construir la imagen: toma las variables de entorno actuales pero no trae código nuevo. Para eso es deploy.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e/restart \
-X POST \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.apps.restart

POST /v1/caas/{id}/databases · scope caas:write · reversible · idempotente

La contraseña la genera la plataforma y no se devuelve acá ni en ningún otro endpoint de /v1: no hay forma de recuperarla por esta API. Conectate desde una app del mismo servicio, donde la cadena de conexión ya está disponible.

Borrar una base no está en esta versión: el backend todavía no lo implementa y publicar un endpoint que siempre falla sería publicar roadmap.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/databases \
-X POST \
-H "Authorization: Bearer $TRUO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"engine":"postgres","name":"principal"}'

operationId: caas.databases.create

GET /v1/caas/{id}/databases · scope caas:read

Son del servicio, no de una app: varias apps del mismo servicio pueden usar la misma base. Las credenciales no se devuelven por ningún endpoint de esta API.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/databases \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.databases.list

GET /v1/caas/{id}/apps/{app_id}/deployments · scope caas:read

Del más reciente al más viejo, según lo devuelve el backend.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e/deployments \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.deployments.list

POST /v1/caas/{id}/apps/{app_id}/domains · scope caas:write · reversible · idempotente

El DNS del host tiene que estar apuntado a la IP del servicio antes de llamar: la emisión del certificado se valida por HTTP.

Dos cosas más que hay que saber:

  • No es atómico. El alta registra el dominio y después reconstruye el ruteo de entrada; si lo segundo falla, la llamada devuelve error con el dominio ya creado. Reintentar es seguro y es lo correcto — el alta es idempotente por host.
  • El certificado se emite después, de forma asíncrona y sin ningún estado ni id que consultar. Por eso certificate_type viene en null acá. La única verificación real es una petición HTTPS al host.
Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e/domains \
-X POST \
-H "Authorization: Bearer $TRUO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"host":"app.ejemplo.com"}'

operationId: caas.domains.create

DELETE /v1/caas/{id}/apps/{app_id}/domains/{host} · scope caas:write · destructiva — no tiene vuelta atras · idempotente

Borrar un host que no está en la app no es un error: el ruteo de entrada se reconstruye igual, que es lo que hace que reintentar sea seguro.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e/domains/app.ejemplo.com \
-X DELETE \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.domains.delete

GET /v1/caas/{id}/apps/{app_id}/domains · scope caas:read

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e/domains \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.domains.list

GET /v1/caas/{id}/apps/{app_id}/env · scope caas:read

Devuelve los nombres, nunca los valores. No hay una versión de este endpoint que los devuelva: una vez escrito, un valor solo lo lee la aplicación. El backend enmascara aplicando una regex al nombre de la clave, lo que deja pasar en claro cualquier cosa que no se llame como un secreto (DATABASE_URL, SENTRY_DSN); eso no es una política de clasificación y no se publica.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e/env \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.env.list

PUT /v1/caas/{id}/apps/{app_id}/env · scope caas:write · destructiva — no tiene vuelta atras · idempotente

Reemplaza el conjunto entero: lo que no venga en vars se borra. No es una limitación, es la semántica del backend, que escribe el bloque completo de una.

Como GET /env no devuelve valores, el set tiene que salir de tu lado — de tu gestor de secretos o de tu repositorio de configuración. Eso es lo natural para infraestructura declarativa, y de paso elimina el modo de fallo del panel, donde guardar sin volver a escribir los secretos los borraba.

Los cambios toman efecto en el próximo deploy o restart.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432/apps/app_9f2c1b7e/env \
-X PUT \
-H "Authorization: Bearer $TRUO_TOKEN" \
-H "Content-Type: application/json" \
-d '{"vars":[]}'

operationId: caas.env.replace

GET /v1/caas/{id} · scope caas:read

Consulta el control plane. Si no responde, provisioning_state y machine vuelven en null en vez de fallar: un hipo del control plane no debería impedirte leer el resto del recurso ni sus capabilities.

Ventana de terminal
curl https://api.truo.cloud/v1/caas/svc_10432 \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.instances.get

GET /v1/caas · scope caas:read

Sale de la base, sin consultar el control plane: provisioning_state y machine vienen en null. Traerlos costaría dos llamadas por elemento de la página.

Una página puede venir con menos elementos que el limit aunque haya más: todos los productos del control plane comparten un mismo módulo de aprovisionamiento, así que el filtro por familia solo puede aplicarse después de leer la página. has_more sigue siendo la señal correcta de si queda algo por traer.

Ventana de terminal
curl https://api.truo.cloud/v1/caas \
-H "Authorization: Bearer $TRUO_TOKEN"

operationId: caas.instances.list