Saltar al contenido principal

Lectura de documentos con IA

Producto

Frisvy automatiza la captura de comprobantes (inicialmente retenciones impositivas) mediante un motor de Inteligencia Artificial. Vos enviás los documentos (PDF/JPG) y obtenés el resultado consolidado para tu conciliación, por API REST o SFTP.

Cómo funciona

El flujo tiene tres etapas: recepción de los documentos, reconocimiento con IA y rendición del resultado. En esta versión se contemplan retenciones impositivas, en archivos PDF y JPG.

1. Recepción de documentos

Hay tres modalidades para hacer llegar los comprobantes a Frisvy:

  • Correo electrónico: se envían como adjuntos a automatizaciones+<empresa>@frisvy.com. El tag posterior al + identifica a la empresa configurada en Frisvy.
  • API REST: tu sistema envía los archivos directamente, autenticando con tus credenciales. No requiere tag de identificación.
  • SFTP: depositás los archivos en tu carpeta del servidor SFTP. La empresa queda identificada por la carpeta asignada.

Tipos de archivo aceptados: PDF y JPG. Otros formatos se ignoran. El procesamiento posterior (reconocimiento, validación y rendición) es idéntico sin importar la modalidad de ingreso.

2. Reconocimiento con IA

Cada archivo se envía al motor de IA, que lee e interpreta el documento y extrae datos estructurados: cabecera (CUIT emisor/receptor, fecha, orden de pago) y detalle de las retenciones (código, jurisdicción, alícuota, importe, base imponible, número de certificado). El resultado se persiste y queda disponible para su rendición y para consultas de trazabilidad.

Deduplicación Frisvy detecta y marca como duplicadas las retenciones repetidas dentro del mismo envío o respecto de envíos previos. No se descartan: quedan con la marca is_duplicate para que puedas excluirlas de tu conciliación.

3. Validación de perfil impositivo (opcional)

Para retenciones, Frisvy puede validar (de forma configurable por empresa) cada retención contra la parametría impositiva (tipo de retención válido para la jurisdicción y fecha). Una retención que no pasa la validación no se descarta: queda registrada con el resultado en has_tax_profile.

4. Rendición del resultado

El resultado se puede obtener por API REST (consulta en JSON con filtros y paginación, ver abajo) o por SFTP (un archivo CSV por empresa, publicado en tu carpeta del servidor sftp.frisvy.com con la frecuencia pactada).

Autenticación Los endpoints REST requieren un token de sesión generado con el scope ibcobros.renditionsretention.read. La empresa se resuelve automáticamente a partir del token: no se envía el CUIT del recaudador en el body ni en headers. Base URL: /report-manager/v1.

API · Consultar retenciones procesadas

POST https://ibcobros.apim.{ambiente}.frisvy.com/report-manager/v1/reports/retentions

Query params

ParámetroTipoRequeridoDescripción
pagenumberNúmero de página (0-based). Ejemplo: 0.
sizenumberCantidad de registros por página. Ejemplo: 20.

Request body

CampoTipoRequeridoDescripción
from_datestringInicio del rango (yyyy-mm-dd). Filtra sobre retention_date.
to_datestringFin del rango (yyyy-mm-dd). Filtra sobre retention_date.
issuer_cuitstringNoCUIT del emisor (agente de retención). Match exacto.
receptor_cuitstringNoCUIT del receptor / sujeto retenido. Match exacto.
certificate_numberstringNoNúmero de certificado de retención. Match exacto.
amount_fromnumberNoCota inferior del importe. Decimales con punto.
amount_tonumberNoCota superior del importe. Decimales con punto.

Ejemplo de request body

{
  "from_date": "2025-12-01",
  "to_date": "2025-12-31",
  "issuer_cuit": "30560950108",
  "receptor_cuit": "30612238355",
  "certificate_number": "00000-00009759",
  "amount_from": 100.0,
  "amount_to": 999999.99
}

Respuesta — 200

CampoTipoDescripción
generated_atdatetime (ISO-8601)Instante en el que se generó la respuesta.
contentListLista de retenciones reconocidas.
total_elementsnumberCantidad total de registros que coinciden con los filtros.
total_pagesnumberCantidad total de páginas.
sizenumberTamaño de página solicitado.
numbernumberNúmero de la página actual (0-based).
number_of_elementsnumberCantidad de registros en la página actual.
firstbooleanIndicador de primera página.
lastbooleanIndicador de última página.
emptybooleanIndicador de respuesta vacía (sin registros).

Campos de cada retención (content[])

CampoTipoDescripción
idstringIdentificador único interno Frisvy del registro de retención.
file_header_idnumberIdentificador interno del documento origen procesado por la IA.
origin_emailstringEmail de origen (modalidad correo). Vacío para envíos por API REST o SFTP.
retention_codestringCódigo del tipo de retención. Ver Tabla 1.
jurisdiction_codestringCódigo de jurisdicción. Ver Tabla 2.
issuer_cuitstringCUIT del emisor (agente de retención). 11 dígitos sin guiones.
receptor_cuitstringCUIT del receptor / sujeto retenido. 11 dígitos sin guiones.
certificate_numberstringNúmero de certificado de retención. Puede venir vacío.
retention_datestring (yyyy-mm-dd)Fecha de la retención.
taxable_base_amountnumberBase imponible. Decimales con punto.
currency_codestringCódigo ISO de moneda.
tax_ratenumberAlícuota aplicada (ej. 4.50 para 4.5%).
amountnumberImporte retenido. Decimales con punto.
has_tax_profilebooleantrue si pasó la validación de perfil impositivo.
is_duplicatebooleantrue si la retención fue identificada como duplicada.
created_atdatetime (ISO-8601)Instante en el que Frisvy persistió el registro.

Ejemplo de response body

{
  "generated_at": "2026-05-28T13:10:30.045+00:00",
  "content": [
    {
      "id": "8f4c1d3a9b2e7f06...",
      "file_header_id": 1234,
      "origin_email": "ejemplo@gmail.com",
      "retention_code": "IIBB",
      "jurisdiction_code": "901",
      "issuer_cuit": "30560950108",
      "receptor_cuit": "30612238355",
      "certificate_number": "00000-00009759",
      "retention_date": "2025-11-19",
      "taxable_base_amount": 140880.2,
      "currency_code": "ARS",
      "tax_rate": 4.5,
      "amount": 6339.61,
      "has_tax_profile": true,
      "is_duplicate": false,
      "created_at": "2026-05-28T13:09:31.545+00:00"
    }
  ],
  "total_elements": 1,
  "total_pages": 1,
  "size": 20,
  "number": 0,
  "number_of_elements": 1,
  "first": true,
  "last": true,
  "empty": false
}

Ejemplo de consumo

cURL (ambiente QA)

curl --location 'https://ibcobros.apim.qa.frisvy.com/report-manager/v1/reports/retentions?page=0&size=20' \
  --header 'accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer eyJraWQiOiJCQVFF...' \
  --data '{ "from_date": "2025-12-01", "to_date": "2025-12-31" }'

Códigos de error

Código HTTPDescripción
400Body inválido, fechas faltantes/incorrectas o rango de fechas inválido.
401Token de sesión ausente o inválido.
403La empresa del token no pudo resolverse o no está autorizada para este servicio.
500Error interno del servidor.

API · Descargar el documento original

Recupera el archivo original (PDF/JPG) que dio origen a una retención reconocida — útil para auditar el reconocimiento o adjuntar el comprobante en tu sistema. El file_header_id se obtiene del endpoint anterior.

GET https://ibcobros.apim.{ambiente}.frisvy.com/report-manager/v1/reports/retentions/{file_header_id}

Path params

CampoTipoRequeridoDescripción
file_header_idnumberIdentificador del documento original. Es el file_header_id devuelto por cada item del endpoint de consulta.

Respuesta — 200

CampoTipoDescripción
contentstringContenido binario del archivo original, codificado en base64.
file_namestringNombre del archivo recibido, con su extensión (.pdf o .jpg).
mime_typestringTipo MIME: application/pdf o image/jpeg.

Ejemplo de response body

{
  "content": "JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC9UeXBlIC9DYXRhbG9nL1BhZ2VzIDIgMCBSPj4...",
  "file_name": "retencion_001.pdf",
  "mime_type": "application/pdf"
}

El contenido viene en base64 en content; decodificalo del lado cliente para obtener el archivo original.

Ejemplo de consumo

cURL (ambiente QA)

curl --location 'https://ibcobros.apim.qa.frisvy.com/report-manager/v1/reports/retentions/1234' \
  --header 'accept: application/json' \
  --header 'Authorization: Bearer eyJraWQiOiJCQVFF...'

Códigos de error

Código HTTPDescripción
401Token de sesión ausente o inválido.
404El file_header_id no existe o no corresponde a la empresa del token (no se distingue, por seguridad).
500Error interno del servidor.

Tablas de referencia

Tabla 1 — Códigos de retenciones

CódigoDescripción
IVAImpuesto al Valor Agregado
SUSSSistema Único de Seguridad Social
GANANCIASImpuesto a las Ganancias
IIBBIngresos Brutos

Tabla 2 — Jurisdicciones

CódigoDescripción
000Nacional
901Ciudad de Buenos Aires
902Provincia de Buenos Aires
903Catamarca
904Córdoba

Notas

  • La API REST expone la marca de duplicidad is_duplicate y devuelve has_tax_profile como booleano (a diferencia del archivo CSV vía SFTP).
  • Fechas en formato ISO yyyy-mm-dd; generated_at y created_at en ISO-8601 con zona horaria.
  • Los importes usan punto como separador decimal y no llevan separador de miles.