Comprobante de Crédito Fiscal (CCF)
Esta sección describe cómo emitir y gestionar Comprobantes de Crédito Fiscal (CCF) mediante la API.
Crear Comprobante de Crédito Fiscal
/api/v1/dte/ccf
Crea y emite un Comprobante de Crédito Fiscal
Este endpoint permite crear y emitir un Comprobante de Crédito Fiscal (CCF) electrónico.
Ejemplo de Solicitud
Request
{
"items": [
{
"type": 1,
"description": "Venta gravada",
"quantity": 1,
"unit_measure": 59,
"unit_price": 2000.00,
"taxed_sale": 2000.00,
"exempt_sale": 0,
"non_subject_sale": 0,
"taxes": [
"20"
]
}
],
"receiver": {
"nrc": "0000",
"nit": "00000000000000",
"name": "CLIENTE DE PRUEBA",
"commercial_name": "EJEMPLO S.A de S.V",
"activity_code": "00000",
"activity_description": "ACTIVIDAD ECONOMICA DE EJEMPLO",
"address": {
"department": "06",
"municipality": "22",
"complement": "Dirección de Prueba 1, N° 1234"
},
"phone": "21212828",
"email": "cliente@gmail.com"
},
"summary": {
"operation_condition": 1,
"total_taxed": 2000.00,
"total_exempt": 0,
"total_non_taxed": 0,
"total_non_subject": 0,
"sub_total_sales": 2000.00,
"sub_total": 2000.00,
"iva_perception": 0,
"iva_retention": 0,
"income_retention": 0,
"total_operation": 2260.00,
"total_to_pay": 2260.00,
"taxes": [
{
"code": "20",
"description": "IVA 13%",
"value": 260.00
}
],
"payment_types": [
{
"code": "01",
"amount": 2260.00
}
]
},
// 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": 3,
"ambiente": "00",
"tipoDte": "03",
"numeroControl": "DTE-03-C0020000-000000000000001",
"codigoGeneracion": "96B3D5DD-EE92-4...",
"tipoModelo": 1,
"tipoOperacion": 1,
"tipoContingencia": null,
"motivoContin": null,
"fecEmi": "2025-04-12",
"horEmi": "19:38:32",
"tipoMoneda": "USD"
},
"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": "21212121",
"correo": "facturacion@empresa.com.sv",
"nombreComercial": "EJEMPLO",
"codEstableMH": null,
"codEstable": "C002",
"codPuntoVentaMH": null,
"codPuntoVenta": null
},
"receptor": {
"nombre": "CLIENTE DE PRUEBA",
"nrc": "0000",
"nit": "00000000000000",
"codActividad": "00000",
"descActividad": "ACTIVIDAD ECONOMICA DE EJEMPLO",
"direccion": {
"departamento": "06",
"municipio": "22",
"complemento": "Dirección de Prueba 1, N° 1234"
},
"telefono": "21212828",
"correo": "cliente@gmail.com",
"nombreComercial": "EJEMPLO S.A de S.V"
},
"cuerpoDocumento": [
{
"numItem": 1,
"tipoItem": 1,
"numeroDocumento": null,
"codigo": null,
"codTributo": null,
"descripcion": "Venta gravada",
"cantidad": 1,
"uniMedida": 59,
"precioUni": 2000,
"montoDescu": 0,
"ventaNoSuj": 0,
"ventaExenta": 0,
"ventaGravada": 2000,
"tributos": [
"20"
],
"psv": 0,
"noGravado": 0
}
],
"resumen": {
"totalNoSuj": 0,
"totalExenta": 0,
"totalGravada": 2000,
"subTotalVentas": 2000,
"descuNoSuj": 0,
"descuExenta": 0,
"descuGravada": 0,
"porcentajeDescuento": 0,
"totalDescu": 0,
"tributos": [
{
"codigo": "20",
"descripcion": "IVA 13%",
"valor": 260
}
],
"subTotal": 2000,
"ivaRete1": 0,
"ivaPerci1": 0,
"reteRenta": 0,
"montoTotalOperacion": 2260,
"totalNoGravado": 0,
"totalPagar": 2260,
"totalLetras": "DOS MIL DOSCIENTOS SESENTA 00/100",
"saldoFavor": 0,
"condicionOperacion": 1,
"pagos": [
{
"codigo": "01",
"montoPago": 2260,
"referencia": null,
"plazo": null,
"periodo": null
}
],
"numPagoElectronico": null
},
"documentoRelacionado": null,
"otrosDocumentos": null,
"ventaTercero": null,
"extension": null,
"apendice": [
{
"campo": "Datos del documento",
"etiqueta": "Sello de recepción",
"valor": "202533D8A3CB39484D..."
}
]
}
}
Campos principales
Campos necesarios para crear un CCF
Campo | Tipo | Descripción | Requerido |
---|---|---|---|
items | array | Lista de productos o servicios | Sí |
items[].type | number | Tipo de ítem (1: Producto, 2: Servicio, 3: Ambos, 4: Impuesto) | Sí |
items[].description | string | Descripción del producto o servicio (1-1000 caracteres) | Sí |
items[].quantity | number | Cantidad (> 0) | Sí |
items[].unit_measure | number | Unidad de medida (1-99) | Sí |
items[].unit_price | number | Precio unitario (≥ 0) | Sí |
items[].discount | number | Descuento (≥ 0) | No |
items[].code | string | Código del producto (1-25 caracteres) | No |
items[].non_subject_sale | number | Venta no sujeta (≥ 0) | Sí |
items[].exempt_sale | number | Venta exenta (≥ 0) | Sí |
items[].taxed_sale | number | Venta gravada (≥ 0) | Sí |
items[].suggested_price | number | Precio sugerido (≥ 0) | No |
items[].non_taxed | number | Monto no gravado (≥ 0) | No |
items[].iva_item | number | IVA del ítem | No |
receiver | object | Información del receptor | Sí |
receiver.nrc | string | Número de registro fiscal del receptor | Sí |
receiver.nit | string | NIT del receptor | Sí |
receiver.name | string | Nombre completo o razón social del receptor | Sí |
receiver.activity_code | string | Código de actividad económica | Sí |
receiver.activity_description | string | Descripción de actividad económica | Sí |
receiver.commercial_name | string | Nombre comercial del receptor | Sí |
receiver.address | object | Dirección del receptor | Sí |
receiver.address.department | string | Código del departamento | Sí |
receiver.address.municipality | string | Código del municipio | Sí |
receiver.address.complement | string | Dirección completa | Sí |
receiver.phone | string | Teléfono del receptor | Sí |
receiver.email | string | Correo electrónico del receptor | Sí |
summary | object | Resumen de totales | Sí |
summary.total_non_subject | number | Total ventas no sujetas | Sí |
summary.total_exempt | number | Total ventas exentas | Sí |
summary.total_taxed | number | Total ventas gravadas | Sí |
summary.sub_total | number | Subtotal | Sí |
summary.total_discount | number | Total descuentos | No |
summary.sub_total_sales | number | Subtotal de ventas | Sí |
summary.total_operation | number | Total operación | Sí |
summary.total_to_pay | number | Total a pagar | Sí |
summary.operation_condition | number | Condición de operación (1: Contado, 2: Crédito, 3: Otro) | Sí |
summary.iva_retention | number | IVA retenido | No |
summary.total_iva | number | Total IVA | No |
summary.payment_types | array | Tipos de pago | Sí |
summary.payment_types[].code | string | Código forma de pago | Sí |
summary.payment_types[].amount | number | Monto | Sí |
summary.payment_types[].term | string | Plazo (requerido para crédito) | No |
summary.payment_types[].period | number | Período | No |
items
Requerido array
items[].type
Requerido number
items[].description
Requerido string
items[].quantity
Requerido number
items[].unit_measure
Requerido number
items[].unit_price
Requerido number
items[].discount
Opcional number
items[].code
Opcional string
items[].non_subject_sale
Requerido number
items[].exempt_sale
Requerido number
items[].taxed_sale
Requerido number
items[].suggested_price
Opcional number
items[].non_taxed
Opcional number
items[].iva_item
Opcional number
receiver
Requerido object
receiver.nrc
Requerido string
receiver.nit
Requerido string
receiver.name
Requerido string
receiver.activity_code
Requerido string
receiver.activity_description
Requerido string
receiver.commercial_name
Requerido string
receiver.address
Requerido object
receiver.address.department
Requerido string
receiver.address.municipality
Requerido string
receiver.address.complement
Requerido string
receiver.phone
Requerido string
receiver.email
Requerido string
summary
Requerido object
summary.total_non_subject
Requerido number
summary.total_exempt
Requerido number
summary.total_taxed
Requerido number
summary.sub_total
Requerido number
summary.total_discount
Opcional number
summary.sub_total_sales
Requerido number
summary.total_operation
Requerido number
summary.total_to_pay
Requerido number
summary.operation_condition
Requerido number
summary.iva_retention
Opcional number
summary.total_iva
Opcional number
summary.payment_types
Requerido array
summary.payment_types[].code
Requerido string
summary.payment_types[].amount
Requerido number
summary.payment_types[].term
Opcional string
summary.payment_types[].period
Opcional number
Validaciones específicas para CCF
- El receptor es OBLIGATORIO y debe incluir NRC, NIT, código de actividad, descripción de actividad y nombre comercial
- Para ítems tipo 4 (impuesto), la unidad de medida debe ser 99
- Solo se permite impuesto IVA (código "20") para ítems tipo 4
- Si hay documentos relacionados, cada ítem debe tener un documento relacionado válido
- El cálculo de IVA debe ser exactamente 13% sobre (venta gravada - descuento gravado)
- La suma de todos los tipos de pago debe ser igual al total a pagar
- Los descuentos no pueden superar el subtotal
- Si la condición de operación es crédito, los campos term y period son obligatorios
Diferencias entre CCF y Factura
-
Para CCF, los items con
taxed_sale > 0
ytype = 1
deben incluir impuestos con código "20" (IVA 13%) - No se permite mezclar ventas gravadas y no gravadas en un mismo ítem
- El receptor es obligatorio y debe incluir información completa del contribuyente
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.