Consultar documentos respaldados del SII
Lista los documentos tributarios (DTE) cuyo XML firmado ya se respaldó para esta conexión, filtrables por período, perspectiva y tipo de documento.
| Tool ID | sii.documentos.consultar |
| Nombre MCP | sii__documentos__consultar |
| Conector | sii |
| Plano | action |
| Lee el alcance | documentos (debe estar habilitado en la conexión) |
| Scope (permiso) | sii:read |
| Auth | none |
| Versión | 2 |
| Sensible | sí |
| Deprecado | no |
| Comportamiento | readOnly=true, destructive=false, idempotent=true, openWorld=false |
Requiere conexión. Indica cuál en cada llamada: header
X-Connect-Connectionen REST, campoconnectionIden elexecutede 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 deconexiones.estado.consultar.
Qué hace
Devuelve SOLO las columnas de cabecera: ni el XML ni el detalle de ítems viaja aquí. Para el detalle de UN documento (sus ítems con cantidad, unidad y precio, los giros y direcciones de emisor y receptor, y la forma de pago) usa 'sii.documentos.detallar' con el 'tipoDte', el 'folio' y el 'rutEmisor' de la fila correspondiente. Lectura pura: NO dispara una sincronización nueva ni contacta al SII. Si el período nunca se sincronizó, devuelve una lista vacía y 'sincronizacion: null'; para traer datos nuevos usa 'sii.conexion.sincronizar' primero. Este respaldo es lo que el RCV no tiene y no puede tener: el RCV dice qué documentos EXISTEN, este respaldo trae el documento. Sólo lo sirven las conexiones cuya credencial es la clave tributaria de una persona que representa a la empresa. 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
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
periodo | string ^\d{4}-\d{2}$ | no | Período tributario AAAA-MM. Sin él, la respuesta cruza períodos y 'sincronizacion' llega null. |
perspectiva | "emitidos" · "recibidos" | no | emitidos = la empresa es el emisor; recibidos = es el receptor. |
tipoDte | entero | no | Filtra por tipo de documento: 33, 34, 46, 52, 56 o 61. El portal no respalda boletas (39/41). |
cursor | string | no | Paginación: el valor que devolvió la respuesta anterior, tal cual. |
limit | entero 1-500 | no · default 100 | Filas por página. |
JSON Schema de entrada
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"periodo": {
"description": "Período tributario AAAA-MM. Sin él, la respuesta cruza períodos y 'sincronizacion' llega null.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}$"
},
"perspectiva": {
"description": "emitidos = la empresa es el emisor; recibidos = es el receptor.",
"type": "string",
"enum": [
"emitidos",
"recibidos"
]
},
"tipoDte": {
"description": "Filtra por tipo de documento: 33, 34, 46, 52, 56 o 61. El portal no respalda boletas (39/41).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"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 -X POST https://connect.emisso.ai/api/v1/tools/sii.documentos.consultar/execute \
-H "Authorization: Bearer connect_sk_…" \
-H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
-H "Content-Type: application/json" \
-d '{"input":{"periodo":"2026-06","perspectiva":"recibidos","tipoDte":33}}'const data = await connect.tools.sii.documentos.consultar({ periodo: "2026-06", perspectiva: "recibidos", tipoDte: 33 }, { connectionId: "conn_9tKfR2mQx4Vb" });{
"tool": "sii.documentos.consultar",
"params": {
"periodo": "2026-06",
"perspectiva": "recibidos",
"tipoDte": 33
},
"connectionId": "conn_9tKfR2mQx4Vb"
}Salida esperada (200):
{
"data": {
"documentos": [
{
"tipoDte": 33,
"folio": "4712",
"rutEmisor": "76111222-8",
"rutReceptor": "77777777-7",
"razonSocialContraparte": "Proveedor Ejemplo SpA",
"perspectiva": "recibidos",
"periodo": "2026-06",
"fechaEmision": "2026-06-14",
"montoNeto": 1000000,
"iva": 190000,
"montoTotal": 1190000,
"estado": "REGISTRADO",
"dteHash": "9f2c1b7a4e5d8c3f0a6b9e2d4c7f1a8b5e3d6c9f2a4b7e1d8c5f3a6b9e2d4c7f",
"ultimaLecturaEn": "2026-08-09T03:15:42.000Z"
}
],
"cursor": null,
"sincronizacion": {
"sincronizadoEn": "2026-08-09T03:15:42.000Z",
"completo": true,
"incompletos": 0,
"fueraDeVentana": null,
"perspectivasFallidas": []
}
},
"meta": {
"request_id": "req_…",
"tool_id": "sii.documentos.consultar",
"plane": "action",
"latency_ms": 24,
"audit_status": "recorded"
}
}Recortado a un documento. Para ver sus ítems, giros y forma de pago, llama a 'sii.documentos.detallar' con { tipoDte: 33, folio: '4712', rutEmisor: '76111222-8' }.
Salida
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
documentos | lista de objeto | sí | Los documentos respaldados que calzan con el filtro, sólo con sus columnas de cabecera. Ni el XML ni el detalle de ítems viaja aquí: para eso usa 'sii.documentos.detallar'. |
documentos[].tipoDte | entero | sí | Código del tipo de DTE: 33 factura, 34 exenta, 46 factura de compra, 52 guía, 56 nota de débito, 61 nota de crédito. |
documentos[].folio | string | sí | El folio del documento, en TEXTO decimal canónico (sin ceros a la izquierda). Junto con 'tipoDte' y 'rutEmisor' lo identifica de forma única, y es el valor que 'sii.documentos.detallar' espera TAL CUAL. Es texto y no un número a propósito: un folio es un identificador con el que no se hace aritmética, y hay folios reales que no caben en un entero de 32 bits. |
documentos[].rutEmisor | string | sí | Quien EMITIÓ el documento. Junto con tipoDte y folio identifica al documento de forma única. |
documentos[].rutReceptor | string | sí | Quien RECIBIÓ el documento: en una fila 'emitidos' es la contraparte, en 'recibidos' es la empresa de esta conexión. |
documentos[].razonSocialContraparte | string | sí | La razón social del lado que NO es la empresa de esta conexión. |
documentos[].perspectiva | "emitidos" · "recibidos" | sí | emitidos = esta empresa es el emisor; recibidos = es el receptor. Es DERIVADA del documento, no del filtro. |
documentos[].periodo | string | sí | El período tributario con que se sincronizó el documento, en formato AAAA-MM. |
documentos[].fechaEmision | string | null | sí |
documentos[].montoNeto | entero | null | sí |
documentos[].iva | entero | null | sí |
documentos[].montoTotal | entero | sí | Puede ser 0 legítimamente: una guía de traslado interno o una nota que corrige sólo texto lo exige por XSD. |
documentos[].estado | string | null | sí |
documentos[].dteHash | string | sí | sha256 del XML guardado. Un DTE firmado es inmutable: si cambia entre sincronizaciones, algo se movió. |
documentos[].ultimaLecturaEn | string | sí | Cuándo se observó esta fila por última vez, en ISO 8601 UTC. El 'estado' es el de esa lectura y no el final: resincroniza el período para refrescarlo. |
cursor | string | null | sí |
sincronizacion | objeto | null | sí |
sincronizacion.sincronizadoEn | string | sí | 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.completo | booleano | null | sí |
sincronizacion.incompletos | entero | null | sí |
sincronizacion.fueraDeVentana | entero | null | sí |
sincronizacion.perspectivasFallidas | lista de objeto | sí | Qué direcciones fallaron enteras en esa sincronización, con su código de error. Hoy sólo la puebla el alcance de 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[].code | string | sí | 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": {
"tipoDte": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Código del tipo de DTE: 33 factura, 34 exenta, 46 factura de compra, 52 guía, 56 nota de débito, 61 nota de crédito."
},
"folio": {
"type": "string",
"description": "El folio del documento, en TEXTO decimal canónico (sin ceros a la izquierda). Junto con 'tipoDte' y 'rutEmisor' lo identifica de forma única, y es el valor que 'sii.documentos.detallar' espera TAL CUAL. Es texto y no un número a propósito: un folio es un identificador con el que no se hace aritmética, y hay folios reales que no caben en un entero de 32 bits."
},
"rutEmisor": {
"type": "string",
"description": "Quien EMITIÓ el documento. Junto con tipoDte y folio identifica al documento de forma única."
},
"rutReceptor": {
"type": "string",
"description": "Quien RECIBIÓ el documento: en una fila 'emitidos' es la contraparte, en 'recibidos' es la empresa de esta conexión."
},
"razonSocialContraparte": {
"type": "string",
"description": "La razón social del lado que NO es la empresa de esta conexión."
},
"perspectiva": {
"type": "string",
"enum": [
"emitidos",
"recibidos"
],
"description": "emitidos = esta empresa es el emisor; recibidos = es el receptor. Es DERIVADA del documento, no del filtro."
},
"periodo": {
"type": "string",
"description": "El período tributario con que se sincronizó el documento, en formato AAAA-MM."
},
"fechaEmision": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "La fecha de emisión que declara el XML del documento, en formato AAAA-MM-DD. 'null' si la fila guardada no la trae."
},
"montoNeto": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "'null' cuando el DTE no declaró <MntNeto>: un documento sólo exento no lo trae. Nunca se fabrica un 0."
},
"iva": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "'null' cuando el DTE no declaró <IVA>, por el mismo motivo que montoNeto."
},
"montoTotal": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Puede ser 0 legítimamente: una guía de traslado interno o una nota que corrige sólo texto lo exige por XSD."
},
"estado": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "El estado crudo del listado del portal, tal cual. Es el observado en la última sincronización, no el final. 'null' cuando el sync no pudo emparejar este documento con su fila del índice."
},
"dteHash": {
"type": "string",
"description": "sha256 del XML guardado. Un DTE firmado es inmutable: si cambia entre sincronizaciones, algo se movió."
},
"ultimaLecturaEn": {
"type": "string",
"description": "Cuándo se observó esta fila por última vez, en ISO 8601 UTC. El 'estado' es el de esa lectura y no el final: resincroniza el período para refrescarlo."
}
},
"required": [
"tipoDte",
"folio",
"rutEmisor",
"rutReceptor",
"razonSocialContraparte",
"perspectiva",
"periodo",
"fechaEmision",
"montoNeto",
"iva",
"montoTotal",
"estado",
"dteHash",
"ultimaLecturaEn"
],
"additionalProperties": false
},
"description": "Los documentos respaldados que calzan con el filtro, sólo con sus columnas de cabecera. Ni el XML ni el detalle de ítems viaja aquí: para eso usa 'sii.documentos.detallar'."
},
"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 sincronizó entero. 'false' = quedaron casillas sin traer, así que puede faltar información. 'null' = no se puede saber, porque 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 enteras en esa sincronización, con su código de error. Hoy sólo la puebla el alcance de 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. Es 'null' por DOS motivos distintos, y ninguno significa que las filas devueltas sean inválidas: (a) la consulta no filtró por 'periodo', así que no hay un sync único al que mirar (pide un 'periodo' concreto para obtener el bloque); o (b) ese período nunca se sincronizó. Un 'null' junto a una lista CON documentos es siempre el caso (a)."
}
},
"required": [
"documentos",
"cursor",
"sincronizacion"
],
"additionalProperties": false
}Errores de esta tool
| Código | HTTP | Reintentable | Qué hacer |
|---|---|---|---|
connection_disabled | 403 | no | Reactívala en /connections o usa otra conexión del mismo sistema. |
alcance_not_enabled | 403 | no | Habilita 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
sii.conexion.sincronizar: la tool que escribe los datos que esta lectura devuelve.- Sincronizar y consultar: por qué leer datos reales son dos pasos.
Verificar conexión SII
Prueba las credenciales de la conexión contra el SII haciendo un login real (y su logout, a cargo del pipeline).
Detallar un documento respaldado del SII
Devuelve UN documento tributario respaldado, con su detalle completo: los ítems (nombre, cantidad, unidad, precio unitario y monto), los giros, direcciones y comunas de emisor y receptor, y la forma de pago.