Sincronizar
Guarda saldos, movimientos y PDF.
| Tool ID | bbva_peru_beta.conexion.sincronizar |
| Nombre MCP | bbva_peru_beta__conexion__sincronizar |
| Conector | bbva_peru_beta |
| Plano | read |
| Alcances | saldos, movimientos, cartolas |
| Scope (permiso) | bbva_peru_beta:read |
| Auth | connection_credentials |
| Versión | 1 |
| Sensible | sí |
| Deprecado | no |
| Comportamiento | readOnly=false, destructive=false, idempotent=true, openWorld=true |
Requiere conexión. Indica cuál en cada llamada: header
X-Connect-Connectionen REST y campoconnectionIden elexecute_writede 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
Conserva las cuentas autorizadas y sus saldos actuales; movimientos y cartolas son opcionales. Los movimientos cubren el mes solicitado: del primer al último día para meses anteriores, o hasta el día de lectura en Perú para el mes actual. La disponibilidad histórica depende del banco. Confirma todas las cuentas, el rango y las páginas antes de guardar. Conserva el corte informado sin afirmar el cierre del día actual. Cartolas conserva los PDF existentes del inventario observado, sin generar documentos nuevos ni interpretar su período o contenido.
Entrada
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
periodo | string `^[1-9]\d3-(?:0[1-9] | 1[0-2])$` | sí |
alcances | lista de "saldos" · "movimientos" · "cartolas" | sí | Saldos, con movimientos y/o cartolas opcionales. Cada lectura cubre todas las cuentas autorizadas. |
JSON Schema de entrada
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"periodo": {
"type": "string",
"minLength": 7,
"maxLength": 7,
"pattern": "^[1-9]\\d{3}-(?:0[1-9]|1[0-2])$",
"description": "Mes en formato AAAA-MM. Con movimientos admite meses anteriores sujetos a disponibilidad; sin movimientos requiere el mes actual de Perú. Los saldos siempre representan el estado observado al sincronizar."
},
"alcances": {
"minItems": 1,
"maxItems": 3,
"type": "array",
"items": {
"type": "string",
"enum": [
"saldos",
"movimientos",
"cartolas"
]
},
"description": "Saldos, con movimientos y/o cartolas opcionales. Cada lectura cubre todas las cuentas autorizadas."
}
},
"required": [
"periodo",
"alcances"
],
"additionalProperties": false
}Ejemplo
curl -X POST https://connect.emisso.ai/api/v1/tools/bbva_peru_beta.conexion.sincronizar/execute \
-H "Authorization: Bearer connect_sk_…" \
-H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
-H "Content-Type: application/json" \
-d '{"input":{"periodo":"2026-11","alcances":["saldos"]}}'{
"tool": "bbva_peru_beta.conexion.sincronizar",
"params": {
"periodo": "2026-11",
"alcances": [
"saldos"
]
},
"connectionId": "conn_9tKfR2mQx4Vb"
}Salida esperada (200):
{
"data": {
"periodo": "2026-11",
"estado": "encolado",
"jobId": "sjb_ejemplo",
"yaEnCurso": false
},
"meta": {
"request_id": "req_…",
"tool_id": "bbva_peru_beta.conexion.sincronizar",
"plane": "read",
"latency_ms": 58240,
"audit_status": "recorded"
}
}Salida
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
periodo | string `^[1-9]\d3-(?:0[1-9] | 1[0-2])$` | sí |
estado | "encolado" · "completado" | sí | 'encolado' = la sincronización quedó en cola y va a empezar enseguida; esta respuesta NO trae datos todavía, y el trabajo se sigue por 'jobId'. 'completado' = la sincronización ya corrió y su resumen por alcance viene en 'results'. Un cliente recibe siempre 'encolado': un sync consulta el sistema externo y puede tardar minutos, así que no se te hace esperar por él. |
jobId | string | null | no |
yaEnCurso | booleano | no | 'true' significa que ya había una sincronización viva para esa conexión y ese período, así que no se creó otra. No es un error ni un rechazo. Si esa sincronización sigue en cola, 'jobId' es el suyo; si ya está corriendo, 'jobId' llega null y su avance se ve en 'trabajos' de 'conexiones.estado.consultar'. Cubre el período, no necesariamente los alcances que pediste: si pediste otros, vuelve a pedirlos cuando termine. Ojo con el otro lado: 'false' NO garantiza que la hayas creado tú: dos llamadas a la vez pueden recibir las dos 'false' y el MISMO 'jobId'. Lo que sí vale siempre es que hay una sola sincronización activa por conexión y período. |
results | lista de objeto | no | El resumen por alcance, una fila por alcance sincronizado. AUSENTE cuando 'estado' es 'encolado': el trabajo todavía no corrió. Ausente no es lo mismo que vacío: un arreglo vacío significaría que se miró y no había nada. |
results[].alcance | "saldos" · "movimientos" · "cartolas" | sí | Alcance completado en esta lectura. |
results[].status | string | sí | El alcance terminó correctamente. Si falla, la sincronización devuelve un error; no entrega una lectura parcial como exitosa. |
results[].recordsSynced | entero | sí | Cantidad de cuentas, movimientos o PDF conservados para cada alcance. |
results[].completo | booleano | sí | La lectura terminó todas las cuentas y páginas del intervalo observado. No garantiza frescura actual ni que el día haya terminado. |
JSON Schema de salida
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"periodo": {
"type": "string",
"minLength": 7,
"maxLength": 7,
"pattern": "^[1-9]\\d{3}-(?:0[1-9]|1[0-2])$",
"description": "Mes en formato AAAA-MM. Con movimientos admite meses anteriores sujetos a disponibilidad; sin movimientos requiere el mes actual de Perú. Los saldos siempre representan el estado observado al sincronizar."
},
"estado": {
"type": "string",
"enum": [
"encolado",
"completado"
],
"description": "'encolado' = la sincronización quedó en cola y va a empezar enseguida; esta respuesta NO trae datos todavía, y el trabajo se sigue por 'jobId'. 'completado' = la sincronización ya corrió y su resumen por alcance viene en 'results'. Un cliente recibe siempre 'encolado': un sync consulta el sistema externo y puede tardar minutos, así que no se te hace esperar por él."
},
"jobId": {
"description": "El identificador de la sincronización encolada. Por la API REST, el avance se consulta en 'GET /v1/syncs/{jobId}'; por MCP, búscalo en 'trabajos' de 'conexiones.estado.consultar' y revisa 'datosListos' ahí mismo. Es el mismo id que viaja en el webhook 'sync.succeeded' o 'sync.failed' si tu plan los incluye. Es null cuando 'estado' es 'completado', porque ahí el resultado ya está en la respuesta, y cuando 'yaEnCurso' es true y esa sincronización ya está corriendo.",
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"yaEnCurso": {
"description": "'true' significa que ya había una sincronización viva para esa conexión y ese período, así que no se creó otra. No es un error ni un rechazo. Si esa sincronización sigue en cola, 'jobId' es el suyo; si ya está corriendo, 'jobId' llega null y su avance se ve en 'trabajos' de 'conexiones.estado.consultar'. Cubre el período, no necesariamente los alcances que pediste: si pediste otros, vuelve a pedirlos cuando termine. Ojo con el otro lado: 'false' NO garantiza que la hayas creado tú: dos llamadas a la vez pueden recibir las dos 'false' y el MISMO 'jobId'. Lo que sí vale siempre es que hay una sola sincronización activa por conexión y período.",
"type": "boolean"
},
"results": {
"description": "El resumen por alcance, una fila por alcance sincronizado. AUSENTE cuando 'estado' es 'encolado': el trabajo todavía no corrió. Ausente no es lo mismo que vacío: un arreglo vacío significaría que se miró y no había nada.",
"type": "array",
"items": {
"type": "object",
"properties": {
"alcance": {
"type": "string",
"enum": [
"saldos",
"movimientos",
"cartolas"
],
"description": "Alcance completado en esta lectura."
},
"status": {
"type": "string",
"const": "ok",
"description": "El alcance terminó correctamente. Si falla, la sincronización devuelve un error; no entrega una lectura parcial como exitosa."
},
"recordsSynced": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991,
"description": "Cantidad de cuentas, movimientos o PDF conservados para cada alcance."
},
"completo": {
"type": "boolean",
"const": true,
"description": "La lectura terminó todas las cuentas y páginas del intervalo observado. No garantiza frescura actual ni que el día haya terminado."
}
},
"required": [
"alcance",
"status",
"recordsSynced",
"completo"
],
"additionalProperties": false
}
}
},
"required": [
"periodo",
"estado"
],
"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. |
too_many_pending | 429 | sí | Deja terminar los trabajos en curso antes de encolar más. |
La llamada solo encola: las fallas del sistema externo (credencial, sesión, caída del portal) no llegan en esta respuesta, sino en el trabajo: en outcomes y last_error de GET /v1/syncs/{jobId}, o en los webhooks sync.succeeded (un alcance que falló junto a otros que terminaron) y sync.failed.
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
bbva_peru_beta.movimientos.consultar: lee el alcancemovimientosque esta sincronización escribe.bbva_peru_beta.saldos.consultar: lee el alcancesaldosque esta sincronización escribe.bbva_peru_beta.cartolas.consultar: lee el alcancecartolasque esta sincronización escribe.