Reintentar Documentos Rechazados
Flujo completo para corregir un documento rechazado por SIFEN y reemitirlo con un nuevo CDC.
Cuando SIFEN rechaza un DE, el documento queda legalmente nulo y no se puede "corregir". El flujo correcto es: identificar la causa, emitir un nuevo DE con los datos corregidos, e inutilizar el número original si es necesario.
Un DE en estado RECHAZADO no tiene validez fiscal. No lo entregues al cliente. El número de documento que consumió tampoco se puede reutilizar: debe inutilizarse o quedará como hueco en la secuencia.
Flujo completo
Detectá el rechazo consultando el estado del DE:
curl "https://api.sifende.com.py/api/v1/documento-electronico/status/{cdc}" \
-H "Authorization: Bearer sk_live_..."Respuesta:
{
"cdc": "01800123451001001000000122026042710000000006",
"estado": "RECHAZADO",
"iTiDe": 1,
"numeroDocumento": 1,
"fechaCreacion": "2026-04-15T10:30:00",
"protocoloAutorizacion": null,
"mensajeRechazo": "[1306] RUC del receptor inexistente en Marangatu"
}numeroDocumento es un Long (entero). El formato "NNN-NNN-NNNNNNN" se devuelve como numeroFormateado en la respuesta de emisión: son campos separados.
Identificá la causa a partir del código entre corchetes ([1302]) en mensajeRechazo. Consultá la tabla de Rechazos SIFEN para ver el significado.
Corregí los datos en tu sistema. Ej: corregir el formato del RUC, completar campos faltantes del receptor, ajustar fechas, etc.
Emití un NUEVO DE con los datos corregidos. Recibirá un nuevo CDC.
curl -X POST "https://api.sifende.com.py/api/v1/documento-electronico" \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{ ...payload corregido... }'Inutilizá el número original si el rechazo dejó un hueco que no se rellenará automáticamente. Ver Inutilizar Numeración.
Rechazos comunes y cómo corregirlos
1108: Timbrado vencido o sin fecha de fin
Causa: El timbrado configurado en Sifende no tiene fechaFin o ya venció.
Solución:
- Renová el timbrado en MARANGATÚ (portal SET)
- Andá a Configuración → Timbrados en Sifende
- Actualizá
fechaFincon la fecha del nuevo timbrado - Reemití el DE con el timbrado correcto
1302: Falta tipoContribuyente para receptor B2B
Causa: Operación B2B sin el campo tipoContribuyente del receptor.
Solución: Incluí tipoContribuyente: "CONTRIBUYENTE" (o EXTRANJERO según corresponda) en el bloque receptor. Reemití.
1303: Tipo de contribuyente receptor inválido
Causa: Se envió tipoContribuyente cuando el receptor es NO_CONTRIBUYENTE (B2C identificado).
Solución: Eliminá el campo tipoContribuyente cuando el receptor es B2C no contribuyente. Reemití.
1304: Falta numeroDocumento (RUC) para receptor contribuyente
Causa: Operación B2B sin el RUC del receptor.
Solución: Completá numeroDocumento (RUC sin DV) y digitoVerificador separadamente. Reemití.
1305: RUC del receptor no requerido
Causa: Se envió numeroDocumento (RUC) cuando el receptor es NO_CONTRIBUYENTE.
Solución: Eliminá numeroDocumento para receptor B2C no contribuyente. Reemití.
1306: RUC del receptor inexistente en Marangatu
Causa: El RUC enviado no está registrado en el padrón de la SET.
Solución:
- Verificá el RUC en el consultador SET
- Confirmá con tu cliente que el RUC sea correcto
- Reemití con el RUC corregido
1309: Dígito verificador del RUC incorrecto
Causa: El DV enviado no coincide con el algoritmo SET (módulo 11).
Solución: Verificá digitoVerificador por separado o pedile al receptor su RUC con DV. Reemití.
Implementación TypeScript
async function reemitirSiRechazado(cdcOriginal: string, payloadOriginal: any) {
const estado = await consultarEstado(cdcOriginal);
if (estado.estado !== "RECHAZADO") {
throw new Error(`No corresponde reemitir. Estado actual: ${estado.estado}`);
}
const codigoError = extraerCodigo(estado.mensajeRechazo);
console.log(`Rechazo ${codigoError}: ${estado.mensajeRechazo}`);
const payloadCorregido = await aplicarCorrecciones(payloadOriginal, codigoError);
// Emitir nuevo DE: recibe un CDC nuevo
const nuevo = await emitirDE(payloadCorregido);
console.log(`Reemitido como CDC: ${nuevo.cdc}`);
// Si querés que el número original quede formalmente cerrado
await inutilizarNumero(cdcOriginal);
return nuevo;
}
function extraerCodigo(motivo: string): string {
const match = motivo.match(/\[(\d+)\]/);
return match ? match[1] : "desconocido";
}Buenas prácticas
- Loggeá todos los rechazos con el código y el payload original. Sirven para detectar bugs sistemáticos
- Validá antes de enviar. Si el 80% de tus rechazos son
1302, fortalecé la validación de RUC en tu frontend - Notificá al usuario. Si un rechazo se da en el contexto de una venta, mostrale al cajero/vendedor qué corregir
- Monitoreá la tasa de rechazos. Una tasa > 1% indica un problema en tu integración
No reintentes el mismo payload. Reenviar exactamente los mismos datos producirá el mismo rechazo. Siempre corregí los datos antes de reemitir.
Próximos pasos
- Rechazos SIFEN: tabla completa de códigos
- Inutilizar Numeración: cerrar el hueco del número rechazado
- Manejar Errores: patrones de error handling