> ## 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.

# Publicar una nueva versión de una plantilla privada

> Publica una nueva versión de una plantilla privada a partir de un manifiesto actualizado y, para los servicios con código, nuevos archivos ZIP.

Esta llamada publica una nueva versión de una plantilla privada y responde `201` con la versión. La petición es `multipart/form-data`, igual que en [Crear una plantilla privada](https://docs.vertracloud.app/es-es/api-reference/endpoint/templates/create.md). El número de versión del manifiesto debe ser mayor que el actual, y el `id` del manifiesto no puede cambiar. Una versión publicada nunca cambia, y un número que ya se usó queda reservado aunque su versión se haya eliminado.

Necesita el ámbito `templates:write` cuando se llama con una clave de API, y solo el propietario de la plantilla (en un workspace, su propietario) puede publicar. Un servicio `code` sin una nueva parte ZIP conserva el código de la versión anterior; si no tenía ninguno, la llamada falla con `TEMPLATE_SOURCE_REQUIRED`. Una variable listada en `env_hidden` y ausente de `env` conserva su valor anterior, y si la envías de nuevo, lo reemplaza. Las aplicaciones ya creadas desde la plantilla no se tocan: cada usuario [actualiza](https://docs.vertracloud.app/es-es/templates/use/updates-and-rollback.md) cuando lo decide.

**template\_id** `string` *required*

El ID de la plantilla.

**manifest** `string` *required*

El manifiesto de la nueva versión, como cadena JSON serializada.

**sources\[service\_id]** `file`

Una parte ZIP con el nuevo código de un servicio, con el nombre del ID del servicio. Es opcional para un servicio que ya tiene código.

**changelog** `string`

Qué cambió, como objeto JSON serializado con `pt-br` (obligatorio), `en` y `es`.

```bash cURL theme={null}
curl -X POST https://api.vertracloud.app/v1/templates/tpl-abc123def456/versions \
  -H "Authorization: Bearer $VERTRA_API_KEY" \
  -F 'manifest=<manifest.json' \
  -F 'changelog={"pt-br":"Corrige o login","en":"Fixes login"}' \
  -F 'sources[bot]=@bot.zip'
```

### Respuesta

**response** `object`

La nueva versión.

**Mostrar objeto**

**id** `string`

El ID de la versión.

**version** `string`

La versión semántica.

**security** `boolean`

`true` para una versión de seguridad.

**changelog** `object | null`

El changelog por idioma (`pt-br`, `en`, `es`), o `null`.

**manifest** `object | null`

El manifiesto de la versión. Los valores de `env_hidden` nunca se incluyen.

**created\_at** `string`

Cuándo se publicó la versión.

```json Response theme={null}
{
  "response": {
    "id": "tplv-555666777888",
    "version": "1.1.0",
    "security": false,
    "changelog": { "pt-br": "Corrige o login", "en": "Fixes login" },
    "manifest": { "id": "support-bot", "version": "1.1.0", "category": "bots", "services": {} },
    "created_at": "2026-10-27T15:30:00Z"
  }
}
```

### Respuestas de error

**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 ámbito `templates:write` (`403`).
* `TEMPLATE_NOT_FOUND`: La plantilla no existe o no es tuya (`404`).
* `TEMPLATE_MANIFEST_INVALID`: El manifiesto no es válido, la versión no es mayor que la actual, o el `id` cambió; `details.issues` lista los hallazgos.
* `TEMPLATE_SOURCE_REQUIRED`: Un servicio `code` no tiene parte ZIP ni código de una versión anterior.
* `TEMPLATE_SECRET_IN_SOURCE`: Un ZIP contiene un secreto; `details.files` lista las rutas (`400`).
* `IMAGE_NOT_FOUND`: Un servicio `image` apunta a una imagen que no es tuya o que no tiene una compilación exitosa.
* `WORKSPACE_OWNER_ONLY`: Solo el propietario del workspace publica versiones de sus plantillas.

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


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