Pular para o conteúdo principal

Usuários

O objeto User é a entidade raiz no Ozzie. Todos os outros recursos — intakes financeiros, planos, metas, transações, mensagens de chat — têm escopo para um usuário. Você cria um usuário por pessoa no seu sistema, identificado pelo seu próprio external_user_id.


O Objeto User

{
"object": "user",
"data": {
"id": "ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE",
"external_user_id": "usr_8821",
"name": "Maria Santos",
"email": "maria@example.com",
"phone": "+15551234567",
"language": "en",
"onboarding_stage": "active",
"created_at": "2025-05-05T14:30:00Z"
}
}

Campos do Objeto User

CampoTipoDescrição
idstringUUID gerado pelo Ozzie para este usuário. Use em todos os caminhos de API subsequentes.
external_user_idstringSeu ID de usuário interno. Único por cliente de API.
namestring | nullNome de exibição do usuário.
emailstring | nullEndereço de e-mail do usuário.
phonestring | nullNúmero de telefone do usuário no formato E.164. Necessário para integração com WhatsApp.
languagestringPreferência de idioma: "en", "pt" ou "es".
onboarding_stagestringEstado atual do onboarding (veja tabela abaixo).
created_atstringTimestamp UTC ISO 8601 de quando o usuário foi criado.

Valores de onboarding_stage

ValorSignificado
intake_pendingUsuário criado, nenhum intake financeiro enviado ainda
plan_pendingIntake enviado, plano ainda não gerado
activePlano gerado — acesso completo à plataforma disponível

POST /v1/users

Cria um novo usuário sob seu cliente de API. Cada usuário deve ter um external_user_id único dentro da sua conta de cliente.

Corpo da Requisição

CampoTipoObrigatórioRestriçõesDescrição
external_user_idstringSimMáx 100 charsSeu ID de usuário interno (ex.: chave primária do banco de dados ou UUID)
namestringNãoMáx 200 charsNome de exibição do usuário
emailstringNãoFormato de e-mail válidoEndereço de e-mail do usuário
phonestringNãoFormato E.164Número de telefone, ex.: +5511999999999. Necessário para WhatsApp.
languagestringNão"en" | "pt" | "es"Idioma do chat e notificações. Padrão "en".

Resposta

Retorna o objeto user criado com HTTP 201 Created.

Erros

CódigoHTTPQuando
CONFLICT409Já existe um usuário com este external_user_id sob seu cliente
VALIDATION_ERROR400Um campo falhou na validação (ex.: formato de e-mail inválido, telefone não em E.164)
UNAUTHORIZED401Credenciais ausentes ou inválidas

Exemplos

curl -X POST https://api.ozzieapp.com/v1/users \
-H "Authorization: Bearer czJjbGllbnQ6czJzZWNyZXQ=" \
-H "Content-Type: application/json" \
-d '{
"external_user_id": "usr_8821",
"name": "Ana Silva",
"email": "ana@exemplo.com.br",
"phone": "+5511999999999",
"language": "pt"
}'

Exemplo de Resposta (201 Created):

{
"object": "user",
"data": {
"id": "ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE",
"external_user_id": "usr_8821",
"name": "Ana Silva",
"email": "ana@exemplo.com.br",
"phone": "+5511999999999",
"language": "pt",
"onboarding_stage": "intake_pending",
"created_at": "2025-05-05T14:30:00Z"
}
}

Resposta de Erro — Usuário duplicado (409 Conflict):

{
"error": {
"code": "CONFLICT",
"message": "A user with external_user_id 'usr_8821' already exists under your API client. Use GET /v1/users/{user_id} to retrieve them."
}
}

Resposta de Erro — E-mail inválido (400 Validation Error):

{
"error": {
"code": "VALIDATION_ERROR",
"message": "Field 'email' must be a valid email address. Received: 'not-an-email'."
}
}
Tratando CONFLICT de forma elegante

Se não tiver certeza se um usuário já existe, capture o erro CONFLICT e imediatamente chame GET /v1/users/external:{external_user_id} para recuperar o registro existente. Isso é seguro para fazer em um fluxo estilo upsert.


GET /v1/users/{user_id}

Recupera um usuário pelo UUID Ozzie ou pelo external_user_id.

Parâmetro de Caminho

ParâmetroDescrição
user_idO UUID Ozzie (ex.: ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE) ou um ID externo com prefixo (ex.: external:usr_8821)

Busca por external_user_id

Para buscar um usuário pelo seu próprio ID em vez do UUID Ozzie, prefixe o valor com external::

GET /v1/users/external:usr_8821

Isso é equivalente a consultar por external_user_id e evita a necessidade de armazenar o UUID Ozzie no seu banco de dados no momento da criação.

Resposta

Retorna o objeto user com HTTP 200 OK.

Erros

CódigoHTTPQuando
NOT_FOUND404Nenhum usuário existe com este ID sob seu cliente
UNAUTHORIZED401Credenciais ausentes ou inválidas
FORBIDDEN403O usuário existe mas pertence a um cliente de API diferente

Exemplos

# Por UUID Ozzie
curl https://api.ozzieapp.com/v1/users/ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE \
-H "Authorization: Bearer czJjbGllbnQ6czJzZWNyZXQ="

# Por external_user_id
curl "https://api.ozzieapp.com/v1/users/external:usr_8821" \
-H "Authorization: Bearer czJjbGllbnQ6czJzZWNyZXQ="

Exemplo de Resposta (200 OK):

{
"object": "user",
"data": {
"id": "ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE",
"external_user_id": "usr_8821",
"name": "Ana Silva",
"email": "ana@exemplo.com.br",
"phone": "+5511999999999",
"language": "pt",
"onboarding_stage": "active",
"created_at": "2025-05-05T14:30:00Z"
}
}

Resposta de Erro — Não encontrado (404):

{
"error": {
"code": "NOT_FOUND",
"message": "No user found with id 'ozz_usr_NOTEXIST' under your API client."
}
}
Verificando onboarding_stage

Use GET /v1/users/{user_id} para verificar o onboarding_stage de um usuário antes de decidir qual UI mostrar. Se o estágio for intake_pending, solicite ao usuário seus detalhes financeiros. Se plan_pending, mostre um estado de carregamento enquanto aciona a geração do plano.