Skip to content

Crear sujeto excluido

Emite una factura de sujeto excluido cuando tu empresa compra un bien o servicio a un proveedor que no es contribuyente de IVA. Úsalo desde tu ERP, Saas o módulo de cuentas por pagar al registrar esa compra.

En lugar de armar el DTE tipo 14, manejar reglas de holgura o redondeo para retención de renta, firmar con certificado y transmitir a Hacienda, solo envías proveedor, ítems, si retienes renta y los pagos. Lumen reserva el correlativo, firma, transmite y te devuelve PDF/JSON con URLs prefirmadas.

Método: POST

https://api-sandbox.lumendte.com/v1/excluded-taxpayers

CampoTipoRequeridoDescripción
AuthorizationstringSíBearer <access_token> (Client Credentials)
x-company-tax-numberstringSíNRC de la empresa compradora (con o sin guiones)
x-establishment-codestringSíCódigo dado por MH para el establecimiento (ej. M001)
x-point-of-sale-codestringSíCódigo dado por MH para el punto de venta (ej. P001)

El proveedor es obligatorio. Este es el payload mínimo para emitir a contado sin retención de renta:

{
"supplier": {
"name": "Juan Perez",
"documentType": "DUI",
"documentNumber": "01010101-1",
"address": {
"complement": "Col. Escalón, San Salvador",
"departmentCode": "06",
"districtCode": "13"
}
},
"items": [
{
"description": "Servicio de consultoría",
"quantity": 1,
"unitPrice": 100.0
}
],
"withholdIncomeTax": false,
"payments": [
{
"paymentCode": "01",
"amount": 100.0
}
]
}

Status: 201 Created

Guarda generationCode y controlNumber. Las URLs pdfUrl y jsonUrl expiran en 15 minutos: descárgalas o reenvíalas de inmediato desde tu backend. No las persistas en tu base de datos para uso posterior.

El campo status indica el resultado:

statusCuándo aplica
TRANSMITTEDEl DTE se firmó y se envió a Hacienda
DRAFTSolo en sandbox, sin credenciales de facturación y certificado: no se firma ni se transmite
{
"status": "TRANSMITTED",
"generationCode": "FF84E5DB-79C5-42CE-B415-EC510C53EFB5",
"controlNumber": "DTE-14-M001P001-000000000000001",
"receivedStamp": "20219E9D4DC0292F4681AD759B0B0F5CA99DC23G",
"environment": "SANDBOX",
"pdfUrl": "https://files.example.com/invoices/1/FF84E5DB-79C5-42CE-B415-EC510C53EFB5.pdf?X-Amz-Expires=900",
"jsonUrl": "https://files.example.com/invoices/1/FF84E5DB-79C5-42CE-B415-EC510C53EFB5.json?X-Amz-Expires=900"
}

En sandbox sin credenciales listas, Lumen crea el documento como borrador: no llama a firma ni a Hacienda. receivedStamp es null. El PDF y el JSON sí quedan disponibles.

{
"status": "DRAFT",
"generationCode": "FF84E5DB-79C5-42CE-B415-EC510C53EFB5",
"controlNumber": "DTE-14-M001P001-000000000000001",
"receivedStamp": null,
"environment": "SANDBOX",
"pdfUrl": "https://files.example.com/invoices/1/FF84E5DB-79C5-42CE-B415-EC510C53EFB5.pdf?X-Amz-Expires=900",
"jsonUrl": "https://files.example.com/invoices/1/FF84E5DB-79C5-42CE-B415-EC510C53EFB5.json?X-Amz-Expires=900"
}

environment: SANDBOX o PRODUCTION.


Si necesitas contacto del proveedor, actividad económica, descuentos, tipo de ítem o pagos a crédito, envía el objeto completo. Con withholdIncomeTax: true, Lumen aplica retención de renta del 10% y la resta del total a pagar: el monto de payments debe ser lo que efectivamente pagas al proveedor.

{
"supplier": {
"name": "Juan Perez",
"email": "juan.perez@example.com",
"phone": "7777-7777",
"documentType": "DUI",
"documentNumber": "01010101-1",
"economicActivityCode": "62010",
"address": {
"complement": "Col. Escalón, San Salvador",
"departmentCode": "06",
"districtCode": "13"
}
},
"items": [
{
"sku": "SERV-001",
"description": "Servicio de consultoría",
"quantity": 1,
"unitPrice": 100.0,
"discountAmount": 0,
"itemType": "SERVICE",
"unitOfMeasure": "59"
}
],
"withholdIncomeTax": true,
"payments": [
{
"paymentCode": "01",
"amount": 90.0
}
]
}

En este ejemplo: subtotal 100, retención 10, total a pagar 90.

Proveedor sujeto excluido. Siempre obligatorio.

CampoTipoRequeridoDescripción
namestringSíNombre completo del proveedor
documentTypestringSíDUI, NIT, PASSPORT, RESIDENT_CARD, OTHER
documentNumberstringSíNúmero de documento (DUI con o sin guiones; NIT con guiones)
address.complementstringSíComplemento de dirección (calle, colonia, etc.)
address.departmentCodestringSíCódigo de departamento. Ver Departamentos
address.districtCodestringSíCódigo de distrito. Ver Distritos
emailstringNoCorreo del proveedor
phonestringNoTeléfono nacional o internacional (ej. 7777-7777, +14155552671)
economicActivityCodestringNoCódigo de actividad económica (1–5). Ver Actividades económicas

Líneas del documento. Mínimo 1, máximo 2000.

CampoTipoRequeridoDescripción
descriptionstringSíDescripción del ítem
quantitynumberSíCantidad (> 0)
unitPricenumberSíPrecio unitario de compra sin IVA (> 0)
skustring | nullNoCódigo interno del producto
discountAmountnumberNoDescuento monetario de la línea (≥ 0). Default: 0. Compra = quantity × unitPrice − discountAmount
itemTypestringNoGOODS, SERVICE (default), BOTH
unitOfMeasurestringNoUnidad de medida del producto. Default: "59" (Unidad). Ver Unidades de medida

Significados de itemType:

ValorSignificado
GOODSProductos o bienes
SERVICEServicio
BOTHImplica tanto servicio como producto a la vez
CampoTipoRequeridoDescripción
withholdIncomeTaxbooleanSíSi true, Lumen aplica retención de renta del 10% y la resta del total a pagar

Formas de pago. Mínimo 1. Puedes enviar más de una si la compra se pagó con varios medios.

Lumen establece la condición de la operación (CAT-016) automáticamente según los pagos enviados:

Pagos enviadosCondición
Solo contado (cualquier código ≠ 13)Contado
Solo crédito (13)Crédito
Crédito (13) + contadoMixto
CampoTipoRequeridoDescripción
paymentCodestringSíCódigo de forma de pago. Ver Formas de pago
amountnumberSíMonto del pago. Envíalo siempre con el valor real de esa forma de pago
referencestringNoReferencia o código de autorización. Se omite en efectivo (01) y en crédito puro
creditTermstring | nullCondicionalTipo de plazo CAT-018. Requerido si paymentCode es 13 (ej. 01 = Días)
creditPeriodnumber | nullCondicionalCantidad de días/meses/años según creditTerm (1–999). Requerido si paymentCode es 13

Cuando paymentCode es 13 (cuentas por pagar), debes indicar plazo y periodo. Ejemplo para un pago a crédito de 30 días:

{
"payments": [
{
"paymentCode": "13",
"amount": 150.0,
"creditTerm": "01",
"creditPeriod": 30
}
]
}

creditTerm (01) = días; creditPeriod (30) = 30 días de plazo. Envía el monto real; en crédito puro Lumen envía montoPago: 0.00 al MH.


Terminal window
curl -X POST https://api-sandbox.lumendte.com/v1/excluded-taxpayers \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer tu_access_token" \
-H "x-company-tax-number: 123456-7" \
-H "x-establishment-code: M001" \
-H "x-point-of-sale-code: P001" \
-d '{
"supplier": {
"name": "Juan Perez",
"documentType": "DUI",
"documentNumber": "01010101-1",
"address": {
"complement": "Col. Escalón, San Salvador",
"departmentCode": "06",
"districtCode": "13"
}
},
"items": [
{
"description": "Servicio de consultoría",
"quantity": 1,
"unitPrice": 100.0
}
],
"withholdIncomeTax": false,
"payments": [
{
"paymentCode": "01",
"amount": 100.0
}
]
}'

Faltan campos del proveedor, withholdIncomeTax no es booleano, o no hay ítems.

{
"errorCode": "INVALID_PARAMETERS",
"message": [
"supplier.name should not be empty",
"supplier.address.districtCode should not be empty",
"withholdIncomeTax must be a boolean value",
"items must contain at least 1 elements"
],
"error": "Bad Request",
"statusCode": 400
}

Fix: Completa supplier (nombre, documento y dirección), envía withholdIncomeTax como true o false, e incluye al menos un ítem. Si retienes renta, el amount de payments debe ser el total a pagar (subtotal − 10%).

El MH rechazó la recepción (contribuyente inactivo, normativa o autorización de emisión).

{
"errorCode": "MH_RECEPTION_TAXPAYER_ERROR",
"message": "The taxpayer is not active at the tax authority.",
"statusCode": 422
}

Fix: Verifica que la empresa esté activa para emitir factura electrónica y que la configuración esté lista para el ambiente Sandbox o Producción.