Ir al contenido

Boletas de Terceros

Las Boletas de Honorarios de Terceros son documentos tributarios que emiten las empresas cuando contratan servicios de terceros (personas naturales o jurídicas). A diferencia de las BHE donde el emisor presta el servicio, en las BHET el emisor es quien contrata y paga, mientras que el tercero es quien presta el servicio.


AspectoBHEBHET
EmisorPersona natural (presta servicio)Empresa (contrata servicio)
ReceptorDestinatario (recibe servicio)Tercero (presta servicio)
RetenciónPPM variable (13.75%)Fija 14.5%
Sin receptorsinDestinatario soportadoSiempre requiere tercero
Campo montomontoLiquidomontoNeto
Campo impuestoppmimpuesto

Antes de emitir una BHET necesitas:

  1. Un Emisor Tributario activo con clave tributaria delegada y servicio BOLETAS_TERCEROS habilitado
  2. Una API Key con uno de estos roles: ADMIN, SUPER-ADMIN, SII-EMISOR-BHET, o FULL-API
  3. Los datos del tercero (siempre requerido, no existe opción sin tercero)

El sistema soporta 3 modos de emisión que permiten balancear entre respuesta inmediata y tolerancia a fallas del SII.

ModoDescripciónRespuestaRecomendado
SINC_COMPLETOTodo síncrono: emitir + PDF interno + PDF SIIBHET completa con ambos PDFsCuando necesitas todo inmediato
SINC_PARCIALEmitir + PDF interno síncronos, PDF SII en backgroundBHET con folio + PDF internoDefault recomendado
ASINCRONOSolo valida y encola. Todo en backgroundID de intento para consultaAlta tolerancia a fallas

Tu App Redcumbre SII
│ │ │
│── POST /bhet ────────────▶│ │
│ (modo: SINC_PARCIAL) │ │
│ │── Emitir BHET ────────▶│
│ │◀── folioSii ──────────│
│ │ │
│ │── Genera PDF interno │
│ │ │
│◀── Response ──────────────│ │
│ (folioSii + pdfInternoUrl) │
│ (estadoPdfSii: PENDIENTE) │
│ │ │
│ [Background] │
│ │── Descarga PDF SII ───▶│
│ │◀── PDF ───────────────│
│ │ │
│◀── Webhook ───────────────│ │
│ (bhet.emision_terminada)│ │

Ventajas:

  • Respuesta rápida con folio y PDF personalizado
  • PDF SII se descarga en background con reintentos automáticos (hasta 7 días)
  • Si el SII tiene problemas, ya tienes el folio y un PDF válido

Tu App Redcumbre SII
│ │ │
│── POST /bhet ────────────▶│ │
│ (modo: ASINCRONO) │ │
│ │── Valida datos │
│ │── Encola emisión │
│ │ │
│◀── Response ──────────────│ │
│ (intentoId, estado: PENDIENTE) │
│ │ │
│ [Background] │
│ │── Emitir BHET ────────▶│
│ │◀── folioSii ──────────│
│ │── Genera PDF interno │
│ │ │
│◀── Webhook ───────────────│ │
│ (bhet.emitida) │ │

Ventajas:

  • Respuesta instantánea (solo valida y encola)
  • Reintentos automáticos por hasta 7 horas si el SII falla
  • Ideal para procesos batch o cuando no necesitas el resultado inmediato

Consultar estado:

Ventana de terminal
GET /{tenantSlug}/bhet/intento/{intentoId}

Existen 4 formas mutuamente excluyentes de especificar el tercero:

ModoCampoDescripciónCobra SII Lookup
1terceroIdID o RUT de contribuyente guardado en sistemaNo
2terceroDatos completos on-the-flyNo
3siiLookupObjeto lookup SII ya obtenidoNo
4lookupRutSolo RUT, sistema ejecuta lookup al SII

¿Tienes datos completos del tercero?
├── SÍ → ¿Están guardados en el sistema?
│ ├── SÍ → Usar Modo 1 (terceroId)
│ └── NO → Usar Modo 2 (tercero)
└── NO → ¿Ya hiciste lookup al SII previamente?
├── SÍ → Usar Modo 3 (siiLookup)
└── NO → Usar Modo 4 (lookupRut) ⚠️ Cobra SII Lookup

El tercero ya está guardado en el sistema (ContribuyenteMaestro). Puedes usar el ID o el RUT.

{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"terceroId": "78012039-8",
"prestaciones": [
{ "descripcion": "Servicio de consultoría", "valor": "150000" }
]
}

Pasas todos los datos manualmente sin necesidad de lookup.

{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"tercero": {
"rut": "78012039-8",
"nombres": "FIRERAISE SPA",
"domicilio": "Av. Providencia 1234, Of. 501",
"codigoRegion": "13",
"codigoComuna": "13101",
"email": "contacto@fireraise.cl"
},
"prestaciones": [
{ "descripcion": "Desarrollo de software", "valor": "250000" }
]
}

Campos del objeto tercero:

CampoTipoRequeridoDescripción
rutstringRUT del tercero (formato 12345678-9)
nombresstringRazón social o nombre completo
domiciliostringDirección completa
codigoRegionstringCódigo de región SII (ej: "13")
codigoComunastringCódigo de comuna SII (ej: "13101")
emailstringNoEmail para envío de boleta

Ya tienes el resultado de un lookup previo al SII.

{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"siiLookup": {
"rut": "78012039-8",
"razonSocial": "FIRERAISE SPA",
"direcciones": [
{
"direccion": "AV PROVIDENCIA 1234 OF 501",
"codigoComuna": "13101",
"comuna": "SANTIAGO"
}
],
"email": "contacto@fireraise.cl"
},
"prestaciones": [
{ "descripcion": "Consultoría estratégica", "valor": "180000" }
]
}

Solo pasas el RUT y el sistema ejecuta el lookup al SII.

{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"lookupRut": "78012039-8",
"prestaciones": [
{ "descripcion": "Asesoría legal", "valor": "200000" }
]
}

Ventana de terminal
POST /{tenantSlug}/bhet
Content-Type: application/json
Authorization: Bearer tu-api-key
{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"tercero": {
"rut": "78012039-8",
"nombres": "FIRERAISE SPA",
"domicilio": "Av. Providencia 1234, Of. 501",
"codigoRegion": "13",
"codigoComuna": "13101",
"email": "contacto@fireraise.cl"
},
"prestaciones": [
{ "descripcion": "Servicio de consultoría en sistemas", "valor": "150000" },
{ "descripcion": "Desarrollo de software", "valor": "75000" }
],
"modo": "SINC_PARCIAL",
"enviarBoletaPorEmail": true,
"correlationId": "mi-referencia-123"
}

Campos del Request:

CampoTipoRequeridoDescripción
emisorTributarioIdstringID del emisor tributario
prestacionesarrayLista de servicios (mín 1)
modoenumNoSINC_COMPLETO, SINC_PARCIAL (default), ASINCRONO
enviarBoletaPorEmailbooleanNoEnviar PDF al email del tercero
correlationIdstringNoID de correlación para tracking
fechaEmisionstringNoFecha de emisión personalizada (ver sección siguiente)

Por defecto, las boletas se emiten con la fecha actual del servidor. Sin embargo, en casos excepcionales puedes especificar una fecha anterior usando el campo fechaEmision.

El campo acepta formato ISO YYYY-MM-DD:

{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"terceroId": "78012039-8",
"prestaciones": [
{ "descripcion": "Servicio de consultoría", "valor": "150000" }
],
"fechaEmision": "2025-12-01"
}
RestricciónDescripción
No futurasLa fecha no puede ser posterior a hoy
Sin validación de plazosNo se valida contra plazos legales del SII
Fecha oficialEl SII registra esta fecha como fecha oficial del documento
Campo en PDFValor
Fecha de EmisiónLa fecha especificada (o fecha actual si no se especificó)
Fecha de ImpresiónSiempre la fecha actual al generar/regenerar el PDF

Esto permite identificar cuándo se prestó el servicio vs cuándo se generó el documento físico.

Campos de prestaciones[]:

Cada prestación puede especificarse de dos formas mutuamente excluyentes:

ModoCampos PermitidosCampos Prohibidos
Item libredescripcion, valorproductoId
Producto del catálogoproductoId, cantidad, descuentoPorcentajedescripcion, valor, precioUnitario, unidadMedida, codigoSku

Cuándo se permite precioUnitario con productos del catálogo:

Condición del Producto¿Permite precioUnitario?
esquemaPrecio: SIN_PRECIOSí (obligatorio)
permisoEdicion: LIBRE
permisoEdicion: DENTRO_RANGO_DESCUENTOSí (dentro del rango)
permisoEdicion: NO_PERMITIDANo

Especifica descripcion y valor directamente. Ideal para servicios únicos o personalizados.

{
"prestaciones": [
{ "descripcion": "Servicio de consultoría", "valor": "150000" }
]
}

Usa productoId para referenciar un producto configurado en el catálogo. El sistema calcula precios, descuentos y cantidades automáticamente.

{
"prestaciones": [
{
"productoId": "clxyz123abc",
"cantidad": 3,
"descuentoPorcentaje": 10
}
]
}

Response: Modo Síncrono (SINC_COMPLETO / SINC_PARCIAL)

Sección titulada «Response: Modo Síncrono (SINC_COMPLETO / SINC_PARCIAL)»
{
"success": true,
"data": {
"id": "cm5abc123def456",
"folioSii": "12345678",
"codigoBarras": "1234567800388FB4702C",
"fechaEmision": "2025-12-05T15:30:00Z",
"fechaEmisionSii": "2025-12-05T15:30:00Z",
"canalEmision": "API_SYNC",
"emisor": {
"rut": "76123456-7",
"razonSocial": "EMPRESA CONTRATANTE SPA"
},
"tercero": {
"rut": "78012039-8",
"nombre": "FIRERAISE SPA",
"domicilio": "AV PROVIDENCIA 1234 OF 501",
"codigoRegion": "13",
"codigoComuna": "13101",
"descComuna": "SANTIAGO"
},
"prestaciones": [
{
"descripcion": "Servicio de consultoría en sistemas",
"cantidad": 1,
"unidadMedida": "servicio",
"precioUnitario": 150000,
"valor": "150000"
}
],
"montoBruto": 225000,
"tasaImpuesto": 14.5,
"impuesto": 32625,
"montoNeto": 192375,
"estado": "EMITIDA",
"modoEmision": "SINC_PARCIAL",
"estadoPdfSii": "PENDIENTE",
"pdfInternoUrl": "https://storage.googleapis.com/.../interno.pdf",
"correlationId": "mi-referencia-123",
"createdAt": "2025-12-05T15:30:00Z"
}
}

{
"success": true,
"data": {
"modo": "ASINCRONO",
"intentoId": "cm5xyz789abc123",
"estado": "PENDIENTE",
"correlationId": "mi-referencia-123"
}
}

Para el modo ASINCRONO, consulta el estado del intento:

Ventana de terminal
GET /{tenantSlug}/bhet/intento/{intentoId}
Authorization: Bearer tu-api-key
{
"id": "cm5xyz789abc123",
"estado": "EMITIDA",
"bhet": {
"id": "cm5abc123xyz",
"folioSii": "123456789",
"codigoBarras": "ABC123...",
"estado": "EMITIDA",
"estadoPdfSii": "DISPONIBLE",
"pdfInternoUrl": "https://...",
"pdfSiiUrl": "https://..."
},
"intentos": 1,
"ultimoIntento": "2025-12-08T15:30:00Z",
"correlationId": "mi-referencia-123",
"createdAt": "2025-12-08T15:00:00Z",
"updatedAt": "2025-12-08T15:30:00Z"
}

Estados del intento:

EstadoDescripción
PENDIENTERegistrado en cola, pendiente de procesamiento
PROCESANDOEn proceso de emisión
EMITIDAEmitido exitosamente (tiene BHET asociada)
FALLIDAFalló después de agotar reintentos (~7 horas)

Cuando un producto tiene un descuento máximo configurado y necesitas aplicar un descuento mayor, debes usar el flujo de borradores con autorización.

¿Descuento excede el máximo del producto?
├── NO → Emitir directamente con POST /{tenantSlug}/bhet
└── SÍ → Flujo de autorización:
1. Crear borrador
2. Solicitar autorización
3. (Esperar aprobación por supervisor)
4. Emitir desde borrador autorizado

MétodoEndpointDescripción
POST/{tenantSlug}/bhet/borradoresCrear borrador
GET/{tenantSlug}/bhet/borradoresListar borradores
GET/{tenantSlug}/bhet/borradores/{id}Detalle de borrador
PATCH/{tenantSlug}/bhet/borradores/{id}Actualizar borrador
DELETE/{tenantSlug}/bhet/borradores/{id}Eliminar borrador
POST/{tenantSlug}/bhet/borradores/{id}/solicitar-autorizacionSolicitar autorización
POST/{tenantSlug}/bhet/borradores/{id}/emitirEmitir desde borrador

EstadoDescripciónAcciones Permitidas
BORRADOREditable, puede emitirse si no requiere autorizaciónEditar, eliminar, solicitar autorización, emitir
EN_AUTORIZACIONEsperando aprobación de supervisorSolo lectura
AUTORIZADOAprobado, listo para emitirEmitir
RECHAZADORechazado por supervisorEditar, eliminar
EMITIDOYa se emitió la BHETSolo lectura

Crea un nuevo borrador a partir de una BHET emitida o un borrador existente. Útil para emisiones recurrentes al mismo tercero.

Ventana de terminal
POST /{tenantSlug}/bhet/{id}/clonar
Authorization: Bearer tu-api-key

Response:

{
"success": true,
"data": {
"borradorId": "cm5newborrador123",
"mensaje": "Borrador creado desde BHET"
}
}
Ventana de terminal
POST /{tenantSlug}/bhet/borradores/{id}/clonar
Authorization: Bearer tu-api-key

Response:

{
"success": true,
"data": {
"borradorId": "cm5newborrador456",
"mensaje": "Borrador clonado exitosamente"
}
}

El sistema genera dos tipos de PDF:

TipoDescripciónDisponibilidad
PDF InternoGenerado con template personalizado del tenantInmediato (modo síncrono)
PDF SIIRespaldo oficial descargado del SIIDepende de disponibilidad del SII

EstadoDescripción
NO_APLICAModo SINC_COMPLETO exitoso o sandbox
PENDIENTEEn cola para descarga
DISPONIBLEDescargado exitosamente
FALLIDOAgotó reintentos después de 7 días

Ventana de terminal
GET /{tenantSlug}/bhet/{id}/archivos

Response:

{
"success": true,
"data": [
{
"id": "archivo-001",
"tipo": "INTERNO",
"templateId": "template-001",
"templateName": "Template Carta",
"fileName": "bhet_12345678_interno.pdf",
"url": "https://...",
"sizeBytes": 125000,
"createdAt": "2025-12-05T15:30:00Z",
"createdBy": "Sistema"
},
{
"id": "archivo-002",
"tipo": "SII",
"templateId": null,
"templateName": null,
"fileName": "bhet_12345678_sii.pdf",
"url": "https://...",
"sizeBytes": 98000,
"createdAt": "2025-12-05T15:35:00Z",
"createdBy": "SII"
}
]
}

Ventana de terminal
GET /{tenantSlug}/bhet?fechaDesde=2025-01-01&estado=EMITIDA&limit=50
Authorization: Bearer tu-api-key

Filtros disponibles:

ParámetroTipoDescripción
fechaDesdeISO 8601Fecha de inicio del rango
fechaHastaISO 8601Fecha de fin del rango
emisorTributarioIdstringFiltrar por emisor
terceroRutstringFiltrar por RUT del tercero
estadoenumEMITIDA, ERROR
canalEmisionenumUI, API_SYNC, API_ASYNC
folioSiistringBuscar por folio (substring)
limitnumberRegistros por página (default: 50, max: 100)
offsetnumberRegistros a saltar (default: 0)

Ventana de terminal
GET /{tenantSlug}/bhet/{id}
Authorization: Bearer tu-api-key

Ventana de terminal
POST /{tenantSlug}/bhet/{id}/archivos/{archivoId}/enviar-email
Content-Type: application/json
Authorization: Bearer tu-api-key
{
"email": "destinatario@email.cl"
}

El sistema envía webhooks para 4 eventos relacionados con BHET:

EventoDescripciónCuándo se dispara
bhet.emitidaBHET emitida exitosamenteInmediatamente después de emitir
bhet.emision_terminadaPDF SII disponibleCuando se descarga el PDF SII en background
bhet.pdf_sii_fallidoDescarga PDF SII fallóDespués de 7 días de reintentos fallidos
bhet.emision_fallidaEmisión asíncrona fallóDespués de ~7 horas de reintentos (modo ASINCRONO)

{
"event": "bhet.emitida",
"tenantId": "8",
"bhetId": "cm5abc123",
"folioSii": "12345678",
"emisor": {
"rut": "76123456-7",
"razonSocial": "EMPRESA CONTRATANTE SPA"
},
"tercero": {
"rut": "78012039-8",
"nombre": "FIRERAISE SPA"
},
"montos": {
"bruto": 225000,
"impuesto": 32625,
"neto": 192375
},
"canalEmision": "API_SYNC",
"correlationId": "mi-referencia-123",
"sandbox": false,
"timestamp": "2025-12-05T15:30:00Z"
}

El sistema calcula automáticamente los montos:

Monto Bruto = Suma de todas las prestaciones
Impuesto = Monto Bruto × 14.5%
Monto Neto = Monto Bruto - Impuesto

CódigoDescripción
MULTIPLE_TERCERO_MODESSe especificó más de un modo de tercero
TERCERO_REQUIREDNo se especificó ningún modo de tercero
CONTRIBUYENTE_NOT_FOUNDID/RUT no existe en ContribuyenteMaestro (modo 1)
INVALID_COMUNA_CODEcodigoComuna no existe en catálogo (modo 2)
SII_LOOKUP_FAILEDLookup al SII falló (modo 4)
EMISOR_NO_HABILITADOEl emisor no tiene el servicio BHET habilitado
CódigoDescripción
SII_AUTH_FAILEDCredenciales incorrectas (RUT/clave tributaria)
SII_RUT_INVALIDORUT del emisor o tercero no válido
SII_DATOS_INVALIDOSDatos de la boleta incorrectos

EstadoDescripción
EMITIDAEmitida correctamente en el SII (tiene folio y código de barras)
ERRORError inmediato no reintentable

Utiliza el modo sandbox para probar la integración sin costo:

  • API Keys con isSandbox: true retornan datos de prueba
  • No se realizan llamadas reales al SII
  • No se genera billing
  • Webhooks funcionan normalmente

RUTResultadoDescripción
78012039-8✅ ÉxitoEmpresa completa (FIRERAISE SPA)
77425402-1✅ ÉxitoEmpresa con múltiples direcciones
13830230-k✅ ÉxitoPersona natural (PDF SII pendiente)
99999999-9❌ ErrorTercero no existe en SII

Ejemplo en sandbox:

Ventana de terminal
POST /{tenantSlug}/bhet
Authorization: Bearer sandbox-api-key
{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"lookupRut": "78012039-8",
"prestaciones": [
{ "descripcion": "Servicio de prueba", "valor": "100000" }
]
}

Response (sandbox):

{
"success": true,
"data": {
"id": "sandbox-bhet-001",
"folioSii": "SBX1234567890",
"codigoBarras": "78012039SBX1234567890SANDBOX",
"estado": "EMITIDA",
...
},
"sandbox": true
}

Para detalles técnicos completos y especificaciones de todos los endpoints:

👉 Ver endpoints de BHET en Swagger