Emisso Connect

Sincronizar conexión Santander

Sincroniza los alcances solicitados (saldos, movimientos) para un período en una sola sesión de portal.

Tool IDsantander_empresas.conexion.sincronizar
Nombre MCPsantander_empresas__conexion__sincronizar
Conectorsantander_empresas
Planoread
Alcancessaldos, movimientos
Scope (permiso)santander_empresas:read
Authconnection_credentials
Versión1
Sensible
Deprecadono
ComportamientoreadOnly=false, destructive=false, idempotent=true, openWorld=true

Requiere conexión. Indica cuál en cada llamada: header X-Connect-Connection en REST, campo connectionId en el execute_write 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

'saldos' es una foto del momento, no del período: solo se sincroniza cuando se pide el período corriente.

Entrada

CampoTipoRequeridoDescripción
periodostring ^\d{4}-\d{2}$El mes que se va a sincronizar, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Traer varios meses son varias llamadas, una por mes.
alcanceslista de "saldos" · "movimientos"Qué módulos de datos traer en esta corrida, al menos uno. Todos se sincronizan sobre UNA sola sesión (un login, un logout), así que pedir varios en una llamada cuesta menos que llamar una vez por cada uno. Un alcance debe estar habilitado en la conexión; si no lo está, la llamada responde 'alcance_not_enabled'.
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": "El mes que se va a sincronizar, en formato AAAA-MM y en calendario chileno (por ejemplo '2026-07'). Traer varios meses son varias llamadas, una por mes."
    },
    "alcances": {
      "minItems": 1,
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "saldos",
          "movimientos"
        ]
      },
      "description": "Qué módulos de datos traer en esta corrida, al menos uno. Todos se sincronizan sobre UNA sola sesión (un login, un logout), así que pedir varios en una llamada cuesta menos que llamar una vez por cada uno. Un alcance debe estar habilitado en la conexión; si no lo está, la llamada responde 'alcance_not_enabled'."
    }
  },
  "required": [
    "periodo",
    "alcances"
  ]
}

Ejemplo

curl
curl -X POST https://connect.emisso.ai/api/v1/tools/santander_empresas.conexion.sincronizar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{"input":{"periodo":"2026-08","alcances":["saldos","movimientos"]}}'
SDK TypeScript
const data = await connect.tools.santander_empresas.conexion.sincronizar({ periodo: "2026-08", alcances: ["saldos", "movimientos"] }, { connectionId: "conn_9tKfR2mQx4Vb" });
MCP · meta-tool execute
{
  "tool": "santander_empresas.conexion.sincronizar",
  "params": {
    "periodo": "2026-08",
    "alcances": [
      "saldos",
      "movimientos"
    ]
  },
  "connectionId": "conn_9tKfR2mQx4Vb"
}

Salida esperada (200):

{
  "data": {
    "periodo": "2026-08",
    "results": [
      {
        "alcance": "saldos",
        "status": "ok",
        "recordsSynced": 1
      },
      {
        "alcance": "movimientos",
        "status": "ok",
        "recordsSynced": 12,
        "cuentasConsultadas": 1
      }
    ]
  },
  "meta": {
    "request_id": "req_…",
    "tool_id": "santander_empresas.conexion.sincronizar",
    "plane": "read",
    "latency_ms": 58240,
    "audit_status": "recorded"
  }
}

Cada sincronización de Santander abre su propia sesión de portal con un desafío de navegador remoto, así que puede tardar cerca de un minuto, también la segunda y las siguientes. Dentro de una misma llamada, todos los alcances que pidas comparten ese único login, así que pedir 'saldos' y 'movimientos' juntos cuesta lo mismo que pedir uno solo.

Salida

CampoTipoRequeridoDescripción
periodostringEco del período que se pidió, para poder correlacionar la respuesta sin guardarlo tú.
resultslista de objetoUna fila por alcance pedido, en el orden canónico del conector. Revísalas todas: un alcance puede fallar mientras los otros de la misma corrida terminan bien.
results[].alcancestringCuál de los alcances pedidos describe esta fila. Hay una fila por alcance solicitado, en el orden canónico del conector, no en el orden en que los pediste.
results[].marcadorstringnoDetalle técnico del fallo, cuando el conector pudo componer uno: en qué paso ocurrió y qué se encontró (conteos, status HTTP, content-type). Sirve para diagnosticar sin volver a reproducirlo. Sólo aparece en filas que fallaron, y nunca contiene datos del contribuyente.
results[].status"ok" · "failed"'ok' = el alcance terminó bien; que 'recordsSynced' sea 0 no lo vuelve un fallo. 'failed' = no terminó bien, y la causa va en 'error'. Ojo con un 'failed': NO garantiza que no se haya escrito nada. Cuando el sistema externo trunca un listado, el alcance queda 'failed' con las filas que alcanzó en 'recordsSynced'. Mira siempre las dos cosas juntas. Y revisa fila por fila: un alcance puede fallar mientras los otros de la misma corrida terminan bien.
results[].recordsSyncedenteroCuántos registros de este alcance escribió ESTA corrida. Es el trabajo de esta llamada, no el total acumulado que tienes guardado: para saber cuánto hay, consulta. Un 0 no significa por sí solo «no hay datos»; cuando el cero tiene una explicación, viene en 'detalle'.
results[].errorstringnoPor qué este alcance no terminó bien. Presente solo cuando 'status' es 'failed'. Normalmente es un código del catálogo de errores; cuando el sistema externo truncó el listado es una etiqueta de resultado ('movimientos_truncated', 'cartolas_truncated') que no está en ese catálogo y que significa «se escribió lo que alcanzó a venir». Decide por el valor, nunca por el texto libre.
results[].cuentasConsultadasenteronoCuántas cuentas se alcanzaron a consultar. Es lo que vuelve interpretable un 'recordsSynced: 0': cero con una cuenta consultada significa que el banco no tiene movimientos ahí, y cero con cero cuentas significa que ni siquiera se llegó a preguntar. Los dos casos traen el mismo 0, así que revisa este campo antes de reportar «no hay datos».
results[].detallestringnoExplicación en lenguaje llano, presente solo cuando el resultado necesita una. Existe para que un cero se pueda transmitir tal cual en vez de concluir «no hay datos»: transmítelo a quien pregunte en lugar de resumir el número solo.
JSON Schema de salida
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "periodo": {
      "type": "string",
      "description": "Eco del período que se pidió, para poder correlacionar la respuesta sin guardarlo tú."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "alcance": {
            "type": "string",
            "description": "Cuál de los alcances pedidos describe esta fila. Hay una fila por alcance solicitado, en el orden canónico del conector, no en el orden en que los pediste."
          },
          "marcador": {
            "description": "Detalle técnico del fallo, cuando el conector pudo componer uno: en qué paso ocurrió y qué se encontró (conteos, status HTTP, content-type). Sirve para diagnosticar sin volver a reproducirlo. Sólo aparece en filas que fallaron, y nunca contiene datos del contribuyente.",
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "ok",
              "failed"
            ],
            "description": "'ok' = el alcance terminó bien; que 'recordsSynced' sea 0 no lo vuelve un fallo. 'failed' = no terminó bien, y la causa va en 'error'. Ojo con un 'failed': NO garantiza que no se haya escrito nada. Cuando el sistema externo trunca un listado, el alcance queda 'failed' con las filas que alcanzó en 'recordsSynced'. Mira siempre las dos cosas juntas. Y revisa fila por fila: un alcance puede fallar mientras los otros de la misma corrida terminan bien."
          },
          "recordsSynced": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Cuántos registros de este alcance escribió ESTA corrida. Es el trabajo de esta llamada, no el total acumulado que tienes guardado: para saber cuánto hay, consulta. Un 0 no significa por sí solo «no hay datos»; cuando el cero tiene una explicación, viene en 'detalle'."
          },
          "error": {
            "description": "Por qué este alcance no terminó bien. Presente solo cuando 'status' es 'failed'. Normalmente es un código del catálogo de errores; cuando el sistema externo truncó el listado es una etiqueta de resultado ('movimientos_truncated', 'cartolas_truncated') que no está en ese catálogo y que significa «se escribió lo que alcanzó a venir». Decide por el valor, nunca por el texto libre.",
            "type": "string"
          },
          "cuentasConsultadas": {
            "description": "Cuántas cuentas se alcanzaron a consultar. Es lo que vuelve interpretable un 'recordsSynced: 0': cero con una cuenta consultada significa que el banco no tiene movimientos ahí, y cero con cero cuentas significa que ni siquiera se llegó a preguntar. Los dos casos traen el mismo 0, así que revisa este campo antes de reportar «no hay datos».",
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "detalle": {
            "description": "Explicación en lenguaje llano, presente solo cuando el resultado necesita una. Existe para que un cero se pueda transmitir tal cual en vez de concluir «no hay datos»: transmítelo a quien pregunte en lugar de resumir el número solo.",
            "type": "string"
          }
        },
        "required": [
          "alcance",
          "status",
          "recordsSynced"
        ],
        "additionalProperties": false
      },
      "description": "Una fila por alcance pedido, en el orden canónico del conector. Revísalas todas: un alcance puede fallar mientras los otros de la misma corrida terminan bien."
    }
  },
  "required": [
    "periodo",
    "results"
  ],
  "additionalProperties": false
}

Errores de esta tool

CódigoHTTPReintentableQué hacer
connection_disabled403noReactívala en /connections o usa otra conexión del mismo sistema.
connection_credential_required428noCrea un enlace con conexiones.enlace.crear (modo reconectar si la conexión ya existe) y pide a la persona que entregue la credencial de nuevo. No reintentes con la credencial anterior.
connection_busy409Espera unos segundos y reintenta. Es una espera transitoria: no necesitas volver a conectar ni ingresar la credencial otra vez.
upstream_error502Reintenta más tarde. Si persiste, el problema está en el sistema externo, no en tu integración.
timeout504Reintenta. Para sincronizaciones largas usa la vía asíncrona y consulta el estado del trabajo.
connection_session_pending409Ejecuta la sincronización de esa conexión (ella acuña la sesión) o espera la programada, y reintenta.
connection_sync_in_progress409Espera a que termine y reintenta, o consulta directamente: puede que ya haya datos.
too_many_pending429Deja terminar los trabajos en curso antes de encolar más.

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

On this page