Error 401 Unauthorized in SDK

RunLLM
RunLLM

Error 401 ("Unauthorized") in Afip SDK means you need an access_token to use the SDK in production. You must log in at https://app.afipsdk.com to obtain one and include it in your requests as described in the documentation. Without this token, production API calls will be rejected with a 401 error.

For more details on handling this error and obtaining the access token, see the Afip SDK Documentation and this Discord discussion. Would you like step-by-step instructions?

Sources:

Giova
Giova

@user ya obtuve el token de acceso, estoy instanciando afip así this.afipInstance = new Afip({ CUIT: AFIP_CONFIG.CUIT, cert: AFIP_CONFIG.CERTIFICATES.CERT, key: AFIP_CONFIG.CERTIFICATES.KEY, production: AFIP_CONFIG.PRODUCTION, accessToken: AFIP_CONFIG.ACCESS_TOKEN, })

RunLLM
RunLLM

El error está en el nombre del parámetro: debe ser access_token (con guion bajo), no accessToken (camelCase). Cámbialo a:

this.afipInstance = new Afip({
  CUIT: AFIP_CONFIG.CUIT,
  cert: AFIP_CONFIG.CERTIFICATES.CERT,
  key: AFIP_CONFIG.CERTIFICATES.KEY,
  production: AFIP_CONFIG.PRODUCTION,
  access_token: AFIP_CONFIG.ACCESS_TOKEN,
})

Según la documentación oficial, el parámetro correcto es access_token. ¿Te gustaría más detalles sobre la configuración?

Sources:

Giova
Giova

@user y este error? [Nest] 20916 - 28/07/2025, 12:53:58 WARN [AfipService] 🟡 Estado general OK, pero servicio de facturación no disponible: [Nest] 20916 - 28/07/2025, 12:53:58 WARN [AfipService] (11002) El punto de venta no se encuentra habilitado a usar en el presente WS. Ver metodo FEParamGetPtosVenta

RunLLM
RunLLM

El error (11002) indica que el punto de venta no está habilitado para el web service de facturación electrónica. Debes dar de alta un punto de venta compatible desde el servicio "Administración de puntos de venta y domicilios" en AFIP, eligiendo la opción correspondiente según tu condición fiscal y asociándolo al web service adecuado.

Para más detalles sobre cómo crear y habilitar el punto de venta, consulta la guía oficial de Afip SDK. ¿Necesitás el paso a paso?

Sources:

Giova
Giova

@user

RunLLM
RunLLM

Parece que los puntos de venta están correctamente dados de alta y habilitados, pero el error persiste. Es probable que el error (11002) se deba a que el número de punto de venta que usás en la solicitud no coincide con los configurados para el tipo de comprobante (por ejemplo, usar el punto 10 para Factura A, 11 para Factura B, etc.), o que estés usando un punto de venta dado de baja (verifica que FchBaja sea "NULL") o bloqueado.

Según la documentación y experiencias de la comunidad y Discord, asegúrate de que el punto de venta usado en tu request coincida exactamente con el tipo de comprobante y esté activo. ¿Querés que te ayude a revisar cómo armar el request correctamente?

Sources:

Giova
Giova

@user Sí ayudame

RunLLM
RunLLM

Debes asegurarte de que, al crear la factura, el campo PtoVta coincida con el punto de venta habilitado y correcto para el tipo de comprobante. Por ejemplo, para Factura A usa el punto 10, para Factura B el 11, y para ticket fiscal el 12, según tu configuración. Además, verifica que el punto de venta no esté dado de baja (FchBaja debe ser "NULL") ni bloqueado.

Ejemplo en JavaScript para Factura A:

const data = {
  CantReg: 1,
  PtoVta: 10, // Punto de venta para Factura A
  CbteTipo: 1, // Tipo de comprobante: 1 = Factura A
  // ...otros campos requeridos
};
const res = await afip.ElectronicBilling.createVoucher(data);

Si el error persiste, revisa que el CUIT usado sea el mismo con el que se dieron de alta los puntos de venta y que el certificado corresponda a ese CUIT. Más detalles en la documentación de errores frecuentes. ¿Te gustaría que te ayude a armar el request completo para tu caso?

Sources:

Giova
Giova

@user const voucherData = { CantReg: 1, PtoVta: 10, // Punto de venta para Factura A CbteTipo: 1, // Tipo de comprobante Factura A Concepto: 1, DocTipo: 80, // CUIT DocNro: 20284486049, // CUIT sin guiones CbteDesde: 123, // Número de comprobante CbteHasta: 123, // Mismo número CbteFch: "20241220", // Fecha formato YYYYMMDD ImpTotal: 3000.00, // Total del comprobante ImpTotConc: 0, // Importe no gravado ImpNeto: 2479.34, // Neto sin IVA ImpOpEx: 0, // Operaciones exentas ImpIVA: 520.66, // IVA calculado ImpTrib: 0, // Tributos MonId: "PES", // Moneda pesos MonCotiz: 1, // Cotización CondicionIVAReceptorId: 1, // Responsable Inscripto (para Factura A) Iva: [ // Detalle de IVA { Id: 5, // Alícuota 21% BaseImp: 2479.34, // Base imponible Importe: 520.66 // Importe IVA } ] }; esta es la estructura

RunLLM
RunLLM

La estructura de tu objeto voucherData es correcta para emitir una Factura A con el punto de venta 10, siempre que ese punto esté habilitado para Factura A y el CUIT/certificado coincidan. Asegúrate de que el número de comprobante (CbteDesde y CbteHasta) sea el siguiente al último autorizado para ese punto y tipo, y que la fecha (CbteFch) sea igual o posterior a la del último comprobante emitido, ya que de lo contrario recibirás errores como el 10016 o 11002.

Puedes consultar el último comprobante autorizado con getLastVoucher(puntoDeVenta, tipoDeComprobante) antes de emitir uno nuevo, como indica la documentación oficial. ¿Te muestro cómo hacerlo paso a paso?

Sources: