> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vertracloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Guardar una aplicación como plantilla

> Guarda una de tus aplicaciones como plantilla privada, eligiendo qué variables se convierten en preguntas y qué archivos se incluyen.

Esta llamada guarda una aplicación como plantilla privada con una primera versión y responde `201` con la plantilla. Los valores de las variables nunca se copian, salvo que elijas `keep` para una variable que no parece una credencial. Llama primero a [Revisar borrador de plantilla](https://docs.vertracloud.app/es-es/api-reference/endpoint/templates/draft.md) para ver lo que propone la plataforma.

Requiere el scope `templates:write` cuando se llama con una clave de API. Se aplican el mismo plan, el límite de 5 plantillas y las reglas de workspace de [Crear una plantilla privada](https://docs.vertracloud.app/es-es/api-reference/endpoint/templates/create.md), y la plantilla no la verifica Vertra Cloud. No se puede guardar una aplicación que llegó desde un enlace para compartir (`TEMPLATE_SAVE_NOT_ALLOWED`), ni tampoco una aplicación de una [plantilla cerrada](https://docs.vertracloud.app/es-es/templates/use/closed-templates.md) (`TEMPLATE_CLOSED`). Una aplicación que ejecuta una imagen de la plataforma tampoco se puede guardar.

**app\_id** `string` *required*

El ID de la aplicación.

**workspace\_id** `string`

Si la aplicación pertenece a un workspace, el ID del workspace.

**id** `string` *required*

El slug de la plantilla: letras minúsculas, dígitos y guiones.

**name** `object` *required*

El nombre por idioma: `pt-br` (obligatorio), `en` y `es`, de hasta 50 caracteres cada uno.

**description** `object` *required*

La descripción por idioma, con la misma forma que `name`, de hasta 128 caracteres cada uno.

**category** `string` *required*

`automation`, `ai-agents`, `bots`, `apis`, `cms`, `monitoring`, `starters`, `databases` u `other`.

**tags** `string[]`

Hasta 10 etiquetas.

**version** `string`

La primera versión, como versión semántica. Por defecto `1.0.0`.

**permissions** `object`

Lo que pueden hacer los usuarios de la plantilla, como en los [permisos](https://docs.vertracloud.app/es-es/templates/create/permissions.md) del manifiesto. Los campos que no aparezcan toman los valores por defecto.

**member** `object` *required*

Lo que se guarda de la aplicación.

**Objeto member**

**resource\_id** `string` *required*

El ID de la aplicación o de la base de datos que se guarda.

**service\_id** `string` *required*

El id que recibe el servicio en el manifiesto.

**env** `object[]`

Una revisión por variable de una aplicación. Una variable sin revisión queda fuera de la plantilla. Cada revisión tiene:

* `key`: el nombre de la variable.
* `mode`: `question` (se convierte en una pregunta que responde el usuario; el valor no se copia), `keep` (el valor se copia; se rechaza cuando parece una credencial), `generate` (se convierte en un secreto que la plataforma genera para cada usuario, con `generate` igual a `random:<n>` o `uuid`), `hidden` (se copia, pero se oculta a quien usa la plantilla; el valor queda fuera de su vista) u `omit` (se deja fuera).
* `label` y `help`: textos por idioma (`pt-br`, `en`, `es`), usados por `question` y `generate`.
* `generate`: cómo se genera el secreto, `random:<n>` o `uuid`.

Lee antes las sugerencias con [Revisar borrador de plantilla](https://docs.vertracloud.app/es-es/api-reference/endpoint/templates/draft.md).

**paths** `string[]`

Las rutas de `/app` de la aplicación que entran en la plantilla, para aplicaciones con código. Sin este campo, entra todo excepto lo que el borrador deja sin seleccionar. Los archivos `.env*`, la carpeta de la plataforma y las carpetas de dependencias nunca se pueden incluir.

**ram** `object`

La memoria del servicio en MB: `min`, `recommended` y `max` opcional.

**workspace\_id** `string`

El workspace que será propietario de la plantilla. Sin este campo, la plantilla te pertenece.

```bash cURL theme={null}
curl -X POST https://api.vertracloud.app/v1/templates/from-app/app-abc123def456 \
  -H "Authorization: Bearer $VERTRA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "support-bot",
    "name": { "pt-br": "Bot de suporte", "en": "Support bot" },
    "description": { "pt-br": "Bot que responde o suporte." },
    "category": "bots",
    "member": {
      "resource_id": "app-abc123def456",
      "service_id": "bot",
      "env": [
        { "key": "DISCORD_TOKEN", "mode": "question", "label": { "pt-br": "Token do bot", "en": "Bot token" } },
        { "key": "LOG_LEVEL", "mode": "keep" }
      ]
    }
  }'
```

### Response

El mismo objeto de plantilla que devuelve [Crear una plantilla privada](https://docs.vertracloud.app/es-es/api-reference/endpoint/templates/create.md), con `201 Created`: `id`, `slug`, `origin` (`private`), `name`, `description`, `category`, `tags`, `current_version`, `services`, `inputs`, `permissions`, `outputs` y los demás campos listados allí.

```json Response theme={null}
{
  "response": {
    "id": "tpl-abc123def456",
    "slug": "support-bot",
    "origin": "private",
    "visibility": "public",
    "name": { "pt-br": "Bot de suporte", "en": "Support bot" },
    "description": { "pt-br": "Bot que responde o suporte." },
    "category": "bots",
    "tags": [],
    "current_version": { "id": "tplv-111222333444", "version": "1.0.0", "security": false, "created_at": "2026-10-27T14:02:00Z" },
    "creates_stack": false,
    "inputs": [
      { "id": "discord_token", "type": "secret", "label": { "pt-br": "Token do bot", "en": "Bot token" } }
    ],
    "created_at": "2026-10-27T14:02:00Z",
    "updated_at": "2026-10-27T14:02:00Z"
  }
}
```

### Error Responses

**code** `string`

El código de error que indica el motivo del fallo. Valores posibles:

* `API_KEY_SCOPE_DENIED`: La clave de API no tiene el scope `templates:write` (`403`).
* `APP_NOT_FOUND`: La aplicación no existe o no es tuya.
* `TEMPLATE_SAVE_NOT_ALLOWED`: La aplicación llegó desde un enlace para compartir, o ejecuta una imagen de la plataforma (`403`).
* `TEMPLATE_CLOSED`: La aplicación procede de una plantilla cerrada (`403`).
* `TEMPLATE_MANIFEST_INVALID`: El resultado no es un manifiesto válido, o una variable `keep` contiene algo que parece una credencial; `details.issues` enumera los hallazgos.
* `TEMPLATE_SECRET_IN_SOURCE`: Un archivo seleccionado de `/app` contiene un secreto; `details.files` enumera las rutas (`400`).
* `TEMPLATE_SLUG_TAKEN`: El slug ya está en uso entre tus plantillas o está reservado.
* `TEMPLATE_PRIVATE_LIMIT_REACHED`: La cuenta ya tiene 5 plantillas privadas.
* `PLAN_DOES_NOT_SUPPORT_CUSTOM_IMAGES`: El plan no puede crear plantillas.
* `WORKSPACE_OWNER_ONLY`: Solo el propietario del workspace guarda plantillas en él.

```json Error Response theme={null}
{
  "code": "TEMPLATE_SAVE_NOT_ALLOWED"
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.