La Nota de crédito B anula, total o parcialmente, una Factura B o una Nota de débito B. Lleva el motivo en reason y, en associated_invoices, el comprobante que ajusta. Las reglas son las de la Factura B: receptor consumidor final, exento, no alcanzado o no categorizado, precios con IVA incluido y el IVA por dentro en amounts.vat y vat_items.
Necesitás un emisor responsable inscripto y verificado, y un webhook para recibir el resultado. El detalle de cada campo está en la referencia de comprobantes.
Emitir una Nota de crédito B
Una Nota de crédito B que anula por el total la Factura B número 1523 del punto de venta 1, la del ejemplo:
const response = await fetch('https://app.afipsdk.com/api/v1/invoices', {
method: 'POST',
headers: {
'Authorization': 'Bearer <ACCESS_TOKEN>',
'Content-Type': 'application/json',
'Idempotency-Key': 'devolucion-0001'
},
body: JSON.stringify({
issuer_cuit: '20111111112',
invoice_type: 8, // Nota de crédito B
concept: 1, // 1 productos, 2 servicios, 3 productos y servicios
reason: 'Devolución de mercadería', // Obligatorio en las notas
associated_invoices: [ // El comprobante que ajusta
{ invoice_type: 6, sales_point: 1, number: 1523, date: '2026-10-14' }
],
receiver: {
doc_type: 96, // 96 DNI; 99 si el consumidor final no se identifica
doc_number: '12345678',
vat_condition: 5, // 5 consumidor final; o 4, 7, 8, 9, 10 y 15
name: 'Juan Pérez',
address: 'Calle Falsa 123, CABA'
},
amounts: {
net: 1000,
vat: 210,
total: 1210
},
vat_items: [ // Una entrada por alícuota; 5 = 21%
{ id: 5, base: 1000, amount: 210 }
],
items: [ // Detalle impreso: precios con IVA incluido
{ description: 'Teclado inalámbrico', quantity: 1, unit_price: 1210, subtotal: 1210 }
],
sale_condition: 'Contado'
})
});
const invoice = await response.json();
reasonyassociated_invoicesson obligatorios. Si la nota ajusta un período y no un comprobante puntual, vaassociated_perioden lugar deassociated_invoices.- Los importes son los del ajuste, no los del comprobante original: una nota parcial lleva solo la parte que se devuelve.
- El receptor es el del comprobante que ajusta, con las mismas reglas de la Factura B.
Respuesta
Factura SDK responde 202 con el comprobante en queued y lo autoriza en segundo plano. Cuando ARCA lo aprueba, tu webhook recibe el evento invoice.approved con el comprobante: el número asignado, el CAE y la URL pública del PDF.
{
"event_id": "evt_9f1e2d3c4b5a69788a9b0c1d2e3f4a5b",
"type": "invoice.approved",
"created": "2026-10-14T14:05:04.000Z",
"data": {
"id": "7c1d9e4b-2f3a-4b8c-9d0e-1a2b3c4d5e6f",
"idempotency_key": "devolucion-0001",
"status": "approved",
"invoice_type": 8,
"sales_point": 1,
"number": 118,
"invoice_date": "2026-10-14",
"total_amount": 1210,
"currency": "PES",
"cae": "76412345678901",
"cae_expiration": "2026-10-24",
"pdf_url": "https://app.afipsdk.com/api/v1/invoices/7c1d9e4b-2f3a-4b8c-9d0e-1a2b3c4d5e6f/pdf?token=kX3v9Qw2LmN8pR5tY7uZ1aB4cD6eF8gH0jK2lM4nO6p",
"...": "el comprobante completo, como lo devuelve GET /v1/invoices/:id"
}
}
Si ARCA lo rechaza, llega invoice.rejected con los motivos en errors. Con sync: true en el cuerpo, el comprobante vuelve ya decidido en la misma respuesta y no hay webhook. El detalle está en respuesta y estados.
Variantes
Los ejemplos muestran solo lo que cambia respecto de la solicitud de arriba.
Nota parcial
Para devolver una parte, los importes son los de esa parte y el comprobante asociado es el mismo:
{
"amounts": { "net": 500, "vat": 105, "total": 605 },
"vat_items": [{ "id": 5, "base": 500, "amount": 105 }],
"items": [
{ "description": "Teclado inalámbrico, devolución parcial", "quantity": 1, "unit_price": 605, "subtotal": 605 }
]
}
Varios comprobantes asociados
Una nota puede ajustar más de un comprobante, con una entrada en associated_invoices por cada uno:
{
"associated_invoices": [
{ "invoice_type": 6, "sales_point": 1, "number": 1523, "date": "2026-10-14" },
{ "invoice_type": 6, "sales_point": 1, "number": 1519, "date": "2026-10-12" }
]
}
Período asociado
Cuando la nota ajusta un período y no un comprobante puntual, por ejemplo un descuento sobre las ventas del mes, va associated_period en lugar de associated_invoices:
{
"reason": "Descuento por volumen de octubre",
"associated_period": { "from": "2026-10-01", "to": "2026-10-31" }
}