Saltar al contenido principal

Portal de Proveedores — Facturas

Estos endpoints permiten a un proveedor (prestador) gestionar sus propias facturas directamente desde la API: listarlas, abrir una para ver el detalle, declarar el monto que está facturando, declarar varias a la vez y verificar un monto contra la tolerancia de la compañía antes de enviarlo. Cada endpoint está acotado a la cuenta de proveedor detrás del token — solo ves y operás sobre tus propias facturas.

Cuenta de proveedor requerida

El usuario autenticado debe estar vinculado a un proveedor (prestador). Las solicitudes desde una cuenta que no sea de proveedor se rechazan con 403 FORBIDDEN. Todos los endpoints requieren un token JWT válido, una clave de API y el encabezado tenant. Ver Autenticación.


Listar facturas​

Obtiene una lista paginada de las facturas del proveedor para un rango de fechas, con estado opcional y búsqueda de texto libre. Cada fila incluye el monto del sistema, el monto declarado y la diferencia entre ambos. La respuesta también incluye la tolerancia que aplica al proveedor para que puedas interpretar las diferencias.

GET/apidev/v1/supplier-portal/invoices
PermisoAPICLI_PORTALPROVEEDOR_READ
Límite de solicitudes30 req/min (ventana deslizante)

Encabezados de la solicitud​

Every request to a protected endpoint requires these headers:

HeaderRequiredDescription
AuthorizationYesBearer token obtained from the Login endpoint. Format: Bearer <token>
X-API-KeyYesCompany integration key provided during onboarding. Format: gtk_xxx...
tenantYesYour assigned tenant domain (default: geotareas.com) — always send your assigned tenant
Content-TypeConditionalapplication/json — required for POST and PUT requests

Parámetros de consulta​

ParámetroTipoRequeridoDescripción
startdatestring (ISO 8601)SíInicio del rango de fechas
enddatestring (ISO 8601)SíFin del rango de fechas (el rango no puede exceder los 93 días)
statusstringNoFiltrar por código de estado de factura: PEN, ENV, APR, REV, REC, AJU, LIQ
searchstringNoCoincidencia de texto libre en número de servicio, cuenta o número de factura (máx. 120 caracteres)
limitintegerNoRegistros por página. Mín.: 1, Máx.: 100, Predeterminado: 25
offsetintegerNoRegistros a omitir. Predeterminado: 0

Campos de la respuesta — data.rows[]​

CampoTipoDescripción
invoice_idstringIdentificador único de la factura
invoice_datestring | nullFecha de la factura
service_idstringID del servicio/tarea relacionado
service_numberstring | nullNúmero visible del servicio
service_call_datestring | nullCuándo se solicitó el servicio
account_namestring | nullCuenta a la que pertenece el servicio
citystring | nullCiudad del servicio
system_amountnumberMonto calculado por el sistema
declaration_idstring | nullID de la declaración, si el proveedor ya declaró un monto
declared_amountnumber | nullMonto declarado por el proveedor
declared_notesstring | nullNotas que el proveedor agregó en la declaración
provider_invoice_numberstring | nullNúmero de factura propio del proveedor
provider_invoice_datestring | nullFecha de factura propia del proveedor
state_codestringCódigo de estado de la factura (PEN, ENV, …)
state_namestringNombre del estado de la factura
differencenumber | nullMonto declarado menos monto del sistema
difference_pctnumber | nullDiferencia como porcentaje del monto del sistema
attachment_urlstring | nullURL al archivo de factura adjunto
attachment_filenamestring | nullNombre original del archivo del adjunto

Campos de la respuesta — data.tolerance​

CampoTipoDescripción
modestring | nullModo de tolerancia: PCT, ABS, AMB, o null cuando no aplica ninguna
tolerance_pctnumber | nullDiferencia porcentual permitida
tolerance_absnumber | nullDiferencia absoluta permitida
auto_approvebooleanSi los montos dentro de la tolerancia se aprueban automáticamente
sourcestringDe dónde proviene la tolerancia: proveedor, global o ninguna

Ejemplo de código​

curl -s "https://$TENANT/apidev/v1/supplier-portal/invoices?startdate=2026-05-01&enddate=2026-05-31&status=PEN&limit=10" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"

Ejemplo de respuesta​

{
"success": true,
"data": {
"rows": [
{
"invoice_id": "7234567890123456789",
"invoice_date": "2026-05-03T15:02:00",
"service_id": "103878",
"service_number": "SRV-2026-0042",
"service_call_date": "2026-05-02T09:10:00",
"account_name": "Supermercado Centro",
"city": "Montevideo",
"system_amount": 1098.00,
"declaration_id": "8100000000045",
"declared_amount": 1100.00,
"declared_notes": "Incluye traslado.",
"provider_invoice_number": "A-0001-0000123",
"provider_invoice_date": "2026-05-03",
"state_code": "ENV",
"state_name": "Enviada",
"difference": 2.00,
"difference_pct": 0.18,
"attachment_url": "https://files.example.com/inv/123.pdf",
"attachment_filename": "factura-123.pdf"
}
],
"tolerance": {
"mode": "PCT",
"tolerance_pct": 5.0,
"tolerance_abs": null,
"auto_approve": true,
"source": "proveedor"
}
},
"meta": {
"total": 1,
"limit": 10,
"offset": 0
}
}

Detalle de factura​

Obtiene una factura individual con su desglose completo: los mismos campos de fila que el listado, más los conceptos de las líneas de detalle y la tolerancia que aplica. Devuelve 404 si la factura no existe o no pertenece al proveedor.

GET/apidev/v1/supplier-portal/invoices/{id}
PermisoAPICLI_PORTALPROVEEDOR_READ
Límite de solicitudes30 req/min (ventana deslizante)

Parámetros de ruta​

ParámetroTipoRequeridoDescripción
idstringSíIdentificador único de la factura

Campos de la respuesta — data.concepts[]​

CampoTipoDescripción
concept_idstringID del catálogo de conceptos
descriptionstringDescripción del concepto
unit_amountnumberMonto por unidad
quantitynumberCantidad
tax_pctnumberPorcentaje de impuesto aplicado
totalnumberTotal de la línea

El objeto data también incluye todos los campos listados para una fila del listado y un objeto tolerance (ver Listar facturas).

Ejemplo de código​

curl -s "https://$TENANT/apidev/v1/supplier-portal/invoices/7234567890123456789" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT"

Ejemplo de respuesta​

{
"success": true,
"data": {
"invoice_id": "7234567890123456789",
"invoice_date": "2026-05-03T15:02:00",
"service_id": "103878",
"service_number": "SRV-2026-0042",
"account_name": "Supermercado Centro",
"city": "Montevideo",
"system_amount": 1098.00,
"declaration_id": "8100000000045",
"declared_amount": 1100.00,
"declared_notes": "Incluye traslado.",
"provider_invoice_number": "A-0001-0000123",
"provider_invoice_date": "2026-05-03",
"state_code": "ENV",
"state_name": "Enviada",
"difference": 2.00,
"difference_pct": 0.18,
"attachment_url": "https://files.example.com/inv/123.pdf",
"attachment_filename": "factura-123.pdf",
"concepts": [
{
"concept_id": "100",
"description": "Mano de obra",
"unit_amount": 900.00,
"quantity": 1,
"tax_pct": 22.0,
"total": 1098.00
}
],
"tolerance": {
"mode": "PCT",
"tolerance_pct": 5.0,
"tolerance_abs": null,
"auto_approve": true,
"source": "proveedor"
}
},
"meta": {}
}

Declarar monto de factura​

Declara el monto que el proveedor está facturando para una factura. Es un upsert: si todavía no existe una declaración se crea, de lo contrario se actualiza la existente. La respuesta informa el estado resultante y cómo se compara el monto declarado con la tolerancia de la compañía.

POST/apidev/v1/supplier-portal/invoices/declare
PermisoAPICLI_PORTALPROVEEDOR_WRITE
Límite de solicitudes10 req/min (ventana deslizante)

Cuerpo de la solicitud​

CampoTipoRequeridoDescripción
invoice_idstringSíFactura a declarar (cadena numérica)
amountnumberSíMonto declarado. Debe ser >= 0
notesstringNoNotas de texto libre para la declaración
invoice_numberstringNoNúmero de factura propio del proveedor (máx. 60 caracteres)
invoice_datestring (ISO 8601)NoFecha de factura propia del proveedor
tax_pctnumberNoPorcentaje de impuesto (0–100)

Campos de la respuesta — data.tolerance​

CampoTipoDescripción
within_tolerancebooleanSi el monto declarado está dentro de la tolerancia
differencenumberMonto declarado menos monto del sistema
difference_pctnumberDiferencia como porcentaje del monto del sistema
difference_absnumberDiferencia absoluta
actionstringAcción resultante (por ejemplo, aprobación automática o envío a revisión)
config_sourcestringDe dónde proviene la tolerancia aplicada

Ejemplo de código​

curl -s -X POST "https://$TENANT/apidev/v1/supplier-portal/invoices/declare" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT" \
-H "Content-Type: application/json" \
-d '{
"invoice_id": "7234567890123456789",
"amount": 1100.00,
"notes": "Incluye traslado.",
"invoice_number": "A-0001-0000123",
"invoice_date": "2026-05-03",
"tax_pct": 22
}'

Ejemplo de respuesta​

{
"success": true,
"data": {
"declaration_id": "8100000000045",
"declared_amount": 1100.00,
"state_id": 101,
"tolerance": {
"within_tolerance": true,
"difference": 2.00,
"difference_pct": 0.18,
"difference_abs": 2.00,
"action": "AUTO_APPROVE",
"config_source": "proveedor"
}
},
"meta": {}
}

Declarar en lote​

Declara montos para muchas facturas en una sola solicitud. Cada ítem se procesa de forma independiente, por lo que la solicitud siempre devuelve 200 con un éxito o fallo por ítem. Usalo para enviar todas las declaraciones de un período de una sola vez.

POST/apidev/v1/supplier-portal/invoices/declare-batch
PermisoAPICLI_PORTALPROVEEDOR_WRITE
Límite de solicitudes10 req/min (ventana deslizante)

Cuerpo de la solicitud​

CampoTipoRequeridoDescripción
declarationsarraySíLista de declaraciones (1–100 ítems)

Cada ítem en declarations[] acepta los mismos campos que Declarar monto de factura:

CampoTipoRequeridoDescripción
invoice_idstringSíFactura a declarar
amountnumberSíMonto declarado (>= 0)
notesstringNoNotas de texto libre
invoice_numberstringNoNúmero de factura propio del proveedor
invoice_datestring (ISO 8601)NoFecha de factura propia del proveedor
tax_pctnumberNoPorcentaje de impuesto (0–100)

Campos de la respuesta — data​

CampoTipoDescripción
resultsarrayUna entrada por cada ítem enviado, en orden
acceptednumberCuántos ítems se declararon correctamente
rejectednumberCuántos ítems fallaron

Cada entrada de results[] incluye invoice_id y success. En caso de éxito incluye los mismos campos que una declaración individual; en caso de fallo incluye un error que describe el motivo.

Ejemplo de código​

curl -s -X POST "https://$TENANT/apidev/v1/supplier-portal/invoices/declare-batch" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT" \
-H "Content-Type: application/json" \
-d '{
"declarations": [
{ "invoice_id": "7234567890123456789", "amount": 1100.00, "invoice_number": "A-0001-0000123" },
{ "invoice_id": "7234567890123456790", "amount": 540.00 }
]
}'

Ejemplo de respuesta​

{
"success": true,
"data": {
"results": [
{
"invoice_id": "7234567890123456789",
"success": true,
"declaration_id": "8100000000045",
"declared_amount": 1100.00,
"state_id": 101,
"tolerance": {
"within_tolerance": true,
"difference": 2.00,
"difference_pct": 0.18,
"difference_abs": 2.00,
"action": "AUTO_APPROVE",
"config_source": "proveedor"
}
},
{
"invoice_id": "7234567890123456790",
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Invoice not found or not owned by this supplier."
}
}
],
"accepted": 1,
"rejected": 1
},
"meta": {}
}

Validar monto (verificación previa)​

Verifica un monto contra la tolerancia de la compañía antes de declararlo. Este endpoint no escribe nada — solo te dice cómo se trataría el monto. Devuelve 404 si la factura no pertenece al proveedor.

POST/apidev/v1/supplier-portal/invoices/validate
PermisoAPICLI_PORTALPROVEEDOR_READ
Límite de solicitudes30 req/min (ventana deslizante)

Cuerpo de la solicitud​

CampoTipoRequeridoDescripción
invoice_idstringSíFactura a verificar
amountnumberSíMonto a probar. Debe ser >= 0

Campos de la respuesta — data​

CampoTipoDescripción
invoice_idstringFactura que se verificó
system_amountnumberMonto calculado por el sistema
declared_amountnumberMonto que enviaste para la verificación
within_tolerancebooleanSi el monto está dentro de la tolerancia
differencenumberMonto enviado menos monto del sistema
difference_pctnumberDiferencia como porcentaje del monto del sistema
difference_absnumberDiferencia absoluta
actionstringAcción que resultaría (por ejemplo, aprobación automática o envío a revisión)
config_sourcestringDe dónde proviene la tolerancia aplicada

Ejemplo de código​

curl -s -X POST "https://$TENANT/apidev/v1/supplier-portal/invoices/validate" \
-H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT" \
-H "Content-Type: application/json" \
-d '{
"invoice_id": "7234567890123456789",
"amount": 1500.00
}'

Ejemplo de respuesta​

{
"success": true,
"data": {
"invoice_id": "7234567890123456789",
"system_amount": 1098.00,
"declared_amount": 1500.00,
"within_tolerance": false,
"difference": 402.00,
"difference_pct": 36.61,
"difference_abs": 402.00,
"action": "REVIEW",
"config_source": "proveedor"
},
"meta": {}
}

Errores​

CódigoHTTPAplica aDescripción
VALIDATION_ERROR400TodosParámetros o cuerpo inválidos (por ejemplo, falta startdate, amount menor a 0, más de 100 declaraciones)
INVALID_DATE_RANGE400ListadoEl rango de fechas excede los 93 días, o las fechas son inválidas
UNAUTHORIZED401TodosToken JWT / clave de API faltante o inválido
TOKEN_EXPIRED401TodosEl JWT era válido pero ha expirado (vigencia de 1 hora)
FORBIDDEN403TodosLa cuenta no es de proveedor — "This endpoint requires a supplier account." — o carece del permiso requerido
NOT_FOUND404Detalle, Declarar, ValidarLa factura no existe o no pertenece a tu cuenta de proveedor
RATE_LIMITED429TodosSe excedió el límite de solicitudes del endpoint