Pular para o conteúdo principal

O que a API da Vertra Cloud faz?

A API REST pública da Vertra Cloud gerencia aplicações, bancos de dados, workspaces e todos os outros recursos da plataforma por código — toda operação disponível no dashboard está disponível via HTTP. A Vertra Cloud é uma plataforma brasileira de hospedagem de aplicações (PaaS); esta API é como você automatiza deploys, reinícios, variáveis de ambiente, snapshots e monitoramento a partir das suas próprias ferramentas. URL base: https://api.vertracloud.app

Como você se autentica?

Toda requisição carrega uma chave de API como token Bearer no cabeçalho Authorization; não há outro método de autenticação para a API pública.

Formato da chave de API

Uma chave criada hoje tem o formato vc_live_ seguido de 48 caracteres hexadecimais. O segredo completo é mostrado uma única vez, na criação ou na rotação — só um hash é armazenado, então ele não pode ser recuperado depois. As chaves criadas antes desse formato (64 caracteres hexadecimais, sem prefixo) continuam funcionando com todos os escopos.

Criando e gerenciando chaves

Gerencie as chaves em https://vertracloud.app/dashboard/settings. A gestão das chaves em si (listar, criar, atualizar, rotacionar, excluir) é apenas por sessão do dashboard — chamar qualquer uma dessas rotas com uma chave de API responde 403 API_KEY_SCOPE_DENIED, para que uma chave vazada não consiga criar ou editar chaves para si mesma. Crie e gerencie chaves no dashboard. Você pode ter até 10 chaves por conta. Cada chave tem:
  • Um nome — de 1 a 40 caracteres.
  • Escopos — quais rotas a chave pode chamar (veja abaixo). Pelo menos um é obrigatório.
  • IPs permitidos (opcional) — até 20 IPs ou CIDRs. Vazio significa que qualquer IP pode usar a chave.
Existe também uma rota legada, POST /v1/users/me/generate-api-key, mantida por compatibilidade (principalmente a CLI): ela cria ou rotaciona a única chave da conta chamada “CLI” (escopo total), sem mexer nas suas outras chaves. Chamá-la de novo apenas dá a essa mesma chave “CLI” um novo segredo — ela nunca cria uma segunda.

Escopos

Cada rota que a API expõe a uma chave pertence a exatamente um escopo, agrupado por recurso. A chave precisa ter o escopo que a rota exige, senão a requisição responde 403 API_KEY_SCOPE_DENIED com details.required indicando o escopo que falta. Uma rota que nem está no catálogo — a gestão das chaves em si ou a aba Data do banco de dados (/v1/databases/{id}/data/*) — sempre responde 403, independentemente dos escopos: a aba Data só pode ser controlada por uma sessão do dashboard. Três predefinições aceleram a criação: read marca todos os escopos *:read, write adiciona todos os escopos *:write e templates:deploy sobre o read, e full marca todo o catálogo, incluindo os escopos sem sufixo read/write (exclusão, envs, arquivos, credenciais). 31 escopos em 10 grupos:
Excluir uma imagem exige images:delete, e images:write não cobre essa ação. Quando a imagem tem aplicações, a chave também precisa de apps:delete, porque as aplicações são excluídas junto com ela; sem ele, a chamada responde 403 API_KEY_SCOPE_DENIED com details.required igual a apps:delete. Enviar arquivos para uma aplicação que roda uma imagem é um commit que reconstrói a imagem, então exige images:write além de apps:files. Criar uma aplicação a partir de uma imagem usa apps:write.
templates:deploy cria aplicações, bancos de dados e stacks, então exige a predefinição write ou uma seleção personalizada; read nunca o inclui. stacks:delete não tem sufixo read/write e só está em full ou em uma seleção personalizada. Com mode: "delete_all", excluir uma stack também exige apps:delete e databases:delete, e blob:write quando os arquivos do Blob são excluídos. Adicionar uma pasta do Blob a uma stack exige blob:write além de stacks:write. Só o dono do workspace faz deploy de templates; um membro recebe WORKSPACE_OWNER_ONLY. Veja Stacks.
Para controlar a plataforma a partir do seu próprio agente, use o servidor MCP com os escopos apps:read, apps:write e apps:files acima.
Também não existe o escopo databases:data. A aba Data do banco de dados (/v1/databases/{id}/data/* — schemas, tabelas, linhas, console SQL, coleções, documentos, chaves) é apenas por sessão do dashboard: uma chave de API recebe 403 em todas essas rotas, independentemente do escopo.
account:write não cobre todas as ações da conta. Ele cobre atualizações de perfil e pastas/favoritos pessoais. Revogar sessões (DELETE /v1/users/me/sessions) e fazer downgrade do plano (POST /v1/users/me/downgrade) são apenas por sessão do dashboard — uma chave de API recebe 403 API_KEY_SCOPE_DENIED nas duas, independentemente do escopo.
workspaces:delete e workspaces:invites não têm sufixo read/write, então as predefinições read e write nunca os incluem — só full ou uma seleção personalizada. O mesmo vale para os outros escopos de exclusão, incluindo images:delete. workspaces:read também lista as solicitações de ação. Algumas ações de workspace continuam apenas por sessão do dashboard e nenhum escopo as cobre: criar um convite (uma chave vazada poderia deixar um acesso que sobrevive à revogação), transferir a propriedade (poderia ser usada para tomar o workspace) e aprovar ou rejeitar uma solicitação de ação (uma decisão humana, inclusive quando um agente a pediu). Com uma chave de API, essas rotas respondem 403 API_KEY_SCOPE_DENIED.
O log de atividades é apenas por sessão do dashboard. Listar atividades e exportar o log de atividades de um workspace respondem ambos 403 API_KEY_SCOPE_DENIED para uma chave de API, independentemente do escopo — o log continua disponível no dashboard.
Uma chave de API pode operar pedidos e dados de cobrança: billing:read cobre listar pedidos, consultar o status de um pedido e ler os dados de cobrança; billing:write cobre criar um pedido de plano, gerar o pagamento PIX dele e atualizar os dados de cobrança; e redeem:write cobre resgatar um código promocional. Fazer downgrade do plano, pagar com cartão, cartões salvos e renovação automática continuam apenas no dashboard.

IPs permitidos

Uma lista allowed_ips vazia significa que a chave funciona de qualquer IP. Assim que você adiciona pelo menos um IP ou CIDR, toda requisição vinda de fora dessa lista responde 403 API_KEY_IP_DENIED, mesmo com chave e escopo corretos. O IP verificado é aquele de onde a conexão chega à borda da Vertra — cabeçalhos enviados pelo cliente, como X-Forwarded-For ou CF-Connecting-IP, são ignorados, então não podem ser falsificados para contornar a lista.

Erros específicos de chaves de API

Conectando por OAuth

Além de colar uma chave copiada do dashboard, um cliente pode obter uma por meio de um fluxo OAuth padrão — é assim que clientes de agentes de terceiros se conectam à sua conta Vertra sem que você precise manipular uma chave bruta.
  • Descoberta: GET /.well-known/oauth-authorization-server retorna o documento de metadados padrão (authorization_endpoint, token_endpoint, registration_endpoint, e os grant types e métodos PKCE suportados).
  • Registro dinâmico de cliente: um POST para registration_endpoint registra o cliente que está se conectando e retorna um client_id; não é preciso cadastrar um app manualmente no dashboard.
  • Autorização: o cliente envia o usuário para authorization_endpoint com PKCE — S256 é o único code_challenge_method suportado. Você aprova em uma tela de consentimento da Vertra que lista os escopos solicitados e mostra o nome do cliente que está se conectando, e então escolhe permitir.
  • Troca de token: um POST para token_endpoint aceita apenas grant_type=authorization_code com o code_verifier PKCE correspondente. Não há grant de refresh token, porque o token retornado não expira.
  • O que você recebe: o “access token” é uma chave de API comum da Vertra — mesmo formato, mesmos escopos, mesmos limites de taxa de uma criada no dashboard — criada com o nome do cliente que está se conectando. Ela aparece em Configurações → Chaves de API, com prefixo oauth:, e você a revoga da mesma forma que revogaria qualquer outra chave.

Como é uma resposta?

Toda resposta usa o mesmo envelope: um sucesso traz o conteúdo em response; um erro traz um code estável, uma message opcional e, em alguns códigos, um objeto details com os números de que você precisa para agir (o escopo que falta, o tempo de espera, o limite). O status HTTP indica qual dos dois é. Sucesso:
Uma rota sem nada a retornar (uma exclusão, um salvamento de arquivo, uma limpeza de cache) responde { "response": null }. Erro:

Quais códigos de erro a API pode retornar?

Os códigos de erro são strings estáveis, seguras para usar em condicionais — a message não é. Estes são os que você vai encontrar com mais frequência; as páginas de cada endpoint documentam os códigos específicos de cada rota.

OPERATION_IN_PROGRESS

Operações de ciclo de vida na mesma aplicação ou banco de dados são serializadas: só uma roda por vez. Se você pedir uma segunda enquanto a primeira ainda está em andamento, a API responde 409 OPERATION_IN_PROGRESS e deixa o recurso sem alterações. Isso é disputa, não falha. Espere alguns segundos e tente de novo. Pode ser retornado por start, restart, stop, delete, instalações de dependências, deploys e operações de snapshot.
Error Response (409)

STORAGE_ABOVE_NEW_LIMIT

Toda aplicação tem um teto de disco fixo (veja Limites). Se o volume já ocupa mais do que esse teto, uma alteração feita pela Atualizar configuração é recusada com 409 em vez de aplicada. A resposta traz os números de que você precisa para agir, em MB:
Error Response (409)
free_mb é quanto você precisa apagar antes que a alteração possa ser aplicada.

Como a API tem limite de taxa?

A API tem três camadas de limites, e uma única chamada pode ser rejeitada por qualquer uma delas. 1. Por rota, fixo, igual em todos os planos. As rotas de ciclo de vida da aplicação — start, restart, stop e publicação — compartilham um único orçamento de 10 requisições por minuto por aplicação, então reiniciar um app dez vezes seguidas não deixa margem para pará-lo naquele mesmo minuto. O reset do banco de dados é limitado a 1 por hora; as mudanças de subdomínio a 5 por minuto, com cooldown de 5 minutos; o console SQL a 30 por minuto; todas as outras rotas da aba Data a 120 por minuto; as exportações de workspace a 5 por minuto. Todas as demais rotas, incluindo os bancos de dados, mantêm o próprio orçamento. Ao exceder o limite: 429 RATE_LIMIT_EXCEEDED. 2. Por minuto, por conta, escalonado por plano. Esta camada conta apenas requisições autenticadas com uma chave de API — sessões do dashboard não contam. Toda resposta feita com chave de API traz os cabeçalhos x-ratelimit-limit, x-ratelimit-remaining e x-ratelimit-reset (em segundos). Ao exceder o limite: 429 RATE_LIMIT_EXCEEDED com details: { scope: "minute", limit, used, retry_after }. 3. Por dia, por conta, escalonado por plano. Também só para chave de API, e reinicia à meia-noite no fuso America/Fortaleza (Brasília). Toda resposta feita com chave de API traz os cabeçalhos x-quota-limit, x-quota-remaining e x-quota-reset (em segundos). Ao exceder o limite: 429 DAILY_QUOTA_EXCEEDED com details: { scope: "day", limit, used, retry_after }. Recomendamos implementar uma lógica de nova tentativa com backoff exponencial para qualquer resposta 429. Deploys têm um orçamento horário próprio, separado dos orçamentos de requisição acima. Criar uma aplicação, enviar um ZIP, fazer deploy a partir do GitHub, reiniciar com reinstall_dependencies ou force_build, e alterar o build command consomem um único contador por conta, dimensionado pelo plano (de 10/hora no Economy a 60/hora no Intermediary e em todos os tiers Enterprise — veja Planos e limites). Iniciar, parar e um reinício simples não consomem esse contador. Ao exceder o limite, a API responde 429 DEPLOY_RATE_LIMITED com details.limit, details.window_seconds (3600) e details.retry_after. A criação manual de snapshots também tem orçamento próprio, além do limite por rota: no máximo 1 a cada 5 minutos por projeto e 10 por hora por conta. Ao exceder, a API responde 429 SNAPSHOT_RATE_LIMITED com details: { scope: "resource" | "account", retry_after }. Restaurar ou baixar um snapshot não é afetado, e os snapshots que a plataforma faz automaticamente antes de uma operação destrutiva não contam para esse orçamento.

Quais recursos a API cobre?

A API cobre usuários, aplicações, imagens Docker, bancos de dados, workspaces, cobrança, códigos de resgate, status da plataforma e Blob Storage. Cada um tem sua própria página de referência, com o corpo da requisição, a resposta e os códigos de erro.

Usuários

Consulte informações sobre o usuário autenticado.

Aplicações

Gerencie o ciclo de vida completo de uma aplicação: criação, deploy, start/stop, arquivos, variáveis de ambiente, snapshots e domínios.

Imagens Docker

Crie, construa e versione imagens Docker personalizadas, e rode aplicações a partir delas.

Bancos de dados

Gerencie bancos de dados: criação, start/stop, reset, métricas e credenciais.

Workspaces

Gerencie workspaces: criação, membros, permissões e vínculo de recursos.

Cobrança

Liste pedidos, crie um pedido de plano, gere o pagamento PIX dele e gerencie os dados de cobrança.

Resgate

Resgate um código de plano na conta autenticada.

Status

Verifique se a infraestrutura está totalmente operacional. Não é necessária autenticação.

Blob Storage

Armazenamento de objetos com referência de API própria: uploads, objetos, compartilhamentos, regras e domínios.
Última modificação em 28 de outubro de 2026