Guías1 de 11

Quickstart: de cero a un comprobante autorizado

Al final de esta guía vas a tener un comprobante con CAE de ARCA, su PDF, y la anulación hecha. Cuatro pedidos HTTP.

Todo lo que sigue —cada comando y cada respuesta— se ejecutó. Las respuestas son las que devolvió la API, sin retocar. Corrieron contra homologación, que es el entorno donde vas a empezar y donde ARCA entrega CAE real: no es un simulador.

Antes de empezar: lo que Emissa no te puede dar

Para emitir contra ARCA hacen falta tres cosas, y dos son trámites tuyos ante el organismo:

  1. Un certificado de ARCA (.crt + su clave privada), que se pide en el sitio de ARCA con un CSR. Emissa lo guarda cifrado y lo usa para firmar; no puede generarlo por vos.
  2. Un punto de venta dado de alta para "Factura Electrónica – Webservice". No es el mismo alta que la del portal web de ARCA — ver Qué es un punto de venta.
  3. Una cuenta de Emissa con una API key.

Sé honesto con el reloj: si ya tenés el certificado y el punto de venta, lo que sigue son cinco minutos. Si no los tenés, el trámite ante ARCA es la parte larga y no depende de nosotros.

1 · La clave

Esto se hace en el panel, con el navegador. La API de integración es /v1; el alta de cuenta y la creación de claves son del panel a propósito, porque entregar una credencial de integración es de lo más sensible que hace el sistema.

  1. Creá tu cuenta en emissa.com.ar y verificá el correo.
  2. Activá el segundo factor. No es opcional: sin 2FA no se pueden crear API keys.
  3. Cargá tu contribuyente (CUIT, razón social, condición frente al IVA, punto de venta, domicilio).
  4. Subí el certificado y su clave privada.
  5. Generá una API key de prueba. Empieza con emi_test_.

La clave se muestra una sola vez. Guardala en tu gestor de secretos.

Y el taxpayerId, que es el otro dato que vas a necesitar

Cada emisión lo pide, y no es el CUIT: es el id que Emissa le dio a tu contribuyente. La forma de obtenerlo con la clave que acabás de crear es GET /v1/consumo, que lista tus contribuyentes con su id:

curl https://api.emissa.com.ar/v1/consumo -H "X-API-Key: $EMISSA_API_KEY"
{
  "period": "2026-07",
  "plan": "SANDBOX",
  "organization": {
    "limite": 50,
    "usada": 0,
    "restante": 50,
    "cuitActivos": 0
  },
  "taxpayers": [
    {
      "taxpayerId": "cms6q9ym80008ureocwo81ig2",
      "cuit": "20437136697",
      "billable": 0,
      "total": 0
    }
  ]
}

Ese taxpayerId es el que va en el cuerpo de la emisión. Alcanza con una clave que declare invoice:read — verificado con una clave que sólo tenía ese scope.

2 · Emitir

Una Factura B a consumidor final por $1.000 + IVA.

curl -X POST https://api.emissa.com.ar/v1/invoices/authorize \
  -H "X-API-Key: $EMISSA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: quickstart-6.1-primera" \
  -d '{
    "taxpayerId": "TU_TAXPAYER_ID",
    "cbteTipo": 6,
    "concepto": 1,
    "receiverDocTipo": 99,
    "receiverDocNro": "0",
    "receiverName": "Consumidor Final",
    "receiverVatConditionId": 5,
    "issueDate": "2026-07-29",
    "items": [
      {
        "description": "Plan Pro - julio 2026",
        "unit": "UNIDADES",
        "quantity": 1,
        "unitPrice": 1000,
        "tratamiento": "GRAVADO",
        "vatRateId": 5
      }
    ]
  }'

201 Created, en 7,1 segundos:

{
  "id": "cms6l4gnq0007ur04xl1dcqf0",
  "environment": "HOMOLOGACION",
  "cbteTipo": 6,
  "cbteTipoNombre": "FACTURA_B",
  "letra": "B",
  "salePoint": 1,
  "number": 131,
  "comprobante": "0001-00000131",
  "issueDate": "2026-07-29",
  "totals": {
    "netAmount": "1000.00",
    "nonTaxedAmount": "0.00",
    "exemptAmount": "0.00",
    "vatAmount": "210.00",
    "otherTaxesAmount": "0.00",
    "totalAmount": "1210.00"
  },
  "vatBreakdown": [
    {
      "vatRateId": 5,
      "vatRatePercent": 21,
      "baseAmount": "1000.00",
      "vatAmount": "210.00"
    }
  ],
  "status": "AUTHORIZED",
  "cae": "86300696468093",
  "caeExpiresAt": "2026-08-08",
  "arcaMetadata": {
    "service": "wsfev1",
    "resultado": "A",
    "authorized": true,
    "observaciones": 0
  }
}

(Recortado: la respuesta completa trae además emitter, receiver, items, customer, taxes, associations, optionals y observations. Los campos de arriba son textuales.)

Eso es un comprobante fiscal. resultado: "A" es ARCA diciendo aprobado. El cae y el caeExpiresAt los emitió el organismo.

Los cuatro campos que más se eligen mal

CampoEn este ejemploDe qué depende
cbteTipo6 = Factura BLa condición frente al IVA tuya y de tu cliente. Ver comprobantes A, B y C
receiverDocTipo99 = consumidor final80 es CUIT, 96 DNI. Con 99 el receiverDocNro va en "0"
receiverVatConditionId5 = consumidor finalObligatorio desde la RG 5616. 1 es responsable inscripto
vatRateId5 = 21 %4 es 10,5 %, 6 es 27 %, 3 es 0 %. 0 % no es exento ni no gravado

Los importes viajan como string, no como número: "1210.00". Es a propósito —un float no representa pesos— y tu cliente HTTP no tiene que redondear nada.

Idempotency-Key es obligatorio

Si lo omitís, el pedido se rechaza:

{
  "statusCode": 400,
  "errorCode": "IDEMPOTENCY_KEY_REQUIRED",
  "message": "Falta el header Idempotency-Key. Es obligatorio en las operaciones que emiten un comprobante."
}

No es burocracia. Repetí el mismo pedido con la misma clave y mirá qué pasa:

# exactamente el mismo comando de arriba, otra vez
HTTP 201 · Idempotent-Replay: true · 0,02 segundos
id devuelto: cms6l4gnq0007ur04xl1dcqf0 | cae: 86300696468093 | number: 131

El mismo comprobante, el mismo CAE, el mismo número. No se emitió un segundo: verificado contando en la base, sigue habiendo uno con ese CAE. Y tardó 0,02 s en vez de 7,1 porque no salió a ARCA.

Un comprobante fiscal duplicado no se deshace: se anula con una nota de crédito y queda en tu historia. Por eso la clave es obligatoria y no un consejo.

3 · Consultar

curl https://api.emissa.com.ar/v1/invoices/cms6l4gnq0007ur04xl1dcqf0 \
  -H "X-API-Key: $EMISSA_API_KEY" -i
HTTP 200 · 0,02 s
X-Request-Id: 17a81316-cd43-4f0f-b320-3c7a0e48ddfa
X-Emissa-Mode: test

Dos cabeceras que conviene loguear desde el primer día: X-Request-Id identifica el pedido si tenés que reportar algo, y X-Emissa-Mode te dice si la clave que usaste es test o live. Loguear la segunda evita la clase de sorpresa que no se descubre hasta fin de mes.

4 · El PDF

curl https://api.emissa.com.ar/v1/invoices/cms6l4gnq0007ur04xl1dcqf0/pdf \
  -H "X-API-Key: $EMISSA_API_KEY" -o comprobante.pdf
HTTP 200 · 0,08 s · 11696 bytes
$ head -c 8 comprobante.pdf | xxd
00000000: 2550 4446 2d31 2e37                      %PDF-1.7

Trae el bloque del emisor, el detalle, las leyendas de transparencia fiscal y el QR de la RG 4892.

5 · Anular

En Argentina un comprobante autorizado no se borra: se anula emitiendo una nota de crédito que lo referencia. Emissa lo hace en un pedido.

curl -X POST https://api.emissa.com.ar/v1/invoices/cms6l4gnq0007ur04xl1dcqf0/cancel \
  -H "X-API-Key: $EMISSA_API_KEY" \
  -H "Idempotency-Key: quickstart-6.1-anular"
HTTP 200 · 0,35 s
tipo        : 8 NOTA_CREDITO_B (letra B)
comprobante : 0001-00000033
cae NC      : 86300696473229
status      : AUTHORIZED
asociado    : [{ "cbteTipo": 6, "salePoint": 1, "number": 131, "issueDate": "2026-07-29" }]
total       : 1210.00

La nota de crédito tiene su propio CAE, distinto del de la factura: es un comprobante fiscal por derecho propio. Y la factura original queda así:

status: CANCELLED | cancelledByInvoiceId: cms6l58la000kur045qi0nfta | cae: 86300696468093

Conserva su CAE —fue válida y ARCA la autorizó— y ahora apunta a la nota que la anula.

Cuánto tarda de verdad

Tiempos medidos en la corrida de arriba, en el orden en que se hicieron:

PasoTiempoPor qué
Emitir (primera vez)7,09 sAutentica contra WSAA y emite en WSFEv1
Reintento idempotente0,02 sNo sale a ARCA: devuelve lo guardado
Consultar0,02 sLectura local
Bajar el PDF0,08 sSe genera al pedirlo
Anular0,35 sEmite en WSFEv1 con el ticket ya en caché

Los cuatro pedidos suman menos de 8 segundos. El primero paga la autenticación contra ARCA, que dura 12 horas y queda cacheada: por eso anular —que también sale a ARCA— tardó 0,35 s y no 7.

Si tu primera emisión tarda parecido, está bien. Si tarda mucho más, mirá qué hacer cuando el CAE viene rechazado.

El error que casi todos cometen primero

La clave va en X-API-Key. En Authorization no funciona, y la API lo dice:

curl "https://api.emissa.com.ar/v1/invoices/search?taxpayerId=..." \
  -H "Authorization: Bearer $EMISSA_API_KEY"
{
  "statusCode": 401,
  "errorCode": "API_KEY_WRONG_HEADER",
  "message": "Las API keys van en el header X-API-Key, no en Authorization. Usá: X-API-Key: emi_...",
  "details": "La key llego en Authorization; va en X-API-Key desde la version 1"
}

Sobre el sandbox y producción

La clave emi_test_ opera contra homologación, y homologación no consume cuota: después de emitir la factura y la nota de crédito, GET /v1/consumo seguía en cero.

{
  "period": "2026-07",
  "plan": "SANDBOX",
  "organization": {
    "limite": 50,
    "usada": 0,
    "restante": 50,
    "cuitActivos": 0
  },
  "taxpayers": [{ "cuit": "20437136697", "billable": 0, "total": 2 }]
}

total: 2 son los dos comprobantes emitidos; billable: 0 es lo que se factura por ellos.

El paso a producción, y una advertencia que conviene leer antes que cualquier otra cosa: emitir en PRODUCCION está habilitado, y lo que emitís ahí es un comprobante fiscal real. Entra en los registros del contribuyente ante ARCA, pesa en su declaración de IVA, y no se borra — se revierte con una nota de crédito.

Todo lo que hiciste hasta acá fue en HOMOLOGACION, que emite con CAE real del organismo y no tiene consecuencia fiscal. Es el lugar para probar; no hay apuro en salir de ahí.

Lo que ARCA te va a exigir para producción, y que Emissa no verifica porque vive del otro lado: certificado productivo, punto de venta de tipo "Factura Electrónica – Web Service" —uno de Comprobantes en Línea no sirve— y el servicio autorizado. Si falta alguno, contesta ARCA con el motivo concreto.

Los controles que sí hace Emissa, medidos: con una clave test contra un contribuyente en PRODUCCION la respuesta es 403 API_KEY_WRONG_MODE, y con una live sin credencial cargada es 400 CREDENTIALS_REQUIRED. Los dos conjuntos —testHOMOLOGACION, livePRODUCCION— son disjuntos a propósito: no podés emitir un comprobante fiscal real con la clave con la que estabas probando.

Mientras tanto el sandbox ejercita el circuito completo con CAE real, que es lo que acabás de hacer.

Qué sigue