Recomendaciones y Mejores Prácticas SIFEN — Guía para el Desarrollador
Fuente: "Guía de Mejores Prácticas para la Gestión del Envío de DE.pdf" (DNIT/e-kuatia, octubre 2024)
1. Generación de Documentos Electrónicos (DE)
Declaración raíz rDE (obligatoria)
<rDE xmlns="http://ekuatia.set.gov.py/sifen/xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ekuatia.set.gov.py/sifen/xsd siRecepDE_v150.xsd">
Reglas de formato — NO incorporar (causa 0160 inmediato)
| # | Regla | Ejemplo malo | Correcto |
|---|---|---|---|
| 1 | Espacios en blanco al inicio/fin de campos numéricos o alfanuméricos | " 80126006 " | "80126006" |
| 2 | Comentarios, anotaciones (annotation, documentation) en el XML | <!-- comentario --> | (omitir) |
| 3 | Caracteres de formato: line-feed, carriage return, tab, espacios entre etiquetas | <tag>\n <sub> | <tag><sub> |
| 4 | Prefijos en el namespace de las etiquetas | <xsd:gDatRec> | <gDatRec> |
| 5 | Etiquetas vacías de campos opcionales (ceros, vacíos, blancos) | <gCamGen/> | (omitir si no tiene contenido) |
| 6 | Valores negativos o caracteres no numéricos en campos numéricos | "-100" o "1.000,00" | "100" o "1000.00" |
| 7 | Nombres de campos con mayúsculas/minúsculas incorrectas | <GopEDE>, <gopede> | <gOpeDE> (exacto como el manual) |
Regla 5 — CRÍTICA: Solo se exceptúan los campos marcados como obligatorios en el XSD (
minOccurs="1"). Un<gCamGen/>vacío, por ejemplo, debe omitirse.
Pre-validador SIFEN
URL: https://ekuatia.set.gov.py/prevalidador/
2. Servicios Web — Endpoints
| Servicio | Test | Producción |
|---|---|---|
| recibe-lote (async) | https://sifen-test.set.gov.py/de/ws/async/recibe-lote.wsdl | https://sifen.set.gov.py/de/ws/async/recibe-lote.wsdl |
| consulta-lote | https://sifen-test.set.gov.py/de/ws/consultas/consulta-lote.wsdl | https://sifen.set.gov.py/de/ws/consultas/consulta-lote.wsdl |
| consulta (por CDC) | https://sifen-test.set.gov.py/de/ws/consultas/consulta.wsdl | https://sifen.set.gov.py/de/ws/consultas/consulta.wsdl |
| recibe-sync | https://sifen-test.set.gov.py/de/ws/sync/recibe.wsdl | https://sifen.set.gov.py/de/ws/sync/recibe.wsdl |
Para obtener el WSDL: agregar
?wsdlal final. Ejemplo:.../consulta-lote.wsdl?wsdl
3. Configuración Postman — mTLS (autenticación mutua)
Pasos (OBLIGATORIO para conectar con SIFEN)
- Abrir Postman →
Settings (⚙)→Certificates - Sección Client certificates →
Add Certificate - Configurar:
| Campo | Valor para TEST | Valor para PROD |
|---|---|---|
| HOST | sifen-test.set.gov.py | sifen.set.gov.py |
| PFX file | ruta al .p12 del emisor | ruta al .p12 del emisor |
| Passphrase | contraseña del certificado | contraseña del certificado |
- Para ONNIX (emisor ID=1):
- Cert:
storage/app/private/sifen/certs/p12/F1T_51100.p12 - Passphrase: (la del archivo p12)
- Agregar entrada para HOST
sifen-test.set.gov.py
- Cert:
Sin este paso, SIFEN rechazará la conexión TLS antes de procesar el XML.
4. SOAP Envelope — recibe-lote (async)
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://ekuatia.set.gov.py/sifen/xsd">
<soap:Header/>
<soap:Body>
<xsd:rEnvioLote>
<xsd:dId>20240926</xsd:dId>
<xsd:xDE>{AQUI VA EL BASE64 DEL ZIP}</xsd:xDE>
</xsd:rEnvioLote>
</soap:Body>
</soap:Envelope>
Cómo construir el body:
- Crear estructura
<rLoteDE><rDE>...</rDE><rDE>...</rDE></rLoteDE>(hasta 50 DEs, mismo tipo, mismo RUC) - Comprimir a ZIP
- Convertir ZIP a Base64
- Poner Base64 en
<xsd:xDE>
Reglas lote:
- ✅ Un solo RUC emisor por lote
- ✅ Un solo tipo de documento por lote (solo Facturas, o solo NC, etc.)
- ✅ Máximo 50 DEs por lote
- ✅ ZIP no debe superar 1000 KB
- ❌ Nunca reenviar el mismo CDC sin haber consultado el resultado
5. Respuestas del WS recibe-lote
| dCodRes | Significado | Acción |
|---|---|---|
0300 | Lote recibido con éxito | Consultar estado con consulta-lote tras 10+ min |
0301 | Lote NO encolado | Ver sección "Lote no encolado para procesamiento" |
6. Respuestas del WS consulta-lote
| dCodResLot | Significado |
|---|---|
0360 | Número de lote inexistente |
0361 | Lote en procesamiento — reintentar en ≥10 min |
0364 | Consulta extemporánea (>48h) — usar consulta por CDC |
0362 | Procesamiento concluido — ver gResProcLote |
Ejemplo respuesta 0362 (concluido, con 0160):
<ns2:gResProcLote>
<ns2:id>07800252985001001000311822024021016361562161</ns2:id>
<ns2:dEstRes>Rechazado</ns2:dEstRes>
<ns2:gResProc>
<ns2:dCodRes>0160</ns2:dCodRes>
<ns2:dMsgRes>XML malformado: [El valor del elemento: dDirRec es invalido,
El valor del elemento: dDirLocEnt es invalido]</ns2:dMsgRes>
</ns2:gResProc>
</ns2:gResProcLote>
⚠️ Este ejemplo muestra que
dDirRecydDirLocEntcon valores inválidos causan 0160.dDirRecya fue removido de nuestro builder.dDirLocEntvive engCamGen > gCamEnt— verificar.
7. SOAP Envelope — consulta-lote
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://ekuatia.set.gov.py/sifen/xsd">
<soap:Header/>
<soap:Body>
<xsd:rEnviConsLoteDe>
<xsd:dId>1</xsd:dId>
<xsd:dProtConsLote>11158097383597290</xsd:dProtConsLote>
</xsd:rEnviConsLoteDe>
</soap:Body>
</soap:Envelope>
8. SOAP Envelope — consulta por CDC
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsd="http://ekuatia.set.gov.py/sifen/xsd">
<soap:Header/>
<soap:Body>
<xsd:rEnviConsDeRequest>
<xsd:dId>12</xsd:dId>
<xsd:dCDC>01028052080001001000013622023100111644108186</xsd:dCDC>
</xsd:rEnviConsDeRequest>
</soap:Body>
</soap:Envelope>
| dCodRes | Significado |
|---|---|
0420 | DE no existe o no está aprobado |
0422 | DE existe y está aprobado — responde xContenDE con XML |
9. Motivos de bloqueo temporal (10-60 min por RUC)
- Enviar lotes vacíos o con contenido inválido
- Enviar el mismo CDC varias veces en un mismo lote
- Enviar el mismo CDC en lotes distintos aún en procesamiento
- Enviar varias veces el mismo lote
10. Checklist Postman para TEST
[ ] HOST sifen-test.set.gov.py configurado en Settings > Certificates
[ ] PFX = F1T_51100.p12 con passphrase correcta
[ ] Content-Type: application/soap+xml; charset=utf-8 (SOAP 1.2)
[ ] SOAPAction header vacío o no presente (SOAP 1.2 no lo requiere)
[ ] URL = https://sifen-test.set.gov.py/de/ws/sync/recibe (para sync)
[ ] Body = raw / XML
[ ] SSL certificate verification: OFF (para test, evitar errores de CA)
11. Puntos críticos a verificar en nuestro XML
| Campo | Problema conocido | Estado |
|---|---|---|
dDirRec | Invalido sin cDepRec/cCiuRec | ✅ Removido |
dDirLocEnt | Invalido en gCamEnt si gCamGen se emite vacío | ⚠️ Verificar |
<gCamGen/> | No debe emitirse vacío (regla 5 PDF) | ⚠️ Verificar |
| Espacios entre etiquetas XML | Causa 0160 per regla 3 PDF | ⚠️ Verificar formatOutput |
iTiContRec | Hardcoded 1 → ahora dinámico desde cliente_tipo_contribuyente | ✅ Fix aplicado |
dFecEmNR | Solo para Notas de Remisión | ✅ Removido |
| Totales IVA | Calculados desde items | ✅ Fix aplicado |