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_duplicatepara 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ámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
page | number | Sí | Número de página (0-based). Ejemplo: 0. |
size | number | Sí | Cantidad de registros por página. Ejemplo: 20. |
Request body
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
from_date | string | Sí | Inicio del rango (yyyy-mm-dd). Filtra sobre retention_date. |
to_date | string | Sí | Fin del rango (yyyy-mm-dd). Filtra sobre retention_date. |
issuer_cuit | string | No | CUIT del emisor (agente de retención). Match exacto. |
receptor_cuit | string | No | CUIT del receptor / sujeto retenido. Match exacto. |
certificate_number | string | No | Número de certificado de retención. Match exacto. |
amount_from | number | No | Cota inferior del importe. Decimales con punto. |
amount_to | number | No | Cota 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
| Campo | Tipo | Descripción |
|---|---|---|
generated_at | datetime (ISO-8601) | Instante en el que se generó la respuesta. |
content | List | Lista de retenciones reconocidas. |
total_elements | number | Cantidad total de registros que coinciden con los filtros. |
total_pages | number | Cantidad total de páginas. |
size | number | Tamaño de página solicitado. |
number | number | Número de la página actual (0-based). |
number_of_elements | number | Cantidad de registros en la página actual. |
first | boolean | Indicador de primera página. |
last | boolean | Indicador de última página. |
empty | boolean | Indicador de respuesta vacía (sin registros). |
Campos de cada retención (content[])
| Campo | Tipo | Descripción |
|---|---|---|
id | string | Identificador único interno Frisvy del registro de retención. |
file_header_id | number | Identificador interno del documento origen procesado por la IA. |
origin_email | string | Email de origen (modalidad correo). Vacío para envíos por API REST o SFTP. |
retention_code | string | Código del tipo de retención. Ver Tabla 1. |
jurisdiction_code | string | Código de jurisdicción. Ver Tabla 2. |
issuer_cuit | string | CUIT del emisor (agente de retención). 11 dígitos sin guiones. |
receptor_cuit | string | CUIT del receptor / sujeto retenido. 11 dígitos sin guiones. |
certificate_number | string | Número de certificado de retención. Puede venir vacío. |
retention_date | string (yyyy-mm-dd) | Fecha de la retención. |
taxable_base_amount | number | Base imponible. Decimales con punto. |
currency_code | string | Código ISO de moneda. |
tax_rate | number | Alícuota aplicada (ej. 4.50 para 4.5%). |
amount | number | Importe retenido. Decimales con punto. |
has_tax_profile | boolean | true si pasó la validación de perfil impositivo. |
is_duplicate | boolean | true si la retención fue identificada como duplicada. |
created_at | datetime (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 HTTP | Descripción |
|---|---|
| 400 | Body inválido, fechas faltantes/incorrectas o rango de fechas inválido. |
| 401 | Token de sesión ausente o inválido. |
| 403 | La empresa del token no pudo resolverse o no está autorizada para este servicio. |
| 500 | Error 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
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
file_header_id | number | Sí | Identificador del documento original. Es el file_header_id devuelto por cada item del endpoint de consulta. |
Respuesta — 200
| Campo | Tipo | Descripción |
|---|---|---|
content | string | Contenido binario del archivo original, codificado en base64. |
file_name | string | Nombre del archivo recibido, con su extensión (.pdf o .jpg). |
mime_type | string | Tipo 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 HTTP | Descripción |
|---|---|
| 401 | Token de sesión ausente o inválido. |
| 404 | El file_header_id no existe o no corresponde a la empresa del token (no se distingue, por seguridad). |
| 500 | Error interno del servidor. |
Tablas de referencia
Tabla 1 — Códigos de retenciones
| Código | Descripción |
|---|---|
| IVA | Impuesto al Valor Agregado |
| SUSS | Sistema Único de Seguridad Social |
| GANANCIAS | Impuesto a las Ganancias |
| IIBB | Ingresos Brutos |
Tabla 2 — Jurisdicciones
| Código | Descripción |
|---|---|
| 000 | Nacional |
| 901 | Ciudad de Buenos Aires |
| 902 | Provincia de Buenos Aires |
| 903 | Catamarca |
| 904 | Córdoba |
Notas
- La API REST expone la marca de duplicidad
is_duplicatey devuelvehas_tax_profilecomo booleano (a diferencia del archivo CSV vía SFTP). - Fechas en formato ISO
yyyy-mm-dd;generated_atycreated_aten ISO-8601 con zona horaria. - Los importes usan punto como separador decimal y no llevan separador de miles.