Skip to main content
Esta guía cubre el flujo completo de emisión: crear el comprobante, consultar su estado y obtener sus representaciones (PDF y XML). Todas las peticiones usan la API key de tu empresa en el header X-Api-Key.

Prerequisitos

La empresa emisora debe estar dada de alta con certificado y folios cargados.

1. Emitir el comprobante

Envía una petición POST con los datos del comprobante. La emisión es asíncrona: Emify recibe el documento, lo genera, lo firma y lo envía al SII en segundo plano.
Ejemplo de cuerpo para una factura electrónica en Chile:
factura.json
Los campos clave del cuerpo:

La tasa de cada impuesto

Cada impuesto, sea de items[].taxes, de global_taxes o de totals.taxes, lleva type y amount. La rate depende del tipo. Cada tipo de GET /api/tax-types trae rate_source, que dice de dónde sale su tasa:
  • CATALOG: la tasa es la del catálogo. Puedes omitir rate, y si la envías se ignora. Es el caso del IVA en todos los países y de los impuestos adicionales de Chile.
  • CLIENT: la tasa depende de la operación y tienes que enviarla. Es el caso de las percepciones y de los tributos provinciales y municipales de Argentina. Sin rate, el documento queda en INV con TAX_RATE_REQUIRED en validation_errors, sobre el campo del impuesto, y no se emite.
El detalle del documento devuelve la tasa con la que se emitió. En un tipo CATALOG, es la del catálogo al momento de crear el documento, aunque hayas enviado otra. Un tipo dado de baja en el catálogo deja de aparecer en GET /api/tax-types y no se acepta en un documento nuevo: en cualquiera de los tres grupos, el documento queda en INV con INACTIVE_TAX_TYPE en validation_errors y el mensaje Tax type '<code>' is inactive for this country sobre el campo, por ejemplo items[0].taxes[1].type. Los documentos que ya creaste con ese tipo no cambian.
Cambios en la dirección. El campo region pasó a llamarse state. Podés seguir enviando region: se acepta como alias y las respuestas devuelven los dos nombres con el mismo valor. region se elimina en una versión futura, así que migrá a state.city pasó a ser texto libre con el nombre de la comuna o localidad ("Antofagasta"), no un código de catálogo. En Chile no puede superar los 20 caracteres: es el límite que impone el SII para la comuna del documento.
El detalle campo por campo (tipos, obligatoriedad, objetos anidados) está en la referencia de la API. Los valores de tipos de documento, monedas, impuestos y unidades salen de los catálogos de referencia.
La respuesta confirma la recepción e incluye el id del documento y su estado inicial.

Validar antes de emitir

Para saber si un documento pasa las validaciones de Emify sin emitirlo, envía el mismo cuerpo a POST /api/invoices/validate. El documento no se registra, no consume folio, no se envía al SII ni a ARCA y no se factura.
Si pasa, la respuesta es 200 con:
Si no pasa, la respuesta también es 200, con todos los errores:
Son los mismos errores, con el mismo field, code y message, que reportaría la emisión de ese cuerpo. También aparecen acá los que en la emisión rechazan el documento con 422, como DUPLICATE_EXTERNAL_REFERENCE, CERTIFICATE_NOT_FOUND o CERTIFICATE_EXPIRED. Un cuerpo mal formado, una empresa suspendida o un tipo de documento inexistente responden igual que en la emisión (400 o 404), sin valid.
valid: true no garantiza que el documento se emita. La validación no cubre la verificación de esquema que se hace al firmar, la disponibilidad de folios ni el criterio del SII o de ARCA: el documento todavía puede terminar rechazado.

2. Consultar el estado

El estado se resuelve de forma asíncrona. Consulta el documento hasta que llegue a un estado final, o mejor, usa webhooks.
Los valores de status y fiscal_status, y qué significan, están en Ciclo de vida de un documento. La respuesta incluye el comprobante completo tal como quedó persistido, incluyendo billing_reference: es la forma de consultar qué referencias declaraste en un documento ya creado, no solo de saber qué códigos son válidos para declarar uno nuevo (ver más abajo).

3. Descargar el PDF

Una vez aprobado, descarga la representación impresa. Formatos: A4, 80mm, 58mm.
Para obtener el PDF en Base64 (por ejemplo, para incrustarlo en otro sistema), usa download-base64/{formato}. En Chile, el PDF A4 de las facturas (tipos 33 y 34) incluye por defecto la copia cedible: una segunda hoja con el recuadro de acuse de recibo (nombre, RUT, fecha y firma), la leyenda de la Ley 19.983 y la palabra “CEDIBLE”. Es la copia que se usa para ceder la factura, por ejemplo a una empresa de factoring. Si solo necesitas la original, agrega cedible=false, tanto en download-pdf/A4 como en download-base64/A4:
Los demás tipos de documento, los formatos 80mm y 58mm y los comprobantes de Argentina nunca llevan copia cedible: en ellos, el parámetro se ignora. En Chile, si el comprobante tiene observations, el PDF las imprime en un recuadro “Observaciones” (en A4, con y sin copia cedible, en 58 mm, en 80 mm y en los documentos de exportación), con un renglón por cada salto de línea. Es el lugar para datos que tu cliente necesita ver en el documento, como la orden de compra. Las observaciones solo aparecen en el PDF: no viajan en el XML que se envía al SII.

4. Descargar el XML

Anular un comprobante

En Chile, un documento emitido no se “borra”: se anula emitiendo una nota de crédito que lo referencia. Envía un POST a invoices con invoice_type de nota de crédito (NCV), el reason_code correspondiente y billing_reference apuntando al documento original.
Ver los códigos de anulación en tipos de documento.
El documento referenciado en billing_reference no necesita haber sido emitido por Emify: puedes referenciar un documento emitido por otro proveedor o sistema y Emify lo acepta, enviando la referencia al SII tal cual la informas para que él la valide.Cuando el documento referenciado sí existe en Emify y lo que emites es una nota de crédito (el tipo que anula otro documento, como NCV o NCC), el tipo referenciado debe ser anulable y la nota debe ser de su tipo de anulación. Por ejemplo, una factura de exportación se anula con NCXC, no con NCV.Una nota de débito (NDV, NDC) o un documento que referencia una guía de despacho no anula lo que referencia, así que esas reglas no aplican: puedes referenciar un documento emitido en Emify con cualquiera de ellos.

El folio de una referencia

billing_reference[].number es el folio del documento referenciado, el FolioRef del SII: un texto de hasta 18 caracteres. Cada dato de la referencia va en su propio campo: el tipo en invoice_type, el folio en number y la fecha del documento referenciado en invoice_date. Los documentos de respaldo no tienen folio numérico. Una orden de compra de Mercado Público, por ejemplo, se referencia así:
  • Documentos tributarios (facturas, notas, boletas, guías de despacho, y todo comprobante argentino): el folio es un número, y puedes enviarlo como string ("772") o como número (772). Si trae otro carácter, el documento queda en INV con INVOICE_BILLING_REF_NUMBER_NOT_NUMERIC sobre billing_reference[i].number en validation_errors, y no se envía al SII.
  • Documentos de respaldo (el rango 800 —orden de compra, DUS, contrato…— y los códigos alfabéticos como HES): el folio va tal como lo envías, letras y guiones incluidos.
  • Un folio de más de 18 caracteres se rechaza con 400 antes de consumir folio. No empaquetes la referencia en un solo campo (801#1057-482-SE26#2026-02-11#): eso no es un folio y supera el largo.
Los códigos de tipo que puedes referenciar sin poder emitirlos están en GET /api/document-reference-types?country=CHL.
Al consultar un documento, billing_reference[].number llega siempre como string, también en los documentos creados antes de este cambio: donde antes se leía "number": 65, ahora llega "number": "65". Si deserializas la respuesta con un tipo numérico, cámbialo a texto. El SDK de C# se regenera con el tipo nuevo.

Argentina: comprobantes Clase A y B

Argentina todavía no está habilitada en producción.
Un Responsable Inscripto emite Factura A o B y discrimina el IVA ante ARCA. La emisión también es asíncrona: la respuesta vuelve con status: "PEN", sin number ni cae, y el CAE llega por webhook, salvo que lo pidas en la misma respuesta. Además de los tipos y receptores de cada clase, se validan estas reglas:
  • Un tratamiento de IVA por ítem. Cada ítem lleva exactamente un impuesto de IVA: una alícuota, exento o no gravado. La alícuota es la del catálogo, así que rate es opcional en el IVA. En los tributos de global_taxes es obligatoria.
  • Sin descuento global. totals.discount va en 0. Si hay un descuento, va en el ítem (discount_amount), que reduce el neto de su alícuota.
  • La modalidad de la Clase A. Si ARCA te asignó la leyenda “PAGO EN CBU INFORMADA” o la de “OPERACIÓN SUJETA A RETENCIÓN”, declárala en issuer.tax_information con cbu o con subject_to_retention: true. La segunda se autoriza con los códigos 51/52/53 y numera en su propia serie. Ver modalidades de la Clase A.
  • Los totales cierran. sub_total es la suma de los netos de los ítems, y total es sub_total más el IVA de los ítems más los tributos.
Ejemplo de una Factura A con dos alícuotas, un ítem exento y una percepción de IIBB: el neto gravado es 1.200, el exento 500, el IVA 231 y los tributos 30, así que el total es 1.961.
El PDF de la Clase A muestra el neto gravado, el IVA por alícuota, el exento, el no gravado y los otros tributos. El de la Clase B muestra los precios con IVA incluido y el bloque del Régimen de Transparencia Fiscal al Consumidor (Ley 27.743) con el IVA contenido; los impuestos internos (AR_IMP_INT) se informan ahí como “Otros Impuestos Nacionales Indirectos”. En las dos clases, si el comprobante tiene tributos, el PDF A4 incluye la tabla “Otros Tributos” del modelo de ARCA: los renglones de Ganancias, IVA, Ingresos Brutos, Internos y Municipales, en cero si no hay tributos de ese tipo, cada tributo que enviaste con su description como detalle, y el total. Sin tributos, o si todos son de importe cero, la tabla no se imprime; el renglón Importe Otros Tributos de los totales sigue apareciendo, en cero. Los tickets de 58 y 80 mm listan solo los tributos que enviaste. Ver los tipos de tributo. Si una regla no se cumple, el comprobante queda en INV, sin enviarse a ARCA, con el código que la identifica en validation_errors: ver errores.

Representación impresa

El PDF sigue el modelo de comprobante de ARCA e incluye los datos que exige la RG 1415:
  • Ingresos Brutos: sale del gross_income_number de la empresa. Cárgalo al dar de alta la empresa; si falta, el renglón no se imprime.
  • Datos del emisor: si el comprobante se crea sin el bloque issuer, el domicilio, la condición frente al IVA y el inicio de actividades salen de la empresa.
  • Modalidad de la Clase A: la leyenda “PAGO EN CBU INFORMADA” (con la CBU) o “OPERACIÓN SUJETA A RETENCIÓN” se imprime en la cabecera, junto a la letra, como exige la RG 5762.
  • Ley 27.618: una Clase A a un monotributista (MT, MTS, MTIP) lleva, a la derecha del QR, la leyenda del crédito fiscal computable solo en el Régimen de Sostenimiento e Inclusión Fiscal.
  • Leyenda 147: si la empresa tiene domicilio en CABA y el receptor es consumidor final (CF), se imprime la leyenda del teléfono gratuito de Defensa del Consumidor, como exige la Ley 3.896 de la Ciudad.

Moneda extranjera

Un comprobante argentino de cualquier clase (A, B o C) se puede emitir en dólares ("code": "USD"). La cotización la envías tú en currency.exchange_rate, en pesos por dólar: Emify no la consulta ni la corrige. Si necesitas una referencia, la del BCRA está en GET /api/services/currencies?country=ARG&currency=USD.
  • En dólares la cotización es obligatoria y distinta de 1. Si falta o vale 1, el comprobante queda en INV con EXCHANGE_RATE_REQUIRED_FOR_FOREIGN_CURRENCY sobre currency.exchange_rate en validation_errors.
  • En pesos la cotización falta o vale 1. Con otro valor queda en INV con EXCHANGE_RATE_MUST_BE_ONE_FOR_LOCAL_CURRENCY.
  • Los importes van en dólares, sin convertir: ítems, impuestos y totales. ARCA los convierte con la cotización.
  • El comprobante se declara cancelable en pesos. El PDF muestra la moneda y el tipo de cambio en el recuadro del receptor, e imprime: «El presente comprobante equivale a 149.374,50ydesercanceladoenpesosargentinosdeberaˊhacersealtipodecambiooficialdelafechaefectivadelaacreditacioˊndelpago.CotizacioˊndelDolar149.374,50 y de ser cancelado en pesos argentinos deberá hacerse al tipo de cambio oficial de la fecha efectiva de la acreditación del pago. Cotización del Dolar 1.234,50».

Concepto y vencimiento del pago

En cualquier clase (A, B o C), el payment_due_date se informa a ARCA solo si concept es "2" (servicios) o "3" (productos y servicios), igual que service_start_date y service_end_date. Con "1" (productos) ARCA lo rechaza: Emify lo guarda y lo devuelve en la consulta, pero no se lo informa a ARCA ni lo imprime en el PDF.

CAE en la respuesta

Si necesitas el número y el CAE en la misma respuesta, por ejemplo para imprimir el comprobante en el momento, agrega sync=true a la petición:
La respuesta espera hasta 25 segundos a que ARCA resuelva el comprobante, y vuelve con el resultado: La respuesta también vuelve en PEN, sin esperar, si ARCA está en una ventana de mantenimiento o si Emify está atendiendo demasiadas esperas a la vez. Revisa siempre el status: el modo sincrónico no reemplaza al webhook, lo adelanta cuando puede.
Envía siempre external_reference. Si tu cliente HTTP corta antes que Emify y reintentas el mismo documento, con la referencia el reintento recibe 422 DUPLICATE_EXTERNAL_REFERENCE; sin ella, se emite un segundo comprobante ante ARCA. Configura el timeout de tu cliente por encima de los 25 segundos.
El parámetro solo existe para Argentina, donde ARCA autoriza en la misma llamada. Para una empresa de otro país la petición responde 400 con code: SYNC_AUTHORIZATION_NOT_SUPPORTED y no registra nada: el SII acepta los documentos en minutos u horas.