Integracin N8N con AFIP

RunLLM
RunLLM

No es necesario crear el certificado de producción ni autorizar los web services en cada request. Estos pasos se realizan solo una vez por CUIT y web service; luego, puedes reutilizar el certificado y la autorización para todas tus solicitudes, como la creación de notas de crédito, hasta que el certificado expire o cambies de entorno (desarrollo/producción) según corresponda. Solo deberás renovar el certificado cuando venza y volver a autorizar si agregas nuevos servicios o CUITs asociados.

Según la documentación, el flujo correcto es: crear el certificado, autorizar el web service, y luego usar esa información para operar normalmente con la API (por ejemplo, emitir comprobantes) sin repetir los pasos iniciales en cada request. Esto aplica tanto en N8N como en cualquier integración con Afip SDK. Más detalles en esta guía paso a paso y en la documentación oficial.

¿Te gustaría ver un ejemplo concreto de cómo se reutiliza el certificado y la autorización en N8N?

Sources:

agus
agus

@user ya cree el certificado de producción y tengo el certificado y la key. Con eso ya estoy para poder opernar normalmente con la api?

RunLLM
RunLLM

Sí, si ya creaste el certificado de producción y tienes el certificado y la key, solo te falta autorizar el web service específico que vas a usar (por ejemplo, factura electrónica) desde la página de ARCA. Una vez autorizado, puedes operar normalmente con la API usando ese certificado y key para todas tus solicitudes, sin repetir el proceso para cada request, hasta que el certificado expire o cambies de entorno.

Puedes consultar el paso de autorización aquí: Autorizar web service de producción. Si ya lo hiciste, ya puedes operar con la API sin problemas.

Sources:

agus
agus

@user el web service de facturacion electronica sirve para hacer notas de credito?

RunLLM
RunLLM

Sí, el web service de facturación electrónica (WSFE) permite emitir notas de crédito, además de facturas y otros comprobantes. Solo debes indicar el tipo de comprobante correspondiente a nota de crédito en tu solicitud, como se muestra en la documentación oficial de Afip SDK.

Puedes ver ejemplos y detalles en la sección de nota de crédito A y otras variantes en la documentación.

Sources:

agus
agus

@user me explicas que es cada valor del json ejemplo de la documentacion de notas de credito: { "environment": "dev", "method": "FECAESolicitar", "wsid": "wsfe", "params": { "Auth": { "Token": "{{token}}", "Sign": "{{sign}}", "Cuit": "20409378472" }, "FeCAEReq": { "FeCabReq": { "CantReg": 1, "PtoVta": 1, "CbteTipo": 203 }, "FeDetReq": { "FECAEDetRequest": { "Concepto": 1, "DocTipo": 80, "DocNro": 33693450239, "CbteDesde": 30, "CbteHasta": 30, "CbteFch": 20240314, "FchServDesde": null, "FchServHasta": null, "FchVtoPago": null, "ImpTotal": 121, "ImpTotConc": 0, "ImpNeto": 100, "ImpOpEx": 0, "ImpIVA": 21, "ImpTrib": 0, "MonId": "PES", "MonCotiz": 1, "CondicionIVAReceptorId": 1, "CbtesAsoc": { "CbteAsoc": [ { "Tipo": 1, "PtoVta": 1, "Nro": 1 } ] }, "Iva": { "AlicIva": [ { "Id": 5, "BaseImp": 100, "Importe": 21 } ] } } } } } }

RunLLM
RunLLM

Cada campo del JSON corresponde a un dato requerido por AFIP para autorizar una nota de crédito electrónica. Por ejemplo:

  • environment: entorno de trabajo ("dev" para pruebas, "prod" para producción).
  • method: método a ejecutar, en este caso "FECAESolicitar" (solicitud de CAE).
  • wsid: identificador del web service, "wsfe" para facturación electrónica.
  • params.Auth: credenciales de autenticación (Token, Sign, Cuit).
  • FeCAEReq.FeCabReq: cabecera del comprobante (cantidad, punto de venta, tipo de comprobante).
  • FeCAEReq.FeDetReq.FECAEDetRequest: detalle del comprobante (concepto, tipo y número de documento, numeración, fechas, importes, moneda, condición IVA, comprobantes asociados, IVA).

Puedes ver la explicación de cada campo y sus valores en la documentación oficial de Afip SDK.

¿Te gustaría una explicación detallada de cada campo específico?

Sources:

agus
agus

@user no me queda claro que datos son los de token y Sign. Son los que recibi al crear el certificado (Cert y Key) ?

RunLLM
RunLLM

No, "Token" y "Sign" no son el certificado ni la key. Son valores temporales que se obtienen al autenticarte contra el web service usando tu certificado y key; se generan en cada sesión y se usan para autorizar las solicitudes a AFIP/ARCA. El certificado y la key solo se usan para obtener estos valores, no se envían en cada request.

Puedes ver cómo obtener "Token" y "Sign" en la documentación oficial.

¿Te gustaría ver un ejemplo de cómo obtenerlos en tu lenguaje?

Sources:

agus
agus

@user o sea para ejecutar crear nota de credito antes tengo que pegarle al endpoint de API de skd para que me devuelva el token y sign?

RunLLM
RunLLM

Exacto: antes de crear una nota de crédito, primero debes hacer una solicitud al endpoint de autenticación de la API de Afip SDK para obtener el "token" y "sign". Luego, usas esos valores en la solicitud para crear la nota de crédito. Este proceso se repite cada vez que el token expira o para cada sesión nueva.

Puedes ver el flujo detallado en la documentación oficial y ejemplos en este tutorial.

Sources:

agus
agus

@user cada cuanto expira? Porque no se si ponerlo dentro del mismo workflow de n8n y que me devuelva un token y sign para cada request o correrlo independiente y obtener los datos estaticos.

RunLLM
RunLLM

El token y sign tienen una validez de 12 horas desde su emisión. Sin embargo, la práctica recomendada es solicitarlos antes de cada request, ya que Afip SDK gestiona automáticamente la renovación si el token expiró, evitando problemas de autenticación y sincronización manual.

Esto significa que puedes incluir el paso de autenticación en tu workflow de n8n para obtener siempre un token y sign válidos antes de cada operación, tal como sugiere la documentación oficial.

Sources:

agus
agus

@user quise obtener el token y sign pero me devuelte este error: Bad request - please check your parameters 400 - "{"statusCode":400,"data_errors":{"cert":"El campo Certificado es obligatorio","key":"El campo Key es obligatorio"}}"

Le pegue a este endpoint: https://app.afipsdk.com/api/v1/afip/auth

Y en el json inclui: { "environment": "prod", "tax_id": "[MI CUIT]", "wsid": "wsfe" }

RunLLM
RunLLM

El error indica que faltan los campos "cert" y "key" en tu JSON. En producción, es obligatorio enviar el certificado y la key junto con los demás parámetros para obtener el token y sign. Debes agregar "cert": "-----BEGIN CERTIFICATE-----..." y "key": "-----BEGIN RSA PRIVATE KEY-----..." en el body de la solicitud.

Puedes ver el ejemplo correcto en la documentación oficial.

Sources:

agus
agus

@user corri la autorizacion de web service de produccion y me sale este error: [

{

"error": "Referenced node doesn't exist"

} ]

RunLLM
RunLLM

Ese error ("Referenced node doesn't exist") no es propio de la autorización del web service en ARCA, sino que proviene de la configuración del workflow en n8n. Indica que algún nodo al que haces referencia en tu flujo fue eliminado o renombrado, y por eso el workflow no puede ejecutarse correctamente.

Revisa tu workflow en n8n y asegúrate de que todos los nodos referenciados existan y estén correctamente conectados. Este error no está relacionado con la API de Afip SDK ni con la autorización del web service en sí, según la documentación oficial.

¿Te gustaría ayuda para revisar la estructura de tu workflow en n8n?

Sources:

agus
agus

@user necesito para cada campo del json que me expliques a que dato refiere. Es de crear nota de credito B

{ "environment": "dev", "method": "FECAESolicitar", "wsid": "wsfe", "params": { "Auth": { "Token": "{{ $json.token }}", "Sign": "{{ $json.sign }}", "Cuit": "20409378472" }, "FeCAEReq": { "FeCabReq": { "CantReg": 1, "PtoVta": 1, "CbteTipo": 208 }, "FeDetReq": { "FECAEDetRequest": { "Concepto": 1, "DocTipo": 99, "DocNro": 0, "CbteDesde": 15, "CbteHasta": 15, "CbteFch": 20240314, "FchServDesde": null, "FchServHasta": null, "FchVtoPago": null, "ImpTotal": 121, "ImpTotConc": 0, "ImpNeto": 100, "ImpOpEx": 0, "ImpIVA": 21, "ImpTrib": 0, "MonId": "PES", "MonCotiz": 1, "CondicionIVAReceptorId": 5, "CbtesAsoc": { "CbteAsoc": [ { "Tipo": 6, "PtoVta": 1, "Nro": 1 } ] }, "Iva": { "AlicIva": [ { "Id": 5, "BaseImp": 100, "Importe": 21 } ] } } } } } }

RunLLM
RunLLM

Te explico cada campo del JSON para crear una Nota de Crédito B:

  • environment: entorno de ejecución ("dev" para desarrollo, "prod" para producción).
  • method: método a ejecutar, aquí "FECAESolicitar" (solicitud de CAE).
  • wsid: identificador del web service, "wsfe" para facturación electrónica.
  • params.Auth: credenciales de autenticación (Token, Sign y CUIT del emisor).
  • FeCAEReq.FeCabReq: cabecera del comprobante:
    • CantReg: cantidad de comprobantes a registrar (normalmente 1).
    • PtoVta: punto de venta.
    • CbteTipo: tipo de comprobante (208 = Nota de Crédito B).
  • FeCAEReq.FeDetReq.FECAEDetRequest: detalle del comprobante:
    • Concepto: 1=Productos, 2=Servicios, 3=Ambos.
    • DocTipo: tipo de documento del receptor (99=Consumidor Final).
    • DocNro: número de documento del receptor (0 para consumidor final).
    • CbteDesde y CbteHasta: numeración del comprobante (igual si es uno solo).
    • CbteFch: fecha del comprobante (formato AAAAMMDD).
    • FchServDesde, FchServHasta, FchVtoPago: fechas de servicio/pago (solo para servicios).
    • ImpTotal: importe total.
    • ImpTotConc: importe no gravado.
    • ImpNeto: importe neto gravado.
    • ImpOpEx: importe exento de IVA.
    • ImpIVA: importe total de IVA.
    • ImpTrib: importe total de tributos.
    • MonId: moneda ("PES" para pesos argentinos).
    • MonCotiz: cotización de la moneda (1 para pesos).
    • CondicionIVAReceptorId: condición frente al IVA del receptor (5=Consumidor Final).
    • CbtesAsoc: comprobantes asociados (tipo, punto de venta y número de la factura asociada).
    • Iva.AlicIva: detalle de alícuotas de IVA (Id=tipo de IVA, BaseImp=base imponible, Importe=importe de IVA).

¿Te gustaría una explicación más detallada de algún campo específico?

Sources:

Para habilitar la administración de certificados digitales en una empresa, debes usar el CUIT de la empresa en los campos cuit y delegate_to. En username, pon el CUIT de la persona física que administra la empresa (quien ingresa a ARCA). La contraseña es la de ese usuario administrador.

Ejemplo:

{
  "automation": "add-relation",
  "params": {
    "cuit": "CUIT_EMPRESA",
    "username": "CUIT_PERSONA_ADMIN",
    "password": "contraseña_admin",
    "service": "web://arfe_certificado",
    "delegate_to": "CUIT_EMPRESA"
  }
}

Más detalles en la documentación oficial.

¿Te gustaría ver un ejemplo en algún lenguaje específico?

Sources:

La respuesta indica que la nota de crédito fue aprobada correctamente (Resultado: "A") y se asignó un CAE, por lo que está emitida en AFIP. Sin embargo, en la plataforma de ARCA, los comprobantes generados por web service pueden demorar hasta 24 horas en aparecer en la sección "Mis comprobantes". No aparecerán en "Comprobantes en Línea", ya que esa sección solo muestra los emitidos manualmente por el portal.

Esto está confirmado en la comunidad y documentación: revisa "Mis comprobantes" después de un tiempo, y si fue en entorno de desarrollo, no aparecerá en producción. Más detalles en este hilo de la comunidad.

Sources:

agus
agus

@user porque en el payload ejemplo de nota de credito B trae como valor de Comprobante tipo = 208 ?

Revisando en arca el que correponde es 8.

RunLLM
RunLLM

El valor 208 corresponde a "Nota de Crédito electrónica MiPyME B", mientras que el valor 8 es para "Nota de Crédito B" común. Debes usar 8 si quieres emitir una Nota de Crédito B estándar, y 208 solo si es una MiPyME. Esto está especificado en la documentación de tipos de comprobantes de ARCA y Afip SDK.

Puedes consultar la lista completa de tipos de comprobantes en la documentación oficial.

Sources:

agus
agus

@user esta fue tu respuesta: La respuesta indica que la nota de crédito fue aprobada correctamente (Resultado: "A") y se asignó un CAE, por lo que está emitida en AFIP. Sin embargo, en la plataforma de ARCA, los comprobantes generados por web service pueden demorar hasta 24 horas en aparecer en la sección "Mis comprobantes". No aparecerán en "Comprobantes en Línea", ya que esa sección solo muestra los emitidos manualmente por el portal.

Si la busco usando afipskd deberia encontrarla o también necesito esperar 24 hs?

RunLLM
RunLLM

Si usas Afip SDK para consultar la nota de crédito emitida por web service, deberías poder encontrarla inmediatamente después de recibir el CAE, sin necesidad de esperar 24 horas. El retraso de hasta 24 hs solo aplica para la visualización en la web de ARCA, no para las consultas vía API/web service.

Esto está confirmado en la comunidad y en la documentación de Afip SDK.

Sources:

Nacho Lank
Nacho Lank

@user hicimos la búsqueda usando la consulta de comprobantes a ARCA https://afipsdk.com/blog/realizar-constatacion-de-comprobantes-de-arca-via-api/ de la nota de crédito emitida de forma aprobada y con CAE usando este request

{ "environment": "prod", "method": "ComprobanteConstatar", "wsid": "wscdc", "params": { "Auth": { "Token": "", "Sign": "", "Cuit": "**" }, "CmpReq": { "CbteModo": "CAE", "CuitEmisor": **, "PtoVta": 3, "CbteTipo": 8, "CbteNro": 1, "CbteFch": 20260331, "ImpTotal": 2673, "CodAutorizacion": "86140758287836", "DocTipoReceptor": "99", "DocNroReceptor": "0" } } }

y me devolvió

[ { "ComprobanteConstatarResult": { "CmpResp": { "CbteModo": "CAE", "CuitEmisor": **, "PtoVta": 3, "CbteTipo": 8, "CbteNro": 1, "CbteFch": "20260331", "ImpTotal": 2673, "CodAutorizacion": "86140758287836", "DocTipoReceptor": "99", "DocNroReceptor": "0" }, "Resultado": "R", "Events": { "Evt": [ { "Code": 0 } ] }, "Errors": { "Err": [ { "Code": 600, "Msg": "ValidacionDeToken: No validó Id Sistema: wscdc(Id Sistema de token es: wsfe)" } ] } } } ]

el rechazo es a la consulta que acabo de hacer o a la nota de crédito? los valores "**" son para evitar compartir por este medio datos sensibles.

Realizar constatación de comprobantes de ARCA via API

Con pocas líneas de código

Open embed source
RunLLM
RunLLM

El rechazo ("Resultado": "R") y el error "ValidacionDeToken: No validó Id Sistema: wscdc(Id Sistema de token es: wsfe)" corresponden a la consulta que realizaste, no a la nota de crédito en sí. El error indica que el Token Authorization (TA) que usaste fue generado para el web service "wsfe" (facturación electrónica) y no para "wscdc" (constatación de comprobantes), por lo que la validación falla antes de analizar el comprobante solicitado. Debes generar el token específicamente para "wscdc" y luego repetir la consulta.

Según la documentación oficial, cada web service requiere su propio token, y este error es común si se reutiliza un token de otro servicio. La nota de crédito no fue rechazada, solo la consulta fue inválida por el token incorrecto.

¿Te gustaría ver el paso a paso para generar el token correcto y repetir la consulta?

Sources:

Nacho Lank
Nacho Lank

@user como podría activar el web service de consulta de comprobantes?

RunLLM
RunLLM

Para activar el web service de consulta de comprobantes (WSCDC), debes autorizar el servicio en ARCA vinculando tu certificado digital al web service "wscdc". Esto se realiza desde el "Administrador de Relaciones de Clave Fiscal" en la web de ARCA, eligiendo el CUIT correspondiente y agregando la relación con el servicio WSCDC. Luego, espera unos minutos para que la autorización se propague.

Si necesitas el paso a paso detallado, avísame y te lo explico con capturas y enlaces directos a la guía oficial.

Sources:

agus
agus

@user necesito hacer un get y traer la última nota de credito B creada como para obtener el numero de comprobante. Que endpoint me recomendas usar ?

RunLLM
RunLLM

Debes usar el endpoint https://app.afipsdk.com/api/v1/afip/requests con el método FECompUltimoAutorizado, especificando el punto de venta y el tipo de comprobante (8 para Nota de Crédito B). Esto te devolverá el número del último comprobante autorizado de ese tipo.

Ejemplo de payload:

{
  "environment": "prod",
  "method": "FECompUltimoAutorizado",
  "wsid": "wsfe",
  "params": {
    "Auth": {
      "Token": "{{token}}",
      "Sign": "{{sign}}",
      "Cuit": "TU_CUIT"
    },
    "PtoVta": 1,
    "CbteTipo": 8
  }
}

Más detalles en la documentación oficial.

Sources:

agus
agus

@user lo corri y me trae un numero de comprobante más bajo del último creado. Porque sucede esto? No me trae el último

RunLLM
RunLLM

Esto puede suceder si el último comprobante fue emitido manualmente desde el portal de ARCA ("Comprobantes en Línea") y no por web service, ya que el método FECompUltimoAutorizado solo devuelve el último comprobante generado por web service, no los creados manualmente. Por eso, el número puede ser menor al último que ves en la plataforma.

Esta limitación está documentada en la comunidad y en la documentación oficial.

¿Te gustaría saber cómo consultar comprobantes manuales?

Sources:

Nacho Lank
Nacho Lank

@user quise hacer una pegada a la obtención el último comprobante y me devolvió status 400 con data errors: tax_id: El campo CUIT es obligatorio. el body del request es

{ "environment": "prod", "method": "FECompUltimoAutorizado", "wsid": "wsfe", "params": { "Auth": { "Token": "aa", "Sign": "aa", "Cuit": "aa" }, "PtoVta": 2, "CbteTipo": 6 } }

el cuit se está enviando, los valores que dicen aa fueron reemplazados por ser datos sensibles. el cuit está incluido.

RunLLM
RunLLM

El error "tax_id: El campo CUIT es obligatorio" se refiere al campo tax_id que debe enviarse en el body principal del request, no solo dentro de params.Auth. Debes agregar "tax_id": "TU_CUIT" al mismo nivel que environment, method, y wsid en el JSON.

Según la documentación oficial de la API, el campo tax_id es obligatorio en el body principal para identificar el CUIT sobre el que se realiza la operación, además de estar en Auth.

¿Te gustaría ver un ejemplo de request corregido?

Sources:

Nacho Lank
Nacho Lank

@user dame un ejemplo de request corregido

RunLLM
RunLLM

Aquí tienes un ejemplo de request corregido, incluyendo el campo tax_id en el body principal:

{
  "environment": "prod",
  "tax_id": "TU_CUIT",
  "method": "FECompUltimoAutorizado",
  "wsid": "wsfe",
  "params": {
    "Auth": {
      "Token": "aa",
      "Sign": "aa",
      "Cuit": "TU_CUIT"
    },
    "PtoVta": 2,
    "CbteTipo": 6
  }
}

Asegúrate de reemplazar "TU_CUIT", "aa" por tus datos reales. Así evitarás el error de campo obligatorio según la documentación oficial.

Sources: