Facturación electrónica SIFEN (Paraguay) — documentación para integraciones. Compatible con FacturaSend.
URL base: https://api.kuat-ia.com.py/api/tu-empresa
API key: Bearer api_key_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Todas las rutas cuelgan de https://api.kuat-ia.com.py/api/{slug}, donde {slug} es el identificador de tu empresa. Autenticá con la API key de la empresa (te la da tu administrador) en el header Authorization:
Si tu sistema anterior apuntaba a una URL sin el /api/ —es decir https://api.kuat-ia.com.py/{slug}/…— también funciona: este servidor acepta las dos formas. Migrar es cambiar el host y la key, nada más.
Authorization: Bearer api_key_XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Content-Type: application/json
Los errores de negocio se devuelven con HTTP 400 y el cuerpo { "success": false, "error": "…" } (nunca 5xx), para que tu cliente siempre pueda leer el mensaje.
Antes que nada, probá la conexión — si esto responde, el host, la clave y el slug están bien:
curl https://api.kuat-ia.com.py/api/tu-empresa/test -H "Authorization: Bearer api_key_..."
Kuat-ia Funciona. - 04/08/2026 16:20 (hora de Asunción) - TU EMPRESA S.A.
El cuerpo es un array de documentos. Agregá ?draft=true para generar un borrador. No espera la aprobación de SIFEN: devuelve el CDC, el número y las fechas al instante; el estado lo consultás después con /de/estado.
curl -X POST https://api.kuat-ia.com.py/api/tu-empresa/lote/create \
-H "Authorization: Bearer api_key_..." \
-H "Content-Type: application/json" \
-d '[{
"tipoDocumento": 1,
"establecimiento": "001", "punto": "001", "numero": 1,
"fecha": "2026-07-26T10:00:00",
"moneda": "PYG",
"cliente": {
"contribuyente": true, "ruc": "80012345-0",
"razonSocial": "CLIENTE EJEMPLO S.A.",
"tipoOperacion": "1", "tipoContribuyente": 2
},
"items": [
{ "descripcion": "Servicio mensual", "cantidad": 1,
"precioUnitario": 550000, "ivaTipo": 1, "iva": 10, "unidadMedida": 77 }
]
}]'
Respuesta
{
"success": true,
"result": {
"deList": [
{ "cdc": "0105234…266", "numero": "001-001-0000001",
"fechaEmision": "2026-07-26T10:00:00", "fechaFirma": "2026-07-26T10:00:00" }
],
"loteId": 1
}
}
tipoDocumento: 1 Factura · 2 Fact. Exportación · 3 Fact. Importación · 4 Autofactura · 5 Nota de Crédito · 6 Nota de Débito · 7 Nota de Remisión. IVA por ítem: gravado 10 % → ivaTipo 1/iva 10; gravado 5 % → iva 5; exenta → ivaTipo 3/iva 0. El numero lo administra tu sistema (se respeta); si mandás 0, Kuat-ia asigna el correlativo. Para NC/ND agregá "documentoAsociado": { "cdc": "…" }.
curl -X POST https://api.kuat-ia.com.py/api/tu-empresa/de/estado \
-H "Authorization: Bearer api_key_..." \
-d '{ "cdcList": [ { "cdc": "0105234…266" } ] }'
{
"success": true,
"deList": [
{ "cdc": "0105234…266", "numero": "001-001-0000001",
"situacion": 2, "fecha": "2026-07-26T10:00:00",
"respuesta_codigo": "", "respuesta_mensaje": "" }
]
}
Un CDC que no existe devuelve situacion: 98. Ver la tabla de situación.
curl -X POST https://api.kuat-ia.com.py/api/tu-empresa/evento/cancelacion \
-H "Authorization: Bearer api_key_..." \
-d '{ "cdc": "0105234…266", "motivo": "Error en el monto facturado" }'
{
"success": true,
"result": {
"ns2:rRetEnviEventoDe": {
"ns2:dFecProc": "2026-07-26T10:05:00",
"ns2:gResProcEVe": {
"ns2:dEstRes": "Aprobado", "ns2:dProtAut": "…",
"ns2:gResProc": { "ns2:dCodRes": "0600", "ns2:dMsgRes": "Evento registrado correctamente" }
}
}
},
"cdc": "0105234…266"
}
dCodRes = 0600 ⇒ cancelado. success:false ⇒ no llegó a SIFEN. El motivo debe tener entre 5 y 500 caracteres; la cancelación de una FE aprobada debe hacerse dentro de las 48 h.
curl -X POST https://api.kuat-ia.com.py/api/tu-empresa/de/pdf \
-H "Authorization: Bearer api_key_..." \
-d '{ "cdcList": [ { "cdc": "0105234…266" } ], "type": "base64", "format": "custom" }'
Devuelve el PDF codificado en base64 como cuerpo de la respuesta. format: ticket (80 mm) o custom (A4).
curl https://api.kuat-ia.com.py/api/tu-empresa/de/xml/0105234…266 -H "Authorization: Bearer api_key_..."
Devuelve el XML del documento (firmado si ya fue enviado a SIFEN).
curl -X POST https://api.kuat-ia.com.py/api/tu-empresa/de/email \
-H "Authorization: Bearer api_key_..." \
-d '{ "email": "cliente@correo.com", "cdcList": [ { "cdc": "0105234…266" } ] }'
{ "success": true, "message": "Correo enviado a cliente@correo.com con 1 documento(s)" }
{ "success": true, "result": {
"cdc": "0105234…266", "numero": "001-001-0000001",
"situacion": 2, "info_codigo": "", "info_descripcion": "",
"fecha": "2026-07-26T10:00:00", "lote_estado": 2 } }
{ "success": true, "fecha": "…", "respuesta_codigo": "0422",
"respuesta_mensaje": "CDC encontrado", "protocolo": "…" }
{ "success": true, "result": {
"respuesta_codigo": "0502", "respuesta_mensaje": "…",
"razon_social": "…", "estado_codigo": "ACT", "estado_mensaje": "…" } }
| situacion | Significado |
|---|---|
| -1 | Borrador |
| 0 | Generado |
| 1 | Enviado en un lote |
| 2 | Aprobado |
| 3 | Aprobado con observación |
| 4 | Rechazado |
| 98 | Inexistente (el CDC no existe) |
| 99 | Cancelado |
| Endpoint | Descripción |
|---|---|
| GET/api/{slug}/test | ¿La API responde? Devuelve texto plano con la hora y el nombre de tu empresa. |
| POST/api/{slug}/lote/create | Emitir documentos (array). ?draft=true = borrador. |
| POST/api/{slug}/de/estado | Consultar la situación de una lista de CDC. |
| POST/api/{slug}/evento/cancelacion | Cancelar un documento ({cdc, motivo}). |
| POST/api/{slug}/evento/inutilizacion | Anular un rango de numeración no usado. |
| POST/api/{slug}/evento/nominacion | Nominar (agregar receptor a) un documento. |
| GET/api/{slug}/de/cdc/:cdc | Consultar un documento en Kuat-ia. |
| POST/api/{slug}/dte/cdc/:cdc | Consultar el DTE en SIFEN por CDC. |
| POST/api/{slug}/de/pdf | KUDE en PDF (base64). |
| GET/api/{slug}/de/xml/:cdc | XML del documento. |
| POST/api/{slug}/de/email | Enviar el KUDE por correo. |
| GET/api/{slug}/de/email/:cdc | Envíos de correo de un documento. |
| POST/api/{slug}/ruc/:ruc | Consultar un RUC en SIFEN. |
| GET/api/{slug}/de/id/:id | Consultar un documento por su ID interno. |
| GET/api/{slug}/de/numero/:tipo/:est/:punto/:numero | Consultar un documento por número (opcional /:serie). |
| POST/api/{slug}/de/estado/:id/:cdc | Refrescar el estado consultando a SIFEN. |
| POST/api/{slug}/de/image | KUDE en imagen (este servidor entrega PDF: usá /de/pdf). |
| POST/api/{slug}/de/wa | Re-enviar por WhatsApp (si el servidor lo tiene configurado). |
| POST/api/{slug}/evento/conformidad | Evento de conformidad (receptor). |
| POST/api/{slug}/evento/disconformidad | Evento de disconformidad (receptor). |
| POST/api/{slug}/evento/desconocimiento | Evento de desconocimiento (receptor). |
| POST/api/{slug}/evento/notificacion | Evento de notificación (receptor). |
| POST/api/{slug}/lote/draft-confirm/:loteId | Confirmar y enviar un lote en borrador. |
| POST/api/{slug}/lote/draft-reject/:loteId | Rechazar (descartar) un lote en borrador. |
| POST/api/{slug}/recibo/create | Crear un recibo digital (no va a SIFEN). |
| POST/api/{slug}/recibo/pdf | KUDE del recibo digital (base64 o binario). |
| GET/api/{slug}/recibo/cdc/:cdc | Consultar un recibo por su identificador. |
| GET/api/{slug}/recibo/id/:id | Consultar un recibo por su id interno. |
| POST/api/{slug}/recibo/estado | Situación de una lista de recibos (cdcList o cdc_list). |
| GET/api/{slug}/recibos | Listado paginado (?page=, ?limit=). |
| GET/api/{slug}/recibo/last-created | El último recibo emitido. |
| GET/api/{slug}/recibo/max/:sucursal/:punto | El número más alto de esa serie (0 si no hay). |
| POST/api/{slug}/recibo/email | Enviar el/los recibo(s) por correo. |
| GET/api/{slug}/recibo/email/:cdc | Envíos por correo de un recibo. |
| POST/api/{slug}/recibo/wa | Enviar el/los recibo(s) por WhatsApp. |
| GET/api/{slug}/recibo/wa/:cdc | Envíos por WhatsApp de un recibo. |
| POST/api/{slug}/recibo/evento/cancelacion | Anular un recibo. No es un evento de SIFEN: el recibo es interno. |
| GET/api/{slug}/de/wa/:cdc | Envíos por WhatsApp de un documento. |
| GET/api/{slug}/system/backend/info/ip | IP de salida del servidor (para listas blancas). |
| POST/api/{slug}/recibo/image | Recibo en imagen. No disponible acá: usá /recibo/pdf. |
| GET/api/{slug}/recibo/xml/:cdc | XML del recibo. No existe: el recibo es un comprobante interno, no un documento de SIFEN. |
| POST/api/{slug}/evento/datos-transporte | Datos de transporte de una NR. Todavía no disponible. |
| GET/api/{slug}/departamentos | Catálogo de departamentos (SIFEN). |
| GET/api/{slug}/distritos/:departamentoId | Distritos de un departamento (null = todos, ?nombre=). |
| GET/api/{slug}/ciudades/:distritoId | Ciudades de un distrito (null = todas, ?nombre=). |
| GET/api/{slug}/system/backend/params | Parámetros del contribuyente (emisor). |
| GET/api/{slug}/system/backend/info | Versión de dependencias + parámetros. |
| PUT/api/{slug}/dte/extras/:id | Modificar los datos extra de un documento. |
| GET/api/system/backend/info | Versiones de las librerías. Sin empresa y sin key. |
Las marcadas como no disponibles devuelven un error 400 que lo explica, no un éxito vacío: preferimos decirlo antes que hacerte creer que el archivo se generó.
Los errores de negocio se devuelven con HTTP 400 y el cuerpo:
{ "success": false, "error": "descripción del problema",
"errores": [ { "error": "descripción del problema" } ] }
HTTP 200 respuesta correcta · 400 error de negocio / autenticación / validación · 404 ruta inexistente.
/v1 (para integraciones nuevas)Kuat-ia también expone una API propia bajo /v1/tenants/:id/… con claves que empiezan con kuat_live_. Es opcional: si venís de FacturaSend, usá la capa compatible de arriba. La API nativa cubre emisión, envío de lotes, KUDE, XML, export CSV/ZIP, webhooks y consultas SIFEN.