Consultar propuesta de compras de SUNAT
Lee los comprobantes de la propuesta RCE ya sincronizada para esta conexión y período.
| Tool ID | sunat_beta.compras.consultar |
| Nombre MCP | sunat_beta__compras__consultar |
| Conector | sunat_beta |
| Plano | action |
| Lee el alcance | compras (debe estar habilitado en la conexión) |
| Scope (permiso) | sunat_beta:read |
| Auth | none |
| Versión | 1 |
| 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 y campoconnectionIden elexecutede MCP. 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
No llama a SUNAT y no acredita un registro presentado. Lista vacía con sincronizacion null significa período no cargado, nunca cero documentos. Los importes conservan la base contable de SIRE y no se convierten a la moneda original del comprobante.
Entrada
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
periodo | string `^\d4-(0[1-9] | 1[0-2])$` | sí |
limite | entero 1-500 | no · default 100 | Filas por página, entre 1 y 500; 100 por defecto. |
cursor | string | no | Cursor opaco de la respuesta anterior, reenviado sin modificar. |
JSON Schema de entrada
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"periodo": {
"type": "string",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
"description": "Período tributario de SUNAT, AAAA-MM."
},
"limite": {
"default": 100,
"description": "Filas por página, entre 1 y 500; 100 por defecto.",
"type": "integer",
"minimum": 1,
"maximum": 500
},
"cursor": {
"description": "Cursor opaco de la respuesta anterior, reenviado sin modificar.",
"type": "string",
"minLength": 1,
"maxLength": 2048
}
},
"required": [
"periodo"
]
}Ejemplo
curl -X POST https://connect.emisso.ai/api/v1/tools/sunat_beta.compras.consultar/execute \
-H "Authorization: Bearer connect_sk_…" \
-H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
-H "Content-Type: application/json" \
-d '{"input":{"periodo":"2026-10","limite":100}}'{
"tool": "sunat_beta.compras.consultar",
"params": {
"periodo": "2026-10",
"limite": 100
},
"connectionId": "conn_9tKfR2mQx4Vb"
}Salida esperada (200):
{
"data": {
"documentos": [],
"cursor": null,
"sincronizacion": null
},
"meta": {
"request_id": "req_…",
"tool_id": "sunat_beta.compras.consultar",
"plane": "action",
"latency_ms": 24,
"audit_status": "recorded"
}
}Salida
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
documentos | lista de objeto | sí | Comprobantes conservados de la propuesta, sin totales agregados. |
documentos[].origen | string | sí | Propuesta de SIRE. No es un registro presentado ni una declaración tributaria. |
documentos[].libro | "rvie" · "rce" | sí | rvie: ventas e ingresos; rce: compras. |
documentos[].periodo | string `^\d4-(0[1-9] | 1[0-2])$` | sí |
documentos[].tipoIdentificadorEmisor | string ^[^\p{Cc}]+$ | sí | Tipo de identificación del emisor informado por SUNAT. |
documentos[].identificadorEmisor | string ^[^\p{Cc}]+$ | sí | Identificación del emisor; conserva el texto y sus ceros. |
documentos[].tipoComprobante | string ^[^\p{Cc}]+$ | sí | Código de tipo de comprobante de SUNAT. |
documentos[].serie | string ^[^\p{Cc}]+$ | sí | Serie original del comprobante, parte de su identidad. |
documentos[].numero | string ^[^\p{Cc}]+$ | sí | Número original del comprobante, como texto; nunca se convierte a un número JavaScript. |
documentos[].fechaEmision | string `^(?:(?:\d\d[2468][048] | \d\d[13579][26] | \d\d0[48] |
documentos[].tipoIdentificadorReceptor | string ^[^\p{Cc}]+$ | no | Tipo de identificación del receptor, cuando SUNAT lo informa. |
documentos[].identificadorReceptor | string ^[^\p{Cc}]+$ | no | Identificación del receptor, cuando SUNAT la informa. |
documentos[].moneda | string ^[A-Z]{3}$ | null | sí |
documentos[].monedaOriginal | string ^[A-Z]{3}$ | null | sí |
documentos[].baseMonetaria | string | sí | Los importes reflejan la base contable de SIRE, sin conversión adicional de Connect. |
documentos[].tipoCambio | string ^-?\d+(?:\.\d+)?$ | null | no |
documentos[].total | string ^-?\d+(?:\.\d+)?$ | sí | Importe total decimal como texto, en moneda de contabilidad SIRE. No sumar con monedas distintas o desconocidas. |
documentos[].baseImponible | string ^-?\d+(?:\.\d+)?$ | no | Base imponible decimal de SIRE; ausente cuando no consta, distinto de cero. |
documentos[].igv | string ^-?\d+(?:\.\d+)?$ | no | IGV decimal de SIRE; ausente cuando no consta, distinto de cero. |
documentos[].carSunat | string ^[^\p{Cc}]+$ | no | CAR informado por SUNAT. No se fabrica ni se usa como identidad canónica del documento. |
cursor | string | null | sí |
sincronizacion | objeto | null | sí |
sincronizacion.sincronizadoEn | string `^(?:(?:\d\d[2468][048] | \d\d[13579][26] | \d\d0[48] |
sincronizacion.completo | booleano | sí | true sólo si se descargó y validó todo el alcance. false no acredita ausencia de documentos. |
sincronizacion.cantidad | entero | sí | Registros de la última lectura conservada, antes de paginar. Si completo es false, esta cantidad histórica no acredita el total vigente del período. |
JSON Schema de salida
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"documentos": {
"type": "array",
"items": {
"type": "object",
"properties": {
"origen": {
"type": "string",
"const": "propuesta",
"description": "Propuesta de SIRE. No es un registro presentado ni una declaración tributaria."
},
"libro": {
"type": "string",
"enum": [
"rvie",
"rce"
],
"description": "rvie: ventas e ingresos; rce: compras."
},
"periodo": {
"type": "string",
"pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
"description": "Período tributario de SUNAT, AAAA-MM."
},
"tipoIdentificadorEmisor": {
"type": "string",
"minLength": 1,
"maxLength": 512,
"pattern": "^[^\\p{Cc}]+$",
"description": "Tipo de identificación del emisor informado por SUNAT."
},
"identificadorEmisor": {
"type": "string",
"minLength": 1,
"maxLength": 512,
"pattern": "^[^\\p{Cc}]+$",
"description": "Identificación del emisor; conserva el texto y sus ceros."
},
"tipoComprobante": {
"type": "string",
"minLength": 1,
"maxLength": 512,
"pattern": "^[^\\p{Cc}]+$",
"description": "Código de tipo de comprobante de SUNAT."
},
"serie": {
"type": "string",
"minLength": 1,
"maxLength": 512,
"pattern": "^[^\\p{Cc}]+$",
"description": "Serie original del comprobante, parte de su identidad."
},
"numero": {
"type": "string",
"minLength": 1,
"maxLength": 512,
"pattern": "^[^\\p{Cc}]+$",
"description": "Número original del comprobante, como texto; nunca se convierte a un número JavaScript."
},
"fechaEmision": {
"type": "string",
"format": "date",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
"description": "Fecha de emisión, AAAA-MM-DD, sin hora ni zona horaria."
},
"tipoIdentificadorReceptor": {
"description": "Tipo de identificación del receptor, cuando SUNAT lo informa.",
"type": "string",
"minLength": 1,
"maxLength": 512,
"pattern": "^[^\\p{Cc}]+$"
},
"identificadorReceptor": {
"description": "Identificación del receptor, cuando SUNAT la informa.",
"type": "string",
"minLength": 1,
"maxLength": 512,
"pattern": "^[^\\p{Cc}]+$"
},
"moneda": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Z]{3}$"
},
{
"type": "null"
}
],
"description": "Moneda de los importes en la contabilidad SIRE. null si no se pudo determinar; no se infiere PEN."
},
"monedaOriginal": {
"anyOf": [
{
"type": "string",
"pattern": "^[A-Z]{3}$"
},
{
"type": "null"
}
],
"description": "Moneda original del comprobante. Puede diferir de la moneda de los importes; null si es desconocida."
},
"baseMonetaria": {
"type": "string",
"const": "contabilidad_sire",
"description": "Los importes reflejan la base contable de SIRE, sin conversión adicional de Connect."
},
"tipoCambio": {
"description": "Tipo de cambio informado por SIRE, sin recalcular importes. Ausente o null si no consta.",
"anyOf": [
{
"type": "string",
"maxLength": 80,
"pattern": "^-?\\d+(?:\\.\\d+)?$"
},
{
"type": "null"
}
]
},
"total": {
"type": "string",
"maxLength": 80,
"pattern": "^-?\\d+(?:\\.\\d+)?$",
"description": "Importe total decimal como texto, en moneda de contabilidad SIRE. No sumar con monedas distintas o desconocidas."
},
"baseImponible": {
"description": "Base imponible decimal de SIRE; ausente cuando no consta, distinto de cero.",
"type": "string",
"maxLength": 80,
"pattern": "^-?\\d+(?:\\.\\d+)?$"
},
"igv": {
"description": "IGV decimal de SIRE; ausente cuando no consta, distinto de cero.",
"type": "string",
"maxLength": 80,
"pattern": "^-?\\d+(?:\\.\\d+)?$"
},
"carSunat": {
"description": "CAR informado por SUNAT. No se fabrica ni se usa como identidad canónica del documento.",
"type": "string",
"minLength": 1,
"maxLength": 512,
"pattern": "^[^\\p{Cc}]+$"
}
},
"required": [
"origen",
"libro",
"periodo",
"tipoIdentificadorEmisor",
"identificadorEmisor",
"tipoComprobante",
"serie",
"numero",
"fechaEmision",
"moneda",
"monedaOriginal",
"baseMonetaria",
"total"
],
"additionalProperties": false
},
"description": "Comprobantes conservados de la propuesta, sin totales agregados."
},
"cursor": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Cursor para la página siguiente. null significa que no hay más filas."
},
"sincronizacion": {
"anyOf": [
{
"type": "object",
"properties": {
"sincronizadoEn": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
"description": "Instante UTC de la última lectura conservada."
},
"completo": {
"type": "boolean",
"description": "true sólo si se descargó y validó todo el alcance. false no acredita ausencia de documentos."
},
"cantidad": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Registros de la última lectura conservada, antes de paginar. Si completo es false, esta cantidad histórica no acredita el total vigente del período."
}
},
"required": [
"sincronizadoEn",
"completo",
"cantidad"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "null: no hay evidencia de una lectura conservada. Una lista vacía con null no significa cero documentos."
}
},
"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. |
connection_not_found | 404 | no | Usa uno de los connectionId que lista el error, o revisa la conexión en /connections. No hace falta reactivar nada. |
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
sunat_beta.conexion.sincronizar: la tool que escribe los datos que esta lectura devuelve.- Sincronizar y consultar: por qué leer datos reales son dos pasos.