---
title: "Emite un lote de facturas (hasta 100)"
method: POST
path: "/comprobantes/lote"
tags: ["Comprobantes"]
---

# Emite un lote de facturas (hasta 100)

`POST /comprobantes/lote`

## Request

- Base URL: `https://contadeo.com/api`
- URL: `https://contadeo.com/api/comprobantes/lote`
- Auth: `bearerAuth` (a scheme the document does not define)

Semántica **parcial, no atómica**: cada factura reserva su propio secuencial y reporta su resultado; un fallo puntual no aborta el lote. Un error de CUENTA (402 cupo agotado / 403 suspendida) sí lo detiene y el resto queda `NO_INTENTADA`. Reintento seguro: repite el request con el mismo header `Idempotency-Key` y las que ya entraron no se duplican. Límite propio: 10 lotes/min por cuenta. Body hasta 2 MB.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `emisorId` string, uuid, required
  - `certificadoId` string, uuid, required
  - `establecimiento` string, required
  - `puntoEmision` string, required
  - `facturas` LoteFactura[], required
    - `referencia` string: Identificador TUYO (nº de pedido, etc.); vuelve tal cual en el resultado.
    - `idempotencyKey` string: Idempotencia por factura. Si falta y el request lleva el header `Idempotency-Key`, se deriva `header:indice`.
    - `infoFactura` InfoFactura, required
      - `fechaEmision` string, date: ISO YYYY-MM-DD; sin ella el servidor usa hoy en hora Ecuador (la única siempre válida ante el SRI).
      - `dirEstablecimiento` string
      - `contribuyenteEspecial` string
      - `obligadoContabilidad` 'SI' | 'NO'
      - `tipoIdentificacionComprador` '04' | '05' | '06' | '07' | '08' | '09', required: 04=RUC, 05=cédula, 06=pasaporte, 07=consumidor final, 08=id. exterior, 09=placa
      - `guiaRemision` string
      - `razonSocialComprador` string, required
      - `identificacionComprador` string, required
      - `direccionComprador` string
      - `totalSinImpuestos` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
        - string
        - number
      - `totalDescuento` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
        - string
        - number
      - `totalConImpuestos` TotalImpuesto[], required
        - `codigo` '2' | '3' | '5', required: 2=IVA, 3=ICE, 5=IRBPNR
        - `codigoPorcentaje` string, required
        - `descuentoAdicional` union: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
        - `baseImponible` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
        - `tarifa` union: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
        - `valor` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
        - `valorDevolucionIva` union: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
      - `propina` union: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
        - string
        - number
      - `importeTotal` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
        - string
        - number
      - `moneda` string
      - `pagos` Pago[]
        - `formaPago` '01' | '15' | '16' | '17' | '18' | '19' | '20' | '21', required: 01=sin sistema financiero, 15=compensación, 16=t. débito, 17=dinero electrónico, 18=t. prepago, 19=t. crédito, 20=otros con sistema financiero, 21=endoso de títulos
        - `total` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
        - `plazo` union: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
        - `unidadTiempo` string: Unidad del plazo, hasta 10 caracteres. Solo `dias` se convierte en vencimiento
    - `detalles` DetalleFactura[], required
      - `codigoPrincipal` string
      - `codigoAuxiliar` string
      - `descripcion` string, required
      - `unidadMedida` string
      - `cantidad` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
        - string
        - number
      - `precioUnitario` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
        - string
        - number
      - `descuento` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
        - string
        - number
      - `precioTotalSinImpuesto` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
        - string
        - number
      - `detallesAdicionales` DetalleAdicional[]
        - `nombre` string, required
        - `valor` string, required
      - `impuestos` ImpuestoLinea[], required
        - `codigo` '2' | '3' | '5', required: 2=IVA, 3=ICE, 5=IRBPNR
        - `codigoPorcentaje` string, required
        - `tarifa` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
        - `baseImponible` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
        - `valor` union, required: Monto o cantidad; se recomienda string decimal ("100.00") para no perder precisión.
          - string
          - number
    - `infoAdicional` object[]
      - `nombre` string
      - `valor` string

## Response `202`

Lote procesado (mira el estado POR elemento: puede haber errores parciales)

- ResultadoLote
  - `total` integer
  - `encoladas` integer
  - `fallidas` integer
  - `noIntentadas` integer
  - `resultados` ResultadoLoteItem[]
    - `indice` integer
    - `referencia` string, nullable
    - `estado` 'BORRADOR' | 'ERROR' | 'NO_INTENTADA': BORRADOR = encolada (siga con webhooks o GET /comprobantes/{id}) · ERROR = esta factura falló · NO_INTENTADA = el lote se detuvo antes por un error de cuenta.
    - `comprobanteId` string, uuid
    - `claveAcceso` string
    - `reutilizado` boolean: true si la idempotencyKey ya tenía comprobante: se devuelve ese, sin re-emitir.
    - `error` string

## Other responses

- `400`: Lote vacío, más de 100 facturas o header de idempotencia demasiado largo
- `429`: Límite de lotes por minuto superado

---

[API](https://skmtc.dev/contadeo/apis/api-de-contadeo.md) · [All operations](https://skmtc.dev/contadeo/apis/api-de-contadeo/llms.txt) · [OpenAPI document](https://skmtc.dev/contadeo/apis/api-de-contadeo/revisions/461bbb9a74ce?raw)
