Referencia · v1.0.0
Referencia
Generada del contrato OpenAPI 3.1.0. Cómo autenticarse, la idempotencia, los webhooks y los errores están explicados en la guía.
https://autoinvoice.com.arPROD, sólo acepta clavesmf_live_https://test.autoinvoice.com.arTEST, sólo acepta clavesmf_test_
Endpoints
Pedir un comprobante
POST /v1/comprobantes
Repetir el pedido con el mismo Idempotency-Key y el mismo cuerpo devuelve el mismo comprobante,
en su estado actual, y no crea otro. La comparación es por contenido: el orden de los campos o
escribir 121 en vez de 121.00 no cambia el pedido. La misma clave con otro cuerpo es un 409.
Ante un 500 o un corte, hay que repetir con la misma clave.
Pide la clave de API: autenticación.
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
Idempotency-Keyobligatorio | encabezado | string | Clave elegida por el cliente, única por pedido.
|
Cuerpo del pedido
Sin importes calculados ni fecha: un cuerpo que los traiga se rechaza. El punto de venta sale de la configuración de la cuenta.
| Campo | Tipo | Descripción |
|---|---|---|
tipoobligatorio | integer | 1 factura A, 6 factura B. Tiene que corresponder a la condición del receptor.
|
conceptoobligatorio | integer | 1 productos, 2 servicios, 3 ambos.
|
receptorobligatorio | Receptor | |
renglonesobligatorio | Renglon[] |
|
servicio_desdeopcional | Fecha | |
servicio_hastaopcional | Fecha | |
vencimiento_pagoopcional | Fecha | |
condicion_ventaopcional | CondicionVenta | Por defecto, |
- Si
conceptoes2o3: son obligatoriosservicio_desde,servicio_hasta,vencimiento_pago. - Si no:
servicio_desdeno se admite;servicio_hastano se admite;vencimiento_pagono se admite. - No admite campos que no estén en esta tabla.
{
"tipo": 6,
"concepto": 2,
"receptor": {
"doc_tipo": 96,
"doc_nro": "30111222",
"condicion_iva": 5,
"nombre": "Ana Pérez",
"domicilio": "San Martín 123, Rosario"
},
"renglones": [
{
"descripcion": "Abono mensual",
"importe": "121.00",
"alicuota": 21
}
],
"servicio_desde": "2026-11-01",
"servicio_hasta": "2026-11-30",
"vencimiento_pago": "2026-12-10",
"condicion_venta": "contado"
} Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
202 | Pedido aceptado. El cuerpo es el comprobante en su estado actual.
| application/jsonComprobante |
400 | Falta el | application/problem+jsonProblema |
401 | La clave falta, es inválida, está revocada o es de otro ambiente. La respuesta no distingue cuál.
| application/problem+jsonProblema |
409 | El | application/problem+jsonProblema |
413 | El cuerpo supera los 256 KB. | application/problem+jsonProblema |
415 | El cuerpo no es | application/problem+jsonProblema |
422 | El pedido está bien formado pero no se puede emitir. | application/problem+jsonProblemaDeValidacion |
429 | Se superó el límite de pedidos del cliente, su tope de pedidos sin procesar, el de autenticaciones fallidas de la IP, o hay demasiados PDF generándose a la vez. Por defecto, 300 pedidos por minuto por cliente, 1000 sin procesar por cliente y 20 autenticaciones fallidas por minuto por IP. Reintentar con el mismo Idempotency-Key es seguro.
| application/problem+jsonProblema |
500 | Error interno, sin detalles. Se puede reintentar; en un | application/problem+jsonProblema |
curl -X POST 'https://test.autoinvoice.com.ar/v1/comprobantes' \
-H 'Authorization: Bearer mf_test_...' \
-H 'Idempotency-Key: pago-1234' \
-H 'Content-Type: application/json' \
-d '{
"tipo": 6,
"concepto": 2,
"receptor": {
"doc_tipo": 96,
"doc_nro": "30111222",
"condicion_iva": 5,
"nombre": "Ana Pérez",
"domicilio": "San Martín 123, Rosario"
},
"renglones": [
{
"descripcion": "Abono mensual",
"importe": "121.00",
"alicuota": 21
}
],
"servicio_desde": "2026-11-01",
"servicio_hasta": "2026-11-30",
"vencimiento_pago": "2026-12-10",
"condicion_venta": "contado"
}' {
"id": "0b8f3c2e-6a1d-4f5b-9c7e-2d4a6b8c1e3f",
"estado": "procesando",
"en_revision": false,
"cuit_emisor": "11111111111",
"punto_venta": 1,
"tipo": 1,
"numero": null,
"concepto": 1,
"fecha": "2026-11-10",
"servicio_desde": null,
"servicio_hasta": null,
"vencimiento_pago": null,
"receptor": {
"doc_tipo": 80,
"doc_nro": "11",
"condicion_iva": 1,
"nombre": "texto",
"domicilio": "texto",
"email": "ana@ejemplo.com"
},
"renglones": [
{
"descripcion": "texto",
"importe": "21.11",
"alicuota": 21
}
],
"condicion_venta": "contado",
"importe_neto": "11.11",
"importe_iva": "11.11",
"importe_total": "11.11",
"cae": null,
"cae_vencimiento": null,
"emitido_en": null,
"comprobante_asociado_id": null,
"rechazo": null,
"creado_en": "2026-11-10T14:30:00Z"
} Los valores son ilustrativos; la forma es la del contrato.
Consultar un comprobante
GET /v1/comprobantes/{id}
Pide la clave de API: autenticación.
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string |
Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
200 | El comprobante en su estado actual. | application/jsonComprobante |
401 | La clave falta, es inválida, está revocada o es de otro ambiente. La respuesta no distingue cuál.
| application/problem+jsonProblema |
404 | No hay un comprobante de este cliente con ese id. La respuesta no distingue si existe para otro. | application/problem+jsonProblema |
429 | Se superó el límite de pedidos del cliente, su tope de pedidos sin procesar, el de autenticaciones fallidas de la IP, o hay demasiados PDF generándose a la vez. Por defecto, 300 pedidos por minuto por cliente, 1000 sin procesar por cliente y 20 autenticaciones fallidas por minuto por IP. Reintentar con el mismo Idempotency-Key es seguro.
| application/problem+jsonProblema |
500 | Error interno, sin detalles. Se puede reintentar; en un | application/problem+jsonProblema |
curl -X GET 'https://test.autoinvoice.com.ar/v1/comprobantes/<id>' \
-H 'Authorization: Bearer mf_test_...' {
"id": "0b8f3c2e-6a1d-4f5b-9c7e-2d4a6b8c1e3f",
"estado": "procesando",
"en_revision": false,
"cuit_emisor": "11111111111",
"punto_venta": 1,
"tipo": 1,
"numero": null,
"concepto": 1,
"fecha": "2026-11-10",
"servicio_desde": null,
"servicio_hasta": null,
"vencimiento_pago": null,
"receptor": {
"doc_tipo": 80,
"doc_nro": "11",
"condicion_iva": 1,
"nombre": "texto",
"domicilio": "texto",
"email": "ana@ejemplo.com"
},
"renglones": [
{
"descripcion": "texto",
"importe": "21.11",
"alicuota": 21
}
],
"condicion_venta": "contado",
"importe_neto": "11.11",
"importe_iva": "11.11",
"importe_total": "11.11",
"cae": null,
"cae_vencimiento": null,
"emitido_en": null,
"comprobante_asociado_id": null,
"rechazo": null,
"creado_en": "2026-11-10T14:30:00Z"
} Los valores son ilustrativos; la forma es la del contrato.
Pedir una nota de crédito sobre una factura
POST /v1/comprobantes/{id}/notas-de-credito
Sólo sobre una factura emitida. La nota toma de la factura la letra (factura A → nota de crédito A, tipo 3; factura B → nota de crédito B, tipo 8), el receptor, el concepto, el período del servicio y la condición de venta, y sale del mismo CUIT, por el punto de venta actual de la cuenta. A ARCA va informada la factura que corrige.
Sin renglones es una nota por el total de la factura. Con renglones, por lo que digan: cada uno con una alícuota que la factura tenga. Sumada a las otras notas de la misma factura que no fueron rechazadas, nunca supera su total ni lo facturado en cada alícuota; dos pedidos simultáneos que juntos se pasan no salen los dos.
El Idempotency-Key funciona igual que al pedir una factura, y es uno por pedido entre facturas y
notas.
Pide la clave de API: autenticación.
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string | El id de la factura que se corrige. |
Idempotency-Keyobligatorio | encabezado | string | Clave elegida por el cliente, única por pedido.
|
Cuerpo del pedido
Sin renglones, la nota es por el total de la factura. Sin importes calculados ni fecha.
| Campo | Tipo | Descripción |
|---|---|---|
renglonesopcional | Renglon[] |
|
- No admite campos que no estén en esta tabla.
{
"renglones": [
{
"descripcion": "Devolución parcial del abono",
"importe": "60.50",
"alicuota": 21
}
]
} Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
202 | Pedido aceptado. El cuerpo es la nota de crédito en su estado actual.
| application/jsonComprobante |
400 | Falta el | application/problem+jsonProblema |
401 | La clave falta, es inválida, está revocada o es de otro ambiente. La respuesta no distingue cuál.
| application/problem+jsonProblema |
404 | No hay un comprobante de este cliente con ese id. La respuesta no distingue si existe para otro. | application/problem+jsonProblema |
409 | El comprobante no es una factura o todavía no está emitido; se emitió con un CUIT distinto del que
tiene hoy la cuenta; la nota superaría a la factura sumada a las otras; el | application/problem+jsonProblema |
413 | El cuerpo supera los 256 KB. | application/problem+jsonProblema |
415 | El cuerpo no es | application/problem+jsonProblema |
422 | El pedido está bien formado pero no se puede emitir. | application/problem+jsonProblemaDeValidacion |
429 | Se superó el límite de pedidos del cliente, su tope de pedidos sin procesar, el de autenticaciones fallidas de la IP, o hay demasiados PDF generándose a la vez. Por defecto, 300 pedidos por minuto por cliente, 1000 sin procesar por cliente y 20 autenticaciones fallidas por minuto por IP. Reintentar con el mismo Idempotency-Key es seguro.
| application/problem+jsonProblema |
500 | Error interno, sin detalles. Se puede reintentar; en un | application/problem+jsonProblema |
curl -X POST 'https://test.autoinvoice.com.ar/v1/comprobantes/<id>/notas-de-credito' \
-H 'Authorization: Bearer mf_test_...' \
-H 'Idempotency-Key: pago-1234' \
-H 'Content-Type: application/json' \
-d '{
"renglones": [
{
"descripcion": "Devolución parcial del abono",
"importe": "60.50",
"alicuota": 21
}
]
}' {
"id": "0b8f3c2e-6a1d-4f5b-9c7e-2d4a6b8c1e3f",
"estado": "procesando",
"en_revision": false,
"cuit_emisor": "11111111111",
"punto_venta": 1,
"tipo": 1,
"numero": null,
"concepto": 1,
"fecha": "2026-11-10",
"servicio_desde": null,
"servicio_hasta": null,
"vencimiento_pago": null,
"receptor": {
"doc_tipo": 80,
"doc_nro": "11",
"condicion_iva": 1,
"nombre": "texto",
"domicilio": "texto",
"email": "ana@ejemplo.com"
},
"renglones": [
{
"descripcion": "texto",
"importe": "21.11",
"alicuota": 21
}
],
"condicion_venta": "contado",
"importe_neto": "11.11",
"importe_iva": "11.11",
"importe_total": "11.11",
"cae": null,
"cae_vencimiento": null,
"emitido_en": null,
"comprobante_asociado_id": null,
"rechazo": null,
"creado_en": "2026-11-10T14:30:00Z"
} Los valores son ilustrativos; la forma es la del contrato.
Descargar el PDF de un comprobante emitido
GET /v1/comprobantes/{id}/pdf
Devuelve el archivo directamente, sin URL firmada. El contenido sale de lo que autorizó ARCA y de los datos congelados al crear el comprobante: el mismo comprobante da siempre el mismo archivo.
Pide la clave de API: autenticación.
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string |
Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
200 | El PDF.
| application/pdfbinario (application/pdf) |
401 | La clave falta, es inválida, está revocada o es de otro ambiente. La respuesta no distingue cuál.
| application/problem+jsonProblema |
404 | No hay un comprobante de este cliente con ese id. La respuesta no distingue si existe para otro. | application/problem+jsonProblema |
409 | No hay PDF para servir. | application/problem+jsonProblema |
429 | Se superó el límite de pedidos del cliente, su tope de pedidos sin procesar, el de autenticaciones fallidas de la IP, o hay demasiados PDF generándose a la vez. Por defecto, 300 pedidos por minuto por cliente, 1000 sin procesar por cliente y 20 autenticaciones fallidas por minuto por IP. Reintentar con el mismo Idempotency-Key es seguro.
| application/problem+jsonProblema |
500 | Error interno, sin detalles. Se puede reintentar; en un | application/problem+jsonProblema |
curl -X GET 'https://test.autoinvoice.com.ar/v1/comprobantes/<id>/pdf' \
-H 'Authorization: Bearer mf_test_...' \
-o 'archivo.pdf' Volver a enviar el resultado de un comprobante
POST /v1/comprobantes/{id}/webhook/reenviar
Encola otra entrega del último evento de resultado, con el mismo id, sin tocar el comprobante.
Sirve después de un webhook_agotado, o si el receptor perdió el mensaje. Si ese evento ya está
esperando entrega no se agrega otra: repetir el pedido es seguro. Cada reenvío tiene otras 24 horas
de reintentos. Tiene el mismo tope de pendientes por cuenta que los pedidos: pasado ese tope
responde 429, salvo que el evento ya esté esperando.
Pide la clave de API: autenticación.
Parámetros
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
idobligatorio | ruta | string |
Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
202 | Entrega encolada. El resultado llega al webhook, no a esta respuesta. | application/jsonReenvioEncolado |
401 | La clave falta, es inválida, está revocada o es de otro ambiente. La respuesta no distingue cuál.
| application/problem+jsonProblema |
404 | No hay un comprobante de este cliente con ese id. La respuesta no distingue si existe para otro. | application/problem+jsonProblema |
409 | No hay nada que enviar. | application/problem+jsonProblema |
429 | Se superó el límite de pedidos del cliente, su tope de pedidos sin procesar, el de autenticaciones fallidas de la IP, o hay demasiados PDF generándose a la vez. Por defecto, 300 pedidos por minuto por cliente, 1000 sin procesar por cliente y 20 autenticaciones fallidas por minuto por IP. Reintentar con el mismo Idempotency-Key es seguro.
| application/problem+jsonProblema |
500 | Error interno, sin detalles. Se puede reintentar; en un | application/problem+jsonProblema |
503 | La entrega de webhooks no está encendida en este ambiente. No se registró ni se encoló nada. | application/problem+jsonProblema |
curl -X POST 'https://test.autoinvoice.com.ar/v1/comprobantes/<id>/webhook/reenviar' \
-H 'Authorization: Bearer mf_test_...' {
"evento": {
"id": "0b8f3c2e-6a1d-4f5b-9c7e-2d4a6b8c1e3f",
"tipo": "comprobante.emitido"
}
} Los valores son ilustrativos; la forma es la del contrato.
Consultar el webhook de la cuenta
GET /v1/webhook
El secreto no se vuelve a mostrar.
Pide la clave de API: autenticación.
Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
200 | El webhook registrado. | application/jsonWebhook |
401 | La clave falta, es inválida, está revocada o es de otro ambiente. La respuesta no distingue cuál.
| application/problem+jsonProblema |
404 | La cuenta no tiene un webhook registrado. | application/problem+jsonProblema |
429 | Se superó el límite de pedidos del cliente, su tope de pedidos sin procesar, el de autenticaciones fallidas de la IP, o hay demasiados PDF generándose a la vez. Por defecto, 300 pedidos por minuto por cliente, 1000 sin procesar por cliente y 20 autenticaciones fallidas por minuto por IP. Reintentar con el mismo Idempotency-Key es seguro.
| application/problem+jsonProblema |
500 | Error interno, sin detalles. Se puede reintentar; en un | application/problem+jsonProblema |
curl -X GET 'https://test.autoinvoice.com.ar/v1/webhook' \
-H 'Authorization: Bearer mf_test_...' {
"url": "https://sistema.ejemplo.com/modofactura/eventos",
"creado_en": "2026-11-10T14:30:00Z",
"actualizado_en": "2026-11-10T14:30:00Z"
} Los valores son ilustrativos; la forma es la del contrato.
Dar de alta el webhook o cambiar su URL
PUT /v1/webhook
Hay un webhook por cuenta. El alta responde 201 con el secreto, que se muestra UNA SOLA VEZ: si
se pierde, hay que rotarlo. Con un webhook ya registrado cambia la URL, conserva el secreto y
responde 200; lo que esté pendiente de entrega sale a la URL nueva.
La URL tiene que ser https, sin credenciales, y resolver sólo a direcciones públicas. Se vuelve a
verificar antes de cada entrega.
Pide la clave de API: autenticación.
Cuerpo del pedido
| Campo | Tipo | Descripción |
|---|---|---|
urlobligatorio | string (uri) |
|
- No admite campos que no estén en esta tabla.
{
"url": "https://sistema.ejemplo.com/modofactura/eventos"
} Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
200 | La URL cambió. | application/jsonWebhook |
201 | Webhook creado. Es la única vez que se muestra el secreto. | application/jsonWebhookConSecreto |
400 | El cuerpo no es JSON válido. | application/problem+jsonProblema |
401 | La clave falta, es inválida, está revocada o es de otro ambiente. La respuesta no distingue cuál.
| application/problem+jsonProblema |
413 | El cuerpo supera los 256 KB. | application/problem+jsonProblema |
415 | El cuerpo no es | application/problem+jsonProblema |
422 | La URL no se admite. Un destino que no resuelve y uno interno dan el mismo error. | application/problem+jsonProblemaDeValidacion |
429 | Se superó el límite de pedidos del cliente, su tope de pedidos sin procesar, el de autenticaciones fallidas de la IP, o hay demasiados PDF generándose a la vez. Por defecto, 300 pedidos por minuto por cliente, 1000 sin procesar por cliente y 20 autenticaciones fallidas por minuto por IP. Reintentar con el mismo Idempotency-Key es seguro.
| application/problem+jsonProblema |
500 | Error interno, sin detalles. Se puede reintentar; en un | application/problem+jsonProblema |
503 | La entrega de webhooks no está encendida en este ambiente. No se registró ni se encoló nada. | application/problem+jsonProblema |
curl -X PUT 'https://test.autoinvoice.com.ar/v1/webhook' \
-H 'Authorization: Bearer mf_test_...' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://sistema.ejemplo.com/modofactura/eventos"
}' {
"url": "https://sistema.ejemplo.com/modofactura/eventos",
"creado_en": "2026-11-10T14:30:00Z",
"actualizado_en": "2026-11-10T14:30:00Z"
} Los valores son ilustrativos; la forma es la del contrato.
Borrar el webhook de la cuenta
DELETE /v1/webhook
Lo que esté pendiente de entrega se descarta. Una URL nueva necesita un alta, con otro secreto.
Pide la clave de API: autenticación.
Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
204 | Borrado. | sin cuerpo |
401 | La clave falta, es inválida, está revocada o es de otro ambiente. La respuesta no distingue cuál.
| application/problem+jsonProblema |
404 | La cuenta no tiene un webhook registrado. | application/problem+jsonProblema |
429 | Se superó el límite de pedidos del cliente, su tope de pedidos sin procesar, el de autenticaciones fallidas de la IP, o hay demasiados PDF generándose a la vez. Por defecto, 300 pedidos por minuto por cliente, 1000 sin procesar por cliente y 20 autenticaciones fallidas por minuto por IP. Reintentar con el mismo Idempotency-Key es seguro.
| application/problem+jsonProblema |
500 | Error interno, sin detalles. Se puede reintentar; en un | application/problem+jsonProblema |
curl -X DELETE 'https://test.autoinvoice.com.ar/v1/webhook' \
-H 'Authorization: Bearer mf_test_...' Rotar el secreto del webhook
POST /v1/webhook/secreto
Genera un secreto nuevo y lo muestra UNA SOLA VEZ. Vale al instante: lo pendiente sale firmado con el nuevo, y lo que el receptor rechace mientras se cambia se reintenta solo.
Pide la clave de API: autenticación.
Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
200 | Secreto nuevo. | application/jsonWebhookConSecreto |
401 | La clave falta, es inválida, está revocada o es de otro ambiente. La respuesta no distingue cuál.
| application/problem+jsonProblema |
404 | La cuenta no tiene un webhook registrado. | application/problem+jsonProblema |
429 | Se superó el límite de pedidos del cliente, su tope de pedidos sin procesar, el de autenticaciones fallidas de la IP, o hay demasiados PDF generándose a la vez. Por defecto, 300 pedidos por minuto por cliente, 1000 sin procesar por cliente y 20 autenticaciones fallidas por minuto por IP. Reintentar con el mismo Idempotency-Key es seguro.
| application/problem+jsonProblema |
500 | Error interno, sin detalles. Se puede reintentar; en un | application/problem+jsonProblema |
503 | La entrega de webhooks no está encendida en este ambiente. No se registró ni se encoló nada. | application/problem+jsonProblema |
curl -X POST 'https://test.autoinvoice.com.ar/v1/webhook/secreto' \
-H 'Authorization: Bearer mf_test_...' {
"url": "https://sistema.ejemplo.com/modofactura/eventos",
"creado_en": "2026-11-10T14:30:00Z",
"actualizado_en": "2026-11-10T14:30:00Z",
"secreto": "mf_whsec_BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
} Los valores son ilustrativos; la forma es la del contrato.
Webhooks
Resultado de un comprobante
POST URL de tu webhook
Cada POST lleva X-ModoFactura-Firma: t=<unix>,v1=<hex>: HMAC-SHA256 en hexadecimal, con el
secreto entero como clave, sobre <t>.<cuerpo crudo>. Hay que verificarlo contra los bytes
recibidos, antes de interpretar el JSON, y rechazar un t con más de 5 minutos de diferencia. Cada
intento firma con su propio t. La documentación trae un ejemplo de verificación.
La entrega es «al menos una vez» y sin orden garantizado: un mismo evento puede llegar más de una
vez, siempre con el mismo id, y conviene deduplicar por ese campo. comprobante.estado es el
estado al momento de entregar. Cualquier 2xx confirma; todo lo demás, también un 3xx, se
reintenta con espera creciente durante 24 horas. No se siguen redirecciones, y el pedido se corta a
los 10 segundos.
Encabezados que manda ModoFactura
| Nombre | En | Tipo | Descripción |
|---|---|---|---|
X-ModoFactura-Firmaobligatorio | encabezado | string |
|
Cuerpo que recibís
comprobante.emitido: ARCA autorizó, y trae número y CAE. comprobante.rechazado: ARCA dijo que no;
motivo trae lo mismo que rechazo en el GET. comprobante.error_datos: los datos del comprobante
no se pueden enviar a ARCA; sigue procesando hasta que lo resuelva una persona.
comprobante.en_revision: espera la revisión de una persona; sigue procesando y no hace falta pedirlo
de nuevo. Estos dos últimos no se entregan si el comprobante se resolvió mientras esperaban: llega el
resultado. comprobante.descartado: ModoFactura lo cerró sin mandarlo a ARCA; no tiene número ni CAE y
no va a cambiar más.
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string (uuid) | Estable. Se repite en cada reintento y en un reenvío, para deduplicar. |
tipoobligatorio | TipoEventoWebhook | |
creado_enobligatorio | string (date-time) | Cuándo pasó, no cuándo se entregó. |
comprobanteobligatorio | ComprobanteDelEvento | |
motivoopcional | string | Legible. No trae más que lo que muestra el
|
- Si
tipoescomprobante.emitido:motivono se admite;comprobante.estadoesemitido;comprobante.numeroes integer desde 1;comprobante.caees string;comprobante.cae_vencimientoes string. - Si no:
motivoes obligatorio;comprobante.numeroesnull;comprobante.caeesnull;comprobante.cae_vencimientoesnull. - Si
tipoescomprobante.error_datosocomprobante.en_revision:comprobante.estadoesprocesando. - Si
tipoescomprobante.rechazado:comprobante.estadoesrechazado. - Si
tipoescomprobante.descartado:comprobante.estadoesdescartado. - No admite campos que no estén en esta tabla.
{
"id": "0b8f3c2e-6a1d-4f5b-9c7e-2d4a6b8c1e3f",
"tipo": "comprobante.emitido",
"creado_en": "2026-11-10T14:30:00Z",
"comprobante": {
"id": "0b8f3c2e-6a1d-4f5b-9c7e-2d4a6b8c1e3f",
"estado": "emitido",
"tipo": 1,
"punto_venta": 1,
"numero": 1,
"cae": "11111111111111",
"cae_vencimiento": "2026-11-10",
"fecha": "2026-11-10",
"comprobante_asociado_id": null
}
} Los valores son ilustrativos; la forma es la del contrato.
Respuestas
| Código | Qué significa | Cuerpo |
|---|---|---|
200 | Recibido. Vale cualquier | sin cuerpo |
Schemas
Fecha
AAAA-MM-DD
Importe
En pesos, como texto para no perder precisión.
Receptor
| Campo | Tipo | Descripción |
|---|---|---|
doc_tipoobligatorio | integer | 80 CUIT, 86 CUIL, 87 CDI, 96 DNI, 99 sin identificar.
|
doc_nroobligatorio | string | CUIT, CUIL o CDI con dígito verificador válido, DNI, o
|
condicion_ivaobligatorio | integer | Condición frente al IVA, código de ARCA (RG 5616). La declara el cliente; ARCA la cruza con su padrón al autorizar. Con DNI o sin identificar, sólo 5 (consumidor final).
|
nombreopcional | string | Nombre o razón social. Va en el PDF, no a ARCA. Obligatorio con CUIT. Sin caracteres de control.
|
domicilioopcional | string | Va en el PDF, no a ARCA. Obligatorio con CUIT. Sin caracteres de control.
|
emailopcional | string (email) | Opcional. Si viene, el comprobante emitido se le manda por mail con el PDF adjunto, desde
|
- Si
doc_tipoes80: son obligatoriosnombre,domicilio. - No admite campos que no estén en esta tabla.
CondicionVenta
Se imprime en el PDF. No viaja a ARCA.
Renglon
| Campo | Tipo | Descripción |
|---|---|---|
descripcionobligatorio | string |
|
importeobligatorio | Importe | Precio final del renglón, IVA incluido. Mayor a cero. |
alicuotaobligatorio | number |
|
- No admite campos que no estén en esta tabla.
PedidoComprobante
Sin importes calculados ni fecha: un cuerpo que los traiga se rechaza. El punto de venta sale de la configuración de la cuenta.
| Campo | Tipo | Descripción |
|---|---|---|
tipoobligatorio | integer | 1 factura A, 6 factura B. Tiene que corresponder a la condición del receptor.
|
conceptoobligatorio | integer | 1 productos, 2 servicios, 3 ambos.
|
receptorobligatorio | Receptor | |
renglonesobligatorio | Renglon[] |
|
servicio_desdeopcional | Fecha | |
servicio_hastaopcional | Fecha | |
vencimiento_pagoopcional | Fecha | |
condicion_ventaopcional | CondicionVenta | Por defecto, |
- Si
conceptoes2o3: son obligatoriosservicio_desde,servicio_hasta,vencimiento_pago. - Si no:
servicio_desdeno se admite;servicio_hastano se admite;vencimiento_pagono se admite. - No admite campos que no estén en esta tabla.
PedidoNotaDeCredito
Sin renglones, la nota es por el total de la factura. Sin importes calculados ni fecha.
| Campo | Tipo | Descripción |
|---|---|---|
renglonesopcional | Renglon[] |
|
- No admite campos que no estén en esta tabla.
MensajeArca
| Campo | Tipo | Descripción |
|---|---|---|
codigoobligatorio | integer | |
mensajeobligatorio | string |
- No admite campos que no estén en esta tabla.
Rechazo
Lo que contestó ARCA. El comprobante rechazado no se reintenta solo.
| Campo | Tipo | Descripción |
|---|---|---|
erroresobligatorio | MensajeArca[] | |
observacionesobligatorio | MensajeArca[] |
- No admite campos que no estén en esta tabla.
Comprobante
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string (uuid) | |
estadoobligatorio | string |
|
en_revisionobligatorio | boolean |
|
cuit_emisorobligatorio | string |
|
punto_ventaobligatorio | integer |
|
tipoobligatorio | integer | 1 factura A, 6 factura B, 3 nota de crédito A, 8 nota de crédito B.
|
numeroobligatorio | integer | null | Sólo con el comprobante emitido. |
conceptoobligatorio | integer |
|
fechaobligatorio | Fecha | La fecha guardada. Hasta que el comprobante esté emitido es sólo la del pedido, y puede cambiar: la definitiva es la del día de emisión en Argentina. |
servicio_desdeobligatorio | string (date) | null | |
servicio_hastaobligatorio | string (date) | null | |
vencimiento_pagoobligatorio | string (date) | null | Si quedó atrás al emitir, pasa a ser el día de emisión. Hasta entonces puede cambiar. |
receptorobligatorio | Receptor | |
renglonesobligatorio | Renglon[] |
|
condicion_ventaobligatorio | CondicionVenta | |
importe_netoobligatorio | ImporteExacto | |
importe_ivaobligatorio | ImporteExacto | |
importe_totalobligatorio | ImporteExacto | |
caeobligatorio | string | null |
|
cae_vencimientoobligatorio | string (date) | null | |
emitido_enobligatorio | string (date-time) | null | |
comprobante_asociado_idobligatorio | string (uuid) | null | En una nota de crédito, la factura que corrige. |
rechazoobligatorio | Rechazo | null | |
creado_enobligatorio | string (date-time) |
- Si
estadoesemitido:numeroes integer desde 1;caees string;cae_vencimientoes string;emitido_enes string;rechazoesnull. - Si no:
numeroesnull;caeesnull;cae_vencimientoesnull;emitido_enesnull. - Si
estadoesrechazado:rechazoes object. - Si no:
rechazoesnull. - No admite campos que no estén en esta tabla.
PedidoWebhook
| Campo | Tipo | Descripción |
|---|---|---|
urlobligatorio | string (uri) |
|
- No admite campos que no estén en esta tabla.
Webhook
| Campo | Tipo | Descripción |
|---|---|---|
urlobligatorio | string (uri) | |
creado_enobligatorio | string (date-time) | |
actualizado_enobligatorio | string (date-time) |
- No admite campos que no estén en esta tabla.
WebhookConSecreto
| Campo | Tipo | Descripción |
|---|---|---|
urlobligatorio | string (uri) | |
creado_enobligatorio | string (date-time) | |
actualizado_enobligatorio | string (date-time) | |
secretoobligatorio | string | Se muestra sólo en esta respuesta. Es la clave del HMAC, entera, como texto.
|
- No admite campos que no estén en esta tabla.
TipoEventoWebhook
ReenvioEncolado
| Campo | Tipo | Descripción |
|---|---|---|
eventoobligatorio | object | |
evento.idobligatorio | string (uuid) | |
evento.tipoobligatorio | TipoEventoWebhook |
- No admite campos que no estén en esta tabla.
ComprobanteDelEvento
Lo necesario para reconocerlo. El detalle completo sale de GET /v1/comprobantes/{id}.
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string (uuid) | |
estadoobligatorio | string | El estado público al momento de entregar.
|
tipoobligatorio | integer | 1 factura A, 6 factura B, 3 nota de crédito A, 8 nota de crédito B.
|
punto_ventaobligatorio | integer |
|
numeroobligatorio | integer | null | Sólo con el comprobante emitido. |
caeobligatorio | string | null |
|
cae_vencimientoobligatorio | string (date) | null | |
fechaobligatorio | Fecha | |
comprobante_asociado_idobligatorio | string (uuid) | null | En una nota de crédito, la factura que corrige. |
- No admite campos que no estén en esta tabla.
EventoWebhook
comprobante.emitido: ARCA autorizó, y trae número y CAE. comprobante.rechazado: ARCA dijo que no;
motivo trae lo mismo que rechazo en el GET. comprobante.error_datos: los datos del comprobante
no se pueden enviar a ARCA; sigue procesando hasta que lo resuelva una persona.
comprobante.en_revision: espera la revisión de una persona; sigue procesando y no hace falta pedirlo
de nuevo. Estos dos últimos no se entregan si el comprobante se resolvió mientras esperaban: llega el
resultado. comprobante.descartado: ModoFactura lo cerró sin mandarlo a ARCA; no tiene número ni CAE y
no va a cambiar más.
| Campo | Tipo | Descripción |
|---|---|---|
idobligatorio | string (uuid) | Estable. Se repite en cada reintento y en un reenvío, para deduplicar. |
tipoobligatorio | TipoEventoWebhook | |
creado_enobligatorio | string (date-time) | Cuándo pasó, no cuándo se entregó. |
comprobanteobligatorio | ComprobanteDelEvento | |
motivoopcional | string | Legible. No trae más que lo que muestra el
|
- Si
tipoescomprobante.emitido:motivono se admite;comprobante.estadoesemitido;comprobante.numeroes integer desde 1;comprobante.caees string;comprobante.cae_vencimientoes string. - Si no:
motivoes obligatorio;comprobante.numeroesnull;comprobante.caeesnull;comprobante.cae_vencimientoesnull. - Si
tipoescomprobante.error_datosocomprobante.en_revision:comprobante.estadoesprocesando. - Si
tipoescomprobante.rechazado:comprobante.estadoesrechazado. - Si
tipoescomprobante.descartado:comprobante.estadoesdescartado. - No admite campos que no estén en esta tabla.
ImporteExacto
Calculado por el servidor, siempre con 2 decimales.
Problema
RFC 9457.
| Campo | Tipo | Descripción |
|---|---|---|
typeobligatorio | string | |
titleobligatorio | string | |
statusobligatorio | integer | |
detailopcional | string |
- No admite campos que no estén en esta tabla.
ProblemaDeValidacion
RFC 9457, con la lista de campos a corregir.
| Campo | Tipo | Descripción |
|---|---|---|
typeobligatorio | string | |
titleobligatorio | string | |
statusobligatorio | integer | |
erroresobligatorio | object[] |
|
errores[].campoobligatorio | string | Ruta del campo, por ejemplo |
errores[].mensajeobligatorio | string |
- No admite campos que no estén en esta tabla.