Atualizar Plano do Projeto

Altera o plano do projeto para um novo plano.

Permissões necessárias

A alteração exige project.plan.update em project:<project-id>. owner tem acesso completo; assistant, member e API Keys da organização precisam desse grant. Se a alteração de plano envolver dados de cobrança, consulte também project.billing.read quando a automação precisar ler custos.

PATCH /v1/project/:id/plan

Limite de requisições: 5 por minuto (contado por IP de origem).

Parâmetros de Path

ParâmetroTipoDescrição
idstringID do projeto

Headers

HeaderObrigatórioDescrição
x-api-key ou AuthorizationSimAPI Key da organização ou token de usuário
x-organization-idCom token de usuárioOrganização ativa do projeto. Dispensável com API Key da organização
Content-Type: application/jsonSimNecessário por haver body JSON

Body

CampoTipoObrigatórioDescrição
planstringSimIdentificador do plano

Planos Disponíveis

PlanoDescrição
staticPlano estático
basicPlano básico
premiumPlano premium
premium_plusPlano premium plus
businessPlano business
deep_learning_basicDeep Learning básico (com GPU)
deep_learning_premiumDeep Learning premium (com GPU)
db-starter, db-basic, db-premium, db-enterprisePlanos de bancos de dados e Key-Value

Os planos free e db-free e os planos de Cache e Queue não são aceitos nesta rota. O novo plano precisa ser da mesma família do tipo do projeto: planos HTTP para aplicações, db-* para PostgreSQL, MariaDB e Key-Value, e analytics-* para Analytics. Projetos Analytics aceitam planos analytics-* (analytics-sandbox, analytics-starter, analytics-production, analytics-enterprise), tanto para subir quanto para descer; as instâncias vêm do plano (1 em Sandbox e Starter, 3 em Production e Enterprise). Em projetos Key-Value, a troca exige o projeto em execução com cobrança por hora e só é aceita entre planos com a mesma quantidade de instâncias e o mesmo armazenamento cobrado; nos demais casos a API responde 409. Jobs agendados, Cache e Queue não trocam de plano.

Regras da troca

  • A troca só é aceita em projetos com cobrança por hora; contratos mensais e anuais mantêm o plano durante o período contratado.
  • Não é possível trocar de ou para os planos free e db-free.
  • O projeto precisa estar em execução (running) ou parado (stopped), sem outra operação em andamento.
  • Um projeto parado continua parado depois da troca: fica com 0 instâncias, sem cobrança de processamento, e volta com o novo plano na retomada.
  • Se a organização tiver pagamentos pendentes, a troca para um plano maior responde 402; a troca para um plano menor continua disponível.

Exemplo

{
  "plan": "premium"
}

Resposta

{
  "status": "success",
  "message": "updated with success"
}

Em projetos Analytics, a resposta 200 acima indica troca concluída. Se a troca continuar em segundo plano, a resposta é 202:

{
  "status": "accepted",
  "code": "PLAN_CHANGE_IN_PROGRESS",
  "message": "The plan change has started and should finish in a few minutes."
}

Acompanhe com GET /v1/project/:id (Informações de projetos). Ao descer para um plano de uma instância, a Zenifra confirma que a instância restante tem todos os dados antes de remover as outras. A cobrança muda quando a troca termina.

Erros

StatusCódigoQuando ocorre
400—Corpo inválido (por exemplo, plan ausente, free, db-free ou fora da lista aceita)
402ORGANIZATION_BILLING_BLOCKEDA organização tem pagamentos pendentes e o novo plano aumenta o gasto
404—Projeto não encontrado (inclusive ambientes de preview e projetos excluídos) ou plano inexistente
409PROJECT_PLAN_ALREADY_SELECTEDO projeto já usa o plano informado (mensagem: "The project already uses this plan.")
409PLAN_TYPE_MISMATCHO plano não pertence à família do tipo do projeto (mensagem: "The selected plan is not available for this project type.")
409PROJECT_STATE_CONFLICTO projeto não está em execução nem parado (por exemplo, ainda em criação ou com falha)
409PROJECT_OPERATION_IN_PROGRESSO projeto está sendo retomado ou excluído, ou outra operação está em andamento
409—O projeto está no plano free ou db-free, ou tem contrato mensal ou anual (cant change plan with contract)
409INSUFFICIENT_PLAN_CAPACITYNão há capacidade disponível no novo plano
409CLICKHOUSE_NON_REPLICATED_DATAEm Analytics: "Some tables use an engine without replication and hold data. Move that data to replicated tables before changing to a plan with one instance." Mova os dados para tabelas com a engine padrão
409CLICKHOUSE_REPLICAS_NOT_IN_SYNCEm Analytics: "The instances are still synchronizing data. Try the plan change again in a few minutes." Tente de novo em alguns minutos
422PROJECT_OPERATION_NOT_SUPPORTEDO tipo de projeto não aceita troca de plano: Job agendado, Cache ou Queue
503PLAN_CAPACITY_TEMPORARILY_UNAVAILABLEA capacidade do plano está temporariamente indisponível; tente novamente em instantes

Os corpos de PROJECT_STATE_CONFLICT, PROJECT_OPERATION_IN_PROGRESS e ORGANIZATION_BILLING_BLOCKED estão em Conflitos e bloqueio de cobrança.


Renovação automática do contrato

Liga ou desliga a renovação automática de um projeto com contrato mensal ou anual.

PATCH /v1/project/:id/renew-automatic-contract

Somente o owner da organização pode alterar a renovação automática. assistant, member e API Keys da organização recebem 403, mesmo com project.plan.update. Limite de requisições: 5 por minuto (contado por IP de origem).

Body

CampoTipoObrigatórioDescrição
renew_automatic_contractbooleanSimtrue para renovar automaticamente ao fim do contrato; false para não renovar
{
  "renew_automatic_contract": false
}

Resposta

{
  "status": "success",
  "message": "renew automatic contract updated with success"
}

Erros

StatusQuando ocorre
400Corpo inválido, ou o projeto usa cobrança por hora ou por minuto, que não tem renovação de contrato
403A credencial não é do owner da organização (owner role required)
404Projeto não encontrado

Cancelar a renovação

DELETE /v1/project/:id/subscription

Desliga a renovação automática de um contrato mensal ou anual: o projeto continua ativo até o fim do período contratado e o contrato não é renovado. Também é exclusivo do owner da organização. Limite de requisições: 5 por minuto (contado por IP de origem).

{
  "status": "success",
  "message": "canceled the subscription of project with success"
}
StatusQuando ocorre
403A credencial não é do owner da organização
404Projeto não encontrado
409O projeto usa cobrança por hora ou por minuto, que não tem contrato (cant cancell subscription of payment mode hourly)

Exemplos

curl -X PATCH "https://api.zenifra.com/v1/project/507f1f77bcf86cd799439011/plan" \
  -H "x-api-key: sua-api-key" \
  -H "x-organization-id: sua-organization-id" \
  -H "Content-Type: application/json" \
  -d '{"plan": "premium"}'

Python

import requests

API_KEY = "sua-api-key"
ORGANIZATION_ID = "sua-organization-id"
PROJECT_ID = "507f1f77bcf86cd799439011"

response = requests.patch(
    f"https://api.zenifra.com/v1/project/{PROJECT_ID}/plan",
    headers={"x-api-key": API_KEY, "x-organization-id": ORGANIZATION_ID},
    json={"plan": "premium"}
)
print(response.json())

Observações

  • A mudança de plano pode levar alguns minutos para ser aplicada
  • A troca de plano só é aceita em projetos com cobrança por hora; a cobrança passa a usar o preço do novo plano a partir da troca
  • Ao mudar para um plano sem auto-scaling ou sem health check, esses recursos são desligados automaticamente
  • Planos com GPU (deep_learning_basic, deep_learning_premium) têm preços próprios; consulte GET /v1/project/plans

Última atualização em

Nessa página