---
title: "Emitir factura (01)"
method: POST
path: "/comprobantes/factura"
tags: ["comprobantes"]
---

# Emitir factura (01)

`POST /comprobantes/factura`

## Request

- Base URL: `https://contadeo.com/api`
- URL: `https://contadeo.com/api/comprobantes/factura`
- Auth: HTTP bearer

Asíncrono: valida, reserva secuencial y encola. Hacer polling de `GET /comprobantes/{id}`. `infoFactura.fechaEmision` es opcional (`YYYY-MM-DD`, calendario de Ecuador): omitida = hoy; explícita = solo la fecha de hoy en Ecuador (cualquier otra, pasada o futura, responde 400). Cuerpo completo por tipo: ver /desarrolladores.

## Headers

- `Idempotency-Key` string

## Request body

- EmitirFactura
  - `emisorId` string, uuid, required
  - `certificadoId` string, uuid, required
  - `establecimiento` string, required
  - `puntoEmision` string, required
  - `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` CampoAdicional[]
    - `nombre` string, required
    - `valor` string, required
  - `cobro` object, nullable: «Ya la cobré»: el banco o la caja donde entró el dinero. El cobro se registra cuando el SRI autoriza la factura, por todo su importe. Necesita el módulo `tesoreria` (402), la empresa en Producción, una factura sin plazo y una cuenta activa del emisor (400, campo `cobro`). No viaja en el XML.
    - `cuentaTesoreriaId` string, uuid, required

## Response `202`

Encolado para firma y transmisión al SRI

- ResultadoEmision
  - `comprobanteId` string, uuid
  - `claveAcceso` string
  - `estado` 'BORRADOR' | 'FIRMADO' | 'ENVIADO' | 'AUTORIZADO' | 'DEVUELTA' | 'RECHAZADO' | 'CONTINGENCIA' | 'ANULADO'
  - `reutilizado` boolean: true si la Idempotency-Key ya tenía comprobante: se devuelve ese (con su estado real), sin re-emitir
  - `advertencias` string[]: Avisos no bloqueantes (p. ej. fecha de emisión con riesgo de error 65)

## Other responses

- `400`: Cuerpo inválido o validación de negocio (previene errores SRI 62/52/65/69/39)
- `402`: Cupo mensual del plan agotado (`upgrade: true`). En una cuenta bajo contrato OEM solo aplica al tope de Pruebas y llega con `upgrade: false`: no hay plan que comprar.
- `409`: La emisión de esta cuenta la gestiona un partner OEM y está en pausa: el régimen de emisión del contrato está pausado o el partner está suspendido. No se reserva secuencial ni se consume cupo. La cuenta no vuelve a su plan propio: vuelve a emitir cuando el régimen se reactiva.
- `429`: Demasiadas peticiones (300/min global, 60/min emisión)

---

[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)
