Emitir comprobantes
Todos los comprobantes se emiten con POST /invoices. El tipo sale de dos campos:
| Campo | Valores | Qué define |
|---|---|---|
letter | A, B, C, M | Comprobante local. La letra depende de la condición frente al IVA del emisor y del receptor. |
E | Exportación. Requiere el objeto export. | |
T | Turismo (reintegro de IVA a turistas extranjeros). Requiere el objeto tourism. | |
kind | FACTURA, NOTA_DEBITO, NOTA_CREDITO | Factura o nota que ajusta una factura anterior. |
Con eso, la API resuelve cómo autorizar el comprobante ante ARCA. Vos no indicás nada más.
El body completo, con todos los campos y sus validaciones, está en la referencia de POST /invoices. Esta guía cubre las decisiones que no son obvias mirando solo el schema.
:::tip Montos en centavos
Todos los montos son enteros en centavos: 12100 es $121,00. Los totales tienen que cuadrar exactamente: total_amount = gravado + no gravado + exento + IVA + otros tributos. Si no cuadra, la API responde 400 antes de llamar a ARCA.
:::
Productos o servicios
concept_type es obligatorio en los comprobantes locales:
concept_type | Campos extra obligatorios | Ventana de issue_date |
|---|---|---|
PRODUCTS | — | ±5 días respecto de hoy |
SERVICES o PRODUCTS_AND_SERVICES | service_start_date, service_end_date, payment_due_date | ±10 días respecto de hoy |
{
"letter": "C",
"kind": "FACTURA",
"concept_type": "SERVICES",
"service_start_date": "2026-09-01",
"service_end_date": "2026-09-30",
"payment_due_date": "2026-10-10",
"...": "..."
}
Detalle de ítems y RG 2904
items es opcional en el circuito estándar: solo se usa para el PDF. Si el emisor está adherido a la RG 2904 (facturación con detalle de ítems), los ítems se vuelven obligatorios y ARCA los valida uno por uno.
La adhesión es un dato del CUIT emisor, no del comprobante. Se declara una vez con rg2904_adherent en PATCH /users/me (modo plataforma) o en POST/PATCH /represented-cuits (modo contador y autoservicio). ARCA no la informa por ninguna vía consultable, así que la API no puede detectarla sola.
Notas de crédito y débito
Una nota ajusta uno o más comprobantes anteriores, que se indican en associations:
{
"letter": "B",
"kind": "NOTA_CREDITO",
"sales_point_number": 1,
"concept_type": "PRODUCTS",
"associations": [
{
"related_voucher_type": 6,
"related_sales_point_number": 1,
"related_voucher_number": 124
}
],
"...": "..."
}
related_voucher_typees el código de comprobante del original (6 = Factura B), deGET /catalogs/tipos-comprobante.related_cuites opcional: si no lo mandás, se asume que el original es del mismo emisor.- En turismo (
letter: "T"),associationsno es obligatorio.
Exportación (letter: "E")
El receptor es del exterior y los datos específicos van en export. Los campos de montos que son obligatorios en los comprobantes locales (taxable_amount, vat_amount, vat_items, etc.) no se usan acá: el detalle va en export.items.
{
"letter": "E",
"kind": "FACTURA",
"sales_point_number": 1,
"issue_date": "2026-09-29",
"total_amount": 500000,
"receptor": {
"name": "Foreign Buyer Inc.",
"identification_category": "FOREIGN_TAX_ID",
"identification_value": "FTX-000111",
"country_code": 212,
"address": "123 Main St, Miami, FL"
},
"export": {
"export_type": 1,
"has_existing_permit": false,
"destination_country_code": 212,
"currency_code": "DOL",
"exchange_rate": 1000,
"invoice_language": 1,
"items": [
{
"product_code": "SKU-EXPORT-1",
"description": "Producto exportado",
"quantity": 10,
"unit_of_measure_id": 7,
"unit_price": 50000,
"amount": 500000
}
]
}
}
Los países salen de GET /catalogs/paises, las monedas de GET /catalogs/monedas y los idiomas de GET /catalogs/idiomas (si omitís invoice_language, se usa español).
Turismo (letter: "T")
Para prestaciones a turistas extranjeros. Los montos y los ítems van dentro de tourism, y cada ítem lleva su propio tourism_code y alícuota de IVA.
{
"letter": "T",
"kind": "FACTURA",
"sales_point_number": 1,
"issue_date": "2026-09-29",
"total_amount": 121000,
"receptor": {
"identification_category": "NATIONAL_DOCUMENT",
"document_type": 94,
"identification_value": "AB123456",
"country_code": 212,
"address": "123 Main St, Miami, FL"
},
"tourism": {
"emitter_receiver_relation_code": 1,
"taxable_amount": 100000,
"non_taxable_amount": 0,
"exempt_amount": 0,
"other_taxes_amount": 0,
"reimbursement_amount": 0,
"currency_code": "PES",
"exchange_rate": 1,
"settles_in_same_foreign_currency": false,
"items": [
{
"item_type": 1,
"tourism_code": 1,
"description": "Hotelería sin desayuno",
"vat_rate_id": 5,
"vat_amount": 21000,
"amount": 121000
}
]
}
}
Un comprobante de turismo no puede tener solamente ítems con tourism_code: 5 (excedente).
Qué hacer con la respuesta
status | Acción |
|---|---|
APPROVED | Listo. El CAE y su vencimiento están en authorization. |
OBSERVED | Válido, con observaciones de ARCA en provider_errors. |
REJECTED | No tiene validez. Ver abajo. |
provider_errors
Cuando ARCA rechaza el comprobante u observa algo, el detalle viene en provider_errors, siempre con el mismo formato:
{
"status": "REJECTED",
"provider_errors": [
{
"code": "10016",
"message": "issue_date está fuera del rango de fechas que acepta ARCA para este comprobante",
"type": "error"
}
],
"...": "..."
}
typeeserror(bloqueante, el comprobante quedóREJECTED) uobservation(informativo).codees el código que informó ARCA. Usalo para manejar el caso en tu código; puede venir vacío si ARCA no informó uno.messagees para personas. Para los códigos más comunes es específico; para el resto es un texto genérico, así que guiate porcode.
Reintentar o emitir uno nuevo
POST /invoices/{id}/retry reconstruye la misma request y crea un comprobante nuevo. Sirve cuando la causa estaba fuera del comprobante: faltaba la delegación en ARCA, el punto de venta no estaba habilitado, ARCA no estaba disponible. Si el problema son los datos (una fecha fuera de rango, un monto que no corresponde), corregilos y emití un comprobante nuevo con POST /invoices.
Para consultar comprobantes emitidos, usá GET /invoices con filtros (status, date_from, date_to, voucher_type, sales_point_number, receptor_identification_value) o GET /invoices/{id} para el objeto completo.