1. Habilitá ARCA
Necesitás CUIT, certificado y clave privada, la relación del certificado con
el servicio Facturación Electrónica, y un punto de venta habilitado para
web services. Homologación y producción tienen certificados y puntos de venta
propios. El SDK no hace estas habilitaciones por vos, pero el CLI te acompaña:
El comando genera la clave privada y el CSR que se sube en ARCA. En homologación,
te deja el CSR en el portapapeles. Después imprime qué página abrir, qué botón
usar y qué servicio autorizar. Cuando ARCA te dé el certificado, pegalo en el
prompt final. El CLI lo guarda en ese mismo directorio como arca-test.crt.
Si saliste antes, npx facturas cert lo toma después. El
paso a paso completo y las referencias oficiales están en
Habilitación en ARCA. Los comandos están en
CLI.
2. Instalá
Requiere Node.js 20 o superior y módulos ESM. Si usás Vercel Postgres,
instalá también el cliente @vercel/postgres de tu aplicación.
3. Configurá el cliente
Definí ARCA_TAX_ID, ARCA_CERTIFICATE_PEM, ARCA_PRIVATE_KEY_PEM y
ARCA_ENVIRONMENT=test. Los PEM deben contener el certificado y la clave
completos. No los subas al repositorio. No hay entorno predeterminado: test
apunta a homologación y production a los servidores reales.
Los campos explícitos de createArcaClient() tienen prioridad.
Con eso alcanza para emitir: el cliente lee las variables de entorno y guarda
el ticket WSAA en memoria. No necesitás base de datos ni ningún servicio
externo. El resto de las opciones está en Configuración.
Antes de escribir código, confirmá las habilitaciones:
El comando prueba la configuración, el certificado, WSAA, WSFE y los puntos de
venta en ese orden. Si algo falla, nombra el paso y muestra dónde corregirlo en
ARCA. No
hace falta exportar nada para correrlo: si arca-test.crt y arca-test.key
están en el directorio, los usa, y saca de ahí el entorno y el CUIT. No
escribe nada en ARCA. Guarda el ticket WSAA en el directorio temporal para
poder repetirse. La tabla completa de diagnósticos está en
CLI.
4. Emití la primera factura
Elegí tu condición real de emisor y tu punto de venta habilitado. Este bloque
es examples/primera-factura.ts:
El importe se expresa en centavos. Para responsables inscriptos usá
issuer: "responsable_inscripto" e ítems como { gross: 12_100, vat: 21 }.
Si preferís probar el circuito antes de escribir código,
npx facturas issue --sales-point 3 --issuer monotributo emite una factura de
ARS 1 en homologación y te imprime la llamada que hizo.
ARCA valida la habilitación fiscal. El SDK no infiere tu condición. Todos los
campos del input están en Facturas.
Antes de emitir podés revisar lo que el SDK va a enviar con
arca.preview(input): es sincrónico, no hace ninguna llamada y devuelve la
clase, el tipo de comprobante, los amounts y el request exacto. Compará
preview(input).amounts.sentTotal con el total de tu venta y recién entonces
llamá a issue().
5. Tratá todos los resultados
authorized: guardá factura.voucher y su CAE.
rejected: revisá los errores que devolvió ARCA.
indeterminate: conservá el número y la evidencia. Conciliá o repetí el mismo input con su clave, como explica el paso 6.
conflict: hay otro comprobante en ese número. Detené el flujo e investigá.
La evidencia SOAP y el input exacto no aparecen por defecto. Podés pedirlos
con include: { raw: true, exactInput: true }. La secuencia de llamadas está en
Qué hace issue() al emitir.
Cuando una llamada falla, mirá Errores.
6. Evitá duplicados al reintentar
ARCA no acepta una clave de idempotencia como Stripe. Si se corta la respuesta,
tu aplicación no sabe si ARCA emitió el comprobante. facturas facilita un
mecanismo de deduplicación: guardá el intento en un store y pasá el ID estable
de la venta como idempotencyKey. Al reintentar, el SDK consulta el número
reservado antes de decidir si tiene que emitir.
Creá una vez la tabla Postgres y usá:
Un solo store guarda tickets WSAA y reservas de comprobantes. También hay
adaptadores para Redis, archivos y memoria. La memoria sirve para pruebas y no
sobrevive al reinicio del proceso. Comparalos en
Evitar comprobantes duplicados.
Usá de 1 a 255 caracteres, sin CUIT, DNI ni otros datos personales. No generes
una clave nueva por intento. Una clave con un input diferente produce
ARCA_INPUT_IDEMPOTENCY_MISMATCH. No borres ni hagas vencer las reservas:
guardan el número fiscal que el reintento debe consultar.
7. Pasá a producción
Habilitá el certificado y punto de venta de producción y cambiá
ARCA_ENVIRONMENT=production. Una prueba de ARS 1 usa items: [{ amount: 100 }].
Una factura de prueba en producción es un documento fiscal real y queda registrada en ARCA.
8. Emití una nota de crédito
ARCA no anula comprobantes: una corrección es una nota de crédito, que también
es un documento real. Lo habitual es la nota parcial, que acredita las líneas
que elegís:
Con all: true en lugar de items acreditás el total del original. El modo es
explícito y obligatorio: sin items ni all: true, el SDK falla antes de
cualquier llamada, así un campo olvidado nunca acredita la factura entera.
La nota es una segunda operación. Si falla, la factura sigue pendiente. La
clase, el receptor, la moneda, el concepto y las fechas de servicio salen del
original. Vos aportás las líneas y, como mucho, el punto de venta y la fecha de
la nota. issueDebitNote() emite notas de débito y associatedPeriod permite
emitir notas por período. Está todo
en Notas de crédito. Si además necesitás detalle de
ítems, el comprobante va por WSMTXCA.