Pular para o conteúdo principal

Transações

Transações são o fluxo de dados central que alimenta a análise de gastos, rastreamento de planos e recomendações personalizadas do Ozzie. O Ozzie usa GPT-4o para analisar descrições em linguagem natural, imagens de recibos (OCR), extratos bancários em PDF e planilhas CSV em registros de transações estruturados e categorizados.

Um único envio pode resultar em múltiplas transações — por exemplo, uma mensagem de texto dizendo "café R$5 e almoço R$15" produzirá dois objetos de transação separados.


O Objeto Transaction

{
"id": "ozz_txn_01HX9Q5NRWBF3KMZP4VC7YDLA",
"user_id": "ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE",
"amount_cents": 4500,
"currency": "BRL",
"category": "food",
"description": "Compras no Supermercado Extra",
"transaction_date": "2025-05-05",
"source": "api_text",
"ai_confidence": 0.97,
"created_at": "2025-05-05T14:34:00Z"
}

Campos do Objeto Transaction

CampoTipoDescrição
idstringUUID gerado pelo Ozzie para esta transação
user_idstringO usuário Ozzie a quem esta transação pertence
amount_centsintegerValor da transação em centavos (ex.: 4500 = R$45,00)
currencystringCódigo de moeda ISO 4217 (ex.: "BRL", "USD", "EUR")
categorystringCategoria de gasto (veja tabela abaixo)
descriptionstringDescrição legível gerada por IA da transação
transaction_datestringData da transação no formato YYYY-MM-DD
sourcestringComo a transação foi enviada (veja tabela abaixo)
ai_confidencefloatPontuação de confiança do parsing de IA de 0.0 a 1.0
created_atstringTimestamp UTC ISO 8601 de quando o registro foi criado no Ozzie

Valores de category

ValorDescrição
foodSupermercado, restaurantes, cafés, delivery de comida
transportGasolina, transporte público, aplicativos de corrida, estacionamento, pedágios
housingAluguel, hipoteca, seguro residencial, reformas
utilitiesEletricidade, água, internet, conta de telefone
healthFarmácia, consultas médicas, academia, plano de saúde
entertainmentStreaming, cinema, jogos, eventos
educationMensalidades, livros, cursos, assinaturas educacionais
clothingRoupas, calçados, acessórios
incomeSalário, pagamento freelance, renda extra, reembolso
otherQualquer coisa que não se encaixe nas categorias acima

Valores de source

ValorDescrição
whatsapp_textMensagem de texto recebida via WhatsApp
whatsapp_imageImagem (recibo/screenshot) recebida via WhatsApp
api_textTexto enviado via API REST
api_imageImagem enviada via API REST (base64)
api_pdfTexto extraído de PDF enviado via API REST
api_spreadsheetDados CSV enviados via API REST

POST /v1/users/{user_id}/transactions

Envie uma ou mais transações para parsing. O Ozzie usa GPT-4o para extrair dados estruturados de transações do conteúdo fornecido. O campo type determina como o conteúdo é interpretado.

Parâmetros de Caminho

ParâmetroDescrição
user_idO UUID Ozzie do usuário ou external:{external_user_id}

Corpo da Requisição — União Discriminada por type

A forma do corpo da requisição depende do campo type. Todos os tipos compartilham o campo language.

type: "text"

Envie uma descrição em linguagem natural de uma ou mais transações.

CampoTipoObrigatórioDescrição
typestringSimDeve ser "text"
contentstringSimDescrição de transação em linguagem natural
languagestringNãoDica de idioma para parsing: "en" | "pt" | "es". Padrão: idioma do usuário.
{
"type": "text",
"content": "Gastei R$45 no supermercado e R$12 no metrô",
"language": "pt"
}

type: "image"

Envie um recibo, screenshot ou foto de uma compra como imagem codificada em base64. O Ozzie realiza OCR e analisa o resultado.

CampoTipoObrigatórioDescrição
typestringSimDeve ser "image"
contentstringSimDados de imagem codificados em base64
mime_typestringSimTipo MIME da imagem: "image/jpeg" | "image/png" | "image/webp"
languagestringNãoDica de idioma para OCR e parsing
{
"type": "image",
"content": "/9j/4AAQSkZJRgABAQEASABIAAD...",
"mime_type": "image/jpeg",
"language": "pt"
}

type: "pdf"

Envie o conteúdo de texto extraído de um extrato bancário ou recibo em PDF. Extraia o texto do PDF do seu lado antes de enviar.

CampoTipoObrigatórioDescrição
typestringSimDeve ser "pdf"
contentstringSimTexto simples extraído do PDF
languagestringNãoDica de idioma para parsing
{
"type": "pdf",
"content": "EXTRATO BANCÁRIO\nData: 2025-05-01\nEstabelecimento: Amazon.com.br\nValor: -R$89,99\nData: 2025-05-02\nEstabelecimento: Netflix\nValor: -R$39,90",
"language": "pt"
}

type: "spreadsheet"

Envie dados de transação formatados em CSV. Inclua uma linha de cabeçalho. O Ozzie normaliza nomes de colunas de forma flexível (ex.: Data / date / transaction_date são todos reconhecidos).

CampoTipoObrigatórioDescrição
typestringSimDeve ser "spreadsheet"
contentstringSimString CSV com linha de cabeçalho
languagestringNãoDica de idioma para parsing
{
"type": "spreadsheet",
"content": "data,descricao,valor\n2025-05-01,Supermercado Extra,45.00\n2025-05-02,Metrô,12.00\n2025-05-03,Netflix,39.90",
"language": "pt"
}

Resposta

Retorna um objeto transaction_list contendo todas as transações analisadas do envio. Um único envio pode produzir uma ou muitas transações.

{
"object": "transaction_list",
"data": {
"transactions": [ ... ]
}
}

Erros

CódigoHTTPQuando
NOT_FOUND404O user_id não existe
VALIDATION_ERROR400Campos obrigatórios ausentes, type inválido ou mime_type não suportado
UNAUTHORIZED401Credenciais ausentes ou inválidas

Exemplos — Entrada de Texto

curl -X POST \
https://api.ozzieapp.com/v1/users/ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE/transactions \
-H "Authorization: Bearer czJjbGllbnQ6czJzZWNyZXQ=" \
-H "Content-Type: application/json" \
-d '{
"type": "text",
"content": "Gastei R$45 no supermercado e R$12 no metrô",
"language": "pt"
}'

Exemplo de Resposta — 2 transações analisadas de uma mensagem de texto (201 Created):

{
"object": "transaction_list",
"data": {
"transactions": [
{
"id": "ozz_txn_01HX9Q5NRWBF3KMZP4VC7YDLA",
"user_id": "ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE",
"amount_cents": 4500,
"currency": "BRL",
"category": "food",
"description": "Compras no Supermercado Extra",
"transaction_date": "2025-05-05",
"source": "api_text",
"ai_confidence": 0.97,
"created_at": "2025-05-05T14:34:00Z"
},
{
"id": "ozz_txn_01HX9Q5NRWBF3KMZP4VC7YDLB",
"user_id": "ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE",
"amount_cents": 1200,
"currency": "BRL",
"category": "transport",
"description": "Passagem de metrô",
"transaction_date": "2025-05-05",
"source": "api_text",
"ai_confidence": 0.95,
"created_at": "2025-05-05T14:34:00Z"
}
]
}
}
Múltiplas transações por envio

O Ozzie intencionalmente analisa todas as transações distintas de uma única entrada. Uma ida ao supermercado mais uma parada no café na mesma mensagem produzirá dois registros de transação separados. Isso corresponde ao uso real onde os usuários descrevem seu dia em uma única mensagem.

Dica para envio de imagem

Para imagens de recibo, JPEG e PNG funcionam bem. Certifique-se de que a imagem seja menor que 10MB antes da codificação em base64. Imagens muito borradas ou rotacionadas podem resultar em pontuações de ai_confidence mais baixas (abaixo de 0.7). Considere pedir ao usuário para tirar a foto novamente se a confiança estiver baixa.


GET /v1/users/{user_id}/transactions

Retorna uma lista paginada de transações de um usuário, ordenada por transaction_date decrescente (mais recente primeiro).

Parâmetros de Caminho

ParâmetroDescrição
user_idO UUID Ozzie do usuário ou external:{external_user_id}

Parâmetros de Query

ParâmetroTipoPadrãoDescrição
limitinteger50Número de transações por página. Máximo 200.
cursorstringCursor datetime ISO 8601 para paginação. Retorna transações mais antigas que este timestamp.
fromstringFiltro: incluir transações a partir desta data (YYYY-MM-DD).
tostringFiltro: incluir transações até esta data (YYYY-MM-DD).
categorystringFiltrar por categoria (ex.: food, transport). Separe por vírgula para múltiplas: food,transport.

Resposta

{
"object": "list",
"data": {
"transactions": [ ... ],
"has_more": true,
"next_cursor": "2025-04-28T09:15:00Z",
"total_count": 142
}
}

Erros

CódigoHTTPQuando
NOT_FOUND404O user_id não existe
VALIDATION_ERROR400Formato de data from/to inválido, ou limit fora do intervalo
UNAUTHORIZED401Credenciais ausentes ou inválidas

Exemplos

# Transações de maio de 2025
curl "https://api.ozzieapp.com/v1/users/ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE/transactions?from=2025-05-01&to=2025-05-31&limit=100" \
-H "Authorization: Bearer czJjbGllbnQ6czJzZWNyZXQ="

# Próxima página usando cursor
curl "https://api.ozzieapp.com/v1/users/ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE/transactions?from=2025-05-01&to=2025-05-31&limit=100&cursor=2025-05-20T10:00:00Z" \
-H "Authorization: Bearer czJjbGllbnQ6czJzZWNyZXQ="
O valor sempre está em centavos

amount_cents é sempre um inteiro na menor unidade monetária (centavos para BRL/USD, etc.). Divida por 100 para exibir valores em reais. Isso evita problemas de precisão de ponto flutuante.

Interpretação de ai_confidence

Pontuações acima de 0.85 indicam alta confiança na categoria e valor analisados. Pontuações entre 0.6 e 0.85 podem se beneficiar de confirmação do usuário. Pontuações abaixo de 0.6 sugerem que a entrada foi ambígua — considere pedir ao usuário que esclareça. O Ozzie nunca descarta silenciosamente transações de baixa confiança; elas são sempre retornadas.