Ir al contenido

Boletas de Honorarios

Las Boletas de Honorarios Electrónicas son documentos tributarios que emiten las personas naturales por servicios profesionales prestados. Nuestra API permite emitir BHE con diferentes modos de emisión, gestionar PDFs y recibir notificaciones vía webhook.


Antes de emitir una BHE necesitas:

  1. Un Emisor Tributario activo con clave tributaria delegada (no certificado digital)
  2. Una API Key con uno de estos roles: ADMIN, SUPER-ADMIN, SII-EMISOR-BHE, o FULL-API
  3. Los datos del destinatario (o usar sinDestinatario: true para emitir sin destinatario)

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 SIIBHE completa con ambos PDFsCuando necesitas todo inmediato
SINC_PARCIALEmitir + PDF interno síncronos, PDF SII en backgroundBHE con folio + PDF internoDefault recomendado
ASINCRONOSolo valida y encola. Todo en backgroundID de intento para consultaAlta tolerancia a fallas

Tu App Redcumbre SII
│ │ │
│── POST /bhe ─────────────▶│ │
│ (modo: SINC_PARCIAL) │ │
│ │── Emitir BHE ─────────▶│
│ │◀── folioSii ──────────│
│ │ │
│ │── Genera PDF interno │
│ │ │
│◀── Response ──────────────│ │
│ (folioSii + pdfInternoUrl) │
│ (estadoPdfSii: PENDIENTE) │
│ │ │
│ [Background] │
│ │── Descarga PDF SII ───▶│
│ │◀── PDF ───────────────│
│ │ │
│◀── Webhook ───────────────│ │
│ (bhe.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 /bhe ─────────────▶│ │
│ (modo: ASINCRONO) │ │
│ │── Valida datos │
│ │── Encola emisión │
│ │ │
│◀── Response ──────────────│ │
│ (intentoId, estado: PENDIENTE) │
│ │ │
│ [Background] │
│ │── Emitir BHE ─────────▶│
│ │◀── folioSii ──────────│
│ │── Genera PDF interno │
│ │ │
│◀── Webhook ───────────────│ │
│ (bhe.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}/bhe/intento/{intentoId}

Cuando sinDestinatario=false, existen 4 formas mutuamente excluyentes de especificar el destinatario:

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

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

Modo 1: destinatarioId (Contribuyente Guardado)

Sección titulada «Modo 1: destinatarioId (Contribuyente Guardado)»

El destinatario ya está guardado en el sistema (ContribuyenteMaestro).

{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"sinDestinatario": false,
"destinatarioId": "12345678-9",
"prestaciones": [
{ "descripcion": "Servicio de consultoría", "valor": "150000" }
],
"tipoRetencion": "RETRECEPTOR"
}

Pasas todos los datos manualmente sin necesidad de lookup.

{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"sinDestinatario": false,
"destinatario": {
"rut": "12345678-9",
"nombres": "EMPRESA CLIENTE SA",
"direccion": "Av. Providencia 1234, Of. 501",
"codigoRegion": "13",
"codigoComuna": "13101",
"email": "contacto@empresa.cl"
},
"prestaciones": [
{ "descripcion": "Servicio de consultoría", "valor": "150000" }
],
"tipoRetencion": "RETRECEPTOR"
}

Campos del objeto destinatario:

CampoTipoRequeridoDescripción
rutstringRUT del destinatario (formato 12345678-9)
nombresstringRazón social o nombre completo
direccionstringDirecció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",
"sinDestinatario": false,
"siiLookup": {
"rut": "12345678-9",
"razonSocial": "EMPRESA CLIENTE SA",
"direcciones": [
{
"direccion": "AV PROVIDENCIA 1234 OF 501",
"codigoComuna": "13101",
"comuna": "SANTIAGO"
}
],
"email": "contacto@empresa.cl"
},
"prestaciones": [
{ "descripcion": "Servicio de consultoría", "valor": "150000" }
],
"tipoRetencion": "RETRECEPTOR"
}

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

{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"sinDestinatario": false,
"lookupRut": "12345678-9",
"prestaciones": [
{ "descripcion": "Servicio de consultoría", "valor": "150000" }
],
"tipoRetencion": "RETRECEPTOR"
}

Ventana de terminal
POST /{tenantSlug}/bhe
Content-Type: application/json
X-API-Key: tu-api-key
{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"sinDestinatario": false,
"destinatario": {
"rut": "12345678-9",
"nombres": "EMPRESA CLIENTE SA",
"direccion": "Av. Providencia 1234, Of. 501",
"codigoRegion": "13",
"codigoComuna": "13101",
"email": "contacto@empresa.cl"
},
"prestaciones": [
{ "descripcion": "Servicio de consultoría en sistemas", "valor": "150000" },
{ "descripcion": "Desarrollo de software", "valor": "75000" }
],
"tipoRetencion": "RETRECEPTOR",
"modo": "SINC_PARCIAL",
"enviarBoletaPorEmail": true,
"correlationId": "mi-referencia-123"
}

Campos del Request:

CampoTipoRequeridoDescripción
emisorTributarioIdstringID del emisor tributario
sinDestinatariobooleantrue para emitir sin destinatario
prestacionesarrayLista de servicios (mín 1, máx 4)
prestaciones[].descripcionstringDescripción del servicio (máx 80 chars)
prestaciones[].valorstringMonto en CLP (string numérico)
tipoRetencionenumRETRECEPTOR o RETCONTRIBUYENTE
modoenumNoSINC_COMPLETO, SINC_PARCIAL (default), ASINCRONO
enviarBoletaPorEmailbooleanNoEnviar PDF al email del destinatario
correlationIdstringNoID de correlación para tracking

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": "78012039-8",
"razonSocial": "JUAN PÉREZ GONZÁLEZ"
},
"destinatario": {
"rut": "12345678-9",
"nombres": "EMPRESA CLIENTE SA",
"sinDestinatario": false
},
"prestaciones": [
{ "descripcion": "Servicio de consultoría en sistemas", "valor": "150000" },
{ "descripcion": "Desarrollo de software", "valor": "75000" }
],
"tipoRetencion": "RETRECEPTOR",
"montoBruto": 225000,
"ppm": 30938,
"montoLiquido": 194062,
"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,
"intentoId": "cm5xyz789abc123",
"correlationId": "mi-referencia-123",
"estado": "PENDIENTE",
"mensaje": "Emisión encolada para procesamiento asíncrono. Consulte el estado o espere webhook."
}

Para el modo ASINCRONO, consulta el estado del intento:

Ventana de terminal
GET /{tenantSlug}/bhe/intento/{intentoId}
X-API-Key: tu-api-key
{
"id": "cm5xyz789abc123",
"estado": "EMITIDA",
"bhe": {
"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 BHE asociada)
FALLIDAFalló después de agotar reintentos (~7 horas)

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 (ya tiene PDF) o boleta no emitida
PENDIENTEEn cola para descarga
DISPONIBLEDescargado exitosamente
FALLIDOAgotó reintentos después de 7 días

Ventana de terminal
# Descarga automática (prioriza PDF SII > PDF Interno)
GET /{tenantSlug}/bhe/{id}/pdf
# PDF Interno específico (template personalizado)
GET /{tenantSlug}/bhe/{id}/pdf/interno
# PDF SII específico (respaldo oficial)
GET /{tenantSlug}/bhe/{id}/pdf/sii

Todos retornan redirect 302 a la URL del PDF.


Ventana de terminal
POST /{tenantSlug}/bhe/{id}/pdf/generate
Content-Type: application/json
X-API-Key: tu-api-key
{
"templateId": "cm5template123"
}

Response:

{
"success": true,
"data": {
"archivoId": "cm5archivo789",
"url": "https://storage.googleapis.com/.../custom.pdf",
"templateId": "cm5template123",
"fileName": "bhe_12345678_custom.pdf"
}
}

Si el PDF SII está en estado FALLIDO, puedes forzar un reintento:

Ventana de terminal
POST /{tenantSlug}/bhe/{id}/reintentar-pdf-sii
X-API-Key: tu-api-key

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

Response:

{
"success": true,
"data": [
{
"id": "archivo-001",
"tipo": "INTERNO",
"templateId": "template-001",
"templateName": "Template Carta",
"fileName": "bhe_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": "bhe_12345678_sii.pdf",
"url": "https://...",
"sizeBytes": 98000,
"createdAt": "2025-12-05T15:35:00Z",
"createdBy": "SII"
}
]
}

Ventana de terminal
GET /{tenantSlug}/bhe?fechaDesde=2025-01-01&estado=EMITIDA&limit=50
X-API-Key: tu-api-key

Filtros disponibles:

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

Response:

{
"data": [
{ /* BheResponseDto */ }
],
"total": 100,
"limit": 50,
"offset": 0
}

Ventana de terminal
GET /{tenantSlug}/bhe/{id}
X-API-Key: tu-api-key

Envía el PDF de la boleta al email del destinatario configurado:

Ventana de terminal
POST /{tenantSlug}/bhe/{id}/enviar-email
X-API-Key: tu-api-key

Requisitos:

  • BHE debe estar en estado EMITIDA
  • Debe tener destinatarioEmail configurado
  • Debe tener al menos un PDF disponible

Enviar Archivo Específico a Email Arbitrario

Sección titulada «Enviar Archivo Específico a Email Arbitrario»
Ventana de terminal
POST /{tenantSlug}/bhe/{id}/archivos/{archivoId}/enviar-email
Content-Type: application/json
X-API-Key: tu-api-key
{
"email": "otro@email.cl"
}

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

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

{
"event": "bhe.emitida",
"tenantId": "8",
"bheId": "cm5abc123",
"folioSii": "12345678",
"emisor": {
"rut": "78012039-8",
"razonSocial": "JUAN PÉREZ GONZÁLEZ"
},
"destinatario": {
"rut": "12345678-9",
"nombre": "EMPRESA CLIENTE SA",
"sinDestinatario": false
},
"montos": {
"bruto": 225000,
"ppm": 30938,
"liquido": 194062
},
"tipoRetencion": "RETRECEPTOR",
"canalEmision": "API_SYNC",
"correlationId": "mi-referencia-123",
"sandbox": false,
"timestamp": "2025-12-05T15:30:00Z"
}

Se envía cuando el PDF SII está disponible (solo para modos SINC_PARCIAL y ASINCRONO):

{
"event": "bhe.emision_terminada",
"tenantId": "8",
"bheId": "cm5abc123",
"folioSii": "12345678",
"pdfInternoUrl": "https://storage.googleapis.com/.../interno.pdf",
"pdfSiiUrl": "https://storage.googleapis.com/.../sii.pdf",
"estadoPdfSii": "DISPONIBLE",
"timestamp": "2025-12-05T15:35:00Z"
}

Se envía después de 7 días de reintentos fallidos:

{
"event": "bhe.pdf_sii_fallido",
"tenantId": "8",
"bheId": "cm5abc123",
"folioSii": "12345678",
"intentosRealizados": 30,
"primerIntento": "2025-12-01T15:30:00Z",
"ultimoIntento": "2025-12-08T15:30:00Z",
"ultimoError": "SII_PDF_NO_DISPONIBLE",
"timestamp": "2025-12-08T15:30:00Z"
}

Se envía cuando una emisión asíncrona falla después de ~7 horas de reintentos:

{
"event": "bhe.emision_fallida",
"tenantId": "8",
"correlationId": "mi-referencia-123",
"intentosRealizados": 15,
"primerIntento": "2025-12-08T10:00:00Z",
"ultimoIntento": "2025-12-08T17:00:00Z",
"ultimoError": "SII_SERVICE_UNAVAILABLE",
"timestamp": "2025-12-08T17:00:00Z"
}

El sistema calcula automáticamente los montos:

Monto Bruto = Suma de todas las prestaciones
PPM = Monto Bruto × 13.75% (tasa actual 2024-2025)
Monto Líquido = Monto Bruto - PPM

Tipos de Retención:

TipoDescripción
RETRECEPTOREl receptor/pagador retiene el PPM (más común)
RETCONTRIBUYENTEEl emisor retiene su propio PPM

CódigoDescripción
MULTIPLE_DESTINATARIO_MODESSe especificó más de un modo de destinatario
DESTINATARIO_REQUIREDNo se especificó ningún modo (y sinDestinatario=false)
CONTRIBUYENTE_NOT_FOUNDRUT no existe en ContribuyenteMaestro (modo 1)
INVALID_COMUNA_CODEcodigoComuna no existe en catálogo (modo 2)
SII_LOOKUP_FAILEDLookup al SII falló (modo 4)
CódigoDescripción
SII_SIN_SEGUNDA_CATEGORIAContribuyente sin actividades de segunda categoría
SII_PERSONA_JURIDICALas BHE solo son para personas naturales
SII_NO_HABILITADOContribuyente no habilitado para emitir BHE
SII_AUTH_FAILEDCredenciales incorrectas (RUT/clave tributaria)
SII_RUT_INVALIDORUT del emisor o destinatario no válido
SII_DATOS_INVALIDOSDatos de la boleta incorrectos
SII_CERTIFICADO_ERRORError con certificado digital
CódigoDescripción
PDF_NOT_AVAILABLENo hay PDF disponible para descargar
PDF_SII_NOT_AVAILABLEPDF SII no disponible (revisa estadoPdfSii)

EstadoDescripción
EMITIDAEmitida correctamente en el SII (tiene folio y código de barras)
ANULADABoleta anulada
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❌ ErrorDestinatario no existe en SII

Ejemplo en sandbox:

Ventana de terminal
POST /{tenantSlug}/bhe
X-API-Key: sandbox-api-key
{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"sinDestinatario": false,
"lookupRut": "78012039-8",
"prestaciones": [
{ "descripcion": "Servicio de prueba", "valor": "100000" }
],
"tipoRetencion": "RETRECEPTOR"
}

Response (sandbox):

{
"success": true,
"data": {
"id": "sandbox-bhe-001",
"folioSii": "SANDBOX-12345678",
"codigoBarras": "SANDBOX7801203988FB4702C...",
"estado": "EMITIDA",
...
},
"sandbox": true
}

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

👉 Ver endpoints de BHE en Swagger