Consultar RCV del SII
Lee el Registro de Compra-Venta ya sincronizado para esta conexión, filtrable por período, perspectiva, tipo de documento (tipoDte) y estado del registro.
| Tool ID | sii.rcv.consultar |
| Nombre MCP | sii__rcv__consultar |
| Conector | sii |
| Plano | action |
| Lee el alcance | rcv (debe estar habilitado en la conexión) |
| Scope (permiso) | sii:read |
| Auth | none |
| Versión | 6 |
| 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
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, use 'sii.conexion.sincronizar' primero. 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 | "compras" · "ventas" | no | compras = la empresa es el receptor; ventas = la empresa es el emisor. |
tipoDte | entero | no | Tipo de DTE (33 factura electrónica, 34 exenta, 46 factura de compra, 56 nota de débito, 61 nota de crédito, …). |
estado | "registro" · "pendiente" · "no_incluir" · "reclamado" | no | Estado del documento en el RCV. |
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": "compras = la empresa es el receptor; ventas = la empresa es el emisor.",
"type": "string",
"enum": [
"compras",
"ventas"
]
},
"tipoDte": {
"description": "Tipo de DTE (33 factura electrónica, 34 exenta, 46 factura de compra, 56 nota de débito, 61 nota de crédito, …).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"estado": {
"description": "Estado del documento en el RCV.",
"type": "string",
"enum": [
"registro",
"pendiente",
"no_incluir",
"reclamado"
]
},
"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.rcv.consultar/execute \
-H "Authorization: Bearer connect_sk_…" \
-H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
-H "Content-Type: application/json" \
-d '{"input":{"periodo":"2026-07","perspectiva":"ventas"}}'const data = await connect.tools.sii.rcv.consultar({ periodo: "2026-07", perspectiva: "ventas" }, { connectionId: "conn_9tKfR2mQx4Vb" });{
"tool": "sii.rcv.consultar",
"params": {
"periodo": "2026-07",
"perspectiva": "ventas"
},
"connectionId": "conn_9tKfR2mQx4Vb"
}Salida esperada (200):
{
"data": {
"documentos": [
{
"tipoDte": 33,
"folio": "4712",
"rutEmisor": "77123456-9",
"rutReceptor": "76543210-3",
"razonSocial": "Constructora Los Robles Ltda",
"fechaEmision": "14/07/2026",
"montoNeto": 1250000,
"montoIva": 237500,
"montoTotal": 1487500,
"estado": "registro",
"periodo": "2026-07",
"fechaEmisionDate": "2026-07-14",
"montoExento": 0,
"fechaRecepcion": "2026-07-14",
"eventoReceptor": null,
"eventoReceptorCod": null,
"tipoDocRef": null,
"folioDocRef": null,
"fechaAcuse": null,
"fechaReclamo": null,
"tipoTransaccion": null,
"perspectiva": "ventas"
},
{
"tipoDte": 33,
"folio": "4718",
"rutEmisor": "77123456-9",
"rutReceptor": "78900400-5",
"razonSocial": "Ferretería El Volcán SpA",
"fechaEmision": "27/07/2026",
"montoNeto": 480000,
"montoIva": 91200,
"montoTotal": 571200,
"estado": "registro",
"periodo": "2026-07",
"fechaEmisionDate": "2026-07-27",
"montoExento": 0,
"fechaRecepcion": "2026-07-28",
"eventoReceptor": null,
"eventoReceptorCod": null,
"tipoDocRef": null,
"folioDocRef": null,
"fechaAcuse": null,
"fechaReclamo": null,
"tipoTransaccion": null,
"perspectiva": "ventas"
}
],
"cursor": null,
"sincronizacion": {
"sincronizadoEn": "2026-08-06T03:15:42.000Z",
"completo": true,
"incompletos": 0,
"fueraDeVentana": null,
"perspectivasFallidas": []
}
},
"meta": {
"request_id": "req_…",
"tool_id": "sii.rcv.consultar",
"plane": "action",
"latency_ms": 24,
"audit_status": "recorded"
}
}Recortado a dos documentos; una respuesta real trae hasta 'limit' filas por página. En 'ventas' el emisor es la empresa de la conexión y 'razonSocial' nombra a la contraparte (el cliente).
Salida
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
documentos | lista de objeto | sí | Los documentos del RCV que calzan con el filtro, uno por fila. Sale de la caché ya sincronizada, nunca de una consulta en vivo al SII. |
documentos[].tipoDte | entero | sí | Código del tipo de DTE: 33 factura electrónica, 34 exenta, 46 factura de compra, 56 nota de débito, 61 nota de crédito. Es un NÚMERO, a diferencia de 'folio': es un código de un vocabulario cerrado, no un identificador. |
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. 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. Compáralo como cadena y no lo conviertas a número para ordenar ni para volver a mandarlo. |
documentos[].rutEmisor | string | sí | Quien EMITIÓ el documento: en 'ventas' es la empresa de esta conexión, en 'compras' es la contraparte. |
documentos[].rutReceptor | string | sí | Quien RECIBIÓ el documento: en 'compras' es la empresa de esta conexión, en 'ventas' es la contraparte. |
documentos[].razonSocial | string | sí | La razón social de la CONTRAPARTE, nunca la de la empresa de esta conexión, tal como la informó el SII. |
documentos[].fechaEmision | string | sí | La fecha de emisión tal cual la manda el SII, en formato DD/MM/AAAA. Para ordenar o comparar usa 'fechaEmisionDate'. |
documentos[].montoNeto | entero | sí | Monto neto en pesos chilenos, entero. Un 0 no distingue 'el documento no tiene neto' (uno sólo exento) de 'el SII no informó el campo': las dos formas llegan igual. |
documentos[].montoIva | entero | sí | IVA en pesos chilenos, entero. Un 0 es ambiguo por el mismo motivo que en 'montoNeto'. |
documentos[].montoTotal | entero | sí | Monto total del documento en pesos chilenos, entero. |
documentos[].estado | string | sí | La casilla del Registro de Compras donde el SII tiene el documento: 'registro', 'pendiente', 'no_incluir' o 'reclamado'. Las ventas son siempre 'registro'. |
documentos[].periodo | string | null | sí |
documentos[].fechaEmisionDate | string | null | sí |
documentos[].montoExento | entero | sí | Monto exento de IVA en pesos chilenos, entero. |
documentos[].fechaRecepcion | string | null | sí |
documentos[].eventoReceptor | string | null | sí |
documentos[].eventoReceptorCod | string | null | sí |
documentos[].tipoDocRef | entero | null | sí |
documentos[].folioDocRef | string | null | sí |
documentos[].fechaAcuse | string | null | sí |
documentos[].fechaReclamo | string | null | sí |
documentos[].tipoTransaccion | string | null | sí |
documentos[].perspectiva | "compras" · "ventas" | sí | compras = tú eres el receptor; ventas = tú eres el emisor |
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 electrónica, 34 exenta, 46 factura de compra, 56 nota de débito, 61 nota de crédito. Es un NÚMERO, a diferencia de 'folio': es un código de un vocabulario cerrado, no un identificador."
},
"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. 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. Compáralo como cadena y no lo conviertas a número para ordenar ni para volver a mandarlo."
},
"rutEmisor": {
"type": "string",
"description": "Quien EMITIÓ el documento: en 'ventas' es la empresa de esta conexión, en 'compras' es la contraparte."
},
"rutReceptor": {
"type": "string",
"description": "Quien RECIBIÓ el documento: en 'compras' es la empresa de esta conexión, en 'ventas' es la contraparte."
},
"razonSocial": {
"type": "string",
"description": "La razón social de la CONTRAPARTE, nunca la de la empresa de esta conexión, tal como la informó el SII."
},
"fechaEmision": {
"type": "string",
"description": "La fecha de emisión tal cual la manda el SII, en formato DD/MM/AAAA. Para ordenar o comparar usa 'fechaEmisionDate'."
},
"montoNeto": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Monto neto en pesos chilenos, entero. Un 0 no distingue 'el documento no tiene neto' (uno sólo exento) de 'el SII no informó el campo': las dos formas llegan igual."
},
"montoIva": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "IVA en pesos chilenos, entero. Un 0 es ambiguo por el mismo motivo que en 'montoNeto'."
},
"montoTotal": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Monto total del documento en pesos chilenos, entero."
},
"estado": {
"type": "string",
"description": "La casilla del Registro de Compras donde el SII tiene el documento: 'registro', 'pendiente', 'no_incluir' o 'reclamado'. Las ventas son siempre 'registro'."
},
"periodo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "El período tributario con que se sincronizó el documento, en formato AAAA-MM. 'null' en filas viejas que no lo guardaron."
},
"fechaEmisionDate": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "La misma fecha de emisión en formato AAAA-MM-DD, o 'null' si no se pudo parsear. Es la que conviene usar para ordenar."
},
"montoExento": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Monto exento de IVA en pesos chilenos, entero."
},
"fechaRecepcion": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Cuándo el SII recibió el documento, en formato AAAA-MM-DD. 'null' si no vino."
},
"eventoReceptor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "La leyenda del evento que registró el receptor (un acuse, un reclamo). 'null' cuando no hubo evento."
},
"eventoReceptorCod": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "El código de ese mismo evento. Decide por el código, nunca por la leyenda. 'null' cuando no hubo evento."
},
"tipoDocRef": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Tipo del documento que este corrige o referencia (una nota de crédito sobre una factura 33). 'null' cuando no referencia a ninguno. Es un NÚMERO, a diferencia de 'folioDocRef': código de vocabulario cerrado contra identificador."
},
"folioDocRef": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Folio del documento referenciado, en TEXTO decimal canónico igual que 'folio', o 'null' cuando no hay referencia. Es el campo más expuesto del conector porque sale de lo que tipeó el emisor en el DTE, así que trátalo como cadena y no lo conviertas a número."
},
"fechaAcuse": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Fecha del acuse de recibo, en formato AAAA-MM-DD. 'null' si no se acusó."
},
"fechaReclamo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Fecha del reclamo, en formato AAAA-MM-DD. 'null' si no se reclamó."
},
"tipoTransaccion": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Con qué tipo de transacción quedó clasificado el documento en el RCV, tal cual lo manda el SII. 'null' si no vino."
},
"perspectiva": {
"type": "string",
"enum": [
"compras",
"ventas"
],
"description": "compras = tú eres el receptor; ventas = tú eres el emisor"
}
},
"required": [
"tipoDte",
"folio",
"rutEmisor",
"rutReceptor",
"razonSocial",
"fechaEmision",
"montoNeto",
"montoIva",
"montoTotal",
"estado",
"periodo",
"fechaEmisionDate",
"montoExento",
"fechaRecepcion",
"eventoReceptor",
"eventoReceptorCod",
"tipoDocRef",
"folioDocRef",
"fechaAcuse",
"fechaReclamo",
"tipoTransaccion",
"perspectiva"
],
"additionalProperties": false
},
"description": "Los documentos del RCV que calzan con el filtro, uno 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 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.
Consultar guías de despacho del SII
Lee las guías de despacho electrónicas (DTE 52) ya sincronizadas para esta conexión, filtradas por período y/o perspectiva (emitidas = las que emitió esta empresa; recibidas = las que le emitieron).
API REST
Una página interactiva por operación, generada del contrato OpenAPI del catálogo documentado.