Autenticación
API keys con permisos explícitos para tu backend, OAuth 2.1 para clientes MCP: cómo se autentica cada llamada al gateway.
Connect tiene dos superficies de entrada, REST (/api/v1/*) y MCP (/mcp), y las dos autentican antes de resolver cualquier otra cosa: el método, el content-type y, sobre todo, la existencia de la tool. Quien llama sin credencial válida no puede distinguir «esa tool no existe» de «existe pero no tienes acceso». En un gateway multitenant, esa asimetría protege el catálogo de cada organización.
API keys
La credencial para llamar desde tu backend es una API key: prefijo connect_sk_, enviada como Authorization: Bearer. Se crean en connect.emisso.ai/api-keys, con nombre, permisos y vencimiento opcional.
El valor completo aparece una sola vez, al crearla. La base guarda su sha256 y un prefijo visible (connect_sk_7Qf3…) para nombrarla en la lista; si la pierdes no hay forma de recuperarla. Rotar es el mismo gesto: la opción «rotar» del dashboard crea un reemplazo con los mismos permisos y te ofrece revocar la anterior justo después de copiar el valor nuevo.
Con la clave en la mano, una llamada autenticada:
curl -X POST https://connect.emisso.ai/api/v1/tools/core.timestamp.now/execute \
-H "Authorization: Bearer connect_sk_..." \
-H "Content-Type: application/json" \
-d '{"input": {"timezone": "America/Santiago"}}'Respuesta (200):
{
"data": {
"iso": "2026-08-07T14:32:11.412Z",
"unix": 1786113131,
"timezone": "America/Santiago"
},
"meta": {
"request_id": "req_...",
"tool_id": "core.timestamp.now",
"plane": "action",
"latency_ms": 12,
"audit_status": "recorded"
}
}Toda respuesta trae este envelope {data, meta}, y el meta.request_id identifica la fila que la llamada dejó en la bitácora. Ahí la clave aparece como lo que es: una API key autentica como agente (actor_type: "agent"), y su id viaja aparte en la columna credential_id. La acción de un agente nunca se atribuye al humano que creó la clave.
Scopes
Cada clave lleva scopes, la lista de permisos que puede ejercer. Cada permiso representa una capacidad: varias tools pueden compartirlo, y un mismo conector puede declarar permisos separados. Una tool nueva reutiliza un permiso solo cuando conserva su alcance de autorización. Por ejemplo, sii:boletas:write es independiente de sii:write del Facturador: requiere una concesión explícita. Un permiso en la clave tampoco sustituye el permiso de la conexión ni la disponibilidad vigente de cada variante. El vocabulario completo:
| Scope | Qué permite |
|---|---|
sii:read | Compras y ventas (RCV), boletas, guías de despacho, boletas de honorarios y el respaldo XML de los documentos emitidos |
sii:boletas:write | Preparar y emitir boletas 39/41 mediante e-Boleta, con consentimiento y evidencia vigente por variante; ambas operaciones permanecen cerradas sin esa evidencia |
sii:carpeta_tributaria:generar | Crear solicitudes puntuales consentidas de carpeta tributaria y consultar su resultado |
sii:honorarios:write | Crear solicitudes de boletas de honorarios y propuestas de permiso recurrente, preparar borradores y consultar resultados bajo autorización profesional. Beta cerrada por organización; la emisión requiere habilitación privada y las aprobaciones aplicables |
sii:honorarios:annul | Crear y consultar solicitudes de anulación de boletas verificadas por Connect, previsualizarlas y cancelarlas antes del envío. El envío fiscal requiere habilitación privada por organización, protocolo certificado y aprobación del profesional para cada documento; el permiso por sí solo no lo autoriza |
sii:write | Previsualizar, emitir y anular documentos en el Facturador Gratuito del SII |
bci_360:read | Saldos y movimientos de BCI 360 |
bci_pyme:read | Saldos y movimientos del Banco BCI |
banco_security:read | Saldos, movimientos, transferencias y nóminas del Banco Security |
bice_empresas:read | Saldos y movimientos del Banco BICE |
bch_empresas:read | Saldos, movimientos de cuentas, movimientos de tarjetas y cartolas del Banco de Chile |
banco_estado:read | Saldos y movimientos de BancoEstado |
santander_empresas:read | Saldos y movimientos del Banco Santander |
itau_empresas:read | Saldos, movimientos y transferencias de Banco Itaú Empresas |
previred:read | Planillas pagadas, cotizaciones por trabajador, deuda previsional y certificados de cotizaciones |
tgr:read | Convenios de pago con la Tesorería: resoluciones, estado de pago y convenios con cuotas |
pjud:read | Cartera judicial autorizada, actuaciones, documentos, novedades y cobertura del piloto civil |
mercadopublico:read | Consultar el estado y descargar los adjuntos ya obtenidos de una licitación de Mercado Público |
mercadopublico:write | Pedir la descarga de los adjuntos de una licitación de Mercado Público |
indicadores:read | UF, dólar, euro, IPC y UTM |
core:read | Diagnóstico: hora del servidor |
echo:read | Diagnóstico: eco |
conexiones:read | Ver qué sistemas están conectados, si ya sincronizaron y qué herramientas ofrecen |
conexiones:write | Emitir enlaces de un solo uso donde una persona entrega sus credenciales reales del banco o del SII, y crear la conexión de un sistema que no pide clave (Mercado Público), que se cobra como cualquier otra |
conexiones:disable | Deshabilitar una conexión: deja de sincronizar y de sumarse al cobro, sin borrar nada |
conexiones:enable | Habilitar una conexión deshabilitada, que vuelve a sincronizar y a sumarse al cobro del plan |
conexiones:delete | Eliminar una conexión junto con su credencial guardada, sus datos sincronizados, su historial de sincronizaciones y sus webhooks. Es irreversible |
webhooks:read | Consultar las suscripciones de webhooks y el historial de sus entregas |
webhooks:write | Crear, modificar y deshabilitar suscripciones, rotar secretos de firma y reenviar entregas |
notta:read | Ver, listar y descargar las facturas y notas ya emitidas |
notta:write | Emitir facturas y notas ante el SII a nombre de la empresa de esta conexión, y reenviar por correo un documento ya emitido. Un documento emitido no se borra: solo se corrige con una nota de crédito |
Tres reglas gobiernan la lista:
- Todo es explícito. El formulario emite exactamente los permisos que marcaste; ni
*ni comodines por conector (sii:*) se aceptan. Puedes otorgar hoy el scope de un sistema que aún no conectaste: queda inerte hasta que la conexión exista, y conectar el sistema después no obliga a re-acuñar la clave. - Vacío significa cero autoridad, nunca «todos los permisos». Por eso una clave sin ningún permiso marcado no se puede crear; si construyes sobre este modelo, esa es la trampa a evitar.
- Lo que no termina en
:reades sensible. El dashboard muestra una advertencia para cada permiso de escritura o solicitud autorizada. En la emisión de honorarios, el permiso de la API conserva la aprobación del profesional por documento o los límites de su permiso recurrente. La anulación exige su propio acceso y aprobación por documento; un permiso recurrente de emisión no la autoriza.
Una llamada que exige un scope que la clave no tiene responde 403 scope_not_granted, con su suggested_fix en el envelope (catálogo de errores).
scope no es alcance
scope es el permiso de ejecución («¿puedes llamar esto?»). alcance es un módulo de datos del plano read («¿qué subconjunto sincroniza esta conexión?»). Son ejes independientes: sii:read es un scope; rcv y boletas son alcances. La distinción completa está en Los dos planos.
OAuth 2.1 para clientes MCP
Un cliente MCP interactivo (Claude, ChatGPT, un agente de terceros) no maneja una API key estática, así que /mcp es además un OAuth 2.1 Resource Server y el enrolamiento ocurre solo. Al agregar https://connect.emisso.ai/mcp en el cliente:
- El cliente descubre los metadatos del recurso protegido (
/.well-known/oauth-protected-resource) y, desde ahí, el authorization server. - Se registra en caliente en
/register(Dynamic Client Registration): sin coordinación previa y sin client secret, porque solo se admiten clientes públicos. - Abre
/authorizecon PKCE S256 obligatorio; una persona inicia sesión, elige la organización y aprueba. - Canjea el código en
/tokeny recibe un access tokenconnect_at_y un refresh tokenconnect_rt_.
El parámetro resource del flujo (RFC 8707) liga el token a la audiencia de este gateway, y cada llamada la verifica: el token no sirve contra ningún otro recurso. Y autentica como usuario: la bitácora registra actor_type: "user" con la identidad de quien aprobó, en vez de un agente anónimo.
Al remover a una persona de la organización, se revocan sus autorizaciones y se invalidan sus códigos de consentimiento pendientes. Un código emitido antes de la remoción no permite recuperar el acceso; si vuelves a invitarla, debe autorizar de nuevo al cliente.
El challenge
Una llamada a /mcp sin bearer no revela nada del catálogo; responde el challenge estándar:
curl -i -X POST https://connect.emisso.ai/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'Respuesta (cabeceras recortadas):
HTTP/2 401
www-authenticate: Bearer resource_metadata="https://connect.emisso.ai/.well-known/oauth-protected-resource"
{"jsonrpc":"2.0","id":null,"error":{"code":-32001,"message":"unauthorized"}}Ese header le dice al cliente dónde iniciar el flujo OAuth. El mismo challenge protege /api/v1/*. La falla queda registrada en security_events con el prefijo de la credencial; a la bitácora no llega, porque una falla de autenticación no tiene organización que la reciba.
Discovery y challenge no se mezclan
/.well-known/oauth-protected-resource (RFC 9728) es un documento de descubrimiento público que siempre responde 200, sin autenticación. El challenge 401 + WWW-Authenticate vive solo en /mcp y /api/v1/*. Un cliente que recibiera un 401 en el endpoint de metadatos no podría completar el flujo nunca.
Cuándo usar cuál
Las dos superficies aceptan las dos credenciales; la elección real es quién custodia el secreto.
API key (connect_sk_) | OAuth 2.1 (connect_at_ / connect_rt_) | |
|---|---|---|
| Caso natural | Tu backend, scripts y agentes propios, sobre REST o MCP | Un cliente MCP interactivo que una persona conecta |
| Cómo nace | La creas tú en el dashboard | El cliente se registra solo (DCR) y una persona aprueba |
| Autoridad | Los scopes explícitos que marcaste | Los permisos que pide el cliente, acotados por tu rol en la organización elegida al aprobar |
| Actor en la bitácora | agent | user |
| Vida | Hasta revocarla, o el vencimiento que le pongas | El access token vence y el cliente lo renueva con el refresh token |
Próximos pasos
- Tu primera llamada: el quickstart con un dato real, sin conexión de por medio.
- Conectar un sistema: del enlace de conexión a la primera sincronización.
- MCP: las tres meta-tools y el recorrido que hace un agente.
Conecta tu primera empresa
De cero a leer el Registro de Compra-Venta de un cliente real, con un enlace de un solo uso, una sincronización y una consulta.
Guías paso a paso
Recorridos guiados para conectar tu empresa desde el panel, cada uno con una demo animada de la pantalla real. Para compartir con quien va a conectar.