# What the widget sends (/docs/security-and-privacy/what-the-widget-sends)

To answer well, Skavelo needs some context about the page a user is on. It collects as little as it can.

## What's sent with each question [#whats-sent-with-each-question]

| Data | Why |
| --- | --- |
| The question | So Skavelo can answer it |
| The page address and title | So answers fit where the user is |
| A short list of visible buttons, links and headings, with their labels and positions | So Skavelo can name the right controls and run walkthroughs |
| The details you pass to `identify`, if any | So answers fit the user's plan and role; see below |
| Error messages showing on the page, and switched off buttons with the reason your app gives | So Skavelo can explain why something isn't working |
| Your app's requests that failed in the last 2 minutes: the method, the path and the status, such as `POST /invoices/:id/send` returned 402 | So Skavelo can tell a permissions problem from a billing one; see below |

## What's never sent [#whats-never-sent]

- **Anything users type.** Values in input fields and text areas, and text in rich-text editors, are never collected.
- **Password fields and editable areas.** These are reduced to their type, marked as masked, with no content.
- **Anything you mark as sensitive.** Add `data-sk-sensitive` to any element, and Skavelo skips everything inside it.

```html
<div data-sk-sensitive>
  Account number 12345678
</div>
```

## Failed requests [#failed-requests]

To work out why something isn't working, the widget notes when one of your app's requests fails. It keeps only the method, the path and the status code, in memory, for 2 minutes. It never reads request or response bodies, headers or query strings, and numbers, IDs and tokens in the path become `:id`. Requests to Skavelo itself, and blocked requests to other sites such as analytics, are ignored.

The widget only watches requests; it never changes, delays or repeats them. To switch it off, set `diagnostics` when you start the widget:

```js
Skavelo.init({ agentId: 'YOUR_AGENT_ID', diagnostics: { network: false } });
```

Error messages and switched off buttons are still read, like the rest of the page. Anything inside `data-sk-sensitive` stays out of both.

## Identity details [#identity-details]

If you [identify signed-in users](/docs/installing/identify-users), their **name** and **email** are stored so your team can see who asked in Conversations, but they're never sent to the AI model. Plan, role and tags help tailor answers. Traits are used only for your targeting rules and shown in Conversations; they aren't sent to the AI model either. Use an opaque user ID rather than an email address for `id`.

## Where the widget runs [#where-the-widget-runs]

The widget renders inside a Shadow DOM, an isolated layer, so it can't read or change your page's styles. It only works on your [allowed sites](/docs/installing/allowed-sites), and during server rendering it does nothing at all.
