Connect

Consultar boletas de honorarios del SII

Lee las boletas de honorarios electrónicas (BHE) ya sincronizadas para esta conexión, filtradas por período y/o perspectiva (emitidas = las que emitió esta empresa; recibidas = las que le emitieron, donde esta empresa es el agente retenedor).

Tool IDsii.boletas_honorarios.consultar
Nombre MCPsii__boletas_honorarios__consultar
Conectorsii
Planoaction
Lee el alcanceboletas_honorarios (debe estar habilitado en la conexión)
Scope (permiso)sii:read
Authnone
Versión2
Sensiblesí
Deprecadono
ComportamientoreadOnly=true, destructive=false, idempotent=true, openWorld=false

Requiere conexión. Indica cuál en cada llamada: header X-Connect-Connection en REST, campo connectionId en el execute de MCP y en las opciones del SDK. No hay resolución implícita, ni siquiera con una sola conexión activa: la conexión es la empresa. El id sale de conexiones.estado.consultar.

Qué hace

Lectura pura: NO dispara una sincronización nueva ni contacta al SII. Si el mes no está cargado, devuelve una lista vacía y 'sincronizacion: null': no es cero movimiento. Para traer datos nuevos, usa 'sii.conexion.sincronizar' primero. El filtro tributario canónico es 'estado' distinto de 'S' sobre el código crudo: 'V' (anulación pendiente), 'R' y 'U' (observadas) siguen VIGENTES; solo 'S' está anulada: nunca filtres por 'estadoNormalizado' igual a 'vigente'. El 'estado' es el observado en la última sincronización del período, no el estado final: una BHE puede anularse, o revertir de anulación pendiente a vigente, hasta el 1 de marzo del año siguiente, y por petición administrativa sin plazo después. Resincroniza el período para refrescarlo; 'ultimaLecturaEn' dice cuándo se observó cada fila. La suma de 'retencion_receptor' es el insumo para cuadrar el F29 código 151, no el código 151: ese además incluye las retenciones por BTE y se imputa al mes del pago. Pagina con 'cursor': cuando la respuesta trae 'cursor' distinto de null, hay más filas. reenvía ese valor tal cual en 'cursor' para pedir la página siguiente; nunca lo construyas a mano.

Entrada

CampoTipoRequeridoDescripción
periodostring ^\d{4}-\d{2}$noUn mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato.
perspectiva"emitidas" · "recibidas"noemitidas = las que emitió esta empresa; recibidas = las que le emitieron, donde esta empresa es el agente retenedor. Sin este filtro vienen las dos.
cursorstringnoPaginación: el valor que devolvió la respuesta anterior, tal cual.
limitentero 1-500no · default 100Filas por página.
JSON Schema de entrada
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "periodo": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "description": "Un mes, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Cada sitio de uso afina qué significa ahí: en una sincronización es el mes que se va a traer, y en una consulta a la caché es el filtro. Esta descripción base existe para que el campo nunca llegue pelado a quien lee el contrato."
    },
    "perspectiva": {
      "description": "emitidas = las que emitió esta empresa; recibidas = las que le emitieron, donde esta empresa es el agente retenedor. Sin este filtro vienen las dos.",
      "type": "string",
      "enum": [
        "emitidas",
        "recibidas"
      ]
    },
    "cursor": {
      "description": "Paginación: el valor que devolvió la respuesta anterior, tal cual.",
      "type": "string"
    },
    "limit": {
      "default": 100,
      "description": "Filas por página.",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  }
}

Ejemplo

curl
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.boletas_honorarios.consultar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{"input":{"periodo":"2026-07","perspectiva":"recibidas"}}'
SDK TypeScript
const data = await connect.tools.sii.boletas_honorarios.consultar({ periodo: "2026-07", perspectiva: "recibidas" }, { connectionId: "conn_9tKfR2mQx4Vb" });
MCP · meta-tool execute
{
  "tool": "sii.boletas_honorarios.consultar",
  "params": {
    "periodo": "2026-07",
    "perspectiva": "recibidas"
  },
  "connectionId": "conn_9tKfR2mQx4Vb"
}

Salida esperada (200):

{
  "data": {
    "documentos": [
      {
        "folio": "153",
        "perspectiva": "recibidas",
        "periodo": "2026-07",
        "fechaBoletaDate": "2026-07-08",
        "fechaBoleta": "08/07/2026",
        "rutContraparte": "12345678-5",
        "razonSocialContraparte": "María José Riquelme Fuentes",
        "codigoBarras": "108452276390415387",
        "honorariosBrutos": 500000,
        "retencionEmisor": 0,
        "retencionReceptor": 76250,
        "honorariosLiquidos": 423750,
        "estado": "N",
        "estadoNormalizado": "vigente",
        "esSocProfesional": "NO",
        "fechaEventoEstadoDate": null,
        "fechaEventoEstado": null,
        "ultimaLecturaEn": "2026-08-06T03:15:42.000Z"
      },
      {
        "folio": "154",
        "perspectiva": "recibidas",
        "periodo": "2026-07",
        "fechaBoletaDate": "2026-07-24",
        "fechaBoleta": "24/07/2026",
        "rutContraparte": "12345678-5",
        "razonSocialContraparte": "María José Riquelme Fuentes",
        "codigoBarras": "108452276390415512",
        "honorariosBrutos": 350000,
        "retencionEmisor": 0,
        "retencionReceptor": 53375,
        "honorariosLiquidos": 296625,
        "estado": "V",
        "estadoNormalizado": "vigente_anulacion_pendiente",
        "esSocProfesional": "NO",
        "fechaEventoEstadoDate": "2026-07-30",
        "fechaEventoEstado": "30/07/2026",
        "ultimaLecturaEn": "2026-08-06T03:15:42.000Z"
      }
    ],
    "cursor": null,
    "sincronizacion": {
      "sincronizadoEn": "2026-08-06T03:15:42.000Z",
      "completo": true,
      "incompletos": 0,
      "fueraDeVentana": null,
      "perspectivasFallidas": []
    }
  },
  "meta": {
    "request_id": "req_…",
    "tool_id": "sii.boletas_honorarios.consultar",
    "plane": "action",
    "latency_ms": 24,
    "audit_status": "recorded"
  }
}

Recortado a dos boletas, elegidas para mostrar lo que 'new Date(fechaBoleta)' hace con datos reales: '08/07/2026' se lee como el 7 de agosto sin avisar y '24/07/2026' da Invalid Date; 'fechaEventoEstado' viaja en el mismo formato y falla igual. Ordena y filtra siempre por 'fechaBoletaDate' y 'fechaEventoEstadoDate' (AAAA-MM-DD) y compáralas como texto. En 'recibidas' esta empresa es el agente retenedor: 'retencionReceptor' se descuenta de 'honorariosBrutos' y 'honorariosLiquidos' es lo que recibe el profesional. La segunda boleta está en 'V' (anulación pendiente) y sigue vigente para el filtro tributario.

Salida

CampoTipoRequeridoDescripción
documentoslista de objetosíLas boletas de honorarios que calzan con el filtro, una por fila. Sale de la caché ya sincronizada, nunca de una consulta en vivo al SII.
documentos[].foliostringsíEl número de la boleta, tal cual lo manda el SII y como texto: puede traer ceros a la izquierda o no ser numérico, y no se normaliza.
documentos[].perspectiva"emitidas" · "recibidas"síemitidas = las boletas que emitió esta empresa; recibidas = las que le emitieron, donde esta empresa es el agente retenedor.
documentos[].periodostringsíEl período tributario de la boleta, en formato AAAA-MM.
documentos[].fechaBoletastringsíDeprecado. No la pases por new Date(). Es la fecha tal cual la manda el SII, en formato chileno DD/MM/AAAA. JavaScript la lee como MM/DD: '07/09/2026' te da el 9 de julio y '28/08/2026' te da Invalid Date. Usa 'fechaBoletaDate': AAAA-MM-DD, null cuando no se pudo parsear. Es un día calendario sin zona horaria: compáralo como texto o con Date.UTC, porque new Date('2026-09-07') es medianoche UTC y en Chile se muestra como el 6.
documentos[].fechaBoletaDatestringnullsí
documentos[].razonSocialContrapartestringsíEl nombre o razón social del otro lado: en 'recibidas' es el profesional que emitió, en 'emitidas' es el receptor.
documentos[].codigoBarrasstringsíEl código de barras con que el SII identifica la boleta. Es único por boleta dentro del informe.
documentos[].honorariosBrutosenterosíEl honorario bruto en pesos chilenos: lo facturado antes de descontar la retención.
documentos[].retencionEmisorenterosíLa retención declarada por el propio emisor, en pesos chilenos. En 'recibidas' llega siempre en 0 porque ese informe no expone el campo: ahí la retención que importa es 'retencionReceptor'.
documentos[].retencionReceptorenterosíLa retención que hizo el receptor como agente retenedor, en pesos chilenos. Su suma es el insumo para cuadrar el código 151 del F29, no el código 151 en sí.
documentos[].honorariosLiquidosenterosíLo que recibe el profesional: el bruto menos la retención, en pesos chilenos.
documentos[].estadostringsíEl código de estado tal cual lo manda el SII: 'N' vigente, 'S' anulada, 'V' anulación pendiente, 'R' y 'U' observadas. El filtro tributario correcto es 'estado' distinto de 'S', porque 'V', 'R' y 'U' siguen vigentes.
documentos[].estadoNormalizado"vigente" · "anulada" · "vigente_anulacion_pendiente" · "observada_receptor" · "observada_unidad" · "desconocido"síEl mismo estado traducido a un enum estable. No lo uses para filtrar lo vigente: 'vigente_anulacion_pendiente', 'observada_receptor' y 'observada_unidad' también lo están. Un código que no reconocemos sale 'desconocido' y nunca se omite de un cómputo.
documentos[].esSocProfesionalstringnullsí
documentos[].fechaEventoEstadostringnullsí
documentos[].fechaEventoEstadoDatestringnullsí
documentos[].rutContrapartestringnullsí
documentos[].ultimaLecturaEnstringsíCuándo se observó esta fila por última vez, en ISO 8601 UTC. Una boleta de honorarios es mutable hasta el 1 de marzo del año siguiente: si esta marca es vieja, resincroniza el período antes de decidir sobre su estado.
cursorstringnullsí
sincronizacionobjetonullsí
sincronizacion.sincronizadoEnstringsíCuándo terminó la última sincronización de este período, en ISO 8601 UTC. Es la frescura del dato que estás leyendo.
sincronizacion.completobooleanonullsí
sincronizacion.incompletosenteronullsí
sincronizacion.fueraDeVentanaenteronullsí
sincronizacion.perspectivasFallidaslista de objetosíQué direcciones fallaron en esa sincronización, con su código de error. La pueblan las guías de despacho y las boletas de honorarios; para los demás llega vacía.
sincronizacion.perspectivasFallidas[].perspectiva"emitidas" · "recibidas"síQué lado falló: 'emitidas' son las que emitió esta empresa y 'recibidas' las que le emitieron.
sincronizacion.perspectivasFallidas[].codestringsíEl código del catálogo de errores que explica por qué falló ese lado. Decide por el código, nunca por el texto.
JSON Schema de salida
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "documentos": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "folio": {
            "type": "string",
            "description": "El número de la boleta, tal cual lo manda el SII y como texto: puede traer ceros a la izquierda o no ser numérico, y no se normaliza."
          },
          "perspectiva": {
            "type": "string",
            "enum": [
              "emitidas",
              "recibidas"
            ],
            "description": "emitidas = las boletas que emitió esta empresa; recibidas = las que le emitieron, donde esta empresa es el agente retenedor."
          },
          "periodo": {
            "type": "string",
            "description": "El período tributario de la boleta, en formato AAAA-MM."
          },
          "fechaBoleta": {
            "type": "string",
            "deprecated": true,
            "x-emisso-formato": "DD/MM/AAAA",
            "x-emisso-canonico": "fechaBoletaDate",
            "x-emisso-admite-vacio": false,
            "description": "No la pases por new Date(). Es la fecha tal cual la manda el SII, en formato chileno DD/MM/AAAA. JavaScript la lee como MM/DD: '07/09/2026' te da el 9 de julio y '28/08/2026' te da Invalid Date. Usa 'fechaBoletaDate': AAAA-MM-DD, null cuando no se pudo parsear. Es un día calendario sin zona horaria: compáralo como texto o con Date.UTC, porque new Date('2026-09-07') es medianoche UTC y en Chile se muestra como el 6."
          },
          "fechaBoletaDate": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "x-emisso-formato": "AAAA-MM-DD",
            "description": "La misma fecha de la boleta en formato AAAA-MM-DD, o null si no se pudo parsear. Es un día calendario sin zona horaria: compáralo como texto o con Date.UTC, porque new Date('2026-09-07') es medianoche UTC y en Chile se muestra como el 6. Es el campo que conviene usar para ordenar y filtrar."
          },
          "razonSocialContraparte": {
            "type": "string",
            "description": "El nombre o razón social del otro lado: en 'recibidas' es el profesional que emitió, en 'emitidas' es el receptor."
          },
          "codigoBarras": {
            "type": "string",
            "description": "El código de barras con que el SII identifica la boleta. Es único por boleta dentro del informe."
          },
          "honorariosBrutos": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "El honorario bruto en pesos chilenos: lo facturado antes de descontar la retención."
          },
          "retencionEmisor": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "La retención declarada por el propio emisor, en pesos chilenos. En 'recibidas' llega siempre en 0 porque ese informe no expone el campo: ahí la retención que importa es 'retencionReceptor'."
          },
          "retencionReceptor": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "La retención que hizo el receptor como agente retenedor, en pesos chilenos. Su suma es el insumo para cuadrar el código 151 del F29, no el código 151 en sí."
          },
          "honorariosLiquidos": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Lo que recibe el profesional: el bruto menos la retención, en pesos chilenos."
          },
          "estado": {
            "type": "string",
            "description": "El código de estado tal cual lo manda el SII: 'N' vigente, 'S' anulada, 'V' anulación pendiente, 'R' y 'U' observadas. El filtro tributario correcto es 'estado' distinto de 'S', porque 'V', 'R' y 'U' siguen vigentes."
          },
          "estadoNormalizado": {
            "type": "string",
            "enum": [
              "vigente",
              "anulada",
              "vigente_anulacion_pendiente",
              "observada_receptor",
              "observada_unidad",
              "desconocido"
            ],
            "description": "El mismo estado traducido a un enum estable. No lo uses para filtrar lo vigente: 'vigente_anulacion_pendiente', 'observada_receptor' y 'observada_unidad' también lo están. Un código que no reconocemos sale 'desconocido' y nunca se omite de un cómputo."
          },
          "esSocProfesional": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Si el emisor es una sociedad de profesionales, tal cual lo manda el SII. Es texto crudo, no un booleano, y puede venir 'null'."
          },
          "fechaEventoEstado": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "x-emisso-formato": "DD/MM/AAAA",
            "x-emisso-canonico": "fechaEventoEstadoDate",
            "x-emisso-admite-vacio": false,
            "description": "No la pases por new Date(). Es la fecha tal cual la manda el SII, en formato chileno DD/MM/AAAA. JavaScript la lee como MM/DD: '07/09/2026' te da el 9 de julio y '28/08/2026' te da Invalid Date. Es cuándo el SII registró el evento que dejó la boleta en su estado actual: cubre anulación, solicitud de anulación y observación, no sólo la anulación. 'null' cuando el SII no informó la fecha. Usa 'fechaEventoEstadoDate': AAAA-MM-DD, null cuando no se pudo parsear. Es un día calendario sin zona horaria: compáralo como texto o con Date.UTC, porque new Date('2026-09-07') es medianoche UTC y en Chile se muestra como el 6."
          },
          "fechaEventoEstadoDate": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "x-emisso-formato": "AAAA-MM-DD",
            "description": "La misma fecha del evento de estado en formato AAAA-MM-DD, o null si no vino o no se pudo parsear. Es un día calendario sin zona horaria: compáralo como texto o con Date.UTC, porque new Date('2026-09-07') es medianoche UTC y en Chile se muestra como el 6. Es el campo que conviene usar para ordenar y filtrar."
          },
          "rutContraparte": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "El RUT del otro lado: en 'recibidas' es el profesional que emitió y en 'emitidas' es el receptor. 'null' cuando la boleta se emitió sin receptor, que el SII permite."
          },
          "ultimaLecturaEn": {
            "type": "string",
            "description": "Cuándo se observó esta fila por última vez, en ISO 8601 UTC. Una boleta de honorarios es mutable hasta el 1 de marzo del año siguiente: si esta marca es vieja, resincroniza el período antes de decidir sobre su estado."
          }
        },
        "required": [
          "folio",
          "perspectiva",
          "periodo",
          "fechaBoleta",
          "fechaBoletaDate",
          "razonSocialContraparte",
          "codigoBarras",
          "honorariosBrutos",
          "retencionEmisor",
          "retencionReceptor",
          "honorariosLiquidos",
          "estado",
          "estadoNormalizado",
          "esSocProfesional",
          "fechaEventoEstado",
          "fechaEventoEstadoDate",
          "rutContraparte",
          "ultimaLecturaEn"
        ],
        "additionalProperties": false
      },
      "description": "Las boletas de honorarios que calzan con el filtro, una por fila. Sale de la caché ya sincronizada, nunca de una consulta en vivo al SII."
    },
    "cursor": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "El cursor de la página siguiente, opaco. 'null' significa que no hay más filas; cualquier otro valor se reenvía tal cual en 'cursor' de la próxima llamada y nunca se construye a mano."
    },
    "sincronizacion": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "sincronizadoEn": {
              "type": "string",
              "description": "Cuándo terminó la última sincronización de este período, en ISO 8601 UTC. Es la frescura del dato que estás leyendo."
            },
            "completo": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "description": "'true' = el período se cargó entero. 'false' = quedaron casillas sin traer. 'null' = se está cargando o no hay registro de ese intento."
            },
            "incompletos": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                {
                  "type": "null"
                }
              ],
              "description": "Cuántas casillas quedaron sin traer en esa sincronización. 'null' cuando no se puede saber."
            },
            "fueraDeVentana": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                {
                  "type": "null"
                }
              ],
              "description": "Sólo aplica a guías: cuántas direcciones cayeron fuera de la ventana de 6 meses que el SII conserva. Un 0 dice que se verificó y no aplicó; 'null', que no aplica o no se conoce."
            },
            "perspectivasFallidas": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "perspectiva": {
                    "type": "string",
                    "enum": [
                      "emitidas",
                      "recibidas"
                    ],
                    "description": "Qué lado falló: 'emitidas' son las que emitió esta empresa y 'recibidas' las que le emitieron."
                  },
                  "code": {
                    "type": "string",
                    "description": "El código del catálogo de errores que explica por qué falló ese lado. Decide por el código, nunca por el texto."
                  }
                },
                "required": [
                  "perspectiva",
                  "code"
                ],
                "additionalProperties": false
              },
              "description": "Qué direcciones fallaron en esa sincronización, con su código de error. La pueblan las guías de despacho y las boletas de honorarios; para los demás llega vacía."
            }
          },
          "required": [
            "sincronizadoEn",
            "completo",
            "incompletos",
            "fueraDeVentana",
            "perspectivasFallidas"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Completitud del último sync del período consultado. Con 'periodo', 'null' y una lista vacía significa que ese mes no está cargado: dilo, no lo informes como cero (revisa 'historico' en 'conexiones.estado.consultar'). Sin 'periodo' siempre es 'null': usa ese bloque para saber qué meses hay."
    }
  },
  "required": [
    "documentos",
    "cursor",
    "sincronizacion"
  ],
  "additionalProperties": false
}

Errores de esta tool

CódigoHTTPReintentableQué hacer
connection_disabled403noReactívala en /connections o usa otra conexión del mismo sistema.
alcance_not_enabled403noHabilita el alcance en /connections o quítalo del input de la sincronización.

Toda llamada puede devolver además los códigos transversales (validation_error, unauthorized, scope_not_granted, rate_limited, entre otros): el detalle vive en el catálogo de errores.

Próximos pasos

En esta página