Guía de Integración API
Versión: 3.9 (Extended Technical Documentation)
Plataforma: Facturación Electrónica (Ecuador)
Esta API permite a sistemas externos (ERP, POS, E-commerce, CRMs) emitir documentos electrónicos legales en Ecuador a través de una sola llamada simplificada. Al basarse en estándares web (REST/JSON), admite integración desde cualquier lenguaje de programación, incluyendo PHP (Laravel), Python (Django/Flask), Java, Node.js, C# (.NET) y más.
El motor interno de KoaDoc se encarga de todo el ciclo de vida del documento electrónico dictaminado por el Servicio de Rentas Internas (SRI):
- Registro: Persistencia en base de datos transaccional con control de atomicidad.
- Generación XML: Estructuración del documento bajo el esquema XSD oficial del SRI.
- Firma Digital: Firma criptográfica (XAdES-BES) usando el certificado
.p12de la empresa. - Envío y Autorización: Comunicación SOAP con los Web Services del SRI.
- Notificación: Envío automático del comprobante (XML y RIDE PDF) al cliente.
1. Autenticación
Todas las peticiones requieren el header Authorization. Existen dos métodos dependiendo de la arquitectura de su integración:
A. Token de Empresa (Prefijo VSR)
Ideal para aplicaciones exclusivas de una empresa, donde la integración no necesita saber el ID interno de la empresa en KoaDoc. Nota: "VSR" es el prefijo de seguridad interno específico de KoaDoc para identificar tokens de empresa única.
- Header:
Authorization: Token vsr_XXXXXXXXXXXXXXXXX - Comportamiento: La API identifica la empresa automáticamente según el prefijo
vsr_. No incluya el campocompanyen el JSON.
B. Token de Usuario (Multi-Empresa)
Ideal para integradores (SaaS) que manejan múltiples empresas desde una sola cuenta administrativa.
- Header:
Authorization: Token XXXXXXXXXXXXXXXXX - Comportamiento: Requiere obligatoriamente enviar el campo
company: ID(entero) en la raíz del cuerpo JSON.
2. Endpoint Principal: Emisión Completa
POST https://koadoc.koadevs.com/api/sri/documents/create_and_process_invoice_complete/
Este endpoint recibe la metadata cruda de una venta y devuelve el resultado del procesamiento.
Importante: La Clave de Acceso (49 Dígitos)
Este es el identificador legal supremo único de cada comprobante. Al enviar tu petición a este endpoint, nosotros nos encargamos de generar y estructurar esta clave automáticamente por ti. Debes asegurarte de guardar esta clave que te retornamos en tu base de datos local, ya que es el comprobante oficial ante el SRI y no se puede repetir por nada del mundo.
Estructura del JSON (Request)
{
"issue_date": "2025-08-04",
"customer_identification_type": "05",
"customer_identification": "1234567890",
"customer_name": "JUAN CARLOS PÉREZ LÓPEZ",
"customer_address": "Av. Principal 123, Quito",
"customer_email": "[email protected]",
"customer_phone": "0987654321",
"service_period": "Agosto 2025",
"expiration_date": "2025-08-15",
"payment_methods": [
{
"payment_method_code": "01",
"amount": 103.50,
"payment_term": 0,
"time_unit": "dias"
}
],
"items": [
{
"main_code": "PROD-001",
"auxiliary_code": "AUX-001",
"description": "Producto de ejemplo",
"quantity": 2.00,
"unit_price": 50.00,
"discount": 5.00,
"tax_rate": 15
}
]
}
Detalle de Campos Raíz (Root)
| Campo | Tipo | Req | Descripción |
|---|---|---|---|
issue_date | String | SI | Formato ISO 8601 (YYYY-MM-DD). Debe ser fecha actual o máximo 1 mes atrás. |
customer_identification_type | String | SI | Código SRI del tipo de ID. |
customer_identification | String | SI | Número de ID. Valida algoritmo automáticamente. |
customer_name | String | SI | Razón Social (Máx 300 caracteres). Evite caracteres especiales. |
customer_email | String | NO | Email para envío del XML y PDF. Admite múltiples separados por coma. |
company | Integer | NO | ID de la empresa (Obligatorio solo si usa Token de Usuario). |
Detalle de Items
| Campo | Tipo | Req | Descripción |
|---|---|---|---|
main_code | String | SI | Máx 25 caracteres. Código interno del producto. |
description | String | SI | Máx 300 caracteres. Descripción del ítem. |
quantity | Number | SI | Cantidad > 0. Soporta hasta 6 decimales. |
unit_price | Number | SI | Precio unitario > 0. Soporta hasta 6 decimales. |
discount | Number | NO | Descuento ≥ 0. |
tax_rate | Number | NO | Porcentaje de IVA del ítem (0, 5, 12, 14, 15). |
3. Consulta de Comprobante Completo
GET https://koadoc.koadevs.com/api/sri/documents/{id}/
Reemplazando {id} por el ID numérico de la factura (ej: /api/sri/documents/1234/).
Para obtener todos los detalles completos de una factura (incluyendo los items individuales que compró el cliente, los impuestos desglosados y el estado final del SRI), debes usar este endpoint de lectura o consulta. El JSON devuelto en la creación es un resumen, pero para armar tu comprobante o voucher completo, debes hacer una petición GET.
Respuesta Esperada
Te devolverá un JSON detallado con toda la información necesaria para dibujar tu ticket. Presta especial atención a los bloques items, taxes y payment_methods.
{
"id": 1234,
"company": 1,
"company_name": "Helados S.A.",
"company_ruc": "0999999999001",
"document_type": "INVOICE",
"document_number": "001-001-000000123",
"access_key": "1308202601179000000000120010010000001231234567812",
"issue_date": "2026-08-13",
"status": "AUTHORIZED",
"status_display": "Autorizado",
"customer_identification": "0999999999",
"customer_name": "Juan Pérez",
"customer_address": "Av. Principal y Secundaria",
"customer_email": "[email protected]",
"subtotal_without_tax": "4.50",
"total_tax": "0.68",
"total_amount": "5.18",
"sri_authorization_code": "13082026011790...",
"sri_authorization_date": "2026-08-13T12:05:00Z",
"items": [
{
"main_code": "HEL-001",
"description": "Cono de Vainilla",
"quantity": "2.000000",
"unit_price": "1.500000",
"discount": "0.00",
"subtotal": "3.00",
"taxes": [
{
"tax_code_display": "IVA",
"percentage_code_display": "15%",
"rate": "15.00",
"taxable_base": "3.00",
"tax_amount": "0.45"
}
]
},
{
"main_code": "HEL-002",
"description": "Tarrina de Chocolate",
"quantity": "1.000000",
"unit_price": "1.500000",
"discount": "0.00",
"subtotal": "1.50",
"taxes": [
{
"tax_code_display": "IVA",
"percentage_code_display": "15%",
"rate": "15.00",
"taxable_base": "1.50",
"tax_amount": "0.23"
}
]
}
],
"payment_methods": [
{
"payment_method_code_display": "SIN UTILIZACION DEL SISTEMA FINANCIERO",
"amount": "5.18",
"payment_term": 0,
"time_unit": "dias"
}
],
"pdf_file_url": "https://tu-dominio.com/mediafiles/sri/pdfs/001-001-000000123.pdf",
"xml_file_url": "https://tu-dominio.com/mediafiles/sri/xmls/001-001-000000123.xml"
}
¿Cómo usar esto para tu comprobante o voucher?
Con esta respuesta tu sistema ya tiene todo para imprimir el voucher:
- Pones el
company_nameycompany_ruccomo cabecera. - Muestras el
document_numbery usas laaccess_keypara generar un código de barras o QR. - Iteras el array de
itemspara imprimir la lista de productos vendidos con cantidad y precio. - Muestras el
sri_authorization_datepara darle validez legal al ticket. - Opcional: Si no quieres diseñar el ticket, descarga y muestra la URL del
pdf_file_url(RIDE).
4. Ten en cuenta la codificación del SRI
El éxito de la integración recae en usar los catálogos técnicos correctos exigidos por el SRI para evitar rechazos en los comprobantes.
Tipos de Identificación (customer_identification_type)
| Código | Tipo Documento | Longitud | Regla de Validación |
|---|---|---|---|
"04" | RUC | 13 dígitos | Algoritmo módulo 11. Debe terminar en 001. |
"05" | Cédula | 10 dígitos | Algoritmo módulo 10. |
"06" | Pasaporte | Alfanumérico | Libre hasta 20 caracteres. |
"07" | Consumidor Final | N/A | Identificación debe ser 9999999999999. |
"08" | ID Exterior | Alfanumérico | Libre. Para extranjeros no residentes. |
Autodetección Inteligente: Si tu sistema no envía el campo customer_identification_type en el JSON, la API es capaz de autodetectarlo matemáticamente basándose en la longitud y el contenido del campo (RUC/Cédula).
Porcentajes de IVA (tax_rate)
| Valor Enviado | Código SRI (Automático) | Descripción |
|---|---|---|
0 | "0" | IVA 0% |
5 | "5" | IVA 5% |
12 | "2" | IVA 12% |
14 | "3" | IVA 14% |
15 | "4" | IVA 15% (Actual) |
Formas de Pago (payment_method_code)
| Código SRI | Significado Legal |
|---|---|
"01" | Sin utilización del sistema financiero (Efectivo) |
"15" | Compensación de deudas |
"16" | Tarjeta de débito |
"17" | Dinero electrónico |
"18" | Tarjeta prepago |
"19" | Tarjeta de crédito |
"20" | Otros con utilización del sistema financiero (Transferencias / Depósitos) |
"21" | Endoso de títulos |
5. Respuestas y Arquitectura
El facturador electrónico posee un conmutador de Procesamiento Sincrónico vs Asincrónico para manejar el throughput de las llamadas en función de la latencia del SRI.
Respuesta en Modo Asincrónico (Recomendado)
Para evitar Timeouts causados por demoras en los servidores del SRI, el Facturador insertará el documento en base de datos, lo colocará en la cola y responderá instantáneamente.
{
"success": true,
"message": "Factura recibida y puesta en cola para procesamiento (SRI asíncrono)",
"invoice": {
"id": 175,
"number": "001-001-000001102",
"access_key": "04082025011234567890...",
"status": "QUEUED"
}
}
Tipos de Respuestas en Emisión (Vouchers y Devoluciones)
Al generar o procesar un documento, la API puede devolver distintos mensajes que tu sistema debe ser capaz de interpretar para mostrar al cliente final o al cajero. Manejar correctamente estas devoluciones es clave para una buena integración:
- Procesamiento Exitoso:
Factura recibida y puesta en cola...-> Muestra al cajero que la transacción fue exitosa y procede a imprimir el voucher (haciendo el GET). - Rechazo por SRI (Ej. Duplicidad):
La clave de acceso ya se encuentra registrada...-> El sistema del SRI ya tiene esta factura. - Error de Validación:
Datos inconsistentes en el ítem X...-> Indica al usuario que revise los precios o impuestos. - Errores de Laboratorio de Calidad: En entornos de prueba (Laboratorio), podrías recibir respuestas que evalúan la calidad de tu integración, por ejemplo:
Simulación de timeout en el SRIoError de calidad: Certificado no corresponde al ambiente. Estas devoluciones sirven para probar la robustez de tu sistema.
6. Reglas Legales y de Validación SRI
Para evitar que el SRI rechace tus comprobantes, nuestro sistema y la ley exigen el cumplimiento estricto de las siguientes reglas de negocio:
- Tope para Consumidor Final: Las facturas emitidas a "Consumidor Final" (Tipo de identificación
07) no pueden superar los $50.00 USD en su total. Si el monto es mayor, debes obligatoriamente emitir la factura a nombre de una persona natural (Cédula) o jurídica (RUC) con sus datos completos. - Fechas de Emisión: La fecha de emisión (
issue_date) no puede ser una fecha futura (posterior al día de hoy). Tampoco puede ser demasiado antigua; por regla general del SRI, no debe superar 1 mes de antigüedad desde la fecha actual de envío. - Cálculos Exactos: El SRI es estricto con los decimales. No envíes totales redondeados arbitrariamente. Deja que nuestra API calcule los impuestos en base a la cantidad, precio unitario y descuento.
8. Manejo de Errores (Extendido)
Es vital que tu sistema lea el código interno (Internal Code) y el mensaje de error para dar retroalimentación útil a los usuarios en sus sistemas de Punto de Venta. A continuación detallamos el catálogo exhaustivo de errores que puede emitir la API de KoaDoc:
| Error HTTP | Código Interno | Significado y Solución |
|---|---|---|
422 | VALIDATION_ERROR | Faltan campos obligatorios, formatos inválidos (ej. email incorrecto), o montos negativos. Solución: Revisa el payload JSON enviado y notifica al usuario. |
400 | CERTIFICATE_NOT_AVAILABLE | La empresa no tiene una firma electrónica (archivo .p12) cargada o está caducada. Solución: Solicita al cliente actualizar su firma en el dashboard. |
400 | CERTIFICATE_PASSWORD_INVALID | La contraseña proporcionada para el certificado .p12 es incorrecta. |
403 | COMPANY_ACCESS_DENIED | El token (API Key) utilizado no tiene permisos sobre la empresa solicitada. |
400 | SRI_CONFIGURATION_MISSING | La empresa no ha configurado su Punto de Emisión y Establecimiento (ej: 001-001). |
502 | SRI_CONNECTION_ERROR | Nuestros servidores no pudieron conectar con el SRI. Solución: Suele ser intermitente, el sistema reintentará automáticamente. |
400 | INVALID_IDENTIFICATION | La cédula o RUC del cliente final es matemáticamente incorrecto según el algoritmo del Registro Civil. Solución: Pide al cajero corregir la cédula. |
400 | LAB_QUALITY_ERROR | Error de Laboratorio de Calidad: Devuelto únicamente en ambiente de PRUEBAS. Indica que los datos ingresados activaron una validación de pruebas exhaustivas (ej. test de carga o tipos de impuestos no combinables). Permite certificar tu software. |
400 | SRI_REJECTED | El SRI rechazó explícitamente el comprobante (ej: Fecha de emisión caducada). Revisa el campo "message" para el motivo exacto que dio el SRI. |
409 | DOCUMENT_DUPLICATED | Secuencial duplicado. Ya existe una factura autorizada con ese mismo número. |
9. Notas Técnicas y Matemáticas
- Cálculos Automáticos e Integridad: La API utiliza aritmética de clase
Decimalpara evitar errores de coma flotante. El IVA se calcula a nivel de línea sobre el subtotal neto de cada ítem. - Secuenciales Automáticos: El Facturador extrae su propio lock transaccional de la base de datos para garantizar secuenciales únicos y contiguos. No es necesario enviar el número de factura.