# Widget de chat web

El widget es el chat que aparece en la esquina de tu sitio. Con `GET` y `PATCH /workspaces/{workspaceId}/web-widget` lees y cambias su **apariencia**, el **mensaje de bienvenida**, el **Met que responde** y los **dominios** donde se puede mostrar.

> Scopes `channels:read` (leer) y `channels:write` (cambiar). No consume Energía. El chat web se activa la primera vez desde Canales → Chat web en el panel; mientras no esté activado, las dos operaciones responden `404` con `web_widget_not_found`.

```ts
import { Met } from '@meteor.ia/sdk';

const met = new Met(process.env.MET_KEY!, { workspaceId: 42 });

const widget = await met.webWidget.retrieve();
console.log(widget.appearance.color, widget.welcome.title, widget.primary_met_id);
```

## Cambiar la configuración

Lo que no mandes no cambia. Dentro de `appearance` y `welcome` también va campo por campo: puedes cambiar solo el color sin tocar el resto.

```ts
await met.webWidget.update({
  appearance: { color: '#1F6FEB', theme: 'auto', position: 'left' },
  welcome: { title: '¡Hola! 👋', tagline: 'Escríbenos y te respondemos al instante.' },
  primary_met_id: 31,
  allowed_domains: ['midominio.com', '*.midominio.com'],
});
```

| Campo | Valores |
|---|---|
| `appearance.color` | Hexadecimal `#RRGGBB`. |
| `appearance.avatar` | Un emoji o la URL `https` de una imagen. |
| `appearance.position` | `right` o `left`. |
| `appearance.bubble_style` | `icon` (solo el círculo) o `expanded` (con `bubble_text` al lado). |
| `appearance.theme` | `light`, `dark` o `auto` (sigue el modo del sistema del visitante). |
| `welcome.title`, `welcome.tagline` | El título y el mensaje de bienvenida del chat. |
| `primary_met_id` | El Met que responde, un `id` de `met.agents.list()`. `null` lo quita. |
| `secondary_met_ids` | Mets de respaldo, hasta 10. Reemplaza la lista completa. |
| `allowed_domains` | De 1 a 50. Reemplaza la lista completa. `*.midominio.com` cubre los subdominios. |

Un Met que no es de tu workspace responde `404` con `met_not_found`; un dominio mal escrito, `400` con `validation_error` y `param: 'allowed_domains'`. Los cambios se ven en tu sitio en la siguiente carga de la página.

> **`allowed_domains` no puede ir vacío.** Una lista vacía no cierra el widget: lo deja abierto, y se mostraría y respondería en cualquier sitio. Por eso responde `400` con `allowed_domains_empty`. Para que el widget no aparezca en ningún sitio, desactívalo desde Canales → Chat web en el panel.
>
> Tampoco se acepta un comodín que cubra sitios de otras personas: un sufijo público como `*.com.co` o `*.co`, ni el de una plataforma que reparte subdominios, como `*.vercel.app`, `*.github.io`, `*.netlify.app` o `*.herokuapp.com`. Responde `400` con `allowed_domain_too_broad`. Usa tu propio dominio (`*.midominio.com`) o tu subdominio exacto (`midominio.vercel.app`).

## Lo que sigue en el panel

El código de instalación (el `<script>` con el token del widget), el horario de atención, el formulario previo al chat y encender o apagar el widget se manejan desde Canales → Chat web. La respuesta de la API no trae el token del snippet.
