curl --request POST \
--url https://api.example.com/api/upload-image \
--header 'Content-Type: application/json' \
--data '{}'{
"success": true,
"url": "<string>",
"analysis": "<string>",
"data": {
"es_ticket": true,
"monto": 123,
"comercio": "<string>",
"categoria_sugerida": "<string>",
"items": [
{}
],
"fecha": "<string>",
"descripcion": "<string>",
"razon": "<string>",
"sugerencia": "<string>"
}
}Upload receipt images with AI-powered OCR analysis using Gemini Vision
curl --request POST \
--url https://api.example.com/api/upload-image \
--header 'Content-Type: application/json' \
--data '{}'{
"success": true,
"url": "<string>",
"analysis": "<string>",
"data": {
"es_ticket": true,
"monto": 123,
"comercio": "<string>",
"categoria_sugerida": "<string>",
"items": [
{}
],
"fecha": "<string>",
"descripcion": "<string>",
"razon": "<string>",
"sugerencia": "<string>"
}
}facturasPOST /api/upload-image
multipart/form-data format.Supported formats: JPG, PNG, WEBPRecommended: Clear photos of receipts, invoices, or purchase ticketsmultipart/form-data
es_ticket: true)YYYY-MM-DD formates_ticket: false)const formData = new FormData();
const fileInput = document.querySelector('input[type="file"]');
formData.append('image', fileInput.files[0]);
const response = await fetch('/api/upload-image', {
method: 'POST',
body: formData
});
const result = await response.json();
console.log('Analysis:', result.analysis);
console.log('Amount:', result.data.monto);
{
"success": true,
"url": "https://example.supabase.co/storage/v1/object/public/facturas/ticket_1709740800000_receipt.jpg",
"analysis": "📸 **TICKET ANALIZADO:**\n\n💰 **Monto:** $450.50 MXN\n🏪 **Comercio:** Pemex\n📁 **Categoría sugerida:** Transporte\n📋 **Items:** Magna Premium 30L, Total\n📅 **Fecha:** 2024-03-06\n\n📝 **Descripción:** Llenado de combustible en Pemex",
"data": {
"es_ticket": true,
"monto": 450.50,
"comercio": "Pemex",
"categoria_sugerida": "Transporte",
"items": ["Magna Premium 30L", "Total"],
"fecha": "2024-03-06",
"descripcion": "Llenado de combustible en Pemex"
}
}
{
"success": true,
"url": "https://example.supabase.co/storage/v1/object/public/facturas/ticket_1709827200000_walmart.jpg",
"analysis": "📸 **TICKET ANALIZADO:**\n\n💰 **Monto:** $350 MXN\n🏪 **Comercio:** Walmart\n📁 **Categoría sugerida:** Alimentación\n📋 **Items:** Leche, Pan, Huevos, Verduras\n📅 **Fecha:** 2024-03-09\n\n📝 **Descripción:** Compra de despensa en Walmart",
"data": {
"es_ticket": true,
"monto": 350.00,
"comercio": "Walmart",
"categoria_sugerida": "Alimentación",
"items": ["Leche", "Pan", "Huevos", "Verduras"],
"fecha": "2024-03-09",
"descripcion": "Compra de despensa en Walmart"
}
}
{
"success": true,
"url": "https://example.supabase.co/storage/v1/object/public/facturas/ticket_1709913600000_screenshot.jpg",
"analysis": "⚠️ **IMAGEN NO RECONOCIDA COMO TICKET**\n\nEsta es una captura de pantalla de una conversación de texto, no un ticket o factura.\n\n💡 **Sugerencia:** Por favor sube una foto de un ticket, factura o recibo de compra para que pueda analizarlo.\n\nSi quieres registrar algo manualmente, dime:\n- ¿Es gasto o ingreso?\n- Monto\n- Comercio/Proveedor\n- Categoría",
"data": {
"es_ticket": false,
"razon": "Esta es una captura de pantalla de una conversación de texto, no un ticket o factura",
"sugerencia": "Por favor sube una foto de un ticket, factura o recibo de compra para que pueda analizarlo"
}
}
{
"error": "No image provided"
}
facturas
ticket_{timestamp}_{original_name}es_ticket)analysis)data)response_format: { type: 'json_object' } to ensure structured JSON output. Temperature is set to 0.1 for consistent, accurate extractions.facturas (Supabase Storage)ticket_{timestamp}_{original_filename}/api/chat/stream for conversational transaction registration:
// 1. Upload image
const uploadResult = await uploadImage(file);
// 2. Send to chat with OCR data
const chatResponse = await fetch('/api/chat/stream', {
method: 'POST',
body: JSON.stringify({
message: 'Registra este gasto',
images: [uploadResult.url],
messages: []
})
});