# Session replay > https://docs.errora.org/en/products/session-replay Session replay records what happened in the browser — DOM mutations, clicks, navigation, console — and plays it back next to the error it produced. ## Setup ```javascript import * as Sentry from "@sentry/browser"; Sentry.init({ dsn: "https://@/", integrations: [ Sentry.replayIntegration({ maskAllText: true, // privacy defaults: on blockAllMedia: true, maskAllInputs: true, }), ], replaysSessionSampleRate: 0.1, // 10% of all sessions replaysOnErrorSampleRate: 1.0, // 100% of sessions that hit an error }); ``` Two sample rates, deliberately: - `replaysSessionSampleRate` — ordinary browsing. Keep it low; every recorded session costs. - `replaysOnErrorSampleRate` — sessions where an error happened. Keep this at `1.0`: this is the recording you will actually want to watch. ## Privacy Replay records your users' screens, so treat it as sensitive by default: | Control | Effect | | --- | --- | | `maskAllText: true` | Text nodes are replaced with blocks | | `maskAllInputs: true` | Input values never leave the browser | | `blockAllMedia: true` | Images/video are not recorded | | `class="sentry-mask"` | Mask one specific element | | `class="sentry-block"` | Do not record the element at all | | `class="sentry-ignore"` | Record the element but not interactions with it | Masking happens **in the browser, before anything is sent**. Turn masking off only for elements you have deliberately reviewed. ## In the UI **Replays** lists recorded sessions with user, duration, error count, browser and OS. Open one for: - **Playback** of the rrweb recording with a timeline - **Visited pages** during the session - **Errors** raised in that session, linked to their issues - **Linked traces**, when tracing is on From an issue, the **Replay** panel jumps straight to the moment the error happened. From [user feedback](/en/products/user-feedback), a `replay_id` does the same. ## API ```text GET /api/v1/projects/{project_id}/replays?stats_period=24h&limit=&offset= GET /api/v1/projects/{project_id}/replays/{replay_id} GET /api/v1/projects/{project_id}/replays/{replay_id}/events ``` ## Cost Replays are metered as the **Session Replay** service, per recorded session — the most expensive unit in the price list. Sampling is your cost control; see [Wallet](/en/billing/wallet). ## Troubleshooting | Symptom | Cause / fix | | --- | --- | | No replays at all | `replayIntegration()` missing, or both sample rates are `0` | | Replays but no error linkage | The error was captured in a different session/tab, or replay started after the error | | Blank/broken playback | Cross-origin stylesheets can't be inlined — serve CSS from your own origin or allow CORS | | Recording is huge | Long sessions on heavy DOMs; lower `replaysSessionSampleRate` and block noisy widgets with `sentry-block` | | Sensitive data visible | Masking was turned off somewhere — audit `mask*` options and per-element classes |