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. ArcaInvalidSoapResponseError también expone service, operation, endpointUrl, statusCode, contentType y una vista previa redactada del cuerpo, para saber qué respondió en lugar de ARCA.

Guardar un error

toArcaSafeErrorMetadata(error) reduce cualquier error a lo que se puede loguear o guardar: name, message, code y los campos tipados de cada clase: Nunca incluye la causa, el stack, la respuesta cruda, la vista previa del cuerpo, la URL del endpoint, los issues ni el CAE. Es el mismo error que trae lookup.kind === "failed" en un indeterminate.

Códigos de ArcaInputError

ArcaInputError se lanza antes de llamar a ARCA. Además del code, expone field con el campo que falló y, cuando aplica, expected con lo que el SDK esperaba. Con ARCA_INPUT_DATE_OUTSIDE_WINDOW trae también window: { from, to }, las fechas que ARCA acepta ese día en YYYY-MM-DD. Desde issue(), issueCreditNote() o issueDebitNote(), un ArcaInputError garantiza que esa llamada no envió ningún pedido de autorización: ARCA no emitió nada por ella. Pudo haber hecho consultas antes, como leer el comprobante original de una nota, pero no reservó la idempotencyKey, así que corregís el input y reintentás con la misma clave. La excepción es ARCA_INPUT_IDEMPOTENCY_MISMATCH: esta llamada tampoco envió nada, pero la clave ya pertenece a otra que sí pudo haber emitido. ARCA_INPUT_RESERVATION_NOT_FOUND 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 store persistente para que un proceso nuevo reuse el TA que obtuvo otro. El store guarda los tickets cifrados. 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, o la fecha no es válida. preview() e issue() rechazan antes, con ArcaInputError, una fecha fuera de la ventana que acepta ARCA. 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 October 1, 2026