Saltar al contenido principal

Transacciones

Las transacciones son el flujo de datos central que alimenta el análisis de gastos, seguimiento de planes y recomendaciones personalizadas de Ozzie. Ozzie usa GPT-4o para analizar descripciones en lenguaje natural, imágenes de recibos (OCR), extractos bancarios en PDF y hojas de cálculo CSV en registros de transacciones estructurados y categorizados.

Un solo envío puede producir múltiples transacciones — por ejemplo, un mensaje de texto que diga "café $5 y almuerzo $15" producirá dos objetos de transacción separados.


El Objeto Transaction

{
"id": "ozz_txn_01HX9Q5NRWBF3KMZP4VC7YDLA",
"user_id": "ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE",
"amount_cents": 4500,
"currency": "USD",
"category": "food",
"description": "Compras en el supermercado",
"transaction_date": "2025-05-05",
"source": "api_text",
"ai_confidence": 0.97,
"created_at": "2025-05-05T14:34:00Z"
}

Campos del Objeto Transaction

CampoTipoDescripción
idstringUUID generado por Ozzie para esta transacción
user_idstringEl usuario Ozzie al que pertenece esta transacción
amount_centsintegerMonto de la transacción en centavos (ej.: 4500 = $45.00)
currencystringCódigo de moneda ISO 4217 (ej.: "USD", "BRL", "EUR")
categorystringCategoría de gasto (ver tabla abajo)
descriptionstringDescripción legible generada por IA de la transacción
transaction_datestringFecha de la transacción en formato YYYY-MM-DD
sourcestringCómo se envió la transacción (ver tabla abajo)
ai_confidencefloatPuntuación de confianza del parsing de IA de 0.0 a 1.0
created_atstringTimestamp UTC ISO 8601 de cuando se creó el registro en Ozzie

Valores de category

ValorDescripción
foodSupermercado, restaurantes, cafés, delivery de comida
transportGasolina, transporte público, aplicaciones de transporte, estacionamiento, peajes
housingAlquiler, hipoteca, seguro de hogar, reparaciones
utilitiesElectricidad, agua, internet, factura de teléfono
healthFarmacia, consultas médicas, gimnasio, seguro médico
entertainmentStreaming, cine, juegos, eventos
educationMatrícula, libros, cursos, suscripciones educativas
clothingRopa, calzado, accesorios
incomeSalario, pago freelance, ingreso adicional, reembolso
otherCualquier cosa que no encaje en las categorías anteriores

Valores de source

ValorDescripción
whatsapp_textMensaje de texto recibido via WhatsApp
whatsapp_imageImagen (recibo/captura) recibida via WhatsApp
api_textTexto enviado via API REST
api_imageImagen enviada via API REST (base64)
api_pdfTexto extraído de PDF enviado via API REST
api_spreadsheetDatos CSV enviados via API REST

POST /v1/users/{user_id}/transactions

Envía una o más transacciones para parsing. Ozzie usa GPT-4o para extraer datos estructurados de transacciones del contenido proporcionado. El campo type determina cómo se interpreta el contenido.

Parámetros de Ruta

ParámetroDescripción
user_idEl UUID Ozzie del usuario o external:{external_user_id}

Cuerpo de la Solicitud — Unión Discriminada por type

La forma del cuerpo de la solicitud depende del campo type. Todos los tipos comparten el campo language.

type: "text"

Envía una descripción en lenguaje natural de una o más transacciones.

CampoTipoRequeridoDescripción
typestringDebe ser "text"
contentstringDescripción de transacción en lenguaje natural
languagestringNoSugerencia de idioma para parsing: "en" | "pt" | "es". Predeterminado: idioma del usuario.
{
"type": "text",
"content": "Gasté $45 en el supermercado y $12 en el metro",
"language": "es"
}

type: "image"

Envía un recibo, captura de pantalla o foto de una compra como imagen codificada en base64. Ozzie realiza OCR y analiza el resultado.

CampoTipoRequeridoDescripción
typestringDebe ser "image"
contentstringDatos de imagen codificados en base64
mime_typestringTipo MIME de la imagen: "image/jpeg" | "image/png" | "image/webp"
languagestringNoSugerencia de idioma para OCR y parsing
{
"type": "image",
"content": "/9j/4AAQSkZJRgABAQEASABIAAD...",
"mime_type": "image/jpeg",
"language": "es"
}

type: "pdf"

Envía el contenido de texto extraído de un extracto bancario o recibo en PDF. Extrae el texto del PDF de tu lado antes de enviar.

CampoTipoRequeridoDescripción
typestringDebe ser "pdf"
contentstringTexto simple extraído del PDF
languagestringNoSugerencia de idioma para parsing
{
"type": "pdf",
"content": "EXTRACTO BANCARIO\nFecha: 2025-05-01\nComercio: Amazon.com\nMonto: -$89.99\nFecha: 2025-05-02\nComercio: Netflix\nMonto: -$15.99",
"language": "es"
}

type: "spreadsheet"

Envía datos de transacción en formato CSV. Incluye una fila de encabezado. Ozzie normaliza nombres de columnas de forma flexible (ej.: Fecha / date / transaction_date son todos reconocidos).

CampoTipoRequeridoDescripción
typestringDebe ser "spreadsheet"
contentstringString CSV con fila de encabezado
languagestringNoSugerencia de idioma para parsing
{
"type": "spreadsheet",
"content": "fecha,descripcion,monto\n2025-05-01,Supermercado,45.00\n2025-05-02,Metro,12.00\n2025-05-03,Netflix,15.99",
"language": "es"
}

Respuesta

Devuelve un objeto transaction_list que contiene todas las transacciones analizadas del envío.

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

Errores

CódigoHTTPCuándo
NOT_FOUND404El user_id no existe
VALIDATION_ERROR400Campos requeridos faltantes, type inválido o mime_type no soportado
UNAUTHORIZED401Credenciales ausentes o inválidas

Ejemplos — 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": "Gasté $45 en el supermercado y $12 en el metro",
"language": "es"
}'

Ejemplo de Respuesta — 2 transacciones analizadas de un mensaje de texto (201 Created):

{
"object": "transaction_list",
"data": {
"transactions": [
{
"id": "ozz_txn_01HX9Q5NRWBF3KMZP4VC7YDLA",
"user_id": "ozz_usr_01HX9KZMR4P5JQNBVT7YCW3DE",
"amount_cents": 4500,
"currency": "USD",
"category": "food",
"description": "Compras en el supermercado",
"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": "USD",
"category": "transport",
"description": "Billete de metro",
"transaction_date": "2025-05-05",
"source": "api_text",
"ai_confidence": 0.95,
"created_at": "2025-05-05T14:34:00Z"
}
]
}
}
Múltiples transacciones por envío

Ozzie analiza intencionalmente todas las transacciones distintas de una sola entrada. Una visita al supermercado más una parada en el café en el mismo mensaje producirá dos registros de transacción separados. Esto coincide con el uso real donde los usuarios describen su día en un solo mensaje.

Consejo para envío de imágenes

Para imágenes de recibo, JPEG y PNG funcionan bien. Asegúrate de que la imagen sea menor de 10MB antes de la codificación base64. Las imágenes muy borrosas o rotadas pueden resultar en puntuaciones de ai_confidence más bajas (por debajo de 0.7). Considera pedir al usuario que tome otra foto si la confianza es baja.


GET /v1/users/{user_id}/transactions

Devuelve una lista paginada de transacciones de un usuario, ordenada por transaction_date descendente (más reciente primero).

Parámetros de Ruta

ParámetroDescripción
user_idEl UUID Ozzie del usuario o external:{external_user_id}

Parámetros de Query

ParámetroTipoPredeterminadoDescripción
limitinteger50Número de transacciones por página. Máximo 200.
cursorstringCursor datetime ISO 8601 para paginación. Devuelve transacciones más antiguas que este timestamp.
fromstringFiltro: incluir transacciones a partir de esta fecha (YYYY-MM-DD).
tostringFiltro: incluir transacciones hasta esta fecha (YYYY-MM-DD).
categorystringFiltrar por categoría (ej.: food, transport). Separa con coma para múltiples: food,transport.

Respuesta

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

Errores

CódigoHTTPCuándo
NOT_FOUND404El user_id no existe
VALIDATION_ERROR400Formato de fecha from/to inválido, o limit fuera de rango
UNAUTHORIZED401Credenciales ausentes o inválidas
El monto siempre está en centavos

amount_cents es siempre un entero en la unidad monetaria más pequeña (centavos para USD, etc.). Divide entre 100 para mostrar montos en dólares. Esto evita problemas de precisión de punto flotante.

Interpretación de ai_confidence

Puntuaciones superiores a 0.85 indican alta confianza en la categoría y monto analizados. Puntuaciones entre 0.6 y 0.85 pueden beneficiarse de confirmación del usuario. Puntuaciones por debajo de 0.6 sugieren que la entrada era ambigua — considera pedir al usuario que aclare. Ozzie nunca descarta silenciosamente transacciones de baja confianza; siempre se devuelven.