Saltar al contenido principal

Emitir comprobantes

Todos los comprobantes se emiten con POST /invoices. El tipo sale de dos campos:

CampoValoresQué define
letterA, B, C, MComprobante local. La letra depende de la condición frente al IVA del emisor y del receptor.
EExportación. Requiere el objeto export.
TTurismo (reintegro de IVA a turistas extranjeros). Requiere el objeto tourism.
kindFACTURA, NOTA_DEBITO, NOTA_CREDITOFactura 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_typeCampos extra obligatoriosVentana de issue_date
PRODUCTS—±5 días respecto de hoy
SERVICES o PRODUCTS_AND_SERVICESservice_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_type es el código de comprobante del original (6 = Factura B), de GET /catalogs/tipos-comprobante.
  • related_cuit es opcional: si no lo mandás, se asume que el original es del mismo emisor.
  • En turismo (letter: "T"), associations no 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​

statusAcción
APPROVEDListo. El CAE y su vencimiento están en authorization.
OBSERVEDVálido, con observaciones de ARCA en provider_errors.
REJECTEDNo 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"
}
],
"...": "..."
}
  • type es error (bloqueante, el comprobante quedó REJECTED) u observation (informativo).
  • code es el código que informó ARCA. Usalo para manejar el caso en tu código; puede venir vacío si ARCA no informó uno.
  • message es para personas. Para los códigos más comunes es específico; para el resto es un texto genérico, así que guiate por code.

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.