Comprobante de Retención Electrónico
Esta sección describe los endpoints necesarios para crear comprobantes de retención electrónicos en el sistema de facturación electrónica de El Salvador.
Crear Comprobante de Retención Electrónico
/api/v1/retention
Crea y emite un comprobante de retención electrónico
Este endpoint permite crear y emitir un comprobante de retención electrónico que cumple con los requisitos del Ministerio de Hacienda. Los comprobantes de retención documentan las retenciones de IVA realizadas a otros contribuyentes.
Ejemplo de Solicitud
Request
{
"items": [
{
"type": 2,
"document_number": "1EEAB582-AA75-4D9C-A...",
"description": "Compra de equipos informáticos",
"retention_code": "22"
}
],
"receiver": {
"document_type": "36",
"document_number": "00000000000000",
"nrc": "000000",
"name": "EJEMPLO S.A de S.V",
"commercial_name": "EJEMPLO",
"activity_code": "00000",
"activity_description": "ACTIVIDADES JURÍDICAS Y CONTABLES",
"address": {
"department": "06",
"municipality": "20",
"complement": "Dirección de Prueba 1, N° 1234"
},
"phone": "21212121",
"email": "cliente@gmail.com"
},
"extension": {
"delivery_name": "Juan Pérez",
"delivery_document": "06141809931020",
"receiver_name": "María López",
"receiver_document": "06142509882011",
"observation": "Entrega en oficina central"
},
// Nota, estos campos si NO seran ocupados, no es necesario enviarlos, los muestra acá unicamente como referencia
appendixes: null
}
Ejemplo de Respuesta
Response
{
"success": true,
"reception_stamp": "202534D1BECF3321453...",
"qr_link": "https://admin.factura.gob.sv/consultaPublica?ambiente=00&codGen=5367521F-DD80-4B6B-9...&fechaEmi=FECHA-DE-EMISION",
"data":{
"identificacion": {
"version": 1,
"ambiente": "00",
"tipoDte": "07",
"numeroControl": "DTE-07-C0020000-000000000000001",
"codigoGeneracion": "EB399033-E184-41D2-B01...",
"tipoModelo": 1,
"tipoOperacion": 1,
"tipoContingencia": null,
"motivoContin": null,
"fecEmi": "2025-04-16",
"horEmi": "20:40:56",
"tipoMoneda": "USD"
},
"resumen": {
"totalSujetoRetencion": 80097.35,
"totalIVAretenido": 800.97,
"totalIVAretenidoLetras": "OCHOCIENTOS 97/100"
},
"emisor": {
"nit": "00000000000000",
"nrc": "0000000",
"nombre": "EMPRESA DE PRUEBAS SA DE CV 2",
"codActividad": "00000",
"descActividad": "Venta al por mayor de otros productos",
"tipoEstablecimiento": "01",
"direccion": {
"departamento": "06",
"municipio": "20",
"complemento": "BOULEVARD SANTA ELENA SUR, SANTA TECLA"
},
"telefono": "21212828",
"correo": "facturacion@empresa.com.sv",
"nombreComercial": "JEMEPLO",
"codigoMH": null,
"codigo": "C002",
"puntoVentaMH": null,
"puntoVenta": null
},
"receptor": {
"nombre": "EJEMPLO S.A DE C.V",
"tipoDocumento": "36",
"numDocumento": "00000000000000",
"nrc": "000000",
"codActividad": "00000",
"descActividad": "ACTIVIDADES JURÍDICAS Y CONTABLES",
"direccion": {
"departamento": "06",
"municipio": "20",
"complemento": "Dirección de Prueba 1, N° 1234"
},
"telefono": "21212121",
"correo": "cliente@gmail.com",
"nombreComercial": "EJEMPLO"
},
"cuerpoDocumento": [
{
"numItem": 1,
"tipoDte": "03",
"tipoDoc": 2,
"numDocumento": "1EEAB582-AA75-4D9C-AFF...",
"fechaEmision": "2025-04-11",
"montoSujetoGrav": 80097.35,
"codigoRetencionMH": "22",
"ivaRetenido": 800.97,
"descripcion": "Compra de equipos informáticos"
}
],
"extension": {
"nombEntrega": "Juan Pérez",
"docuEntrega": "06141809931020",
"nombRecibe": "María López",
"docuRecibe": "06142509882011",
"observaciones": "Entrega en oficina central"
},
"apendice": [
{
"campo": "Datos del documento",
"etiqueta": "Sello de recepción",
"valor": "202534D1BECF33214..."
}
]
}
Alternativa - Generación fisica
Si todos los documentos sujetos a retención son de generación física, se debe seguir un formato mas detallado, como se muestra a continuación.
Estructura de request cuando todos los items son de generación física
{
"items": [
{
"type": 1,
"document_number": "S221001345",
"description": "Compra de suministros de oficina",
"retention_code": "22",
"taxed_amount": 115.25,
"iva_amount": 1.15,
"emission_date": "2025-04-11",
"dte_type": "03"
},
{
"type": 1,
"document_number": "S221001346",
"description": "Servicio de limpieza",
"retention_code": "C4",
"taxed_amount": 226.50,
"iva_amount": 29.44,
"emission_date": "2025-03-22",
"dte_type": "03"
}
],
"summary": {
"total_retention_amount": 341.75,
"total_retention_iva": 30.59
},
"receiver": {
"document_type": "36",
"document_number": "00000000000000",
"nrc": "000000",
"name": "EJEMPLO S.A de S.V",
"commercial_name": "EJEMPLO",
"activity_code": "00000",
"activity_description": "ACTIVIDADES JURÍDICAS Y CONTABLES",
"address": {
"department": "06",
"municipality": "20",
"complement": "Dirección de Prueba 1, N° 1234"
},
"phone": "21212121",
"email": "cliente@gmail.com"
},
"extension": {
"delivery_name": "Juan Pérez",
"delivery_document": "06141809931020",
"receiver_name": "María López",
"receiver_document": "06142509882011",
"observation": "Entrega en oficina central"
}
}
Alternativa - Generación Mixta
Si los documentos sujetos a retención son de generación mixta (algunos físicos y otros electrónicos), en este caso
NO SE DEBE INCLUIR LA SECCIÓN SUMMARY
, como se muestra a continuación.
Estructura de request cuando todos los items son de generación mixta
{
"items": [
{
"type": 1,
"document_number": "S221001347",
"description": "Consultoría financiera",
"retention_code": "C9",
"taxed_amount": 450.00,
"iva_amount": 19.00,
"emission_date": "2025-03-15",
"dte_type": "03"
},
{
"type": 2,
"document_number": "FF32E9DB-79C3-42...",
"description": "Servicios de auditoría",
"retention_code": "C4"
}
],
"receiver": {
"document_type": "36",
"document_number": "00000000000000",
"nrc": "000000",
"name": "EJEMPLO S.A de S.V",
"commercial_name": "EJEMPLO",
"activity_code": "00000",
"activity_description": "ACTIVIDADES JURÍDICAS Y CONTABLES",
"address": {
"department": "06",
"municipality": "20",
"complement": "Dirección de Prueba 1, N° 1234"
},
"phone": "21212121",
"email": "cliente@gmail.com"
},
"extension": {
"delivery_name": "Juan Pérez",
"delivery_document": "06141809931020",
"receiver_name": "María López",
"receiver_document": "06142509882011",
"observation": "Entrega en oficina central"
}
}
Campos principales
Los campos necesarios para crear un comprobante de retención electrónico
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
items | array | Lista de documentos sobre los cuales se realiza la retención | Sí |
items[].type | integer | Tipo de generación del documento (1: Físico, 2: Electrónico - Emisión DTE) | Sí |
items[].document_number | string | Número del documento sujeto a retención (máx. 20 caracteres) | Sí |
items[].dte_type | string | Tipo de documento fiscal (ver lista de tipos válidos para retención) | Sí |
items[].emission_date | string | Fecha de emisión del documento retenido (formato YYYY-MM-DD) | Sí |
items[].taxed_amount | number | Monto sujeto a retención (> 0 y <= 9999999999.99) | Sí |
items[].retention_code | string | Código de retención según catálogo del MH (22: 1%, C4: 13%, C9: Otros) | Sí |
items[].iva_amount | number | Monto de IVA retenido (taxed_amount * porcentaje_retención) | Sí |
items[].description | string | Descripción de la retención (1-1000 caracteres) | Sí |
receiver | object | Información del sujeto al que se le realiza la retención | Sí |
receiver.name | string | Nombre completo del receptor (1-250 caracteres) | Sí |
receiver.nrc | string | Número de Registro de Contribuyente (1-8 dígitos) | Sí |
receiver.activity_code | string | Código de actividad económica (2-6 dígitos) | Sí |
receiver.activity_description | string | Descripción de la actividad económica (1-150 caracteres) | Sí |
receiver.address | object | Dirección del receptor | Sí |
receiver.address.department | string | Código de departamento del receptor | Sí |
receiver.address.municipality | string | Código de municipio del receptor | Sí |
receiver.address.complement | string | Complemento de la dirección del receptor | Sí |
receiver.document_type | string | Tipo de documento de identificación | No |
receiver.document_number | string | Número de documento de identificación | No |
receiver.commercial_name | string | Nombre comercial (1-150 caracteres) | No |
receiver.phone | string | Teléfono del receptor (8-30 caracteres) | No |
receiver.email | string | Correo electrónico del receptor (formato válido) | No |
summary | object | Resumen de totales de retención | Sí |
summary.total_retention_amount | number | Total de montos sujetos a retención (suma de todos los taxed_amount) | Sí |
summary.total_retention_iva | number | Total de IVA retenido (suma de todos los iva_amount) | Sí |
items
Requerido array
items[].type
Requerido integer
items[].document_number
Requerido string
items[].dte_type
Requerido string
items[].emission_date
Requerido string
items[].taxed_amount
Requerido number
items[].retention_code
Requerido string
items[].iva_amount
Requerido number
items[].description
Requerido string
receiver
Requerido object
receiver.name
Requerido string
receiver.nrc
Requerido string
receiver.activity_code
Requerido string
receiver.activity_description
Requerido string
receiver.address
Requerido object
receiver.address.department
Requerido string
receiver.address.municipality
Requerido string
receiver.address.complement
Requerido string
receiver.document_type
Opcional string
receiver.document_number
Opcional string
receiver.commercial_name
Opcional string
receiver.phone
Opcional string
receiver.email
Opcional string
summary
Requerido object
summary.total_retention_amount
Requerido number
summary.total_retention_iva
Requerido number
Códigos de Retención
Los códigos de retención deben corresponder a los catálogos definidos por el Ministerio de Hacienda:
Código | Descripción | Porcentaje |
---|---|---|
22 | Retención IVA 1% | 0.01 |
C4 | Retención IVA 13% | 0.13 |
C9 | Otros | Variable |
Validaciones específicas para Comprobante de Retención
- Validación de Fechas: Los documentos retenidos deben estar dentro del plazo permitido:
- Si pertenecen al mismo mes de emisión del comprobante, cualquier día es válido.
- Si pertenecen al mes anterior, el comprobante debe emitirse dentro de los primeros 10 días hábiles del mes siguiente.
- No se permiten documentos de meses anteriores fuera de estos plazos.
- Cálculo de Retención: El monto de IVA retenido (
iva_amount
) debe ser exactamente igual al monto sujeto a retención (taxed_amount
) multiplicado por el porcentaje correspondiente al código de retención. - Validación de Totales:
- El
total_retention_amount
debe ser igual a la suma de todos lostaxed_amount
de los ítems. - El
total_retention_iva
debe ser igual a la suma de todos losiva_amount
de los ítems.
- El
- Documentos Válidos para Retención: No todos los tipos de documentos fiscales son válidos para aplicar retención. Los tipos permitidos incluyen:
- 01 - Facturas Electrónicas
- 03 - Comprobantes de Crédito Fiscal Electrónicos
- 14 - Facturas de Exportación Electrónicas
- Montos Monetarios:
- Ningún monto monetario puede ser negativo.
- Los montos sujetos a retención deben ser mayores a cero.
Extensión del Comprobante de Retención
Cuando el monto del comprobante de retención es mayor o igual a $1,095.00, es obligatorio
incluir el campo extension
:
Ejemplo de extensión requerida
{
"extension": {
"delivery_name": "Nombre de quien entrega",
"delivery_document": "00000000-0",
"receiver_name": "Nombre de quien recibe",
"receiver_document": "00000000-0",
"observation": "Observaciones adicionales"
}
}
Campos del objeto extension
La extensión es obligatoria cuando el monto total es mayor o igual a $1,095.00
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
delivery_name | string | Nombre de quien entrega (1-100 caracteres) | Sí |
delivery_document | string | Documento de quien entrega (1-25 caracteres) | Sí |
receiver_name | string | Nombre de quien recibe (1-100 caracteres) | Sí |
receiver_document | string | Documento de quien recibe (1-25 caracteres) | Sí |
observation | string | Observaciones adicionales (máx. 3000 caracteres) | No |
delivery_name
Requerido string
delivery_document
Requerido string
receiver_name
Requerido string
receiver_document
Requerido string
observation
Opcional string
Appendixes (Apéndices)
Los apéndices contienen información adicional complementaria.
Ejemplo de apéndices
{
"appendixes": {
"items": [
{
"field": "campo_adicional",
"label": "Información Adicional",
"value": "Detalle adicional para el documento"
}
],
"type": "array"
}
}
Campos de Apéndices
Validaciones para el objeto appendixes
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
field | string | Identificador del campo (2-25 caracteres) | Sí |
label | string | Etiqueta descriptiva (3-50 caracteres) | Sí |
value | string | Valor del campo (1-150 caracteres) | Sí |
field
Requerido string
label
Requerido string
value
Requerido string
Consideraciones importantes:
- Los apéndices son opcionales.
- Si se incluyen, todos sus campos son obligatorios.