Emitir un comprobante
POST /v1/comprobantes — headers Authorization e Idempotency-Key (obligatorio, ver la sección siguiente). Responde 201.
| Campo | Tipo | Notas |
|---|---|---|
cuit | número | CUIT emisor (el del certificado) |
entorno | homologacion | produccion | producción emite comprobantes reales |
ptoVta | número | punto de venta habilitado para Web Services |
tipoComprobante | número | ver Catálogos (11 = Factura C) |
concepto | 1 | 2 | 3 | productos / servicios / ambos |
receptor | objeto | docTipo, docNro (0 = consumidor final sin identificar), condicionIvaId |
fecha | fecha | del comprobante: usá la fecha de hoy en cada intento |
fechaServicioDesde, fechaServicioHasta, fechaVtoPago | fecha | obligatorias con concepto 2 o 3 |
moneda, cotizacion | texto, número | "PES" y 1 para pesos |
importes | objeto | neto, noGravado?, exento?, iva?[], tributos?[], total |
comprobantesAsoc | lista | obligatoria en notas de crédito/débito: [{ "tipo", "ptoVta", "nro" }] (cuit opcional: 11 dígitos, sin guiones) |
receptor.nombre, receptor.domicilio | texto | opcionales, solo para el PDF |
receptor.email | texto | opcional: se guarda para mandarle el PDF (ver Mandar el PDF por mail) |
condicionVenta | texto | opcional, para el PDF: Contado (por defecto), Cuenta corriente, Transferencia bancaria, Tarjeta de débito, Tarjeta de crédito, Cheque u Otra |
items | lista | opcional, para el PDF: [{ "descripcion", "cantidad", "precioUnitario", "codigo?", "unidad?", "bonificacion?", "alicuotaId?" }], hasta 50. Tienen que sumar importes.neto; con varias alícuotas, alicuotaId en cada ítem y cada alícuota suma su base imponible |
plantilla | texto | opcional: plantilla del PDF (su identificador, ver Plantillas de factura). Sin enviar: la plantilla de la API key, la del punto de venta, la predeterminada de la cuenta o la Clásica |
nombreFantasia | texto | opcional: nombre de fantasía para el PDF de este comprobante (pisa el de la plantilla y el del CUIT; hasta 100 caracteres, sin enlaces). Queda guardado con el comprobante |
certPem, keyPem | texto | opcionales: solo si no guardaste el certificado en la bóveda (van los dos juntos) |
Reglas que valida la API antes de ir a ARCA:
total = neto + noGravado + exento + Σiva + Σtributos(tolerancia de 1 centavo).- Factura C (monotributo): sin
iva. A y M: IVA discriminado por alícuota y receptor con CUIT (docTipo80). - Concepto 2 o 3:
fechaServicioDesde,fechaServicioHastayfechaVtoPago. - ARCA exige la fecha cerca de hoy (±5 días productos, ±10 servicios) y no anterior al último comprobante de la serie.
Respuesta (201):
{
"numero": 42, "cae": "86400952208054", "caeVencimiento": "2026-10-22",
"resultado": "A", "resultadoDescripcion": "Aprobado",
"ptoVta": 1, "tipoComprobante": 11, "letra": "C", "clase": "factura", "descripcion": "Factura C",
"observaciones": []
}
Factura C de servicios a un CUIT (TypeScript):
// hoyAR(): fecha de hoy en Argentina, 'YYYY-MM-DD'
const r = await fetch('https://api.arcafactura.com/v1/comprobantes', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.ARCAFACTURA_API_KEY}`,
'Idempotency-Key': cobro.idempotencyKey, // guardada junto al cobro: la misma en cada reintento
'Content-Type': 'application/json',
},
body: JSON.stringify({
cuit: 20111111112, entorno: 'produccion', ptoVta: 2, tipoComprobante: 11, concepto: 2,
receptor: { docTipo: 80, docNro: 30712345678, condicionIvaId: 1 },
fecha: hoyAR(), fechaServicioDesde: '2026-10-01', fechaServicioHasta: '2026-10-31', fechaVtoPago: hoyAR(),
moneda: 'PES', cotizacion: 1,
importes: { neto: 15000, total: 15000 },
}),
})
if (r.status === 503 || r.status >= 500) throw new Transitorio() // reintentar con la MISMA key
const body = await r.json()
if (!r.ok) throw new Rechazado(body.code, body.message, body.observaciones)
Nota de crédito C que anula la factura 42: igual, con "tipoComprobante": 13 y "comprobantesAsoc": [{ "tipo": 11, "ptoVta": 2, "nro": 42 }] (ver Notas de crédito).