> ## 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 uma nova versão de um template privado

> Publica uma nova versão de um template privado a partir de um manifesto atualizado e, para serviços com código, de novos arquivos ZIP.

Esta chamada publica uma nova versão de um template privado e responde `201` com a versão. A requisição é `multipart/form-data`, como em [Criar um template privado](https://docs.vertracloud.app/pt-br/api-reference/endpoint/templates/create.md). O número de versão do manifesto precisa ser maior que o atual, e o `id` do manifesto não pode mudar. Uma versão publicada nunca muda, e um número que já foi usado fica reservado mesmo se a versão for removida.

Precisa do escopo `templates:write` quando chamada com uma chave de API, e só o dono do template (em um workspace, o dono do workspace) pode publicar. Um serviço `code` sem uma nova parte ZIP mantém o código da versão anterior; se não tinha nenhum, a chamada falha com `TEMPLATE_SOURCE_REQUIRED`. Uma variável listada em `env_hidden` e ausente de `env` mantém o valor anterior; enviá-la novamente o substitui. As aplicações já criadas a partir do template não são tocadas: cada usuário [atualiza](https://docs.vertracloud.app/pt-br/templates/use/updates-and-rollback.md) quando quiser.

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

O ID do template.

**manifest** `string` *required*

O manifesto da nova versão, como string serializada em JSON.

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

Uma parte ZIP com o novo código de um serviço, nomeada com o ID do serviço. Opcional para um serviço que já tem código.

**changelog** `string`

O que mudou, como objeto serializado em JSON com `pt-br` (obrigatório), `en` e `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'
```

### Resposta

**response** `object`

A nova versão.

**Mostrar objeto**

**id** `string`

O ID da versão.

**version** `string`

A versão semântica.

**security** `boolean`

`true` para uma versão de segurança.

**changelog** `object | null`

O changelog por idioma (`pt-br`, `en`, `es`), ou `null`.

**manifest** `object | null`

O manifesto da versão. Os valores de `env_hidden` nunca são incluídos.

**created\_at** `string`

Quando a versão foi publicada.

```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"
  }
}
```

### Respostas de erro

**code** `string`

O código de erro que indica o motivo da falha. Valores possíveis:

* `API_KEY_SCOPE_DENIED`: A chave de API não tem o escopo `templates:write` (`403`).
* `TEMPLATE_NOT_FOUND`: O template não existe ou não é seu (`404`).
* `TEMPLATE_MANIFEST_INVALID`: O manifesto não é válido, a versão não é maior que a atual, ou o `id` foi alterado; `details.issues` lista os problemas encontrados.
* `TEMPLATE_SOURCE_REQUIRED`: Um serviço `code` não tem parte ZIP nem código de uma versão anterior.
* `TEMPLATE_SECRET_IN_SOURCE`: Um ZIP contém um segredo; `details.files` lista os caminhos (`400`).
* `IMAGE_NOT_FOUND`: Um serviço `image` aponta para uma imagem que não é sua ou não tem build concluído com sucesso.
* `WORKSPACE_OWNER_ONLY`: Só o dono do workspace publica versões dos templates dele.

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


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