Scopes

Los permisos que se pueden pedir y qué habilita cada uno.

Un Scope es un permiso concreto. Los pides al autorizar y recibes exactamente los que la persona aprobó, que pueden ser menos de los que pediste.

ts
await andco.auth.signIn({ scopes: ["openid", "email", "bank_accounts:read"] });

// Lo aprobado, no lo pedido.
session.scopes;

Identidad

Scope Qué habilita
openid identificar a la persona con OpenID Connect
email su correo electrónico
profile su nombre y su avatar
profile:write actualizar esos datos de perfil
phone su teléfono
identities:read sus identidades y documentos
addresses:read sus direcciones
addresses:write crear o modificar direcciones

Organizaciones

Scope Qué habilita
organizations:list listar las empresas de las que forma parte

Banca

Scope Qué habilita
bank_accounts:read leer sus cuentas bancarias
bank_accounts.movements:read leer los movimientos de esas cuentas

Sesión

Scope Qué habilita
offline_access recibir un refresh token y seguir actuando cuando la persona no está presente

Sin offline_access la sesión dura lo que dure el access token. Pídelo solo si de verdad necesitas actuar sin la persona delante.

Pedir de más no es gratis

Cada scope que agregas aparece en la pantalla de consentimiento, y algunos exigen que la persona complete verificaciones —teléfono, identidad— antes de poder aprobarlos. Pedir bank_accounts:read al inicio de sesión convierte un ingreso de dos clics en un trámite.

Pide lo mínimo para empezar y amplía cuando la persona llegue a la parte que lo necesita:

ts
if (!session.scopes.includes("bank_accounts:read")) {
  await andco.auth.signIn({ scopes: [...session.scopes, "bank_accounts:read"] });
}

Scopes que no están en la lista

El tipo AndCoScope acepta cualquier cadena: los conocidos se sugieren en el editor, y uno nuevo sigue siendo válido sin esperar una versión del SDK.

Cuando falta uno

Un 403 cuyo details trae required_scope te dice exactamente cuál faltaba:

ts
const missing = error.details?.["required_scope"];
if (missing) await andco.auth.signIn({ scopes: [...session.scopes, String(missing)] });