SIFENDE
Referencia APIDocumentos Electrónicos

Emitir Documento Electrónico

POST /api/v1/documento-electronico — emite cualquier tipo de documento electrónico (FE, NCE, NDE) y retorna un DTO con el CDC y URLs de seguimiento.

POST /api/v1/documento-electronico

Emite un documento electrónico y lo encola para envío a SIFEN. La respuesta es asíncrona: la API retorna inmediatamente con estado: PENDIENTE y un CDC ya calculado. El procesamiento real ocurre en segundo plano (lote → firma → envío SIFEN → resultado). Usá GET /status/:cdc o el statusUrl retornado para hacer polling del estado final.

Autenticación

Authorization: Bearer {api-key} — requerido

Idempotencia

Idempotency-Key es un header opcional de 1 a 255 caracteres ASCII visibles, sin espacios al inicio ni al final. El flujo compartido está definido en Idempotencia y Reintentos Seguros.

Idempotency-Key: 7d444840-9dc0-11d1-b245-5ffdce74fad2

En emisión, el replay devuelve el mismo 202, documento, CDC, correlativo y Location; nunca reserva otro número. Si el contrato no está disponible, 503 idempotency-unavailable no crea el documento ni consume el correlativo.

Request body

El campo tipoDocumento determina el schema completo del request. Ver los modelos:

Campos comunes a todos los tipos

CampoTipoReq.Descripción
tipoDocumentoenumSíTipo de documento — ver la lista de modelos arriba
fechaEmisiondatetimeSíFecha y hora de emisión (YYYY-MM-DDTHH:mm:ss)
tipoEmisionenumSíNORMAL o CONTINGENCIA
numeroEstablecimientointegerSíNúmero de establecimiento (1-999)
puntoExpedicionintegerSíPunto de expedición (1-999)
receptorobjectSíDatos del receptor — ver Campos del receptor
itemsarraySíLista de ítems — ver Modelo Ítem
monedaOperacionenumNoMoneda de la operación (ej: PYG, USD). Por defecto PYG
descuentoGlobalPorcentajenumberNoPorcentaje global mayor que 0 y menor o igual a 100. No se admite en Nota de Remisión
infoEmisorstringNoTexto libre adicional del emisor (campo SIFEN B005)

Campos condicionales según el tipo de documento

Estos campos no aplican a todos los tipos de documento. Omitir el que corresponde a tu tipoDocumento devuelve 400 validation-error.

CampoTipoObligatorio cuandoDescripción
tipoTransaccionenumtipoDocumento es FACTURA_ELECTRONICA o AUTOFACTURA_ELECTRONICANaturaleza de la operación (VENTA_MERCADERIA, PRESTACION_SERVICIOS, …). En NCE, NDE y NRE no se informa
condicionOperacionenumtipoDocumento es FACTURA_ELECTRONICA, AUTOFACTURA_ELECTRONICA o NOTA_DE_REMISION_ELECTRONICACONTADO o CREDITO. No aplica a NCE ni NDE
condicionPagoobjectcondicionOperacion es CONTADO o CREDITOMedio de pago o modalidad de crédito — ver Modelo Condición de Pago
motivoEmisionenumtipoDocumento es NOTA_DE_CREDITO_ELECTRONICA o NOTA_DE_DEBITO_ELECTRONICAMotivo del ajuste (DEVOLUCION, DESCUENTO, AJUSTE_DE_PRECIO, …)
documentoAsociadoobjecttipoDocumento es NOTA_DE_CREDITO_ELECTRONICA o NOTA_DE_DEBITO_ELECTRONICAEl documento que se modifica. Opcional en FE (anticipos) — ver Modelo Documento Asociado

Campos del receptor

El bloque receptor usa los mismos nombres de campo en toda operación, pero cuáles son obligatorios depende de tipoContribuyente. Schema completo en Modelo Receptor.

CampoTipoReq.Descripción
tipoContribuyenteenumSíCONTRIBUYENTE (receptor con RUC) o NO_CONTRIBUYENTE. Siempre se envía
tipoOperacionenumSíB2B, B2C, B2G, B2F
numeroDocumentostringSíRUC sin DV, cédula o pasaporte según el caso. Para el receptor innominado, el literal "0"
nombreRazonSocialstringSíNombre o razón social. Para el receptor innominado, el literal "Sin Nombre"
tipoContribuyenteReceptorenumCondicionalObligatorio cuando tipoContribuyente = CONTRIBUYENTE. PERSONA_FISICA o PERSONA_JURIDICA (campo SIFEN D207). No se envía para NO_CONTRIBUYENTE: SIFEN lo rechaza con el código 1303
digitoVerificadorstringCondicionalObligatorio cuando tipoContribuyente = CONTRIBUYENTE. Un solo dígito — el DV del RUC del receptor
tipoDocumentoenumCondicionalObligatorio cuando tipoContribuyente = NO_CONTRIBUYENTE. CEDULA_PARAGUAYA, PASAPORTE, INNOMINADO, etc. No se envía para CONTRIBUYENTE
direccionstringCondicionalObligatoria para tipoOperacion = B2F y para la Nota de Remisión. Opcional en el resto
emailstringNoSi está configurado el envío automático, Sifende manda el KuDE a esta dirección

tipoContribuyente decide tres campos a la vez, y es el motivo de rechazo más frecuente al integrar. Si el receptor es CONTRIBUYENTE, tipoContribuyenteReceptor y digitoVerificador van sí o sí, y tipoDocumento no se envía. Si es NO_CONTRIBUYENTE, es exactamente al revés. La guía Receptor B2B y B2C cubre cada caso con su ejemplo.

Respuesta exitosa

Status: 202 Accepted

La respuesta es un objeto JSON con el CDC, el estado inicial (PENDIENTE) y URLs auxiliares para seguimiento.

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "cdc": "01800123451001001000000122026042710000000006",
  "estado": "PENDIENTE",
  "tipoDocumento": "FACTURA_ELECTRONICA",
  "iTiDe": 1,
  "numeroDocumento": 1,
  "numeroFormateado": "001-001-0000001",
  "fechaCreacion": "2026-04-27T10:30:00",
  "qrUrl": "https://ekuatia.set.gov.py/consultas-test/qr?...",
  "statusUrl": "https://api.sifende.com.py/api/v1/documento-electronico/status/01800123451001001000000122026042710000000006",
  "kudeUrl": "https://api.sifende.com.py/api/v1/documento-electronico/01800123451001001000000122026042710000000006/kude"
}

Headers de respuesta

HeaderValorDescripción
Location{statusUrl}URL absoluta para consultar el estado del documento

Campos del DTO

CampoTipoDescripción
iduuidIdentificador público del documento en Sifende. No es una clave de idempotencia
cdcstring(44)Código de Control del Documento Electrónico — identificador único en SIFEN
estadoenumEstado inicial: siempre PENDIENTE en la respuesta de emisión
tipoDocumentoenumTipo del documento creado (eco del request)
iTiDeintegerCódigo numérico SIFEN del tipo (1=FE, 5=NCE, 6=NDE)
numeroDocumentointegerNúmero correlativo asignado dentro del punto de expedición
numeroFormateadostringNúmero en formato establecimiento-puntoExpedicion-secuencia (ej: 001-001-0000001)
fechaCreaciondatetimeTimestamp de creación del registro
qrUrlstringURL del QR oficial de SIFEN para el KuDE
statusUrlstringURL absoluta para consultar el estado
kudeUrlstringURL absoluta para descargar el KuDE en PDF (disponible una vez que el DE quedó registrado en SIFEN: APROBADO o APROBADO_OBSERVACION)

El estado inicial es siempre PENDIENTE. Hacé polling a statusUrl o GET /status/:cdc cada 5–10 segundos hasta llegar a un estado terminal: APROBADO, APROBADO_OBSERVACION, RECHAZADO o ERROR. APROBADO_OBSERVACION es un resultado exitoso: el DE quedó registrado, con observaciones en mensajeRechazo. Ver Polling de resultados.

Errores comunes

StatusTipoCuándo ocurreAcción
400validation-errorCampos inválidos, faltantes o ramas de pago incompatiblesCorregí las rutas incluidas en errors y reenviá el request
400validation-errorEn CREDITO: falta condicionCredito, se mezclan PLAZO/CUOTA, no coincide cuotas con detalleCuotas, la entrega es inválida o la moneda no es PYGAjustá condicionPago según la referencia
400invalid-enum-valueValor de enumeración no reconocidoUsá un valor publicado por GET /api/v1/public/enums
404timbrado-not-foundNo hay timbrado configuradoConfigurá un timbrado vigente
404certificate-not-foundNo hay certificado digital subidoCargá el certificado del contribuyente
422documento-electronico-generation-errorUna invariante fiscal interna impide generar el DERevisá el detalle y contactá soporte si el request cumple OpenAPI

La API ejecuta la validación 400 antes de reservar la secuencia. Un payload inválido no consume numeración ni crea un registro de documento electrónico.

Ejemplos

Los dos casos de receptor que cubren la mayoría de las integraciones. Copiá el que corresponda a tu operación — lo que los diferencia es el bloque receptor.

Factura B2C — consumidor final identificado

Factura a crédito por cuotas

El siguiente body coincide con el fixture válido publicado por OpenAPI:

curl -X POST https://api.sifende.com.py/api/v1/documento-electronico \
  -H "Authorization: Bearer $SIFENDE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "tipoDocumento": "FACTURA_ELECTRONICA",
  "fechaEmision": "2026-09-18T10:30:00",
  "tipoEmision": "NORMAL",
  "numeroEstablecimiento": 1,
  "puntoExpedicion": 1,
  "tipoTransaccion": "VENTA_MERCADERIA",
  "monedaOperacion": "PYG",
  "receptor": {
    "tipoContribuyente": "CONTRIBUYENTE",
    "tipoOperacion": "B2B",
    "tipoContribuyenteReceptor": "PERSONA_JURIDICA",
    "numeroDocumento": "80012345",
    "digitoVerificador": "7",
    "nombreRazonSocial": "Comercial San Roque S.A."
  },
  "condicionOperacion": "CREDITO",
  "condicionPago": {
    "tipo": "CREDITO",
    "condicionCredito": "CUOTA",
    "cuotas": 3,
    "detalleCuotas": [
      {
        "monto": 40000,
        "fechaVencimiento": "2026-09-18"
      },
      {
        "monto": 40000,
        "fechaVencimiento": "2026-10-18"
      },
      {
        "monto": 40000,
        "fechaVencimiento": "2026-11-18"
      }
    ]
  },
  "items": [
    {
      "codigo": "PROD-001",
      "descripcion": "Resma de papel A4 75g",
      "cantidad": 10,
      "unidadMedida": "UNI",
      "precioUnitario": 12000,
      "afectacionTributaria": "GRAVADO",
      "tasaIVA": 10
    }
  ]
}'

Para crédito a plazo, reemplazá la rama por condicionCredito: "PLAZO" y plazoCredito; no envíes cuotas ni detalleCuotas. La API sólo admite crédito en PYG por ahora.

Factura B2B — receptor contribuyente con RUC

Respecto del ejemplo anterior, en el bloque receptor: tipoContribuyente pasa a CONTRIBUYENTE y tipoOperacion a B2B, se agregan tipoContribuyenteReceptor y digitoVerificador, y se saca tipoDocumento. El numeroDocumento es el RUC sin el dígito verificador.

Próximos pasos

On this page