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

POST /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

items

Requerido
array
Lista de productos o servicios que componen la factura

items[].type

Requerido
integer
Tipo de ítem (1: Producto, 2: Servicio, 3: Ambos, 4: Impuesto)

items[].code

Opcional
string
Código del producto o servicio

items[].description

Requerido
string
Descripción del ítem (1-1000 caracteres)

items[].quantity

Requerido
number
Cantidad del ítem (debe ser mayor que 0)

items[].unit_measure

Requerido
integer
Unidad de medida según catálogo

items[].unit_price

Requerido
number
Precio unitario (debe ser mayor o igual a 0)

items[].discount

Opcional
number
Monto de descuento para el ítem
Predeterminado: 0

items[].taxed_sale

Opcional
number
Venta gravada (debe ser mayor o igual a 0)
Predeterminado: 0

items[].exempt_sale

Opcional
number
Venta exenta (debe ser mayor o igual a 0)
Predeterminado: 0

items[].non_subject_sale

Opcional
number
Venta no sujeta (debe ser mayor o igual a 0)
Predeterminado: 0

items[].non_taxed

Opcional
number
Monto no gravado (debe ser mayor o igual a 0)
Predeterminado: 0

items[].iva_item

Opcional
number
Monto de IVA del ítem (13% de la venta gravada)

items[].suggested_price

Opcional
number
Precio sugerido de venta
Predeterminado: 0

items[].tax_code

Opcional
string
Código de impuesto

items[].taxes

Opcional
array
Lista de impuestos aplicables al ítem

items[].related_doc

Opcional
string
Referencia a documento relacionado

receiver

Requerido
object
Información del receptor o cliente

receiver.document_type

Requerido
string
Tipo de documento (13: DUI, 36: NIT, etc.)

receiver.document_number

Requerido
string
Número de documento del receptor

receiver.name

Requerido
string
Nombre del receptor

receiver.address

Requerido
object
Dirección del receptor

receiver.address.department

Requerido
string
Código de departamento del receptor

receiver.address.municipality

Requerido
string
Código de municipio del receptor

receiver.address.complement

Requerido
string
Complemento de la dirección del receptor

receiver.nrc

Opcional
string
Número de Registro de Contribuyente

receiver.activity_code

Opcional
string
Código de actividad económica

receiver.activity_description

Opcional
string
Descripción de actividad económica

receiver.phone

Opcional
string
Teléfono del receptor

receiver.email

Opcional
string
Correo electrónico del receptor

summary

Requerido
object
Resumen de totales de la factura

summary.total_taxed

Requerido
number
Total de ventas gravadas

summary.total_exempt

Requerido
number
Total de ventas exentas
Predeterminado: 0

summary.total_non_subject

Requerido
number
Total de ventas no sujetas
Predeterminado: 0

summary.total_non_taxed

Requerido
number
Total no gravado
Predeterminado: 0

summary.sub_total

Requerido
number
Subtotal de la factura

summary.sub_total_sales

Requerido
number
Subtotal de ventas

summary.discount_percentage

Requerido
number
Porcentaje de descuento
Predeterminado: 0

summary.taxed_discount

Requerido
number
Descuento gravado
Predeterminado: 0

summary.exempt_discount

Requerido
number
Descuento exento
Predeterminado: 0

summary.non_subject_discount

Requerido
number
Descuento no sujeto
Predeterminado: 0

summary.total_discount

Requerido
number
Total de descuentos
Predeterminado: 0

summary.total_operation

Requerido
number
Total de la operación

summary.total_to_pay

Requerido
number
Total a pagar

summary.total_iva

Opcional
number
Total de IVA

summary.iva_retention

Opcional
number
Retención de IVA
Predeterminado: 0

summary.income_retention

Opcional
number
Retención de renta
Predeterminado: 0

summary.balance_in_favor

Opcional
number
Saldo a favor
Predeterminado: 0

summary.operation_condition

Requerido
integer
Condición de operación (1: Contado, 2: Crédito)

summary.payment_types

Requerido
array
Tipos de pago utilizados

summary.payment_types[].code

Requerido
string
Código del tipo de pago

summary.payment_types[].amount

Requerido
number
Monto del pago

summary.payment_types[].period

Opcional
integer
Período de pago (obligatorio si operation_condition = 2)

summary.payment_types[].term

Opcional
string
Plazo de pago (obligatorio si operation_condition = 2)

summary.taxes

Opcional
array
Impuestos aplicados a la factura
Indica campo obligatorio

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 a total_to_pay
  • Si operation_condition = 1 (contado), no puede haber term ni period
  • Si operation_condition = 2 (crédito):
    • term y period 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

field

Requerido
string
Nombre del campo adicional (2-25 caracteres)

label

Requerido
string
Etiqueta o título del campo (3-50 caracteres)

value

Requerido
string
Valor del campo (1-150 caracteres)
Indica campo obligatorio

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

delivery_name

Requerido
string
Nombre de quien entrega (1-100 caracteres)

delivery_document

Requerido
string
Documento de quien entrega (1-25 caracteres, DUI o NIT por ejemplo)

receiver_name

Requerido
string
Nombre de quien recibe (1-100 caracteres)

receiver_document

Requerido
string
Documento de quien recibe (1-25 caracteres, DUI o NIT por ejemplo)

observation

Opcional
string
Observaciones adicionales (Máximo 3000 caracteres)

vehicule_plate

Opcional
string
Placa del vehículo (1-10 caracteres)
Indica campo obligatorio

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

document_code

Requerido
integer
Código del documento (1-4)

description

Opcional
string
Descripción del documento. Obligatorio si document_code ≠ 3

detail

Opcional
string
Detalle del documento. Obligatorio si document_code ≠ 3

doctor

Opcional
object
Información del médico. Obligatorio si document_code = 3
Indica campo obligatorio

Campos del objeto doctor

Validaciones para el objeto doctor dentro de other_docs

name

Requerido
string
Nombre del médico (1-100 caracteres)

service_type

Requerido
integer
Tipo de servicio médico (1-6)

nit

Opcional
string
NIT del médico. Requerido si identification no se proporciona

identification

Opcional
string
Identificación del médico. Requerido si nit no se proporciona
Indica campo obligatorio

Códigos de Documentos:

  1. Documento de Emisor
  2. Documento de Receptor
  3. Documento Médico
  4. 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 caracteres
    • detail: 1-300 caracteres
  • Cuando document_code = 3 (Documento Médico), el objeto doctor es obligatorio y los campos description y detail deben estar ausentes.
  • Para los otros códigos, description y detail son obligatorios y doctor debe estar ausente.
  • En doctor, debe proporcionarse o bien nit o bien identification, 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

document_type

Requerido
string
Tipo de documento ('04': Nota de Remisión, '09': Doc. Contable Liquidación)

generation_type

Requerido
integer
Tipo de generación (1: Normal, 2: Contingencia)

document_number

Requerido
string
Número de documento (formato según generation_type)

emission_date

Requerido
string
Fecha de emisión en formato 'YYYY-MM-DD'
Indica campo obligatorio

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 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

nit

Requerido
string
NIT del tercero (formato NIT válido)

name

Requerido
string
Nombre del tercero
Indica campo obligatorio

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.