ARCA {API}
Facturación (WSFEv1)

Emitir factura

Emitir factura A, B o C con CAE mediante WSFEv1.

Emite una factura electrónica (tipo A, B o C) y devuelve el CAE asignado por ARCA.

Endpoint

POST /api/wsfe/facturas

Request

curl -X POST https://arca.api.com.ar/api/wsfe/facturas \
  -H "Authorization: Bearer ak_TuSecretoAqui" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: pedido-uuid-1234" \
  -d '{
    "environment": "homologacion",
    "representada": "27111111118",
    "cbteTipo": 6,
    "ptoVta": 1,
    "docTipo": 80,
    "docNro": "30999888777",
    "concepto": 1,
    "condicionIvaReceptorId": 1,
    "email": "cliente@empresa.com",
    "items": [
      {
        "cantidad": 2,
        "descripcion": "Servicio de consultoría",
        "precioUnitario": 10000.00,
        "alicuotaIva": 21
      }
    ]
  }'

Parámetros

CampoTipoDescripción
environment"homologacion" | "produccion"Entorno de ARCA
representadastring (11 dígitos)CUIT representado que emite
cbteTiponumberTipo de comprobante: 1 (Fac A), 6 (Fac B), 11 (Fac C) y 4 / 9 / 15 (Recibo A / B / C). También 201/206/211 para la Factura de Crédito Electrónica MiPyME
ptoVtanumber (opcional)Punto de venta. Si lo omitís usamos el configurado para ese CUIT; la respuesta siempre informa cuál se usó
docTiponumberTipo de documento del receptor (ej. 80 = CUIT, 96 = DNI)
docNrostringNúmero de documento del receptor
conceptonumber1 = Productos, 2 = Servicios, 3 = Productos y servicios
condicionIvaReceptorIdnumberCondición IVA del receptor: 1 RI, 4 Exento, 5 Consumidor Final, 6 Monotributo, 7 No Categorizado
itemsarrayLista de ítems (ver debajo)
clienteIdstring (opcional)Id de un cliente guardado. Completa docTipo, docNro, condicionIvaReceptorId y email: ver Emitir por referencia
emailstring (opcional)Destinatario al que se le envía el comprobante por email al aprobarse
cbteFchstring (opcional)Fecha del comprobante YYYYMMDD (default: hoy). Dentro de un mismo punto de venta y tipo las fechas no pueden retroceder: si mandás una anterior a la del último comprobante que autorizó ARCA, la emisión se rechaza con 400 sin llegar al organismo. Ver La numeración o la fecha no corresponden
monedastring (opcional)Código de moneda (default: "PES")
cotizacionnumber (opcional)Cotización (default: 1)
fchServDesdestring (obligatorio si concepto = 2 o 3)Fecha inicio servicio YYYYMMDD
fchServHastastring (obligatorio si concepto = 2 o 3)Fecha fin servicio YYYYMMDD
fchVtoPagostring (obligatorio si concepto = 2 o 3, y siempre en MiPyME)Fecha vencimiento de pago YYYYMMDD
fceobject (obligatorio en MiPyME)Datos del régimen de crédito electrónico: ver Factura de Crédito Electrónica MiPyME

Ítems (items[])

CampoTipoDescripción
cantidadnumberCantidad de unidades. Siempre la mandás vos
descripcionstringDescripción del ítem
precioUnitarionumberPrecio unitario neto (sin IVA)
alicuotaIvanumberAlícuota de IVA en porcentaje: 0, 2.5, 5, 10.5, 21, 27. Obligatoria salvo que el ítem sea exento o no gravado
condicionIvastring (opcional)Condición del ítem frente al IVA: "gravado" (default), "exento" o "no_gravado". Ver Ítems exentos y no gravados
productoIdstring (opcional)Id de un producto guardado. Completa descripcion, precioUnitario, alicuotaIva y condicionIva: ver Emitir por referencia

El sistema calcula automáticamente ImpNeto, ImpIVA, ImpOpEx, ImpTotConc, ImpTotal y el desglose de IVA por alícuota. Para factura tipo C, no se discrimina IVA y tanto alicuotaIva como condicionIva son ignorados.

Ítems exentos y no gravados

Ante ARCA, exento no es una alícuota. Un ítem exento no lleva una línea de IVA al 0%: su importe va a ImpOpEx, fuera del neto gravado. Lo mismo con los no gravados, que van a ImpTotConc. Son tres cosas distintas:

condicionIvaQué significaDónde va el importe
"gravado" con alicuotaIva: 0Operación gravada a la alícuota del 0%ImpNeto, con línea de IVA al 0%
"exento"Operación exenta de IVAImpOpEx, sin línea de IVA
"no_gravado"Operación no alcanzada por el IVAImpTotConc, sin línea de IVA

alicuotaIva: 0 no es exento: es una operación gravada al 0%, y ARCA las registra distinto. Si tu actividad está exenta —comisiones, intereses, ciertos servicios—, el campo que necesitás es condicionIva.

Un ítem exento o no gravado no necesita alicuotaIva; si la mandás, se ignora.

{
  "items": [
    { "cantidad": 1, "descripcion": "Honorarios", "precioUnitario": 3235.28, "alicuotaIva": 21 },
    {
      "cantidad": 1,
      "descripcion": "Comisión de intermediación",
      "precioUnitario": 737.86,
      "condicionIva": "exento"
    }
  ]
}

En ese comprobante ImpNeto es 3235.28, ImpIVA es 679.41, ImpOpEx es 737.86 y el array Iva trae una sola entrada, la del 21%.

condicionIva es del ítem y no tiene nada que ver con condicionIvaReceptorId, que es la condición del receptor frente al IVA (RG 5616) y va a nivel comprobante.

Punto de venta

ptoVta es opcional. Si lo omitís, lo resolvemos así, deteniéndonos en lo primero que aplique:

  1. El punto de venta configurado para ese CUIT en el dashboard (Certificados → editar el CUIT).
  2. Lo que ARCA informa como habilitado: si hay uno solo, ese.
  3. El punto de venta 1.

La respuesta siempre incluye el ptoVta con el que se emitió, así que nunca quedás sin saber cuál se usó.

Si mandás el campo, tu valor gana siempre: no lo pisa el configurado ni la consulta a ARCA. Y no lo completamos con un 1 por default a propósito — es justo el número que en la mayoría de las cuentas no está habilitado para web services (ver el punto de venta no está habilitado).

Esto vale para WSFEv1. En WSFEX (exportación) ptoVta sigue siendo obligatorio: los puntos de venta de exportación se declaran por separado en ARCA y no son los mismos que los del mercado interno, así que no podemos deducirlos del que configuraste acá.

Envío por email

Si mandás email y el comprobante resulta aprobado, se le envía al destinatario con el PDF adjunto, sin que hagas nada más. El envío ocurre después de la respuesta, así que no le suma latencia a la emisión, y su estado viaja en el campo email de la respuesta. Ver Envío por email.

Idempotencia

Podés enviar el header Idempotency-Key con cualquier string único (UUID, ID de tu sistema, etc.). Si reenviás la misma solicitud con la misma key, el sistema devuelve el comprobante ya emitido sin volver a llamar a ARCA y sin reenviar el email.

Idempotency-Key: pedido-uuid-1234

Recibos

El recibo se emite por este mismo endpoint: no tiene campos propios ni ruta aparte, sólo un cbteTipo distinto. Es el comprobante que usan, por ejemplo, los profesionales de la salud para documentar honorarios.

cbteTipoComprobante
4Recibo A
9Recibo B
15Recibo C

Cada recibo se arma igual que la factura de su letra: el 15 no discrimina IVA (los ítems van sin alicuotaIva, como en la Factura C) y el 4 y el 9 la discriminan como la Factura A y B. Tampoco lleva comprobantes asociados: un recibo vale por sí solo, no es una nota.

Lo único a tener en cuenta es la numeración: cada tipo de comprobante lleva su propia serie dentro del punto de venta. El primer recibo de un punto de venta que ya tiene 200 facturas sale igual con el número 1. Como en el resto de la API, el número lo asignamos nosotros consultando el último autorizado para ese (ptoVta, cbteTipo).

{
  "environment": "produccion",
  "representada": "20111111112",
  "cbteTipo": 15,
  "docTipo": 99,
  "docNro": "0",
  "concepto": 2,
  "condicionIvaReceptorId": 5,
  "fchServDesde": "20260901",
  "fchServHasta": "20260930",
  "fchVtoPago": "20260930",
  "items": [
    { "cantidad": 1, "descripcion": "Honorarios profesionales", "precioUnitario": 25000 }
  ]
}

Para dejar sin efecto un recibo se emite la nota de crédito de su letra (13 para un Recibo C), asociada al recibo: ver notas de crédito y débito.

Factura de Crédito Electrónica MiPyME

La FCE es una factura común con dos particularidades: sus propios códigos de comprobante y unos datos bancarios que el régimen exige informar. Se emite por el mismo endpoint, con el mismo body de siempre más el bloque fce.

cbteTipoComprobante
201 / 206 / 211Factura de Crédito Electrónica MiPyME A / B / C
202 / 207 / 212Nota de débito electrónica MiPyME A / B / C
203 / 208 / 213Nota de crédito electrónica MiPyME A / B / C

Las notas del régimen se emiten por notas de crédito y débito y tienen requisitos distintos de los de la factura — no es el mismo bloque fce: ver Notas sobre una FCE.

El bloque fce en la factura

CampoTipoDescripción
cbustring (22 dígitos)Obligatorio. CBU del emisor donde se cobra el comprobante
aliasCbustring (opcional)Alias de ese CBU
opcionTransferencia"ADC" | "SCA" (opcional)Agente de Depósito Colectivo o Sistema de Circulación Abierta

Lo traducimos internamente a las entradas del bloque Opcionales que espera ARCA, así que no necesitás conocer esa tabla. Si preferís mandarlas vos, opcionales sigue funcionando y tu valor gana: ante un mismo identificador prevalece el que escribiste a mano. Los identificadores vigentes se consultan con tipos-opcional.

Estos tres campos son de la factura y sólo de la factura. En una nota MiPyME, ARCA los rechaza: los datos del cobro viajan en la factura asociada, no se repiten en la nota.

curl -X POST https://arca.api.com.ar/api/wsfe/facturas \
  -H "Authorization: Bearer ak_TuSecretoAqui" \
  -H "Content-Type: application/json" \
  -d '{
    "environment": "homologacion",
    "representada": "27111111118",
    "cbteTipo": 201,
    "ptoVta": 1,
    "docTipo": 80,
    "docNro": "30999888777",
    "concepto": 1,
    "condicionIvaReceptorId": 1,
    "fchVtoPago": "20260210",
    "fce": {
      "cbu": "0170099220000067797243",
      "aliasCbu": "mi.alias.cbu",
      "opcionTransferencia": "ADC"
    },
    "items": [
      {
        "cantidad": 10,
        "descripcion": "Provisión de insumos",
        "precioUnitario": 45000.00,
        "alicuotaIva": 21
      }
    ]
  }'

fchVtoPago es obligatorio, también con concepto: 1

En un comprobante común fchVtoPago sólo se exige con concepto 2 o 3 (servicios). En la factura de crédito electrónica se exige siempre, incluso facturando productos: es la fecha que dispara los plazos de aceptación y de transferencia del régimen. En sus notas, en cambio, ARCA lo prohíbe.

Emitir una factura MiPyME sin fce.cbu o sin fchVtoPago devuelve 400 antes de llamar a ARCA: no consume cuota ni avanza la numeración, así que corregís y reintentás sin costo.

Qué queda fuera de esta API

Emitimos la FCE; el resto del circuito no pasa por acá. La aceptación (expresa o tácita), el rechazo, el informe del CBU del receptor y la transferencia al Agente de Depósito Colectivo no son parte de WSFEv1: viven en otros servicios y en el portal de ARCA. Si tu flujo necesita cobrar la factura de crédito, ese tramo lo seguís haciendo por fuera.

Tampoco validamos las condiciones de habilitación del régimen: si estás inscripto en el registro MiPyME, si el receptor es una empresa grande y si el monto supera el mínimo lo decide ARCA, no nosotros. Cuando algo de eso no se cumple, ARCA rechaza el comprobante y te devolvemos su mensaje tal cual, sin reinterpretarlo.

Emitir por referencia (clienteId / productoId)

Si guardaste el receptor en tu agenda de clientes o el ítem en tu catálogo de productos, podés referenciarlos en lugar de repetir sus datos en cada request:

CampoDónde vaQué completa
clienteIdEn el comprobantedocTipo, docNro, condicionIvaReceptorId y email
productoIdEn cada ítemdescripcion, precioUnitario, alicuotaIva y condicionIva

El mismo request de arriba, con referencias:

curl -X POST https://arca.api.com.ar/api/wsfe/facturas \
  -H "Authorization: Bearer ak_TuSecretoAqui" \
  -H "Content-Type: application/json" \
  -d '{
    "environment": "homologacion",
    "representada": "27111111118",
    "cbteTipo": 6,
    "ptoVta": 1,
    "concepto": 1,
    "clienteId": "8f1c2b3a-4d5e-6f70-8192-a3b4c5d6e7f8",
    "items": [
      { "productoId": "c3e5a7b9-1d2f-4068-8a9b-0c1d2e3f4a5b", "cantidad": 2 }
    ]
  }'

La respuesta es idéntica a la de la emisión escrita a mano: las referencias son una comodidad de escritura del request, no un modo distinto de emitir.

Podés mezclar libremente: un comprobante puede llevar clienteId con ítems escritos a mano, o un receptor explícito con ítems del catálogo, o cualquier combinación ítem por ítem.

cantidad siempre la mandás vos. No es un atributo del catálogo: el mismo producto se vende en cantidades distintas.

El campo explícito siempre gana

La referencia es un default que completa lo que el request no trae, nunca un candado que pisa lo que escribiste. Si mandás los dos, vale el tuyo:

{
  "clienteId": "8f1c2b3a-4d5e-6f70-8192-a3b4c5d6e7f8",
  "email": "otra-direccion@empresa.com",
  "items": [
    {
      "productoId": "c3e5a7b9-1d2f-4068-8a9b-0c1d2e3f4a5b",
      "cantidad": 2,
      "precioUnitario": 8500
    }
  ]
}

Ese comprobante sale con el documento y la condición frente al IVA del cliente guardado, pero con el email del request; y con la descripción y la alícuota del producto, pero con el precio del request. Es la forma de aplicar un descuento puntual o mandar el comprobante a otra dirección sin tener que editar la agenda ni el catálogo.

El comprobante guarda valores, no punteros

Las referencias se resuelven en el momento de emitir. El comprobante persiste los datos resueltos, así que editar después el cliente o cambiar el precio del producto no altera nada de lo ya emitido —cosa que además sería ilegal: un comprobante con CAE es inmutable.

Dicho al revés: actualizar el catálogo es cómo subís precios hacia adelante, no cómo reescribís el pasado.

Errores de resolución

Una referencia que no se puede resolver devuelve 400, antes de llamar a ARCA: no consume cuota ni avanza la numeración, así que corregís y reintentás sin costo.

MensajeCausa
No se encontró el cliente <id> en tu cuentaEl id no existe, es de otra cuenta o lo diste de baja. Los tres casos son indistinguibles a propósito
No se encontró el producto <id> en tu cuentaÍdem, para un productoId de algún ítem
El cliente <id> no tiene condición frente al IVA cargadaEl cliente existe pero le falta condicionIvaReceptorId, que la emisión exige
El producto <id> no tiene alícuota de IVA cargadaEl producto existe, está gravado y le falta alicuotaIva. Un producto exento o no gravado se referencia sin alícuota

Los dos últimos ocurren porque el modelo guardado es más laxo que el de emisión: esos campos son opcionales al guardar y obligatorios al emitir. Nunca los inferimos. Un 21% supuesto o una condición frente al IVA adivinada producen un comprobante fiscalmente incorrecto con CAE, y eso no se puede deshacer; un 400 cuesta un reintento.

Se resuelven de cualquiera de las dos formas: completando el dato en el recurso guardado, o mandándolo explícito en el body.

Ver No pudimos resolver una referencia.

clienteId no aplica a WSFEX: el cliente guardado modela un receptor argentino (documento de ARCA y condición frente al IVA), y un receptor de exportación necesita país de destino e identificación del exterior. productoId sí funciona en WSFEX, pero sólo completa descripcion y precioUnitario: cantidad y unidadMedida los seguís mandando vos, y la alícuota de IVA no aplica a la exportación.

Respuesta exitosa

{
  "resultado": "A",
  "cae": "75050000000001",
  "caeFchVto": "20251225",
  "cbteNro": 42,
  "ptoVta": 1,
  "cbteTipo": 6,
  "observaciones": [],
  "errores": [],
  "pdfUrl": null,
  "email": { "to": "cliente@empresa.com", "status": "pending" }
}

El campo email sólo aparece si mandaste un destinatario. Su status en la respuesta de emisión es pending (el envío arranca recién después de responderte) o skipped en homologación, que nunca envía mails. El estado final se consulta después: ver Envío por email.

Comprobante rechazado

Si ARCA rechaza el comprobante devuelve HTTP 422:

{
  "resultado": "R",
  "cae": null,
  "caeFchVto": null,
  "cbteNro": null,
  "ptoVta": 1,
  "cbteTipo": 6,
  "observaciones": [
    { "code": 10048, "msg": "El importe no coincide con el calculado" }
  ],
  "errores": [],
  "pdfUrl": null
}

Un comprobante rechazado no consume cuota de tu plan: sólo se cuentan las facturas que obtuvieron CAE. Corregí lo que indica observaciones[].code y reintentá sin costo. Ver ARCA rechazó el comprobante.

Errores

Antes de reintentar una emisión, leé Reintentar sin duplicar el comprobante: un 502 no significa que el comprobante no se haya emitido.

En esta página