Factura Electrónica
Esta sección describe los endpoints necesarios para crear facturas electrónicas en el sistema de facturación electrónica de El Salvador.
Crear Factura Electrónica
/api/v1/invoices
Crea y emite una factura electrónica
Este endpoint permite crear y emitir una factura electrónica que cumple con los requisitos del Ministerio de Hacienda.
Ejemplo de Solicitud
Request
{
"items": [
{
"type": 1,
"description": "CODO PVC 3/4",
"quantity": 12,
"unit_measure": 59,
"unit_price": 0.65,
"discount": 0,
"code": "COD1",
"non_subject_sale": 0,
"exempt_sale": 0,
"taxed_sale": 7.8,
"suggested_price": 0,
"non_taxed": 0,
"iva_item": 0.9
},
{
"type": 1,
"description": "CODO PVC 1",
"quantity": 123,
"unit_measure": 59,
"unit_price": 0.75,
"discount": 0,
"code": "COD2",
"non_subject_sale": 0,
"exempt_sale": 0,
"taxed_sale": 92.25,
"suggested_price": 0,
"non_taxed": 0,
"iva_item": 10.61
}
],
"receiver": {
"document_type": "13",
"document_number": "00000000-0",
"name": "CLIENTE DE PRUEBA",
"address": {
"department": "08",
"municipality": "23",
"complement": "SOYAPANGO, SAN SALVADOR"
},
"phone": "21212121",
"email": "cliente@gmail.com"
},
"summary": {
"total_non_subject": 0,
"total_exempt": 0,
"total_taxed": 100.05,
"sub_total": 100.05,
"non_subject_discount": 0,
"exempt_discount": 0,
"taxed_discount": 0,
"discount_percentage": 0,
"total_discount": 0,
"sub_total_sales": 100.05,
"total_operation": 100.05,
"total_non_taxed": 0,
"total_to_pay": 99.05,
"operation_condition": 1,
"iva_retention": 1.00,
"total_iva": 11.51,
"payment_types": [
{
"code": "01",
"amount": 99.05
}
]
},
// Nota, estos campos si NO seran ocupados, no es necesario enviarlos, los muestra acá unicamente como referencia
"third_party_sale": null,
"related_docs": null,
"other_docs": null,
"appendixes": null
}
Ejemplo de Respuesta
Response
{
"success": true,
"reception_stamp": "202533D8A3CB39484D...",
"qr_link": "https://admin.factura.gob.sv/consultaPublica?ambiente=00&codGen=UUID-GENERADO&fechaEmi=FECHA-EMISION",
"data": {
"identificacion": {
"version": 1,
"ambiente": "00",
"tipoDte": "01",
"numeroControl": "DTE-01-00000000-000000000000001",
"codigoGeneracion": "29378712-E876-4...",
"tipoModelo": 1,
"tipoOperacion": 1,
"tipoContingencia": null,
"motivoContin": null,
"fecEmi": "2025-04-16",
"horEmi": "15:00:48",
"tipoMoneda": "USD"
},
"resumen": {
"totalNoSuj": 0,
"totalExenta": 0,
"totalGravada": 100.05,
"subTotalVentas": 100.05,
"descuNoSuj": 0,
"descuExenta": 0,
"descuGravada": 0,
"porcentajeDescuento": 0,
"totalDescu": 0,
"tributos": [],
"subTotal": 100.05,
"reteRenta": 0,
"ivaRete1": 1,
"montoTotalOperacion": 100.05,
"totalNoGravado": 0,
"totalPagar": 99.05,
"totalLetras": "NOVENTA Y NUEVE 05/100",
"totalIva": 11.51,
"saldoFavor": 0,
"condicionOperacion": 1,
"pagos": [
{
"codigo": "01",
"montoPago": 99.05,
"referencia": null,
"plazo": null,
"periodo": null
}
],
"numPagoElectronico": null
},
"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": "EJEMPLO",
"codEstableMH": null,
"codEstable": null,
"codPuntoVentaMH": null,
"codPuntoVenta": null
},
"receptor": {
"nombre": "CLIENTE DE PRUEBA",
"tipoDocumento": "13",
"numDocumento": "00000000-0",
"nrc": null,
"codActividad": null,
"descActividad": null,
"direccion": {
"departamento": "08",
"municipio": "23",
"complemento": "SOYAPANGO, SAN SALVADOR"
},
"telefono": "21212121",
"correo": "cliente@gmail.com"
},
"cuerpoDocumento": [
{
"numItem": 1,
"tipoItem": 1,
"numeroDocumento": null,
"codigo": null,
"codTributo": null,
"descripcion": "CODO PVC 3/4",
"cantidad": 12,
"uniMedida": 59,
"precioUni": 0.65,
"montoDescu": 0,
"ventaNoSuj": 0,
"ventaExenta": 0,
"ventaGravada": 7.8,
"tributos": null,
"psv": 0,
"noGravado": 0,
"ivaItem": 0.9
},
{
"numItem": 2,
"tipoItem": 1,
"numeroDocumento": null,
"codigo": null,
"codTributo": null,
"descripcion": "CODO PVC 1",
"cantidad": 123,
"uniMedida": 59,
"precioUni": 0.75,
"montoDescu": 0,
"ventaNoSuj": 0,
"ventaExenta": 0,
"ventaGravada": 92.25,
"tributos": null,
"psv": 0,
"noGravado": 0,
"ivaItem": 10.61
}
],
"documentoRelacionado": null,
"otrosDocumentos": null,
"ventaTercero": null,
"extension": null,
"apendice": [
{
"campo": "Datos del documento",
"etiqueta": "Sello de recepción",
"valor": "202533D8A3CB39484D..."
}
]
}
}
Campos principales
Los campos necesarios para crear una factura electrónica
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
items | array | Lista de productos o servicios que componen la factura | Sí |
items[].type | integer | Tipo de ítem (1: Producto, 2: Servicio, 3: Ambos, 4: Impuesto) | Sí |
items[].code | string | Código del producto o servicio | No |
items[].description | string | Descripción del ítem (1-1000 caracteres) | Sí |
items[].quantity | number | Cantidad del ítem (debe ser mayor que 0) | Sí |
items[].unit_measure | integer | Unidad de medida según catálogo | Sí |
items[].unit_price | number | Precio unitario (debe ser mayor o igual a 0) | Sí |
items[].discount | number | Monto de descuento para el ítem
(Predeterminado: 0
)
| No |
items[].taxed_sale | number | Venta gravada (debe ser mayor o igual a 0)
(Predeterminado: 0
)
| No |
items[].exempt_sale | number | Venta exenta (debe ser mayor o igual a 0)
(Predeterminado: 0
)
| No |
items[].non_subject_sale | number | Venta no sujeta (debe ser mayor o igual a 0)
(Predeterminado: 0
)
| No |
items[].non_taxed | number | Monto no gravado (debe ser mayor o igual a 0)
(Predeterminado: 0
)
| No |
items[].iva_item | number | Monto de IVA del ítem (13% de la venta gravada) | No |
items[].suggested_price | number | Precio sugerido de venta
(Predeterminado: 0
)
| No |
items[].tax_code | string | Código de impuesto | No |
items[].taxes | array | Lista de impuestos aplicables al ítem | No |
items[].related_doc | string | Referencia a documento relacionado | No |
receiver | object | Información del receptor o cliente | Sí |
receiver.document_type | string | Tipo de documento (13: DUI, 36: NIT, etc.) | Sí |
receiver.document_number | string | Número de documento del receptor | Sí |
receiver.name | string | Nombre del receptor | 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.nrc | string | Número de Registro de Contribuyente | No |
receiver.activity_code | string | Código de actividad económica | No |
receiver.activity_description | string | Descripción de actividad económica | No |
receiver.phone | string | Teléfono del receptor | No |
receiver.email | string | Correo electrónico del receptor | No |
summary | object | Resumen de totales de la factura | Sí |
summary.total_taxed | number | Total de ventas gravadas | Sí |
summary.total_exempt | number | Total de ventas exentas
(Predeterminado: 0
)
| Sí |
summary.total_non_subject | number | Total de ventas no sujetas
(Predeterminado: 0
)
| Sí |
summary.total_non_taxed | number | Total no gravado
(Predeterminado: 0
)
| Sí |
summary.sub_total | number | Subtotal de la factura | Sí |
summary.sub_total_sales | number | Subtotal de ventas | Sí |
summary.discount_percentage | number | Porcentaje de descuento
(Predeterminado: 0
)
| Sí |
summary.taxed_discount | number | Descuento gravado
(Predeterminado: 0
)
| Sí |
summary.exempt_discount | number | Descuento exento
(Predeterminado: 0
)
| Sí |
summary.non_subject_discount | number | Descuento no sujeto
(Predeterminado: 0
)
| Sí |
summary.total_discount | number | Total de descuentos
(Predeterminado: 0
)
| Sí |
summary.total_operation | number | Total de la operación | Sí |
summary.total_to_pay | number | Total a pagar | Sí |
summary.total_iva | number | Total de IVA | No |
summary.iva_retention | number | Retención de IVA
(Predeterminado: 0
)
| No |
summary.income_retention | number | Retención de renta
(Predeterminado: 0
)
| No |
summary.balance_in_favor | number | Saldo a favor
(Predeterminado: 0
)
| No |
summary.operation_condition | integer | Condición de operación (1: Contado, 2: Crédito) | Sí |
summary.payment_types | array | Tipos de pago utilizados | Sí |
summary.payment_types[].code | string | Código del tipo de pago | Sí |
summary.payment_types[].amount | number | Monto del pago | Sí |
summary.payment_types[].period | integer | Período de pago (obligatorio si operation_condition = 2) | No |
summary.payment_types[].term | string | Plazo de pago (obligatorio si operation_condition = 2) | No |
summary.taxes | array | Impuestos aplicados a la factura | No |
items
Requerido array
items[].type
Requerido integer
items[].code
Opcional string
items[].description
Requerido string
items[].quantity
Requerido number
items[].unit_measure
Requerido integer
items[].unit_price
Requerido number
items[].discount
Opcional number
0
items[].taxed_sale
Opcional number
0
items[].exempt_sale
Opcional number
0
items[].non_subject_sale
Opcional number
0
items[].non_taxed
Opcional number
0
items[].iva_item
Opcional number
items[].suggested_price
Opcional number
0
items[].tax_code
Opcional string
items[].taxes
Opcional array
items[].related_doc
Opcional string
receiver
Requerido object
receiver.document_type
Requerido string
receiver.document_number
Requerido string
receiver.name
Requerido string
receiver.address
Requerido object
receiver.address.department
Requerido string
receiver.address.municipality
Requerido string
receiver.address.complement
Requerido string
receiver.nrc
Opcional string
receiver.activity_code
Opcional string
receiver.activity_description
Opcional string
receiver.phone
Opcional string
receiver.email
Opcional string
summary
Requerido object
summary.total_taxed
Requerido number
summary.total_exempt
Requerido number
0
summary.total_non_subject
Requerido number
0
summary.total_non_taxed
Requerido number
0
summary.sub_total
Requerido number
summary.sub_total_sales
Requerido number
summary.discount_percentage
Requerido number
0
summary.taxed_discount
Requerido number
0
summary.exempt_discount
Requerido number
0
summary.non_subject_discount
Requerido number
0
summary.total_discount
Requerido number
0
summary.total_operation
Requerido number
summary.total_to_pay
Requerido number
summary.total_iva
Opcional number
summary.iva_retention
Opcional number
0
summary.income_retention
Opcional number
0
summary.balance_in_favor
Opcional number
0
summary.operation_condition
Requerido integer
summary.payment_types
Requerido array
summary.payment_types[].code
Requerido string
summary.payment_types[].amount
Requerido number
summary.payment_types[].period
Opcional integer
summary.payment_types[].term
Opcional string
summary.taxes
Opcional array
Validaciones específicas para Factura Electrónica
- Los ítems solo pueden tener un tipo de venta (gravada, exenta, no sujeta o no gravada)
-
Si hay
taxed_sale > 0
(venta gravada):unit_price
debe ser mayor que 0-
El cálculo de
iva_item
debe ser 13% de la venta gravada
-
Si hay
non_taxed > 0
(monto no gravado):- No debe tener otros tipos de venta
- No debe incluir impuestos
unit_price
debe ser 0
-
La suma de los montos de
payment_types
debe ser igual atotal_to_pay
-
Si
operation_condition = 1
(contado), no puede haberterm
niperiod
-
Si
operation_condition = 2
(crédito):term
yperiod
son obligatorios- No se permite pago tipo "01" (efectivo)
Campos Opcionales
Estos campos complementan la información principal de la factura electrónica, permitiendo casos de uso más específicos.
1. Appendixes (Apéndices)
Los apéndices son campos adicionales que proporcionan información complementaria al documento principal.
Estructura de Apéndices
"appendixes": [
{
"field": "string",
"label": "string",
"value": "string"
},
]
Campos de Apéndices
Validaciones para el objeto appendixes
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
field | string | Nombre del campo adicional (2-25 caracteres) | Sí |
label | string | Etiqueta o título del campo (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 en la factura electrónica.
- Si se incluyen, todos los campos son obligatorios.
- El sistema puede agregar automáticamente un apéndice conteniendo el "sello de recepción".
2. Extension (Extensión)
La extensión contiene información sobre entrega y recepción de bienes o servicios.
Ejemplo de extensión requerida
{
"extension": {
"delivery_name": "string",
"delivery_document": "string",
"receiver_name": "string",
"receiver_document": "string",
"observation": "string"
"vehicule_plate": "string"
}
}
Campos de Extensión
Validaciones para el objeto extension
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, DUI o NIT por ejemplo) | Sí |
receiver_name | string | Nombre de quien recibe (1-100 caracteres) | Sí |
receiver_document | string | Documento de quien recibe (1-25 caracteres, DUI o NIT por ejemplo) | Sí |
observation | string | Observaciones adicionales (Máximo 3000 caracteres) | No |
vehicule_plate | string | Placa del vehículo (1-10 caracteres) | No |
delivery_name
Requerido string
delivery_document
Requerido string
receiver_name
Requerido string
receiver_document
Requerido string
observation
Opcional string
vehicule_plate
Opcional string
Consideraciones importantes:
- La extensión es opcional por defecto, pero se vuelve obligatoria si el total de la operación es ≥ $1,095.00 USD.
- Si se incluye la extensión, los primeros 4 campos son obligatorios.
3. Other Documents (Otros Documentos)
Los otros documentos incluyen documentos asociados a la operación, como documentos de transporte o médicos.
Estructura de Otros Documentos
"other_docs": [
{
"document_code": 0,
"description": "string",
"detail": "string",
"doctor": {
"name": "string",
"nit": "string",
"identification": "string",
"service_type": 0
}
}
]
Campos de Otros Documentos
Validaciones para el objeto other_docs
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
document_code | integer | Código del documento (1-4) | Sí |
description | string | Descripción del documento. Obligatorio si document_code ≠ 3 | No |
detail | string | Detalle del documento. Obligatorio si document_code ≠ 3 | No |
doctor | object | Información del médico. Obligatorio si document_code = 3 | No |
document_code
Requerido integer
description
Opcional string
detail
Opcional string
doctor
Opcional object
Campos del objeto doctor
Validaciones para el objeto doctor dentro de other_docs
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
name | string | Nombre del médico (1-100 caracteres) | Sí |
service_type | integer | Tipo de servicio médico (1-6) | Sí |
nit | string | NIT del médico. Requerido si identification no se proporciona | No |
identification | string | Identificación del médico. Requerido si nit no se proporciona | No |
name
Requerido string
service_type
Requerido integer
nit
Opcional string
identification
Opcional string
Códigos de Documentos:
- Documento de Emisor
- Documento de Receptor
- Documento Médico
- Documento de Transporte
Consideraciones importantes:
- La sección es opcional, pero si se incluye, debe contener entre 1 y 10 documentos.
- Validaciones específicas:
description
: 1-100 caracteresdetail
: 1-300 caracteres
- Cuando
document_code = 3
(Documento Médico), el objetodoctor
es obligatorio y los camposdescription
ydetail
deben estar ausentes. - Para los otros códigos,
description
ydetail
son obligatorios ydoctor
debe estar ausente. - En
doctor
, debe proporcionarse o biennit
o bienidentification
, pero no ambos.
4. Related Documents (Documentos Relacionados)
Los documentos relacionados vinculan el DTE actual con documentos previos.
Estructura de Documentos Relacionados
"related_docs": [
{
"document_number": "string",
"document_type": "string",
"emission_date": "string",
"generation_type": 0
}
],
}
Campos de Documentos Relacionados
Validaciones para el objeto related_docs
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
document_type | string | Tipo de documento ('04': Nota de Remisión, '09': Doc. Contable Liquidación) | Sí |
generation_type | integer | Tipo de generación (1: Normal, 2: Contingencia) | Sí |
document_number | string | Número de documento (formato según generation_type) | Sí |
emission_date | string | Fecha de emisión en formato 'YYYY-MM-DD' | Sí |
document_type
Requerido string
generation_type
Requerido integer
document_number
Requerido string
emission_date
Requerido string
Consideraciones importantes:
- La sección es opcional, pero si existe, puede contener hasta 50 documentos.
- Validaciones específicas:
- Si
generation_type = 1
: document_number puede tener máximo 20 caracteres - Si
generation_type = 2
: document_number debe tener formato UUID emission_date
: No puede ser una fecha futura. Si generation_type es 2 no es necesario enviarlo
- Si
- Si hay documentos relacionados, entonces los ítems que referencian estos documentos deben incluir el campo
related_doc
con el número de documento correspondiente. - No se permiten tipos de documentos mixtos en la misma lista.
- Todos los documentos relacionados deben tener el mismo tipo.
5. Third Party Sale (Venta a Terceros)
Representa ventas realizadas por cuenta de un tercero.
Estructura de Venta a Terceros
"third_party_sale": {
"name": "string",
"nit": "string"
}
Campos de Venta a Terceros
Validaciones para el objeto third_party_sale
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
nit | string | NIT del tercero (formato NIT válido) | Sí |
name | string | Nombre del tercero | Sí |
nit
Requerido string
name
Requerido string
Consideraciones importantes:
- La sección es opcional.
- Si se incluye, todos sus campos son obligatorios.
- Cuando existe venta a terceros, todos los ítems deben tener su campo
related_doc
con referencia a un documento relacionado. - No se pueden mezclar ventas propias con ventas a terceros en el mismo documento.
Validaciones Comunes para Campos Opcionales
Existen algunas validaciones que aplican a todos los documentos tributarios electrónicos:
- Relaciones entre Campos: Si existe related_docs, los ítems que lo referencian deben incluir un related_doc válido que apunte a un documento listado.
- Validación de Extensión: La extensión es obligatoria si el total de la operación es ≥ $1,095.00 USD, de lo contrario es opcional.
- Campos Opcionales: Aunque un objeto sea opcional, si se incluye, sus campos requeridos se vuelven obligatorios según las reglas específicas de cada sección.