Emitir Documento Electrónico
POST /api/v1/documento-electronico — emite cualquier tipo de documento electrónico (FE, AFE, NCE, NDE, NRE) y retorna una respuesta con el CDC y URLs de seguimiento.
POST /api/v1/documento-electronico
Recibe un documento electrónico para firmarlo y enviarlo a SIFEN. La respuesta es asíncrona: la API retorna inmediatamente con estado: PENDIENTE y un CDC ya calculado. La respuesta de SIFEN llega después. Usá GET /status/:cdc o el statusUrl retornado para hacer polling del estado final.
Con una clave sk_sandbox_, el documento se procesa sin envío a SIFEN. La respuesta inicial sigue siendo 202 con PENDIENTE; consultá el comportamiento de SANDBOX.
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-5ffdce74fad2En emisión, el replay devuelve el mismo 202, documento, CDC, correlativo y Location; nunca reserva otro número.
Cuerpo de la solicitud
El campo tipoDocumento determina el schema completo de la solicitud. Ver los modelos:
- Factura Electrónica
- Autofactura Electrónica
- Nota de Crédito Electrónica
- Nota de Débito Electrónica
- Nota de Remisión Electrónica
Campos de facturas y notas de crédito o débito
La NRE tiene un contrato propio de carga y transporte, sin importes comerciales. Usá sus tablas de campos.
La AFE también tiene un contrato propio: informa vendedor, lugarOperacion y constancia, y no admite receptor. Usá sus tablas de campos.
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
tipoDocumento | enum | Sí | Tipo de documento — ver la lista de modelos arriba |
fechaEmision | datetime | No | Fecha y hora de Paraguay (YYYY-MM-DDTHH:mm:ss). Si se omite, se usa la fecha y hora en que Sifende recibe la solicitud |
tipoEmision | enum | No | Sólo NORMAL, valor por defecto. SIFEN todavía no habilita la emisión en contingencia |
numeroEstablecimiento | integer | Sí | Número de establecimiento (1-999) |
puntoExpedicion | integer | Sí | Punto de expedición (1-999) |
receptor | object | Sí | Datos del receptor — ver Campos del receptor |
items | array | Sí | Lista de ítems — ver Modelo Ítem |
monedaOperacion | enum | No | Moneda de la operación (ej: PYG, USD). Por defecto PYG |
descuentoGlobalPorcentaje | number | No | Porcentaje global mayor que 0 y menor o igual a 100. No se admite en Nota de Remisión |
infoEmisor | string | No | Texto libre adicional del emisor, de 1 a 3000 caracteres en una sola línea |
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.
| Campo | Tipo | Obligatorio cuando | Descripción |
|---|---|---|---|
tipoTransaccion | enum | tipoDocumento es FACTURA_ELECTRONICA o AUTOFACTURA_ELECTRONICA | Naturaleza de la operación (VENTA_MERCADERIA, PRESTACION_SERVICIOS, …). En NCE, NDE y NRE no se informa |
condicionOperacion | enum | tipoDocumento es FACTURA_ELECTRONICA o AUTOFACTURA_ELECTRONICA | CONTADO o CREDITO. En AFE sólo se admite CONTADO, que es el valor por defecto. No aplica a NCE ni NDE |
condicionPago | object | condicionOperacion es CONTADO o CREDITO, salvo que uses pagos/credito | Medio de pago o modalidad de crédito — ver Modelo Condición de Pago |
pagos / credito | array / object | Alternativa de la FE a condicionPago | Varios medios de pago y crédito con entrega — ver Forma completa |
motivoEmision | enum | tipoDocumento es NOTA_DE_CREDITO_ELECTRONICA o NOTA_DE_DEBITO_ELECTRONICA | Motivo del ajuste (DEVOLUCION, DESCUENTO, AJUSTE_DE_PRECIO, …) |
documentoAsociado | object | tipoDocumento es NOTA_DE_CREDITO_ELECTRONICA o NOTA_DE_DEBITO_ELECTRONICA | El documento que se modifica — ver Modelo Documento Asociado. La FE usa la lista documentosAsociados |
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.
| Campo | Tipo | Req. | Descripción |
|---|---|---|---|
tipoContribuyente | enum | Sí | CONTRIBUYENTE (receptor con RUC) o NO_CONTRIBUYENTE. Siempre se envía |
tipoOperacion | enum | Sí | B2B, B2C, B2G, B2F |
numeroDocumento | string | Sí | RUC sin DV, cédula o pasaporte según el caso. Para el receptor innominado, el literal "0" |
nombreRazonSocial | string | Sí | Nombre o razón social. Para el receptor innominado, el literal "Sin Nombre" |
tipoContribuyenteReceptor | enum | Condicional | Obligatorio cuando tipoContribuyente = CONTRIBUYENTE. PERSONA_FISICA o PERSONA_JURIDICA. No se envía para NO_CONTRIBUYENTE: SIFEN lo rechaza con el código 1303 |
digitoVerificador | string | Condicional | Obligatorio cuando tipoContribuyente = CONTRIBUYENTE. Un solo dígito — el DV del RUC del receptor |
tipoDocumento | enum | Condicional | Obligatorio cuando tipoContribuyente = NO_CONTRIBUYENTE. CEDULA_PARAGUAYA, PASAPORTE, INNOMINADO, etc. No se envía para CONTRIBUYENTE |
direccion | string | Condicional | Obligatoria para tipoOperacion = B2F y para la Nota de Remisión. Opcional en el resto |
email | string | No | Si 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 incluye el CDC, el ambiente efectivo y URLs auxiliares para seguimiento.
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"cdc": "01800123451001001000000122026042710000000006",
"estado": "PENDIENTE",
"ambiente": "DEV",
"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
| Header | Valor | Descripción |
|---|---|---|
Location | {statusUrl} | URL absoluta para consultar el estado del documento |
Campos de la respuesta
| Campo | Tipo | Descripción |
|---|---|---|
id | uuid | Identificador público del documento en Sifende. No es una clave de idempotencia |
cdc | string(44) | Código de Control del Documento Electrónico — identificador único en SIFEN |
estado | enum | Estado inicial: siempre PENDIENTE en la respuesta de emisión |
ambiente | string | Ambiente de la emisión: DEV, PROD o SANDBOX, determinado por la API key. No cambia para este documento |
tipoDocumento | enum | Tipo del documento creado (eco de la solicitud) |
iTiDe | integer | Código numérico SIFEN del tipo (1=FE, 4=AFE, 5=NCE, 6=NDE, 7=NRE) |
numeroDocumento | integer | Número correlativo asignado dentro del punto de expedición |
numeroFormateado | string | Número en formato establecimiento-puntoExpedicion-secuencia (ej: 001-001-0000001) |
fechaCreacion | datetime | Timestamp de creación del registro |
qrUrl | string | URL del QR oficial de SIFEN para el KuDE |
statusUrl | string | URL absoluta para consultar el estado |
kudeUrl | string | URL absoluta para descargar el KuDE en PDF en estado APROBADO o APROBADO_OBSERVACION. En SANDBOX, el PDF indica que no tiene validez fiscal |
El estado inicial es siempre PENDIENTE. Hacé polling a statusUrl o GET /status/:cdc cada 5 segundos, durante un máximo de 5 minutos, hasta llegar a un estado terminal: APROBADO, APROBADO_OBSERVACION, RECHAZADO, CANCELADO o ERROR. APROBADO_OBSERVACION es un resultado exitoso: el DE quedó registrado, con observaciones en mensajeRechazo. Ver Polling de resultados.
Errores comunes
| Status | Tipo | Cuándo ocurre | Acción |
|---|---|---|---|
| 400 | validation-error | Campos inválidos, faltantes o ramas de pago incompatibles; en CONTADO, pagos que no cubren exactamente el total | Corregí las rutas incluidas en errores y reenviá la solicitud |
| 400 | validation-error | En CREDITO: falta condicionCredito, se mezclan PLAZO/CUOTA, no coincide cuotas con detalleCuotas, las cuotas no suman el saldo financiado o la entrega es inválida | Ajustá condicionPago según la referencia |
| 400 | invalid-enum-value | Valor de enumeración no reconocido | Usá un valor publicado por GET /api/v1/public/enums |
| 422 | configuracion-incompleta | Falta el timbrado u otro dato del emisor | Completá el dato indicado por campo |
| 404 | certificate-not-found | Falta certificado activo o CSC del ambiente | Revisá ambos desde el panel |
| 422 | documento-electronico-generation-error | El documento no cumple una regla fiscal; revisá el detail | Revisá el detalle y contactá soporte si la solicitud 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
Ejemplo de solicitud:
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": "0",
"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.
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
- Receptor B2B y B2C: cada caso de receptor con su ejemplo y los rechazos asociados.
- Consultar el estado del documento
- Modelo Receptor: schema completo del bloque
receptor.