Skip to main content

Manejo de errores

Todos los errores extienden ArcaError y exponen un code estable como string.
Importá las clases de error desde facturas o desde facturas/errors. También se exporta isArcaAuthenticationError(error) para ruteo con predicados. Los errores de autenticación exponen solamente el código estable ARCA_AUTHENTICATION_ERROR, un reason tipado, el servicio, la operación y un código de proveedor seguro cuando está disponible. No se adjuntan los cuerpos crudos del proveedor ni los valores de las credenciales. recover() usa ARCA_INPUT_RESERVATION_NOT_FOUND cuando la clave no tiene una reserva guardada. Ese código es distinto de lookup.kind === "not_found", que significa que la reserva existe y ARCA confirmó que su número está vacío.

Diagnóstico

  • coe.alreadyAuthenticated: el SDK deduplica los logins WSAA en vuelo y reusa los tickets válidos guardados en caché. En funciones serverless, procesos de cola o cualquier despliegue con varios procesos, configurá un wsaaSessionStore persistente para que un proceso nuevo reuse el TA que obtuvo otro. El caché en memoria no se comparte entre procesos.
  • dh key too small: los pedidos de producción de WSFE ya usan, donde hace falta, el nivel de seguridad anterior de OpenSSL. Si igual lo ves, confirmá que no estés salteando el transporte del SDK ni terminando TLS en otra capa.
  • Certificado vencido: reemplazá el certificado PEM por uno renovado que cumpla las mismas expectativas de clave privada, y redesplegá o reiniciá el proceso.
  • Servicio no autorizado: tu certificado puede ser válido pero no estar autorizado para el servicio o el entorno de destino. Revisá de nuevo la configuración de WSASS / homologación para test y las relaciones de servicio para producción.
  • WSFE 10015: en general significa que la combinación DocTipo / DocNro es inconsistente para ese tipo de comprobante y ese importe. Por ejemplo, la Factura B tiene reglas especiales de documento del receptor según el total.
  • WSFE 10016: el número de comprobante enviado en CbteDesde no es el siguiente válido para ese punto de venta y ese tipo de comprobante. Llamá a getNextVoucherNumber() inmediatamente antes de autorizar cuando tu numeración se pueda haber movido. Con clave de idempotencia, issue() consulta el número reservado: si ya lo ocupa otro comprobante el resultado es conflict y queda anotado en el store, y si el número está vacío sigue siendo rejected.
Cuando un error no es claro, revisá esto en orden:
  1. Que el certificado y la clave privada correspondan entre sí.
  2. Que el entorno sea el correcto (test o production).
  3. Que la autorización del servicio esté hecha para ese entorno.
  4. Que la combinación de tipo de comprobante, tipo de documento e importe sea válida.
  5. Que tu proceso no esté reusando supuestos viejos sobre el próximo número.
Last modified on September 10, 2026