# 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)] });
```
