Introducción
Esta API permite emitir documentos electrónicos válidos ante la SET (Subsecretaría de Estado de Tributación) de Paraguay a través del sistema SIFEN.
Cumplimiento Legal
100% conforme a normativas de la DNIT (Dirección Nacional de Ingresos Tributarios)
Integración Simple
API REST con JSON, fácil de integrar en cualquier sistema
Seguridad
Firma digital con certificado válido, encriptación SSL
Tiempo Real
Emisión y validación instantánea con SIFEN
¿Qué es SIFEN?
SIFEN (Sistema Integrado de Facturación Electrónica Nacional) es el sistema oficial de la SET para la emisión de documentos electrónicos en Paraguay.
Documentos Soportados
| Tipo | Código | Descripción | Uso |
|---|---|---|---|
| Factura Electrónica | 1 | Documento de venta | Ventas de productos o servicios |
| Nota de Crédito | 5 | Anulación o devolución | Devoluciones, descuentos |
| Nota de Débito | 6 | Ajuste adicional | Intereses, gastos adicionales |
| Nota de Remisión | 7 | Traslado de mercadería | Movimiento de stock |
Componentes del Documento Electrónico
- XML: Documento estructurado según especificaciones SIFEN v150
- Firma Digital: Certificado digital válido (.pfx)
- CDC: Código de Control del Documento (44 dígitos único)
- QR: Código QR para validación pública
- Protocolo: Número de autorización de SIFEN
Endpoints de la API
Base URL: https://tu-dominio.com/invoicing
GET/companies
Obtiene la lista de empresas configuradas para facturación.
Respuesta:
[
{
"id": "abc-123-def",
"name": "Mi Empresa SRL",
"ruc": "80012345-6",
"business_name": "MI EMPRESA SOCIEDAD DE RESPONSABILIDAD LIMITADA"
}
]
POST/emit/invoice
Emite una factura electrónica y la envía a SIFEN.
Parámetros Query:
| Parámetro | Tipo | Descripción |
|---|---|---|
company_id |
string | Requerido ID de la empresa emisora |
Body (JSON):
{
"cliente": {
"ruc": "80009735-1",
"razonSocial": "ANDE",
"direccion": "Av. España",
"numeroCasa": "1234",
"tipoContribuyente": 2,
"tipoOperacion": 3,
"email": "cliente@ande.gov.py"
},
"items": [
{
"codigo": "PROD-001",
"descripcion": "Silla de Oficina",
"cantidad": 1.0,
"precioUnitario": 150000,
"ivaTipo": 10,
"unidadMedida": 77
}
],
"condicion": {
"tipo": 1,
"entregas": [
{
"tipo": 1,
"monto": 150000,
"moneda": "PYG"
}
]
},
"moneda": "PYG",
"observacion": "Factura de prueba"
}
Respuesta Exitosa:
{
"ns2:rRetEnviDe": {
"ns2:rProtDe": {
"ns2:dEstRes": "Aprobado",
"ns2:dProtAut": "12345678901234567890",
"ns2:gResProc": {
"ns2:dCodRes": "0260",
"ns2:dMsgRes": "Aprobado"
}
}
},
"cdc": "01800123456001001000104720241201000000011234567890",
"qr_url": "https://ekuatia.set.gov.py/consultas/qr?nVersion=150&Id=...",
"xml_signed": "..."
}
- cdc: Código único del documento (guárdalo en tu base de datos)
- qr_url: URL del QR para validación pública
- xml_signed: XML completo firmado (para imprimir o almacenar)
- dEstRes: Estado del documento ("Aprobado", "Rechazado")
POST/emit/credit-note
Emite una nota de crédito asociada a una factura.
Campos Adicionales Requeridos:
{
"motivo": 2,
"documentoAsociado": {
"cdc": "01800123456001001000104720241201000000011234567890",
"tipo": 1
},
...resto de campos igual que factura
}
Motivos de Nota de Crédito:
| Código | Descripción |
|---|---|
| 1 | Devolución y anulación de factura |
| 2 | Devolución y anulación parcial |
| 3 | Descuento o bonificación |
| 4 | Ajuste de precio |
POST/emit/debit-note
Emite una nota de débito para ajustes adicionales.
Motivos de Nota de Débito:
| Código | Descripción |
|---|---|
| 1 | Interés por mora |
| 2 | Ajuste de precio |
| 3 | Gastos adicionales |
POST/emit/remision
Emite una nota de remisión para traslado de mercadería.
Ejemplo:
{
"cliente": {...},
"items": [
{
"codigo": "PROD-001",
"descripcion": "Silla de Oficina",
"cantidad": 5,
"unidadMedida": 77
}
],
"moneda": "PYG",
"observacion": "Traslado a sucursal"
}
POST/consult/ruc
Valida un RUC en el sistema SIFEN.
Parámetros Query:
| Parámetro | Descripción |
|---|---|
ruc |
RUC a consultar (formato: 80012345-6) |
company_id |
ID de la empresa que realiza la consulta |
Respuesta:
{
"ns2:rResEnviConsRUC": {
"ns2:xContRUC": {
"ns2:dRUC": "80009735-1",
"ns2:dRazSoc": "ADMINISTRACION NACIONAL DE ELECTRICIDAD",
"ns2:dNomFan": "ANDE",
"ns2:dEstRUC": "Activo"
}
}
}
POST/consult/document
Consulta el estado de un documento por su CDC.
Parámetros Query:
| Parámetro | Descripción |
|---|---|
cdc |
CDC del documento (44 dígitos) |
company_id |
ID de la empresa |
POST/events/cancel
Cancela un documento electrónico emitido.
Body:
{
"cdc": "01800123456001001000104720241201000000011234567890",
"motivo": "Error en datos del cliente"
}
Generación de XML SIFEN
La API genera automáticamente el XML según las especificaciones SIFEN v150.
Proceso de Generación
1. Validación
Valida todos los datos del request contra las reglas de SIFEN
2. Generación XML
Crea el XML estructurado con todos los campos requeridos
3. Firma Digital
Firma el XML con el certificado digital de la empresa
4. QR Code
Agrega el código QR al XML firmado
5. Envío a SIFEN
Envía el documento a SIFEN para validación
6. Respuesta
Retorna CDC, QR URL y XML completo
Ejemplo de XML Generado
<?xml version="1.0" encoding="UTF-8"?>
<rDE xmlns="http://ekuatia.set.gov.py/sifen/xsd">
<DE Id="01800123456001001000104720241201000000011234567890">
<dVerFor>150</dVerFor>
<gOpeDE>
<iTipEmi>1</iTipEmi>
<dDesTipEmi>Normal</dDesTipEmi>
<dCodSeg>669880626</dCodSeg>
</gOpeDE>
<gTimb>
<iTiDE>1</iTiDE>
<dDesTiDE>Factura electrónica</dDesTiDE>
<dNumTim>03970287</dNumTim>
<dEst>001</dEst>
<dPunExp>001</dPunExp>
<dNumDoc>0000001</dNumDoc>
<dFeIniT>2024-01-01</dFeIniT>
</gTimb>
<gDatGralOpe>
<dFeEmiDE>2024-12-01T10:30:00</dFeEmiDE>
</gDatGralOpe>
<gEmis>
<dRucEm>80012345-6</dRucEm>
<dRazSocEm>MI EMPRESA SRL</dRazSocEm>
...
</gEmis>
<gDatRec>
<dRucRec>80009735-1</dRucRec>
<dRazSocRec>ANDE</dRazSocRec>
...
</gDatRec>
<gDtipDE>
<gCamFE>
<gCamItem>
<dCodInt>PROD-001</dCodInt>
<dDesProSer>Silla de Oficina</dDesProSer>
<dCantProSer>1.0</dCantProSer>
<dPUniProSer>150000</dPUniProSer>
...
</gCamItem>
</gCamFE>
</gDtipDE>
</DE>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
...firma digital...
</Signature>
<dCarQR>https://ekuatia.set.gov.py/consultas/qr?...</dCarQR>
</rDE>
Campos Automáticos
La API genera automáticamente los siguientes campos:
| Campo | Descripción |
|---|---|
| CDC | Código de Control del Documento (44 dígitos único) |
| Código de Seguridad | Número aleatorio de 9 dígitos |
| Número de Documento | Secuencial automático si no se especifica |
| Fecha de Emisión | Fecha/hora actual si no se especifica |
| Totales | Cálculo automático de subtotales, IVA y total |
Ejemplos de Uso
Python
import requests
url = "https://api.ejemplo.com/invoicing/emit/invoice"
params = {"company_id": "abc-123"}
factura = {
"cliente": {
"ruc": "80009735-1",
"razonSocial": "ANDE",
"direccion": "Av. España",
"numeroCasa": "1234",
"tipoContribuyente": 2,
"email": "cliente@ande.gov.py"
},
"items": [{
"codigo": "PROD-001",
"descripcion": "Producto",
"cantidad": 1,
"precioUnitario": 100000,
"ivaTipo": 10
}],
"condicion": {
"tipo": 1,
"entregas": [{"tipo": 1, "monto": 100000, "moneda": "PYG"}]
},
"moneda": "PYG"
}
response = requests.post(url, params=params, json=factura)
result = response.json()
print(f"CDC: {result['cdc']}")
print(f"QR: {result['qr_url']}")
cURL
curl -X POST "https://api.ejemplo.com/invoicing/emit/invoice?company_id=abc-123" \
-H "Content-Type: application/json" \
-d '{
"cliente": {
"ruc": "80009735-1",
"razonSocial": "ANDE",
"direccion": "Av. España",
"numeroCasa": "1234",
"tipoContribuyente": 2,
"email": "cliente@ande.gov.py"
},
"items": [{
"codigo": "PROD-001",
"descripcion": "Producto",
"cantidad": 1,
"precioUnitario": 100000,
"ivaTipo": 10
}],
"condicion": {
"tipo": 1,
"entregas": [{"tipo": 1, "monto": 100000, "moneda": "PYG"}]
},
"moneda": "PYG"
}'
Códigos de Error
Errores Comunes
| Error | Causa | Solución |
|---|---|---|
| Empresa no tiene certificado activo | Certificado digital no configurado | Cargar certificado .pfx válido |
| RUC inválido | Formato incorrecto de RUC | Usar formato: 80012345-6 (con DV) |
| Timbrado vencido | Timbrado fuera de vigencia | Renovar timbrado en la SET |
| Items sin precio | Falta precioUnitario o ivaTipo | Agregar precio e IVA a todos los items |
| Documento rechazado por SIFEN | Datos inválidos según SIFEN | Revisar mensaje de error de SIFEN |
Códigos de Respuesta SIFEN
| Código | Estado | Descripción |
|---|---|---|
| 0260 | Aprobado | Documento aprobado correctamente |
| 0261 | Pendiente | En proceso de validación |
| 0300-0399 | Rechazado | Error en datos del documento |
Esquema de Datos Completo
Cliente (ClientSchema)
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
ruc |
string | Requerido | RUC con DV (ej: 80012345-6) |
razonSocial |
string | Requerido | Razón social o nombre completo |
direccion |
string | Requerido | Dirección del cliente |
numeroCasa |
string | Requerido | Número de casa |
tipoContribuyente |
int | Requerido | 1: Físico, 2: Jurídico |
tipoOperacion |
int | Requerido | 1: B2B, 2: B2C, 3: B2G |
email |
string | Requerido | Email del cliente |
documentoTipo |
int | Requerido | Tipo de documento (si no tiene RUC) |
documentoNumero |
string | Requerido | Número de documento (si no tiene RUC) |
Item (ItemSchema)
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
codigo |
string | Requerido | Código del producto/servicio |
descripcion |
string | Requerido | Descripción del item |
cantidad |
float | Requerido | Cantidad |
precioUnitario |
float | Requerido* | Precio unitario |
ivaTipo |
int | Requerido* | 10, 5, o 0 (exento) |
unidadMedida |
int | Opcional | Código de unidad (default: 77) |
descuento |
float | Opcional | Descuento unitario |
* No requerido para notas de remisión
Tipos de IVA
| Código | Descripción | Uso |
|---|---|---|
| 10 | IVA 10% | Productos/servicios gravados al 10% |
| 5 | IVA 5% | Productos/servicios gravados al 5% |
| 0 | Exento | Productos/servicios exentos de IVA |