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
Authorization: Bearer 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)
tipoRetencionenumRETRECEPTOR o RETCONTRIBUYENTE
validarCatalogobooleanNoForzar validación contra catálogo de productos
modoenumNoSINC_COMPLETO, SINC_PARCIAL (default), ASINCRONO
enviarBoletaPorEmailbooleanNoEnviar PDF al email del destinatario
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",
"sinDestinatario": false,
"destinatarioId": "12345678-9",
"prestaciones": [
{ "descripcion": "Servicio de consultoría", "valor": "150000" }
],
"tipoRetencion": "RETRECEPTOR",
"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

Con productoId:

  • Solo enviar: productoId (requerido), cantidad (default: 1), descuentoPorcentaje (opcional, 0-100%)
  • El sistema calcula automáticamente: precio, descripción, unidad de medida, valor total
  • Si envías campos prohibidos, recibirás error 400

Sin productoId (item libre):

  • Enviar: descripcion (requerido, máx 80 chars), valor (requerido, string numérico en CLP)
  • No hay validación de catálogo

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

El sistema soporta dos modos de especificar prestaciones:

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

Cuando usas productoId, el sistema valida automáticamente:

ValidaciónDescripción
ExistenciaEl producto debe existir y pertenecer al tenant
EstadoEl producto debe estar en estado ACTIVO
TipoEl producto debe ser tipo SERVICIO (no PRODUCTO)
ILAEl producto NO debe tener impuesto adicional (ILA)
VisibilidadEl producto debe tener visibleEnBhe: true
DescuentoEl descuentoPorcentaje no puede exceder el máximo configurado en el producto

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": [
{
"productoId": "clxyz123abc",
"codigoSku": "SRV-00001",
"descripcion": "Consultoría especializada",
"cantidad": 3,
"unidadMedida": "hora",
"precioUnitario": 50000,
"descuentoPorcentaje": 10,
"descuentoMonto": 15000,
"valor": "135000"
},
{
"descripcion": "Desarrollo de software",
"cantidad": 1,
"unidadMedida": "unidad",
"precioUnitario": 75000,
"descuentoPorcentaje": 0,
"descuentoMonto": 0,
"valor": "75000"
}
],
"tipoRetencion": "RETRECEPTOR",
"montoBruto": 210000,
"ppm": 28875,
"montoLiquido": 181125,
"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}
Authorization: Bearer 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)

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}/bhe
└── 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}/bhe/borradoresCrear borrador
GET/{tenantSlug}/bhe/borradoresListar borradores
GET/{tenantSlug}/bhe/borradores/{id}Detalle de borrador
PATCH/{tenantSlug}/bhe/borradores/{id}Actualizar borrador
DELETE/{tenantSlug}/bhe/borradores/{id}Eliminar borrador
POST/{tenantSlug}/bhe/borradores/{id}/solicitar-autorizacionSolicitar autorización
POST/{tenantSlug}/bhe/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 BHESolo lectura

Cuando una línea requiere autorización, incluye motivoAutorizacion:

Ventana de terminal
POST /{tenantSlug}/bhe/borradores
Content-Type: application/json
Authorization: Bearer tu-api-key
{
"emisorTributarioId": "cmitg28qt0009serjtjcrejci",
"sinDestinatario": false,
"destinatarioId": "12345678-9",
"prestaciones": [
{
"productoId": "clxyz123abc",
"cantidad": 2,
"descuentoPorcentaje": 25,
"motivoAutorizacion": "Cliente VIP con contrato anual"
}
],
"tipoRetencion": "RETRECEPTOR"
}

Response:

{
"success": true,
"data": {
"id": "cm5borrador123",
"estado": "BORRADOR",
"requiereAutorizacion": true,
"lineasConAutorizacion": [
{
"lineaIndex": 0,
"productoId": "clxyz123abc",
"descuentoSolicitado": 25,
"descuentoMaximo": 15,
"motivoAutorizacion": "Cliente VIP con contrato anual"
}
],
"montoBruto": 75000,
"ppm": 10313,
"montoLiquido": 64687,
"createdAt": "2025-12-08T10:00:00Z"
}
}

Ventana de terminal
POST /{tenantSlug}/bhe/borradores/{id}/solicitar-autorizacion
Authorization: Bearer tu-api-key

Response:

{
"success": true,
"data": {
"id": "cm5borrador123",
"estado": "EN_AUTORIZACION",
"solicitudAutorizacionId": "cm5auth456"
},
"message": "Solicitud de autorización enviada. Recibirás una notificación cuando sea procesada."
}

Una vez autorizado:

Ventana de terminal
POST /{tenantSlug}/bhe/borradores/{id}/emitir
Authorization: Bearer tu-api-key

Response:

{
"success": true,
"data": {
"bheId": "cm5bhe789",
"folioSii": "12345678",
"estado": "EMITIDA",
"mensaje": "BHE emitida exitosamente desde borrador"
}
}

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

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

Response:

{
"success": true,
"data": {
"borradorId": "cm5newborrador123",
"mensaje": "Borrador creado desde BHE"
}
}
Ventana de terminal
POST /{tenantSlug}/bhe/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 (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
Authorization: Bearer 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
Authorization: Bearer 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
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
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}
Authorization: Bearer tu-api-key

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

Ventana de terminal
POST /{tenantSlug}/bhe/{id}/enviar-email
Authorization: Bearer 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
Authorization: Bearer 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
Authorization: Bearer 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