# API Enterprise de Fotofacturas > API REST para integrar la recuperación de facturas CFDI 4.0 a partir de fotos de tickets en México. Tu sistema sube la foto de un ticket y recibe el CFDI (PDF y XML) que emite el comercio. Fotofacturas RECUPERA facturas, no las emite: identifica el comercio del ticket y gestiona la facturación con él (portal, correo o teléfono) hasta obtener el CFDI. Fotofacturas no es un PAC ni un emisor; la factura la emite el comercio y esta API la consigue y la entrega. - Base URL: https://api.fotofacturas.ai/B2B/ - Formato: JSON (salvo los endpoints multipart/form-data indicados) - Documentación web: https://fotofacturas.ai/docs - Acceso: se habilita por cuenta; solicita credenciales en https://calendar.app.google/vYyxzDJAC86ajhjh6 - ¿Necesitas usar la infraestructura de Fotofacturas (app, canal de WhatsApp) en lugar de integrar por API? Es otra API: solicita acceso en la misma liga. --- ## Autenticación Todas las peticiones llevan un token Bearer en el header Authorization: ``` Authorization: Bearer ``` Un 401 significa token no válido o expirado. El token identifica tu cuenta B2B y sus límites; guárdalo como secreto en tu backend. --- ## Envelope FFResponse Todas las respuestas comparten la misma estructura: - isSuccess (boolean): Indica si la operación fue o no exitosa. - message (string): Mensaje informativo del estado de la petición: confirmación de éxito o la razón de una operación fallida. - data (object | array | null): Información solicitada. Depende del endpoint: algunos no regresan data. ## Códigos HTTP - 200: Petición correcta. - 400: Parámetros incorrectos. - 401: Token de autenticación no válido o expirado. - 404: No encontrado. - 500: Fallo en el servidor. Los errores de negocio (p. ej. ticket ilegible) no son errores HTTP: la petición responde 200 y el resultado se comunica con isSuccess, message y los códigos de ticket (ver catálogo al final). --- ## Tickets (TicketV1) Sube tickets a partir de una foto y consulta su estado y sus archivos (PDF y XML del CFDI) cuando la factura se recupera. ### CreateTicket Registra un nuevo ticket en la plataforma a partir de la foto. Es el endpoint central de la integración: recibe la imagen por multipart/form-data junto con el contexto fiscal del usuario, y a partir de ahí Fotofacturas gestiona la recuperación del CFDI con el comercio. POST https://api.fotofacturas.ai/B2B/TicketV1/CreateTicket Body (multipart/form-data): - image (file, requerido): Foto del ticket (el ticket completo y legible). JPG o PNG. - ticketPaymentMethodId (string, requerido): Método de pago del ticket. Catálogo: GetTicketPaymentMethods. - userTaxInfoId (int, requerido): Información fiscal del usuario con la que se factura (ver AddUserTaxInfo). - regimenFiscalId (int, requerido): Régimen fiscal del receptor. Catálogo: GetRegimenFiscalAndCFDI. - usoCfdiId (string, requerido): Uso de CFDI (p. ej. G03). Catálogo: GetRegimenFiscalAndCFDI. - cardLastFour (string, opcional): Últimos 4 dígitos de la tarjeta cuando el pago fue con tarjeta. - userId (int, requerido): Usuario dueño del ticket. Ejemplo cURL: ``` curl -X POST "https://api.fotofacturas.ai/B2B/TicketV1/CreateTicket" \ -H "Authorization: Bearer $FF_API_TOKEN" \ -F "image=@ticket.jpg" \ -F "ticketPaymentMethodId=28" \ -F "userTaxInfoId=10423" \ -F "regimenFiscalId=626" \ -F "usoCfdiId=G03" \ -F "cardLastFour=1234" \ -F "userId=3" ``` Respuesta 200: ```json { "isSuccess": true, "message": "Ticket creado exitosamente", "data": null } ``` Nota: El procesamiento es asíncrono: el resultado (facturado, ilegible, expirado…) se consulta después con GetTicketById o se interpreta con los códigos de ticket. ### GetTicketsByMonth Obtiene la lista de tickets de la cuenta filtrados por mes y año. GET https://api.fotofacturas.ai/B2B/TicketV1/GetTicketsByMonth Parámetros (query string): - month (int, requerido): Mes (1–12). - year (int, requerido): Año (p. ej. 2026). Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/TicketV1/GetTicketsByMonth?month=4&year=2026" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": [ { "userTicketId": 88254, "userId": 3, "ticketUrl": "https://…/ticket.jpg", "pdfUrl": null, "xmlUrl": null, "ticketDate": null, "ticketAmount": null, "ticketPaymentMethodId": "28", "ticketPaymentMethod": "Tarjeta de débito", "ticketStatusId": 5, "ticketStatus": "WAITING INVOICE EMAIL", "taxIdentifier": "XAXX010101ABC", "taxName": "JUAN PEREZ", "xmlData": null, "clientName": "Juan Pérez García", "clientEmail": "usuario@empresa.com", "createDate": "2026-04-14T20:10:02.430074", "updateDate": "2026-04-14T20:10:02.430074" } ], "isSuccess": true, "message": "Tickets obtenidos para 4/2026" } ``` Nota: pdfUrl y xmlUrl se llenan cuando la factura se recupera; ticketStatus refleja el paso del proceso en el que va el ticket. ### GetTicketsByUser Obtiene todos los tickets de un usuario específico. GET https://api.fotofacturas.ai/B2B/TicketV1/GetTicketsByUser Parámetros (query string): - userId (int, requerido): ID del usuario. Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/TicketV1/GetTicketsByUser?userId=3" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": [ { "userTicketId": 88254, "userId": 3, "ticketUrl": "https://…/ticket.jpg", "pdfUrl": null, "xmlUrl": null, "ticketDate": null, "ticketAmount": null, "ticketPaymentMethodId": "28", "ticketPaymentMethod": "Tarjeta de débito", "ticketStatusId": 5, "ticketStatus": "WAITING INVOICE EMAIL", "taxIdentifier": "XAXX010101ABC", "taxName": "JUAN PEREZ", "xmlData": null, "clientName": "Juan Pérez García", "clientEmail": "usuario@empresa.com", "createDate": "2026-04-14T20:10:02.430074", "updateDate": "2026-04-14T20:10:02.430074" } ], "isSuccess": true, "message": "Tickets obtenidos para usuario 3" } ``` ### GetTicketById Consulta la información detallada de un ticket específico mediante su ID. GET https://api.fotofacturas.ai/B2B/TicketV1/GetTicketById Parámetros (query string): - userTicketId (int, requerido): ID del ticket. Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/TicketV1/GetTicketById?userTicketId=88254" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": { "userTicketId": 88254, "userId": 3, "ticketUrl": "https://…/ticket.jpg", "pdfUrl": null, "xmlUrl": null, "ticketDate": null, "ticketAmount": null, "ticketPaymentMethodId": "28", "ticketPaymentMethod": "Tarjeta de débito", "ticketStatusId": 5, "ticketStatus": "WAITING INVOICE EMAIL", "taxIdentifier": "XAXX010101ABC", "taxName": "JUAN PEREZ", "xmlData": null, "clientName": "Juan Pérez García", "clientEmail": "usuario@empresa.com", "createDate": "2026-04-14T20:10:02.430074", "updateDate": "2026-04-14T20:10:02.430074" }, "isSuccess": true, "message": "Ticket obtenido exitosamente" } ``` --- ## Usuarios (UserV1) Administra a los usuarios finales de tu integración: altas, actualizaciones, estado y su información fiscal (constancia de situación fiscal). ### GetUsersByAssociation Obtiene el listado de todos los usuarios vinculados a una asociación específica. GET https://api.fotofacturas.ai/B2B/UserV1/GetUsersByAssociation Parámetros (query string): - associationId (int, requerido): ID de la asociación. Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/UserV1/GetUsersByAssociation?associationId=41" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": [ { "userId": 10619, "createDate": "2026-01-27T21:06:34.3608", "updateDate": "2026-01-27T21:06:34.3608", "isActive": true, "isDeleted": false, "fullName": "Juan Pérez García", "email": "usuario@empresa.com", "phone": "525512345678", "isEmailVerified": false, "isPhoneVerified": false, "associationId": 41, "associationName": "EMPRESA MATRIZ (B2B)", "taxInfos": [ { "userId": 10619, "userTaxInfoId": 10423, "csfFile": "https://…/csf.pdf", "startOperationsDate": "2021-02-12T00:00:00", "lastStatusChangeDate": "2021-02-12T00:00:00", "createDate": "2026-01-27T21:09:23.845268", "updateDate": "2026-01-27T21:09:23.845268", "isVerified": true, "isActive": true } ], "cards": [] } ], "isSuccess": true, "message": "Ejecutado correctamente" } ``` Nota: Cada objeto de taxInfos incluye campos adicionales de la constancia fiscal (aquí se muestran los principales). ### CreateUser Registra un nuevo usuario en el sistema B2B. POST https://api.fotofacturas.ai/B2B/UserV1/CreateUser Body (JSON): - name (string, requerido): Nombre(s). - pSurname (string, requerido): Apellido paterno. - mSurname (string, opcional): Apellido materno. - email (string, requerido): Correo del usuario. - phone (string, requerido): Teléfono a 10 dígitos. - phoneCode (string, requerido): Código de país (52 para México). - associationId (int, requerido): Asociación a la que pertenece el usuario. Ejemplo cURL: ``` curl -X POST "https://api.fotofacturas.ai/B2B/UserV1/CreateUser" \ -H "Authorization: Bearer $FF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "Juan", "pSurname": "Pérez", "mSurname": "García", "email": "nuevo.usuario@empresa.com", "phone": "5512345678", "phoneCode": "52", "associationId": 51 }' ``` Respuesta 200: ```json { "isSuccess": true, "message": "Guardado correctamente", "data": null } ``` ### UpdateUser Actualiza la información de un usuario existente. PUT https://api.fotofacturas.ai/B2B/UserV1/UpdateUser Body (JSON): - userId (int, requerido): ID del usuario a actualizar. - name (string, requerido): Nombre(s). - pSurname (string, requerido): Apellido paterno. - mSurname (string, opcional): Apellido materno. - email (string, requerido): Correo del usuario. - phone (string, requerido): Teléfono a 10 dígitos. - phoneCode (string, requerido): Código de país (52 para México). - associationId (int, requerido): Asociación a la que pertenece el usuario. Ejemplo cURL: ``` curl -X PUT "https://api.fotofacturas.ai/B2B/UserV1/UpdateUser" \ -H "Authorization: Bearer $FF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "userId": 11491, "name": "Juan", "pSurname": "Pérez", "mSurname": "García", "email": "usuario@empresa.com", "phone": "5512345678", "phoneCode": "52", "associationId": 52 }' ``` Respuesta 200: ```json { "isSuccess": true, "message": "Guardado correctamente" } ``` ### ChangeUserStatus Modifica el estado de un usuario dentro del sistema (activar/desactivar). PUT https://api.fotofacturas.ai/B2B/UserV1/ChangeUserStatus Body (JSON): - userId (int, requerido): ID del usuario. - isActive (boolean, requerido): true para activar, false para desactivar. Ejemplo cURL: ``` curl -X PUT "https://api.fotofacturas.ai/B2B/UserV1/ChangeUserStatus" \ -H "Authorization: Bearer $FF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "userId": 11491, "isActive": true }' ``` Respuesta 200: ```json { "isSuccess": true, "message": "Guardado correctamente" } ``` ### AddUserTaxInfo Agrega la información fiscal a un usuario. Recibe el archivo de la constancia de situación fiscal (CSF) por multipart/form-data; de ella se extraen RFC, régimen y código postal. POST https://api.fotofacturas.ai/B2B/UserV1/AddUserTaxInfo Body (multipart/form-data): - CSF (file, requerido): Constancia de situación fiscal vigente (PDF, idealmente con menos de 3 meses). - userId (int, requerido): Usuario al que se agrega la información fiscal. Ejemplo cURL: ``` curl -X POST "https://api.fotofacturas.ai/B2B/UserV1/AddUserTaxInfo" \ -H "Authorization: Bearer $FF_API_TOKEN" \ -F "CSF=@constancia.pdf" \ -F "userId=10619" ``` Respuesta 200: ```json { "isSuccess": true, "message": "Guardado correctamente" } ``` ### UpdateUserTaxInfo Actualiza la documentación fiscal previamente cargada de un usuario. PUT https://api.fotofacturas.ai/B2B/UserV1/UpdateUserTaxInfo Body (multipart/form-data): - CSF (file, requerido): Nueva constancia de situación fiscal (PDF). - userTaxInfoId (int, requerido): ID de la información fiscal a actualizar. Ejemplo cURL: ``` curl -X PUT "https://api.fotofacturas.ai/B2B/UserV1/UpdateUserTaxInfo" \ -H "Authorization: Bearer $FF_API_TOKEN" \ -F "CSF=@constancia.pdf" \ -F "userTaxInfoId=10423" ``` Respuesta 200: ```json { "isSuccess": true, "message": "Actualizado correctamente" } ``` --- ## Asociaciones (AssociationV1) Las asociaciones organizan a tus usuarios en una jerarquía (empresa matriz, sucursales, equipos). Cada usuario pertenece a una asociación y los límites de la cuenta se administran sobre ese árbol. ### GetAssociationTree Obtiene la lista jerárquica de asociaciones/sucursales de la cuenta. GET https://api.fotofacturas.ai/B2B/AssociationV1/GetAssociationTree Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/AssociationV1/GetAssociationTree" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": { "title": "EMPRESA MATRIZ (B2B)", "key": "41", "children": [ { "title": "SUCURSAL CENTRO (B2B)", "key": "42", "children": [] } ] }, "isSuccess": true, "message": "Guardada correctamente" } ``` ### CreateAssociation Crea nuevas asociaciones bajo las existentes. POST https://api.fotofacturas.ai/B2B/AssociationV1/CreateAssociation Body (JSON): - parentId (int, requerido): Asociación padre bajo la que se crea la nueva. - name (string, requerido): Nombre de la nueva asociación. Ejemplo cURL: ``` curl -X POST "https://api.fotofacturas.ai/B2B/AssociationV1/CreateAssociation" \ -H "Authorization: Bearer $FF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "parentId": 1, "name": "Nueva Sucursal" }' ``` Respuesta 200: ```json { "isSuccess": true, "message": "Guardada correctamente" } ``` ### UpdateAssociation Actualiza los datos de una asociación existente. PUT https://api.fotofacturas.ai/B2B/AssociationV1/UpdateAssociation Body (JSON): - associationId (int, requerido): ID de la asociación a actualizar. - name (string, requerido): Nuevo nombre. - parentId (int, opcional): Nueva asociación padre (para mover la asociación en el árbol). Ejemplo cURL: ``` curl -X PUT "https://api.fotofacturas.ai/B2B/AssociationV1/UpdateAssociation" \ -H "Authorization: Bearer $FF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "associationId": 42, "name": "Sucursal Norte", "parentId": 52 }' ``` Respuesta 200: ```json { "isSuccess": true, "message": "Actualizada correctamente" } ``` --- ## Reportes (ReportV1) Métricas agregadas de la cuenta: tickets por día y resumen mensual (procesados, en espera, cancelados, montos facturados e IVA). ### GetTicketsByDay Consulta los tickets diarios de un periodo (mes y año). Si no se envían parámetros, regresa el mes en curso. GET https://api.fotofacturas.ai/B2B/ReportV1/GetTicketsByDay Parámetros (query string): - month (int, opcional): Mes (1–12). Opcional. - year (int, opcional): Año. Opcional. Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/ReportV1/GetTicketsByDay?month=4&year=2026" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": { "days": [ { "day": 1, "ticketCount": 0 }, { "day": 2, "ticketCount": 1 }, { "day": 3, "ticketCount": 2 }, { "day": 4, "ticketCount": 0 }, { "day": 5, "ticketCount": 1 } ], "average": 1.2352941176470589 }, "isSuccess": true, "message": "Tickets obtenidos para 4/2026" } ``` Nota: El arreglo days trae un elemento por cada día del mes consultado (aquí se muestra truncado). ### GetMonthStats Regresa el estado de los tickets del mes consultado y, como referencia, el del mes anterior. GET https://api.fotofacturas.ai/B2B/ReportV1/GetMonthStats Parámetros (query string): - month (int, opcional): Mes (1–12). Opcional. - year (int, opcional): Año. Opcional. Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/ReportV1/GetMonthStats?month=4&year=2026" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": { "currentMonth": { "startDate": "2026-04-01T00:00:00Z", "endDate": "2026-04-30T23:59:59.999999Z", "processedTicketCount": 8, "waitingTicketCount": 1, "cancelledTicketCount": 12, "totalInvoiced": 2983.76, "totalIVATaxInvoiced": 477.4016, "totalTicketsUsed": 21, "ticketsMonthlyLimit": 1000 }, "lastMonth": { "startDate": "2026-03-01T00:00:00Z", "endDate": "2026-03-31T23:59:59.999999Z", "processedTicketCount": 24, "waitingTicketCount": 6, "cancelledTicketCount": 9, "totalInvoiced": 13222.30, "totalIVATaxInvoiced": 2115.5680, "totalTicketsUsed": 39, "ticketsMonthlyLimit": 1000 } }, "isSuccess": true, "message": "Ejecutado correctamente" } ``` --- ## Catálogos (MiscellaneousV1) Endpoints de soporte (Miscellaneous): prueba de conexión, información de la cuenta y los catálogos que alimentan CreateTicket — métodos de pago, regímenes fiscales con usos de CFDI y códigos de ticket. ### Test Confirma que la API esté activa y que tu token funcione. Úsalo como primer paso de la integración. GET https://api.fotofacturas.ai/B2B/MiscellaneousV1/Test Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/MiscellaneousV1/Test" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "isSuccess": true, "message": "API funcionando correctamente" } ``` ### GetAccountInfo Obtiene la información de la cuenta: administrador, límites mensuales de tickets, RFCs múltiples permitidos y consumo del mes. GET https://api.fotofacturas.ai/B2B/MiscellaneousV1/GetAccountinfo Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/MiscellaneousV1/GetAccountinfo" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": { "adminUserId": 26, "username": "empresa.demo", "name": "Juan", "pSurname": "Pérez", "mSurname": null, "email": "usuario@empresa.com", "isActive": true, "ticketsMonthlyLimit": 1000, "ticketsMonthlyLimitPerUser": 50, "canPictureInvoice": true, "multiRfc": 10, "multiRfcPerUser": 5, "multiRfcType": "M", "ticketsUsed": 21 }, "isSuccess": true, "message": "Ejecutado correctamente" } ``` ### GetTicketPaymentMethods Retorna los métodos de pago de tickets. El ticketPaymentMethodId se envía en CreateTicket. GET https://api.fotofacturas.ai/B2B/MiscellaneousV1/GetTicketPaymentMethods Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/MiscellaneousV1/GetTicketPaymentMethods" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": [ { "ticketPaymentMethodId": "01", "name": "Efectivo", "sequence": 1, "isVisible": true }, { "ticketPaymentMethodId": "28", "name": "Tarjeta de débito", "sequence": 2, "isVisible": true } ], "isSuccess": true, "message": "Ejecutado correctamente" } ``` Nota: La lista completa incluye más métodos (aquí truncada). ### GetRegimenFiscalAndCFDI Retorna los regímenes fiscales y los usos de CFDI válidos para cada uno. regimenFiscalId y usoCFDIId se envían en CreateTicket. GET https://api.fotofacturas.ai/B2B/MiscellaneousV1/GetRegimenFiscalAndCFDI Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/MiscellaneousV1/GetRegimenFiscalAndCFDI" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": [ { "regimenFiscalId": 626, "name": "Régimen Simplificado de Confianza", "altName": "", "isFisica": true, "isMoral": true, "cfdi": [ { "usoCFDIId": "G03", "name": "Gastos en general", "altName": "", "sequence": 1 }, { "usoCFDIId": "G01", "name": "Adquisición de mercancías", "altName": "", "sequence": 4 }, { "usoCFDIId": "CP01", "name": "Pagos", "altName": "", "sequence": 5 } ] } ], "isSuccess": true, "message": "Ejecutado correctamente" } ``` Nota: La lista completa incluye todos los regímenes del catálogo del SAT (aquí truncada). ### GetTicketCodes Regresa los códigos de resultado de un ticket, exitosos y de error, con su descripción y el mensaje que se muestra al usuario. La tabla completa está en la página de códigos de ticket. GET https://api.fotofacturas.ai/B2B/MiscellaneousV1/GetTicketCodes Ejemplo cURL: ``` curl "https://api.fotofacturas.ai/B2B/MiscellaneousV1/GetTicketCodes" \ -H "Authorization: Bearer $FF_API_TOKEN" ``` Respuesta 200: ```json { "data": [ { "ticketCodeId": 1, "category": "Ticket", "summary": "Ticket facturado exitosamente", "description": "El ticket fue procesado exitosamente por Fotofacturas.", "userMessage": "¡Hola! Este ticket fue facturado exitosamente.", "isSuccessCode": true, "sequence": 1 }, { "ticketCodeId": 7, "category": "Imagen", "summary": "Ticket ilegible", "description": "La imagen del ticket no permite extraer los datos necesarios.", "userMessage": "¡Hola! No podemos leer la información del ticket. Por favor sube una foto más clara y nítida del ticket completo. ¡Gracias!", "isSuccessCode": false, "sequence": 1 } ], "isSuccess": true, "message": "Ejecutado correctamente" } ``` Nota: Respuesta truncada. Consulta la tabla completa en /docs/codigos-de-ticket. --- ## Catálogo completo de códigos de ticket Resultado final de cada ticket (endpoint MiscellaneousV1/GetTicketCodes). isSuccessCode true = el ticket terminó con factura (o ya estaba facturado). userMessage es el texto listo para mostrar al usuario final. - 1 · Ticket · Ticket facturado exitosamente (éxito): El ticket fue procesado exitosamente por Fotofacturas. Mensaje al usuario: "¡Hola! Este ticket fue facturado exitosamente." - 2 · Ticket · Ticket facturado previamente (éxito): El ticket ya fue procesado previamente por Fotofacturas o por otro medio. Mensaje al usuario: "¡Hola! Este ticket ya fue facturado anteriormente. Cada ticket solo puede facturarse una vez. ¡Gracias!" - 7 · Imagen · Ticket ilegible (error): La imagen del ticket no permite extraer los datos necesarios. Mensaje al usuario: "¡Hola! No podemos leer la información del ticket. Por favor sube una foto más clara y nítida del ticket completo. ¡Gracias!" - 8 · Imagen · Ticket incompleto (error): La imagen no muestra el ticket completo o algunos datos están tapados. Mensaje al usuario: "¡Hola! Por favor sube nuevamente una foto donde salga tu ticket completo con todos los datos legibles, evita doblar, arrugar, tapar o romper tus tickets. ¡Gracias!" - 4 · Ticket · Ticket expirado (error): El ticket fue subido fuera del período de facturación vigente del comercio. Mensaje al usuario: "El ticket fue subido fuera del período de facturación vigente del comercio." - 3 · Ticket · No es ticket de compra (error): La imagen corresponde a un voucher o comprobante de pago, no a un ticket de venta. Mensaje al usuario: "¡Hola! La imagen corresponde a un comprobante de pago o voucher, no a un ticket de compra. Por favor sube el ticket de venta que te entregó el comercio. ¡Gracias!" - 6 · Datos fiscales · Datos de facturación incorrectos (error): Los datos fiscales del receptor (RFC, régimen fiscal, CP) son inválidos o están incompletos. Mensaje al usuario: "¡Hola! No pudimos generar tu factura porque tus datos fiscales están incorrectos. Por favor sube tu constancia de situación fiscal vigente (menos de 3 meses) y vuelve a subir tu ticket. ¡Gracias!" - 12 · Comercio · Error en portal de facturación (error): El portal del comercio devolvió un error durante el procesamiento. Mensaje al usuario: "¡Hola! El portal de facturación del comercio generó un error al procesar tu solicitud. Reintentaremos más tarde. ¡Gracias por tu paciencia!" - 13 · Comercio · Contacto del comercio no encontrado (error): No se encontró información de contacto del comercio para gestionar la factura. Mensaje al usuario: "¡Hola! No encontramos información de contacto del comercio. Si tienes teléfono o correo del comercio, inclúyelos junto con la foto del ticket. ¡Gracias!" - 11 · Comercio · Comercio no responde (error): El comercio no respondió a los intentos de contacto tras múltiples reintentos. Mensaje al usuario: "¡Hola! No pudimos generar tu factura porque el comercio no respondió a nuestros intentos de contacto. Te recomendamos elegir comercios que faciliten el proceso de facturación. ¡Gracias!" - 5 · Ticket · Comercio extranjero (error): El ticket no corresponde a un comercio mexicano. Mensaje al usuario: "El ticket no corresponde a un comercio mexicano." --- ## Páginas de la documentación - Introducción y quickstart: https://fotofacturas.ai/docs - Autenticación, envelope y códigos HTTP: https://fotofacturas.ai/docs/autenticacion - Tickets (CreateTicket y consultas): https://fotofacturas.ai/docs/tickets - Usuarios e información fiscal: https://fotofacturas.ai/docs/usuarios - Asociaciones (jerarquía): https://fotofacturas.ai/docs/asociaciones - Reportes (por día y mensual): https://fotofacturas.ai/docs/reportes - Catálogos (Test, cuenta, métodos de pago, regímenes/CFDI): https://fotofacturas.ai/docs/catalogos - Códigos de ticket: https://fotofacturas.ai/docs/codigos-de-ticket Nota: los valores de los ejemplos (correos, nombres, RFC, teléfonos, URLs de archivos) son ficticios; la estructura JSON es la real.