Pular para o conteúdo principal

Plano

O Plano é a saída central do mecanismo de análise financeira do Ozzie. Ele recebe os dados de intake financeiro do usuário (renda, despesas, dívidas, metas) e produz um roteiro estruturado com alocações orçamentárias, marcos projetados e itens de ação priorizados.

O plano é o pré-requisito para gerar money moves e molda todas as respostas do coach de IA no chat.


Referência do objeto

CampoTipoDescrição
idstringIdentificador único do plano
user_idstringO usuário Ozzie a quem este plano pertence
timeline_monthsintegerMeses projetados para atingir o objetivo principal do usuário
allocationsobjectDivisão orçamentária JSONB por categoria (percentuais)
allocations.needsnumber% da renda líquida alocada para necessidades essenciais
allocations.wantsnumber% da renda líquida alocada para gastos discricionários
allocations.savingsnumber% da renda líquida alocada para poupança
allocations.debtnumber% da renda líquida alocada para pagamento de dívidas
key_metricsobjectPrincipais indicadores financeiros projetados
key_metrics.monthly_savings_amountnumberValor em dinheiro economizado por mês sob este plano
key_metrics.projected_goal_datestring (ISO 8601)Data estimada em que o usuário atinge sua meta
key_metrics.current_savings_ratenumberTaxa de poupança atual como percentual da renda
key_metrics.target_savings_ratenumberTaxa de poupança recomendada para atingir a meta no prazo
key_metrics.debt_payoff_datestring (ISO 8601) | nullData projetada de quitação de dívida (se a meta for dívida)
action_itemsstring[]Lista ordenada de próximas ações recomendadas
personality_typestring | nullPerfil de personalidade aplicado (se personalizado)
created_atstring (ISO 8601)Quando o plano foi gerado
updated_atstring (ISO 8601)Quando o plano foi atualizado pela última vez

POST /v1/users/{user_id}/plan

Calcula um novo plano financeiro para o usuário, ou recupera e atualiza um existente. Se já existe um plano, chamar este endpoint o recalcula com base no intake e dados de transações mais recentes.

aviso

Este endpoint requer que um intake financeiro exista para o usuário. Se nenhum intake foi enviado, você receberá um erro INTAKE_REQUIRED.

informação

A geração de plano é idempotente por usuário. Você pode chamar este endpoint com segurança várias vezes — o Ozzie retornará o plano mais atual, recalculando se novos dados de intake ou transações foram enviados desde a última geração.

Parâmetros de caminho

ParâmetroTipoObrigatórioDescrição
user_idstringSimO ID do usuário Ozzie

Corpo da requisição

Nenhum corpo de requisição necessário. O Ozzie lê todos os dados do intake e transações existentes do usuário.

Requisição

curl -X POST https://api.ozzieapp.com/v1/users/usr_4f8a1b2c3d/plan \
-H "Authorization: Bearer ozp_Y2xpZW50X2ExYjJjM2Q0OnNrX2xpdmVfeEs5bVAycVI3dEwu" \
-H "Content-Type: application/json"

Resposta

{
"object": "plan",
"data": {
"id": "pln_8b3d1e9f2a",
"user_id": "usr_4f8a1b2c3d",
"timeline_months": 57,
"allocations": {
"needs": 60,
"wants": 20,
"savings": 15,
"debt": 5
},
"key_metrics": {
"monthly_savings_amount": 562.50,
"projected_goal_date": "2029-11-01T00:00:00Z",
"current_savings_rate": 8,
"target_savings_rate": 15,
"debt_payoff_date": null
},
"action_items": [
"Aumente sua contribuição de poupança de 8% para 15% da renda líquida — comece com R$562,50/mês",
"Reduza os gastos discricionários (atualmente 28%) para 20% cortando saídas para comer e assinaturas de streaming",
"Configure uma transferência automática no dia do pagamento para que a poupança aconteça antes de gastar",
"Revise seus gastos com alimentação — você está R$120/mês acima de uma linha de base razoável para sua renda",
"Quando seu fundo de emergência atingir R$3.000, considere abrir uma conta poupança de alto rendimento"
],
"personality_type": null,
"created_at": "2025-05-05T14:50:00Z",
"updated_at": "2025-05-05T14:50:00Z"
}
}

Erros

CódigoStatus HTTPQuando ocorre
UNAUTHORIZED401Credenciais ausentes ou inválidas
NOT_FOUND404O usuário não existe
INTAKE_REQUIRED422Nenhum intake financeiro existe para o usuário
INTERNAL_ERROR500Falha no cálculo do plano — seguro para tentar novamente

POST /v1/users/{user_id}/plan/personalize

Ajusta o plano existente do usuário com base em um perfil de personalidade. Planos com consciência de personalidade ajustam a linguagem, ritmo e ênfase das recomendações para combinar com a forma como o usuário pensa sobre dinheiro.

informação

A personalização requer que um plano já exista. Chame POST /plan primeiro, depois chame /plan/personalize para adicionar o perfil de personalidade.

Parâmetros de caminho

ParâmetroTipoObrigatórioDescrição
user_idstringSimO ID do usuário Ozzie

Corpo da requisição

CampoTipoObrigatórioDescrição
personality_typestringSimO identificador do perfil de personalidade (ex.: "optimizer", "avoider", "planner", "spender")

Tipos de personalidade

TipoDescrição
"optimizer"Orientado a dados, motivado por eficiência e retornos máximos
"planner"Metódico, prefere roteiros detalhados e previsibilidade
"avoider"Ansioso com finanças; precisa de reasseguramento e pequenas vitórias
"spender"Orientado ao estilo de vida; precisa de estratégias que não pareçam privação

Requisição

curl -X POST https://api.ozzieapp.com/v1/users/usr_4f8a1b2c3d/plan/personalize \
-H "Authorization: Bearer ozp_Y2xpZW50X2ExYjJjM2Q0OnNrX2xpdmVfeEs5bVAycVI3dEwu" \
-H "Content-Type: application/json" \
-d '{
"personality_type": "avoider"
}'

Resposta

Retorna o plano atualizado com o perfil de personalidade aplicado. Observe como os action_items mudam para passos mais suaves e menores para um perfil "avoider".

{
"object": "plan",
"data": {
"id": "pln_8b3d1e9f2a",
"user_id": "usr_4f8a1b2c3d",
"timeline_months": 57,
"allocations": {
"needs": 60,
"wants": 20,
"savings": 15,
"debt": 5
},
"key_metrics": {
"monthly_savings_amount": 562.50,
"projected_goal_date": "2029-11-01T00:00:00Z",
"current_savings_rate": 8,
"target_savings_rate": 15,
"debt_payoff_date": null
},
"action_items": [
"Você já está poupando — isso é algo para se sentir bem. Vamos apenas crescer um pouco mais.",
"Tente transferir apenas R$50 a mais por pagamento para poupança este mês. Um pequeno passo.",
"Você não precisa cortar tudo. Escolha uma despesa esta semana que pareceu esquecível e pause.",
"Configure uma transferência automática de R$50 no dia do pagamento — você não vai notar, mas sua poupança vai.",
"Sua meta é alcançável. Neste ritmo você terá R$3.000 economizados em 6 meses."
],
"personality_type": "avoider",
"created_at": "2025-05-05T14:50:00Z",
"updated_at": "2025-05-05T15:10:00Z"
}
}

Erros

CódigoStatus HTTPQuando ocorre
UNAUTHORIZED401Credenciais ausentes ou inválidas
NOT_FOUND404O usuário não existe
PLAN_REQUIRED422Nenhum plano existe ainda — chame POST /plan primeiro
PERSONALITY_REQUIRED422Campo personality_type ausente no corpo da requisição
VALIDATION_ERROR422Valor de personality_type desconhecido
INVALID_JSON400Corpo da requisição não é JSON válido
dica

Você pode determinar o tipo de personalidade de um usuário realizando um quiz curto no seu fluxo de onboarding e depois passando o resultado aqui. O string personality_type é armazenado no plano e refletido em todas as respostas subsequentes do coach de IA para esse usuário.