---
title: Quickstart
description: Installa l'SDK, inizializzalo con il tuo endpoint token e gestisci un ciclo chiamata completo dal browser.
---

Questa pagina ti porta da zero a una chiamata funzionante. Presuppone che tu
abbia già un endpoint backend che emette i token di sessione — se non ce l'hai,
parti dalla pagina [Token flow & setup backend](/docs/operator-sdk/token-flow).

## Installazione

<Tabs items={["npm", "pnpm", "yarn", "UMD (<script>)"]}>
<Tab value="npm">
```bash
npm install @audin.ai/operator-sdk
```
</Tab>
<Tab value="pnpm">
```bash
pnpm add @audin.ai/operator-sdk
```
</Tab>
<Tab value="yarn">
```bash
yarn add @audin.ai/operator-sdk
```
</Tab>
<Tab value="UMD (<script>)">
In alternativa puoi caricare il bundle UMD via `<script>`: espone il global
`AudinOperatorSDK`.

```html
<script src="https://unpkg.com/@audin.ai/operator-sdk/dist/audin-operator-sdk.umd.cjs"></script>
<script>
  const op = new AudinOperatorSDK.AudinOperator({ /* … */ });
</script>
```
</Tab>
</Tabs>

## Inizializzazione

Crea un'istanza di `AudinOperator` passando l'URL del servizio operatori Audin e
la tua callback `getToken`:

```ts
import { AudinOperator } from "@audin.ai/operator-sdk";

const op = new AudinOperator({
  coreUrl: "https://core.audin.ai",
  getToken: async () => {
    const r = await fetch("/api/operator/token", { method: "POST" });
    return r.json(); // { token, expiresAt? }
  },
});
```

`coreUrl` accetta uno schema `http(s)`, convertito internamente nel
corrispondente `ws(s)`.

## Esempio end-to-end minimale

Registra i listener per gli eventi, scegli un numero, vai online ed esegui una
chiamata:

```ts
// ── eventi ───────────────────────────────────────────────
op.on("incomingCall", (call) => {
  console.log("ringing da", call.from);
  // Mostra la tua UI "accetta / rifiuta", poi:
  call.accept(); // oppure call.reject();
});

op.on("callStarted", (call) => {
  console.log("connessa:", call.callSid, call.direction);
});

op.on("callEnded", (call) => {
  console.log("terminata:", call.callSid, "motivo:", call.endReason);
});

op.on("error", (e) => console.error(e.code, e.message));

// ── scegli un numero ─────────────────────────────────────
// Elenca i numeri dell'account, recuperati dall'SDK con lo stesso token di
// sessione dei WebSocket (nessuna API Key nel browser):
const numbers = await op.listPhoneNumbers();
// → [{ id: "pn_1", phoneNumber: "+390299999999", displayName: "Milano" }, ...]
const mine = numbers[0]; // es. quello selezionato dall'operatore nella tua UI

// ── vai online sull'id del numero ────────────────────────
await op.goOnline([mine.id]);

// ── chiamata in uscita ───────────────────────────────────
// Usa l'E.164 dello stesso numero come caller ID.
const call = await op.dial("+39021234567", { callerId: mine.phoneNumber });

// Controlli disponibili sull'oggetto call (esempi, non una sequenza reale):
call.mute(true);
call.mute(false);
call.hangup();

// ── quando l'operatore fa logout / chiude l'app ──────────
await op.goOffline();
```

<Callout type="info">
  La prima chiamata può richiedere un **gesto dell'utente** (es. un click) per
  sbloccare l'audio del browser, e l'accesso al microfono richiede un contesto
  **HTTPS** (o `localhost`). Vedi la pagina
  [Audio & microfono](/docs/operator-sdk/audio-microfono).
</Callout>

## Approfondimenti

<Cards>
  <Card href="/docs/operator-sdk/numeri-presenza" title="Numeri & presenza" description="listPhoneNumbers, goOnline / goOffline e l'evento availabilityChanged." />
  <Card href="/docs/operator-sdk/chiamate-in-entrata" title="Chiamate in entrata" description="incomingCall, accept / reject e il modello di offerta." />
  <Card href="/docs/operator-sdk/chiamate-in-uscita" title="Chiamate in uscita" description="dial, callerId e gli stati della chiamata." />
  <Card href="/docs/operator-sdk/api-reference" title="API reference" description="Tutte le opzioni, i metodi, gli eventi e i tipi." />
</Cards>
