# Instalación

> Los paquetes de JavaScript y de Python, y qué necesitas configurar antes de la primera llamada.


## JavaScript

El paquete base es `@andco/sdk`. Trae el cliente, OAuth, el almacenamiento de sesión y el cliente REST, y funciona en cualquier runtime con `fetch`: navegador, Node, Bun, Deno, Expo, Tauri.

```bash tab="node:npm"
npm install @andco/sdk
```

```bash tab="node:pnpm"
pnpm add @andco/sdk
```

```bash tab="node:yarn"
yarn add @andco/sdk
```

```bash tab="node:bun"
bun add @andco/sdk
```

Si usas un framework, agrega su paquete de enlace. Cada uno depende de `@andco/sdk` y no duplica nada de él.

| Framework | Paquete |
| --- | --- |
| React, Next.js | `@andco/sdk-react` |
| Vue | `@andco/sdk-vue` |
| Svelte | `@andco/sdk-svelte` |
| Sin build, con `<script>` | `@andco/sdk-script` |
| Expo, React Native | `@andco/sdk-react-native-webview` |

```bash tab="node:npm"
npm install @andco/sdk @andco/sdk-react
```

```bash tab="node:pnpm"
pnpm add @andco/sdk @andco/sdk-react
```

```bash tab="node:yarn"
yarn add @andco/sdk @andco/sdk-react
```

```bash tab="node:bun"
bun add @andco/sdk @andco/sdk-react
```

En el servidor puede que además quieras la integración con tu capa de autenticación: `@andco/better-auth` para Better Auth y `@andco/passport` para Passport.

## Python

```bash tab="python:uv"
uv add andco-sdk
```

```bash tab="python:pip"
pip install andco-sdk
```

```bash tab="python:poetry"
poetry add andco-sdk
```

El SDK de Python es solo de backend: cliente confidencial, sin navegador y sin presentaciones. Requiere Python 3.11 o superior.

## Lo que necesitas de Andco

Para cualquier integración hacen falta dos valores, que obtienes al registrar tu aplicación:

- **`clientId`**: identifica públicamente a tu aplicación. Viaja en la URL de autorización y no es un secreto.
- **`redirectTo`**: la URL exacta a la que Andco devuelve al usuario. Debe estar registrada tal cual, incluido el esquema y el puerto.

Una integración de servidor necesita además un **`clientSecret`**, que nunca debe llegar al navegador. Si estás construyendo una aplicación de navegador, no tienes ni necesitas un secreto: el flujo usa PKCE justamente para eso.

## Variables de entorno

El SDK no lee variables de entorno por su cuenta: las recibe como argumentos. Eso deja la decisión de dónde viven en tu aplicación, que es donde corresponde.

```ts title=".env.local"
NEXT_PUBLIC_ANDCO_CLIENT_ID=tu-client-id
ANDCO_CLIENT_SECRET=tu-client-secret
```

La convención de prefijos es la de tu framework. Lo único que importa es que el secreto no esté entre las variables que el framework expone al navegador.

## Comprobar que quedó

```ts title="scripts/check.ts"
import { createAndcoInstanceForServer } from "@andco/sdk/server";

const andco = createAndcoInstanceForServer({
  clientId: process.env.ANDCO_CLIENT_ID!,
  clientSecret: process.env.ANDCO_CLIENT_SECRET!,
});

const configuration = await andco.oauth.configuration();
console.log(configuration.serverMetadata().issuer);
```

Si eso imprime el emisor, tu configuración llega al servidor de autorización y el resto de la documentación te va a funcionar. Si falla, el error dice qué URL no respondió.
