Install the aiAxonIQ browser agent, what it collects and deliberately does not, and what the RUM section’s tabs show — overview, performance, sessions, errors, API calls and assets.
Real user monitoring (RUM) measures your site as your users’ browsers
experienced it: page views, sessions, Core Web Vitals, JavaScript errors and how
long each asset took to load. It is measured in the browser, so it sees what no
server-side trace can — a slow network, a heavy bundle, a script that threw
before any request was made.
Plan entitlement. RUM data is served only to organizations whose plan
includes the rum feature. Without it, the RUM tabs show Not included in
this plan with the reason, instead of an error. The install snippet itself
is available whatever your plan, so you can install first.
There is no OpenTelemetry step for the browser. A small aiAxonIQ browser agent,
loaded by a snippet in your pages, sends beacons straight to the /rum path on
the same host that serves your dashboard — for aiAxonIQ Cloud,
https://app.aiaxoniq.com/rum. The agent’s own code is served from that host
too, under /rum-agent/.The beacons are authenticated by a Browser project’s agent key, which is
written into the snippet. That key is public by design — it ships in your page
source, where anyone can read it — so it is not treated as a secret:
Each project’s ingest is rate-limited per project. That is the control
that refuses traffic.
A project can carry a list of allowed page origins. That list stops another
site pasting your snippet and polluting your numbers; it is a data-quality
control, not an authentication boundary, because anything that is not a
browser can simply omit the origin.
Page views, including a single-page app’s route changes, and Core Web Vitals with what each was about (the element behind a slow interaction, the largest paint, the biggest layout shift)
Session replay — switched off, both in the snippet and by the server, until its masking has been verified end to end
JavaScript errors with their stack, frame URLs stripped of query strings
Automatic console capture — switched off the same way
XHR and fetch timings, with query strings stripped and no request or response bodies
The text of anything clicked or typed — a click names its element by tag, id, class and type only
Clicks, folded per element, with the agent’s rage, dead and error flags
Static asset timings from the browser’s Resource Timing API
A per-session trace, for the session detail
What your page reports itself: its release, the user, and page actions — see Tell RUM about your app
Why replay is off at the server, not only in the snippet. A snippet is text
on your page, and anyone can edit it. The server tells the agent which
features it may run, and it denies session replay and console capture
regardless of what the page asks for.
Open RUM and choose Set up a website (or go to /rum/setup). You need
the Editor role or above to create a website. The setup takes four steps:
1
Name your website
One per site or single-page app. This creates a Browser project and its
agent key. Picking a website you already set up reuses it — no second key is
created.
2
Configure collection
Three settings, all applied by the collector when page views arrive:
Allowed sites — page views are accepted only from these addresses.
Empty accepts any site. This keeps a site that copies your snippet out of
your numbers; it is not an authentication control.
Anonymise visitor IP addresses — on by default: sessions are located to
their country. Off adds the city. The IP address itself is never stored.
URL grouping — numbers, UUIDs and long hex strings in a path are grouped
as :id automatically. Add a regular expression for any other segment that
is really an id; the page previews the route a URL will be stored under.
Changes reach the collector within five minutes.
3
Install the snippet
Copy the snippet into the <head> of every page — the page shows where it
goes for plain HTML, Vite (React, Vue, Svelte), Angular and Next.js — and the
Content-Security-Policy directives to add if your site sends one.
4
See it report
Deploy, then open any page of your site. The setup page checks every five
seconds whether this website’s page views have arrived, and turns green
with the first page views, sessions, browser and latest page as soon as they
do.
For automation, the same flow is available through the API. You need a session token — see
Authentication — and the
Editor role or above to create a project.
The response is the new project (201); its _id is the project id.
Creating the same name and type again returns the existing project (200)
rather than a second one.
If you already have a Browser project, list it instead:
The response is two <script> elements: a configuration block carrying the
project’s agent key and id, then the agent loader.
4
Paste it into every page
Put the snippet in the <head> of every page you want measured. Paste it
exactly as returned: the beacon address and the address
the agent loads its code from must both point at the host that issued it.
reporting turns true once a page view from this project has arrived
in the last 24 hours, with pageviews, sessions, lastSeen, lastPage
and browser. Until then those are 0 or null — never a value for a
page view that did not happen.
Expected result. Load a page. In the browser’s network tab you should see
the loader fetched from /rum-agent/… and beacons sent to /rum/… answered
with a success status. Once the first page load has reported, RUM →
Overview shows a non-zero Sessions and Page views count.To see original file names and line numbers in error stacks, also upload your
source maps — see Source maps for browser errors.
Do not rotate the project’s agent key casually. The snippet already on
your pages carries the current key; replacing it stops every page that has not
been updated from reporting.
RUM opens on Websites: every Browser project on the account with its
sessions, page views, JavaScript errors and Core Web Vitals for the selected time
range. Open a website for its own workspace. Every page in it reads only that
website’s data, and its side navigation groups the pages as Monitor (Summary,
Page views, AJAX, Web vitals, Assets, Releases), Triage (JS errors,
Frustration), Users (Session traces, Page actions, Browsers, Geography) and
Settings (Application settings).A page view opens its own page: the same summary for that one route, and the API
calls, errors and sessions seen on it. An AJAX endpoint opens its status codes,
the pages that call it and its slowest calls. An error group opens its stack, the
sessions it hit, what the person did just before it, and where it happens —
its sessions by browser, operating system, device, page and release beside the
same split of your traffic, naming the one it is markedly over-represented on. A
session opens its trace: page loads, route changes, API calls, flagged clicks,
page actions, errors and vitals in order.
Overview
Sessions, Page views, Bounce rate (sessions with one page view),
Sessions with errors, Page load p75 and Users (distinct user ids
your site set; anonymous visitors are not users). Below them: the five vitals,
traffic and JavaScript errors over time on one grid, where the average page load
goes (server response, download and parse, subresources), the slowest pages at
p75, and browsers, devices, operating systems and countries by page views.
A page view is a full page load or a route change inside a single-page app, so
moving around an app is not a bounce. A performance score (0–100) weighs
the vitals as Sentry does — LCP and INP 30 each, CLS and FCP 15, TTFB 10 —
scoring 90 at a vital’s “good” threshold and 50 at its “poor” one. The
Frustration card gives the share of sessions with a rage, dead or error
click.
Performance
LCP, INP and CLS (the Core Web Vitals) plus FCP and TTFB, each judged at the
75th percentile against web.dev’s thresholds — for example LCP good at 2.5 s or
less and poor above 4 s, CLS good at 0.1 or less and poor above 0.25, INP good
at 200 ms or less and poor above 500 ms. Every card shows the share of samples
that were good, needed improvement or were poor, and how many samples the
verdict stands on; fewer than 20 is marked as indicative. Pick a vital to see
its p75 over time drawn on the three bands, and a per-page table judging every
route the same way, with its score and its opportunity — how many points the
whole site would gain if that page scored 100.For LCP, INP and CLS, What to fix shows where the time goes (INP’s input
delay, processing and presentation; LCP’s time to first byte, load delay, load
duration and render delay) and the elements behind it, worst first.A vital with no samples is marked as not measured, never shown as zero. INP
needs someone to interact with the page. FID is not shown: INP replaced it as a
Core Web Vital in March 2024.
Sessions
One row per session that started in the window: user, start, duration,
views (with a Bounced badge for one-page sessions), errors, entry page
(grouped into its route), browser and OS, device and country. Expand a row for
its referrer and campaign parameters, the client build, and its page-load
waterfall.
Errors
JavaScript errors grouped by a fingerprint computed from the stack, so a
rebuild that only changes a bundle hash does not create a new group. Each row
shows occurrences, affected sessions and users, the page and the last time
it was seen. Expand a row for the stack, with each frame marked
Symbolicated or Not symbolicated depending on whether a matching
source map is uploaded.
API calls
Every XHR and fetch your pages made, by endpoint (ids in the path grouped as
:id): calls, how many failed (status 400 or above, or no response) and their
share, and p50, p75 and slowest duration. The agent’s own reports are left out.
Frustration
Clicks that did not do what someone expected: rage clicks (several fast
clicks on one element), dead clicks (a click that changed nothing) and
error clicks (a click followed by a JavaScript error) — over time, by the
element people clicked, and by page.
Releases
Every release of your site that reported in the window, newest first: sessions,
the share that hit an error, the error groups it introduced, and LCP, INP and
CLS — each compared with the release before it, with a vital that moved to a
worse band flagged. Needs setApplicationVersion (below).
Page actions
The events your pages report with addPageAction, by name: how often, in how
many sessions, by how many users and on which page. A name opens its trend, its
attribute values and its latest occurrences, each linked to its session.
Assets
Scripts, stylesheets, images and fonts by host and type, from the browser’s
Resource Timing API: requests, average and p75 duration, the share served from
the browser cache, and bytes transferred.
At the time of writing, no browser has been verified reporting to a deployed
aiAxonIQ environment. The pipeline has been exercised in a real browser against the
snippet this page describes, and the RUM section is available so that you can
install it — but treat your first installation as the check, and use the
expected result above to confirm it.
Three calls, made on every page after the snippet, give the RUM pages what only
your code knows. The agent’s API is on window.AIAXONIQ.
AIAXONIQ.setApplicationVersion('2.4.1'); // the release — Releases, and the release on every errorAIAXONIQ.setUserId(currentUser.id); // the user — the Users counts and each session's userAIAXONIQ.addPageAction('addToCart', { sku: 'A-12' }); // a step you want counted — Page actions
A user id is whatever identifier you choose to send; send an opaque id rather
than an email address. Source maps are matched to errors by the release you
declare with addRelease(name, id) — see
Source maps.
No browser telemetry yet means no page views and no sessions arrived in
the window. That is what an un-instrumented site looks like, and waiting will
not change it. Check that the snippet is in the page’s <head>, then load a
page and watch the network tab: the loader should come from /rum-agent/…
and the beacons should go to /rum/….
The loader loads but no beacons are sent
The snippet was probably edited or assembled by hand. The agent fetches the
rest of its code from the address in the snippet’s configuration; if that
address is missing or points at your own site, the agent fails to load its
code and sends nothing. Replace the snippet with a fresh copy from the
rum-snippet call.
Beacons are refused with 403
The response body says which of three reasons applies. Unknown agent key
means the key in the snippet is not a current project key — the project was
deleted, or its key was replaced after the snippet was pasted; fetch the
snippet again. Origin not allowed for this project means the project has
a list of allowed origins and the page is not on it. No agent key
supplied means the snippet’s configuration block is missing or was edited.
A burst of refusals under heavy load can also be the per-project rate limit.
Not included in this plan
Your organization’s plan does not include RUM. The snippet can still be
installed; the data becomes visible when the plan includes the rum
feature.
A vital shows as not measured
No browser reported that vital in the window. Some browsers do not report
every vital, and a page that is closed before it finishes loading reports
none.
Assets leaves some durations out
A cross-origin asset served without a Timing-Allow-Origin header reports no
timing to the browser, so it is counted but left out of the durations. Add the
header on the asset’s host if you control it.
Countries says it isn't available
The collector records each visitor’s network prefix but needs a GeoIP database
to name a country, and none is configured yet. No country is guessed.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"aiAxonIQ","description":"Documentation for aiAxonIQ — send OpenTelemetry logs, metrics and traces, then search, alert and investigate.","colors":{"primary":"#006B80","light":"#22C7E6","dark":"#006B80"},"logo":{"light":"https://mintcdn.com/ai-axon-iq/WoiAVV8vwflLeOvu/logo/light.png?fit=max\u0026auto=format\u0026n=WoiAVV8vwflLeOvu\u0026q=85\u0026s=120e1abae07a4f35e810a38791d7339c","dark":"https://mintcdn.com/ai-axon-iq/WoiAVV8vwflLeOvu/logo/dark.png?fit=max\u0026auto=format\u0026n=WoiAVV8vwflLeOvu\u0026q=85\u0026s=4433b29b3d983ee9529c0446d9a1b2f3","href":"https://aiaxoniq.com"},"favicon":"https://mintcdn.com/ai-axon-iq/WoiAVV8vwflLeOvu/favicon.png?fit=max\u0026auto=format\u0026n=WoiAVV8vwflLeOvu\u0026q=85\u0026s=b662761f53474416b3bb238d403eb92c","appearance":{"default":"system"},"background":{"color":{"light":"#F5F4F0","dark":"#0A0C0F"}},"navbar":{"links":[{"href":"https://play.aiaxoniq.com/playground","label":"Try the playground"},{"href":"https://aiaxoniq.com/contact","label":"Support"}],"primary":{"type":"button","label":"Open dashboard","href":"https://app.aiaxoniq.com"}},"footer":{"socials":{"website":"https://aiaxoniq.com","linkedin":"https://www.linkedin.com/company/aiaxoniq"},"links":[{"header":"Product","items":[{"label":"Overview","href":"https://aiaxoniq.com/product"},{"label":"Use cases","href":"https://aiaxoniq.com/customers"},{"label":"Changelog","href":"https://aiaxoniq.com/changelog"}]},{"header":"Documentation","items":[{"label":"Quickstart","href":"https://docs.aiaxoniq.com/get-started/quickstart"},{"label":"Send data","href":"https://docs.aiaxoniq.com/send-data/overview"},{"label":"API reference","href":"https://docs.aiaxoniq.com/api-reference/introduction"}]},{"header":"Company","items":[{"label":"About","href":"https://aiaxoniq.com/about"},{"label":"Contact","href":"https://aiaxoniq.com/contact"},{"label":"Security","href":"https://aiaxoniq.com/security"}]},{"header":"Legal","items":[{"label":"Privacy","href":"https://aiaxoniq.com/privacy"},{"label":"Terms","href":"https://aiaxoniq.com/terms"},{"label":"DPA","href":"https://aiaxoniq.com/dpa"}]}]},"search":{"prompt":"Search the aiAxonIQ docs"},"seo":{"metatags":{"og:site_name":"aiAxonIQ Documentation","og:type":"website","og:image":"https://docs.aiaxoniq.com/images/og-default.png","og:image:width":"1200","og:image:height":"630","og:image:alt":"aiAxonIQ documentation — send OpenTelemetry logs, metrics and traces","twitter:card":"summary_large_image","twitter:image":"https://docs.aiaxoniq.com/images/og-default.png","twitter:title":"aiAxonIQ Documentation","twitter:description":"Send OpenTelemetry logs, metrics and traces to aiAxonIQ, then search, alert and investigate.","robots":"index, follow"},"indexing":"navigable"},"fonts":{"family":"Inter"},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"ai-axon-iq","hasAudioNarration":false,"actualSubdomain":"ai-axon-iq","customDomains":["docs.aiaxoniq.com"],"gitSource":{"type":"github","owner":"aiaxoniq","repo":"aiaxoniq","deployBranch":"master","contentDirectory":"docs-portal","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae62842b1d87e83eee6c688","collectionId":"7b0a98ab-2b4a-4d8c-a130-2dc3588fd952","liveDeploymentHistoryId":"6ae62842b1d87e83eee6c688","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae62842b1d87e83eee6c688","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"API reference","count":758},{"language":"default","tag":"Endpoints","count":757},{"language":"default","tag":"Alerts","count":75},{"language":"default","tag":"Users and roles","count":71},{"language":"default","tag":"SIEM","count":65},{"language":"default","tag":"Services","count":55},{"language":"default","tag":"Logs","count":47},{"language":"default","tag":"Authentication","count":35},{"language":"default","tag":"Get started","count":34},{"language":"default","tag":"Dashboards","count":34}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"guides/rum/overview","slug":"/guides/rum/overview","pageMetadata":{"title":"Real user monitoring","description":"Install the aiAxonIQ browser agent, what it collects and deliberately does not, and what the RUM section's tabs show — overview, performance, sessions, errors, API calls and assets.","icon":"eye","href":"/guides/rum/overview"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Install the aiAxonIQ browser agent, what it collects and deliberately does not, and what the RUM section’s tabs show — overview, performance, sessions, errors, API calls and assets.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,CodeBlock,Heading,Info,Note,Step,Steps,Table,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Real user monitoring (RUM) measures your site as your users’ browsers\nexperienced it: page views, sessions, Core Web Vitals, JavaScript errors and how\nlong each asset took to load. It is measured in the browser, so it sees what no\nserver-side trace can — a slow network, a heavy bundle, a script that threw\nbefore any request was made.`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Plan entitlement.`}),` RUM data is served only to organizations whose plan\nincludes the `,_jsx(_components.code,{children:`rum`}),` feature. Without it, the RUM tabs show `,_jsx(_components.strong,{children:`Not included in\nthis plan`}),` with the reason, instead of an error. The install snippet itself\nis available whatever your plan, so you can install first.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`how-browser-telemetry-arrives`,children:`How browser telemetry arrives`}),`\n`,_jsxs(_components.p,{children:[`There is no OpenTelemetry step for the browser. A small aiAxonIQ browser agent,\nloaded by a snippet in your pages, sends beacons straight to the `,_jsx(_components.code,{children:`/rum`}),` path on\nthe same host that serves your dashboard — for aiAxonIQ Cloud,\n`,_jsx(_components.code,{children:`https://app.aiaxoniq.com/rum`}),`. The agent’s own code is served from that host\ntoo, under `,_jsx(_components.code,{children:`/rum-agent/`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The beacons are authenticated by a `,_jsx(_components.strong,{children:`Browser project’s agent key`}),`, which is\nwritten into the snippet. That key is public by design — it ships in your page\nsource, where anyone can read it — so it is not treated as a secret:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Each project’s ingest is `,_jsx(_components.strong,{children:`rate-limited`}),` per project. That is the control\nthat refuses traffic.`]}),`\n`,_jsxs(_components.li,{children:[`A project can carry a list of allowed page origins. That list stops another\nsite pasting your snippet and polluting your numbers; it is a data-quality\ncontrol, `,_jsx(_components.strong,{children:`not`}),` an authentication boundary, because anything that is not a\nbrowser can simply omit the origin.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`what-the-agent-collects`,children:`What the agent collects`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{style:{textAlign:`left`},children:`Collected`}),_jsx(_components.th,{style:{textAlign:`left`},children:`Not collected`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Page views, including a single-page app’s route changes, and Core Web Vitals with what each was about (the element behind a slow interaction, the largest paint, the biggest layout shift)`}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.strong,{children:`Session replay`}),` — switched off, both in the snippet and by the server, until its masking has been verified end to end`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`JavaScript errors with their stack, frame URLs stripped of query strings`}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.strong,{children:`Automatic console capture`}),` — switched off the same way`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{style:{textAlign:`left`},children:[`XHR and `,_jsx(_components.code,{children:`fetch`}),` timings, with query strings stripped and no request or response bodies`]}),_jsxs(_components.td,{style:{textAlign:`left`},children:[_jsx(_components.strong,{children:`The text of anything clicked or typed`}),` — a click names its element by tag, `,_jsx(_components.code,{children:`id`}),`, `,_jsx(_components.code,{children:`class`}),` and `,_jsx(_components.code,{children:`type`}),` only`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Clicks, folded per element, with the agent’s rage, dead and error flags`}),_jsx(_components.td,{style:{textAlign:`left`}})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`Static asset timings from the browser’s Resource Timing API`}),_jsx(_components.td,{style:{textAlign:`left`}})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{style:{textAlign:`left`},children:`A per-session trace, for the session detail`}),_jsx(_components.td,{style:{textAlign:`left`}})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{style:{textAlign:`left`},children:[`What your page reports itself: its release, the user, and page actions — see `,_jsx(_components.a,{href:`#tell-rum-about-your-app`,children:`Tell RUM about your app`})]}),_jsx(_components.td,{style:{textAlign:`left`}})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Why replay is off at the server, not only in the snippet.`}),` A snippet is text\non your page, and anyone can edit it. The server tells the agent which\nfeatures it may run, and it denies session replay and console capture\nregardless of what the page asks for.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`install-the-snippet`,children:`Install the snippet`}),`\n`,_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`RUM`}),` and choose `,_jsx(_components.strong,{children:`Set up a website`}),` (or go to `,_jsx(_components.code,{children:`/rum/setup`}),`). You need\nthe `,_jsx(_components.strong,{children:`Editor`}),` role or above to create a website. The setup takes four steps:`]}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Name your website`,children:_jsxs(_components.p,{children:[`One per site or single-page app. This creates a `,_jsx(_components.strong,{children:`Browser project`}),` and its\nagent key. Picking a website you already set up reuses it — no second key is\ncreated.`]})}),_jsxs(Step,{title:`Configure collection`,children:[_jsx(_components.p,{children:`Three settings, all applied by the collector when page views arrive:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Allowed sites`}),` — page views are accepted only from these addresses.\nEmpty accepts any site. This keeps a site that copies your snippet out of\nyour numbers; it is not an authentication control.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Anonymise visitor IP addresses`}),` — on by default: sessions are located to\ntheir country. Off adds the city. The IP address itself is never stored.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`URL grouping`}),` — numbers, UUIDs and long hex strings in a path are grouped\nas `,_jsx(_components.code,{children:`:id`}),` automatically. Add a regular expression for any other segment that\nis really an id; the page previews the route a URL will be stored under.`]}),`\n`]}),_jsx(_components.p,{children:`Changes reach the collector within five minutes.`})]}),_jsx(Step,{title:`Install the snippet`,children:_jsxs(_components.p,{children:[`Copy the snippet into the `,_jsx(_components.code,{children:`\u003chead>`}),` of every page — the page shows where it\ngoes for plain HTML, Vite (React, Vue, Svelte), Angular and Next.js — and the\nContent-Security-Policy directives to add if your site sends one.`]})}),_jsx(Step,{title:`See it report`,children:_jsxs(_components.p,{children:[`Deploy, then open any page of your site. The setup page checks every five\nseconds whether `,_jsx(_components.strong,{children:`this`}),` website’s page views have arrived, and turns green\nwith the first page views, sessions, browser and latest page as soon as they\ndo.`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`through-the-api-instead`,children:`Through the API instead`}),`\n`,_jsxs(_components.p,{children:[`For automation, the same flow is available through the API. You need a session token — see\n`,_jsx(_components.a,{href:`/get-started/authentication`,children:`Authentication`}),` — and the\n`,_jsx(_components.strong,{children:`Editor`}),` role or above to create a project.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Find your organization id`,children:[_jsxs(_components.p,{children:[`Every call names your organization as `,_jsx(_components.code,{children:`tenantId`}),`:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`TENANT_ID`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`$(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SESSION_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://app.aiaxoniq.com/auth/me`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` jq`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -r`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` .user.tenantId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Create a Browser project`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -X`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` POST`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SESSION_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Content-Type: application/json\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -d`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '{\"name\": \"storefront-web\", \"type\": \"Browser\"}'`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://app.aiaxoniq.com/api/projects?tenantId=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$TENANT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`The response is the new project (`,_jsx(_components.code,{children:`201`}),`); its `,_jsx(_components.code,{children:`_id`}),` is the project id.\nCreating the same name and type again returns the existing project (`,_jsx(_components.code,{children:`200`}),`)\nrather than a second one.\nIf you already have a Browser project, list it instead:`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SESSION_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://app.aiaxoniq.com/api/projects?tenantId=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$TENANT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` jq`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -r`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` '.[] | select(.type == \"Browser\") | \"\\\\(._id) \\\\(.name)\"'`})]}),`\n`]})})})]}),_jsxs(Step,{title:`Fetch the snippet`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SESSION_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://app.aiaxoniq.com/api/projects/`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/rum-snippet?tenantId=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$TENANT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`]})})}),_jsxs(_components.p,{children:[`The response is two `,_jsx(_components.code,{children:`\u003cscript>`}),` elements: a configuration block carrying the\nproject’s agent key and id, then the agent loader.`]})]}),_jsx(Step,{title:`Paste it into every page`,children:_jsxs(_components.p,{children:[`Put the snippet in the `,_jsx(_components.code,{children:`\u003chead>`}),` of every page you want measured. Paste it\nexactly as returned: the beacon address and the address\nthe agent loads its code from must both point at the host that issued it.`]})}),_jsxs(Step,{title:`Check that it is reporting`,children:[_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -s`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -H`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"Authorization: Bearer `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$SESSION_TOKEN`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D7BA7D`},children:` \\\\`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"https://app.aiaxoniq.com/api/projects/`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$PROJECT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`/rum-status?tenantId=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`$TENANT_ID`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`})]}),`\n`]})})}),_jsxs(_components.p,{children:[_jsx(_components.code,{children:`reporting`}),` turns `,_jsx(_components.code,{children:`true`}),` once a page view from `,_jsx(_components.strong,{children:`this`}),` project has arrived\nin the last 24 hours, with `,_jsx(_components.code,{children:`pageviews`}),`, `,_jsx(_components.code,{children:`sessions`}),`, `,_jsx(_components.code,{children:`lastSeen`}),`, `,_jsx(_components.code,{children:`lastPage`}),`\nand `,_jsx(_components.code,{children:`browser`}),`. Until then those are `,_jsx(_components.code,{children:`0`}),` or `,_jsx(_components.code,{children:`null`}),` — never a value for a\npage view that did not happen.`]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Expected result.`}),` Load a page. In the browser’s network tab you should see\nthe loader fetched from `,_jsx(_components.code,{children:`/rum-agent/…`}),` and beacons sent to `,_jsx(_components.code,{children:`/rum/…`}),` answered\nwith a success status. Once the first page load has reported, `,_jsx(_components.strong,{children:`RUM →\nOverview`}),` shows a non-zero `,_jsx(_components.strong,{children:`Sessions`}),` and `,_jsx(_components.strong,{children:`Page views`}),` count.`]}),`\n`,_jsxs(_components.p,{children:[`To see original file names and line numbers in error stacks, also upload your\nsource maps — see `,_jsx(_components.a,{href:`/guides/rum/source-maps`,children:`Source maps for browser errors`}),`.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Do not rotate the project’s agent key casually.`}),` The snippet already on\nyour pages carries the current key; replacing it stops every page that has not\nbeen updated from reporting.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`what-the-rum-section-shows`,children:`What the RUM section shows`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`RUM`}),` opens on `,_jsx(_components.strong,{children:`Websites`}),`: every Browser project on the account with its\nsessions, page views, JavaScript errors and Core Web Vitals for the selected time\nrange. Open a website for its own workspace. Every page in it reads only that\nwebsite’s data, and its side navigation groups the pages as `,_jsx(_components.strong,{children:`Monitor`}),` (Summary,\nPage views, AJAX, Web vitals, Assets, Releases), `,_jsx(_components.strong,{children:`Triage`}),` (JS errors,\nFrustration), `,_jsx(_components.strong,{children:`Users`}),` (Session traces, Page actions, Browsers, Geography) and\n`,_jsx(_components.strong,{children:`Settings`}),` (Application settings).`]}),`\n`,_jsxs(_components.p,{children:[`A page view opens its own page: the same summary for that one route, and the API\ncalls, errors and sessions seen on it. An AJAX endpoint opens its status codes,\nthe pages that call it and its slowest calls. An error group opens its stack, the\nsessions it hit, what the person did just before it, and `,_jsx(_components.strong,{children:`where it happens`}),` —\nits sessions by browser, operating system, device, page and release beside the\nsame split of your traffic, naming the one it is markedly over-represented on. A\nsession opens its trace: page loads, route changes, API calls, flagged clicks,\npage actions, errors and vitals in order.`]}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Overview`,icon:`gauge`,id:`overview`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Sessions`}),`, `,_jsx(_components.strong,{children:`Page views`}),`, `,_jsx(_components.strong,{children:`Bounce rate`}),` (sessions with one page view),\n`,_jsx(_components.strong,{children:`Sessions with errors`}),`, `,_jsx(_components.strong,{children:`Page load p75`}),` and `,_jsx(_components.strong,{children:`Users`}),` (distinct user ids\nyour site set; anonymous visitors are not users). Below them: the five vitals,\ntraffic and JavaScript errors over time on one grid, where the average page load\ngoes (server response, download and parse, subresources), the slowest pages at\np75, and browsers, devices, operating systems and countries by page views.\nA page view is a full page load or a route change inside a single-page app, so\nmoving around an app is not a bounce. A `,_jsx(_components.strong,{children:`performance score`}),` (0–100) weighs\nthe vitals as Sentry does — LCP and INP 30 each, CLS and FCP 15, TTFB 10 —\nscoring 90 at a vital’s “good” threshold and 50 at its “poor” one. The\n`,_jsx(_components.strong,{children:`Frustration`}),` card gives the share of sessions with a rage, dead or error\nclick.`]})}),_jsxs(Accordion,{title:`Performance`,icon:`chart-line`,id:`performance`,children:[_jsxs(_components.p,{children:[`LCP, INP and CLS (the Core Web Vitals) plus FCP and TTFB, each judged at the\n75th percentile against web.dev’s thresholds — for example LCP good at 2.5 s or\nless and poor above 4 s, CLS good at 0.1 or less and poor above 0.25, INP good\nat 200 ms or less and poor above 500 ms. Every card shows the share of samples\nthat were good, needed improvement or were poor, and how many samples the\nverdict stands on; fewer than 20 is marked as indicative. Pick a vital to see\nits p75 over time drawn on the three bands, and a per-page table judging every\nroute the same way, with its score and its `,_jsx(_components.strong,{children:`opportunity`}),` — how many points the\nwhole site would gain if that page scored 100.`]}),_jsxs(_components.p,{children:[`For LCP, INP and CLS, `,_jsx(_components.strong,{children:`What to fix`}),` shows where the time goes (INP’s input\ndelay, processing and presentation; LCP’s time to first byte, load delay, load\nduration and render delay) and the elements behind it, worst first.`]}),_jsx(_components.p,{children:`A vital with no samples is marked as not measured, never shown as zero. INP\nneeds someone to interact with the page. FID is not shown: INP replaced it as a\nCore Web Vital in March 2024.`})]}),_jsx(Accordion,{title:`Sessions`,icon:`users`,id:`sessions`,children:_jsxs(_components.p,{children:[`One row per session that `,_jsx(_components.strong,{children:`started`}),` in the window: user, start, duration,\nviews (with a `,_jsx(_components.strong,{children:`Bounced`}),` badge for one-page sessions), errors, entry page\n(grouped into its route), browser and OS, device and country. Expand a row for\nits referrer and campaign parameters, the client build, and its page-load\nwaterfall.`]})}),_jsx(Accordion,{title:`Errors`,icon:`triangle-exclamation`,id:`errors`,children:_jsxs(_components.p,{children:[`JavaScript errors grouped by a fingerprint computed from the stack, so a\nrebuild that only changes a bundle hash does not create a new group. Each row\nshows occurrences, affected sessions and users, the page and the last time\nit was seen. Expand a row for the stack, with each frame marked\n`,_jsx(_components.strong,{children:`Symbolicated`}),` or `,_jsx(_components.strong,{children:`Not symbolicated`}),` depending on whether a matching\nsource map is uploaded.`]})}),_jsx(Accordion,{title:`API calls`,icon:`arrow-right-arrow-left`,id:`api-calls`,children:_jsxs(_components.p,{children:[`Every XHR and `,_jsx(_components.code,{children:`fetch`}),` your pages made, by endpoint (ids in the path grouped as\n`,_jsx(_components.code,{children:`:id`}),`): calls, how many failed (status 400 or above, or no response) and their\nshare, and p50, p75 and slowest duration. The agent’s own reports are left out.`]})}),_jsx(Accordion,{title:`Frustration`,icon:`hand-pointer`,id:`frustration`,children:_jsxs(_components.p,{children:[`Clicks that did not do what someone expected: `,_jsx(_components.strong,{children:`rage clicks`}),` (several fast\nclicks on one element), `,_jsx(_components.strong,{children:`dead clicks`}),` (a click that changed nothing) and\n`,_jsx(_components.strong,{children:`error clicks`}),` (a click followed by a JavaScript error) — over time, by the\nelement people clicked, and by page.`]})}),_jsx(Accordion,{title:`Releases`,icon:`rocket`,id:`releases`,children:_jsxs(_components.p,{children:[`Every release of your site that reported in the window, newest first: sessions,\nthe share that hit an error, the error groups it introduced, and LCP, INP and\nCLS — each compared with the release before it, with a vital that moved to a\nworse band flagged. Needs `,_jsx(_components.code,{children:`setApplicationVersion`}),` (below).`]})}),_jsx(Accordion,{title:`Page actions`,icon:`bolt`,id:`page-actions`,children:_jsxs(_components.p,{children:[`The events your pages report with `,_jsx(_components.code,{children:`addPageAction`}),`, by name: how often, in how\nmany sessions, by how many users and on which page. A name opens its trend, its\nattribute values and its latest occurrences, each linked to its session.`]})}),_jsx(Accordion,{title:`Assets`,icon:`file-arrow-down`,id:`assets`,children:_jsx(_components.p,{children:`Scripts, stylesheets, images and fonts by host and type, from the browser’s\nResource Timing API: requests, average and p75 duration, the share served from\nthe browser cache, and bytes transferred.`})})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`At the time of writing, no browser has been verified reporting to a deployed\naiAxonIQ environment.`}),` The pipeline has been exercised in a real browser against the\nsnippet this page describes, and the RUM section is available so that you can\ninstall it — but treat your first installation as the check, and use the\nexpected result above to confirm it.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`tell-rum-about-your-app`,children:`Tell RUM about your app`}),`\n`,_jsxs(_components.p,{children:[`Three calls, made on every page after the snippet, give the RUM pages what only\nyour code knows. The agent’s API is on `,_jsx(_components.code,{children:`window.AIAXONIQ`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`AIAXONIQ`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`setApplicationVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'2.4.1'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// the release — Releases, and the release on every error`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`AIAXONIQ`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`setUserId`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`currentUser`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// the user — the Users counts and each session's user`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4FC1FF`},children:`AIAXONIQ`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`addPageAction`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'addToCart'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`sku:`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` 'A-12'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` }); `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// a step you want counted — Page actions`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`A user id is whatever identifier you choose to send; send an opaque id rather\nthan an email address. Source maps are matched to errors by the release you\ndeclare with `,_jsx(_components.code,{children:`addRelease(name, id)`}),` — see\n`,_jsx(_components.a,{href:`/guides/rum/source-maps`,children:`Source maps`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Overview says Nothing has reported in this window`,id:`overview-says-nothing-has-reported-in-this-window`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`No browser telemetry yet`}),` means no page views and no sessions arrived in\nthe window. That is what an un-instrumented site looks like, and waiting will\nnot change it. Check that the snippet is in the page’s `,_jsx(_components.code,{children:`\u003chead>`}),`, then load a\npage and watch the network tab: the loader should come from `,_jsx(_components.code,{children:`/rum-agent/…`}),`\nand the beacons should go to `,_jsx(_components.code,{children:`/rum/…`}),`.`]})}),_jsx(Accordion,{title:`The loader loads but no beacons are sent`,id:`the-loader-loads-but-no-beacons-are-sent`,children:_jsxs(_components.p,{children:[`The snippet was probably edited or assembled by hand. The agent fetches the\nrest of its code from the address in the snippet’s configuration; if that\naddress is missing or points at your own site, the agent fails to load its\ncode and sends nothing. Replace the snippet with a fresh copy from the\n`,_jsx(_components.code,{children:`rum-snippet`}),` call.`]})}),_jsx(Accordion,{title:`Beacons are refused with 403`,id:`beacons-are-refused-with-403`,children:_jsxs(_components.p,{children:[`The response body says which of three reasons applies. `,_jsx(_components.strong,{children:`Unknown agent key`}),`\nmeans the key in the snippet is not a current project key — the project was\ndeleted, or its key was replaced after the snippet was pasted; fetch the\nsnippet again. `,_jsx(_components.strong,{children:`Origin not allowed for this project`}),` means the project has\na list of allowed origins and the page is not on it. `,_jsx(_components.strong,{children:`No agent key\nsupplied`}),` means the snippet’s configuration block is missing or was edited.\nA burst of refusals under heavy load can also be the per-project rate limit.`]})}),_jsx(Accordion,{title:`Not included in this plan`,id:`not-included-in-this-plan`,children:_jsxs(_components.p,{children:[`Your organization’s plan does not include RUM. The snippet can still be\ninstalled; the data becomes visible when the plan includes the `,_jsx(_components.code,{children:`rum`}),`\nfeature.`]})}),_jsx(Accordion,{title:`A vital shows as not measured`,id:`a-vital-shows-as-not-measured`,children:_jsx(_components.p,{children:`No browser reported that vital in the window. Some browsers do not report\nevery vital, and a page that is closed before it finishes loading reports\nnone.`})}),_jsx(Accordion,{title:`Assets leaves some durations out`,id:`assets-leaves-some-durations-out`,children:_jsxs(_components.p,{children:[`A cross-origin asset served without a `,_jsx(_components.code,{children:`Timing-Allow-Origin`}),` header reports no\ntiming to the browser, so it is counted but left out of the durations. Add the\nheader on the asset’s host if you control it.`]})}),_jsx(Accordion,{title:`Countries says it isn't available`,id:`countries-says-it-isnt-available`,children:_jsx(_components.p,{children:`The collector records each visitor’s network prefix but needs a GeoIP database\nto name a country, and none is configured yet. No country is guessed.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`next`,children:`Next`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Source maps for browser errors`,icon:`file-code`,href:`/guides/rum/source-maps`,children:_jsx(_components.p,{children:`Show original file and line numbers in stacks.`})}),_jsx(Card,{title:`APM`,icon:`chart-line`,href:`/guides/apm/overview`,children:_jsx(_components.p,{children:`The server side of the same requests.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Real user monitoring","description":"Install the aiAxonIQ browser agent, what it collects and deliberately does not, and what the RUM section's tabs show — overview, performance, sessions, errors, API calls and assets.","icon":"eye","href":"/guides/rum/overview"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"How browser telemetry arrives","slug":"how-browser-telemetry-arrives","depth":2,"children":[{"title":"What the agent collects","slug":"what-the-agent-collects","depth":3,"children":[]}]},{"title":"Install the snippet","slug":"install-the-snippet","depth":2,"children":[{"title":"Through the API instead","slug":"through-the-api-instead","depth":3,"children":[]}]},{"title":"What the RUM section shows","slug":"what-the-rum-section-shows","depth":2,"children":[]},{"title":"Tell RUM about your app","slug":"tell-rum-about-your-app","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Next","slug":"next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"ai-axon-iq","siteName":"aiAxonIQ","title":"Real user monitoring - aiAxonIQ","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-01T03:42:05.040Z","originalFileLocation":"guides/rum/overview.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Install the aiAxonIQ browser agent, what it collects and deliberately does not, and what the RUM section\u0026#x27;s tabs show — overview, performance, sessions, errors, API calls and assets.\">\u003cmeta data-mint-head name=\"application-name\" content=\"aiAxonIQ\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003cmeta data-mint-head name=\"robots\" content=\"index, follow\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Real user monitoring - aiAxonIQ\">\u003cmeta data-mint-head property=\"og:description\" content=\"Install the aiAxonIQ browser agent, what it collects and deliberately does not, and what the RUM section\u0026#x27;s tabs show — overview, performance, sessions, errors, API calls and assets.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"aiAxonIQ Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.aiaxoniq.com/guides/rum/overview\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.aiaxoniq.com/images/og-default.png\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"aiAxonIQ Documentation\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Send OpenTelemetry logs, metrics and traces to aiAxonIQ, then search, alert and investigate.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.aiaxoniq.com/images/og-default.png\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/ai-axon-iq/2wGnplOLGG1HbyBX/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"aiAxonIQ\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#006B80\">\u003cmeta data-mint-head name=\"og:image:alt\" content=\"aiAxonIQ documentation — send OpenTelemetry logs, metrics and traces\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.aiaxoniq.com/guides/rum/overview\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/guides/rum/overview.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.aiaxoniq.com/#organization\",\"name\":\"aiAxonIQ\",\"url\":\"https://docs.aiaxoniq.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/ai-axon-iq/WoiAVV8vwflLeOvu/logo/light.png?fit=max\u0026auto=format\u0026n=WoiAVV8vwflLeOvu\u0026q=85\u0026s=120e1abae07a4f35e810a38791d7339c\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.aiaxoniq.com#website\",\"name\":\"aiAxonIQ\",\"url\":\"https://docs.aiaxoniq.com\",\"publisher\":{\"@id\":\"https://docs.aiaxoniq.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.aiaxoniq.com/guides/rum/overview#webpage\",\"url\":\"https://docs.aiaxoniq.com/guides/rum/overview\",\"name\":\"Real user monitoring\",\"description\":\"Install the aiAxonIQ browser agent, what it collects and deliberately does not, and what the RUM section's tabs show — overview, performance, sessions, errors, API calls and assets.\",\"dateModified\":\"2026-10-01T03:42:05.040Z\",\"isPartOf\":{\"@id\":\"https://docs.aiaxoniq.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.aiaxoniq.com/guides/rum/overview#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.aiaxoniq.com/guides/rum/overview#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"aiAxonIQ\",\"item\":\"https://docs.aiaxoniq.com\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Real user monitoring\",\"item\":\"https://docs.aiaxoniq.com/guides/rum/overview\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.aiaxoniq.com/guides/rum/overview#article\",\"headline\":\"Real user monitoring\",\"name\":\"Real user monitoring\",\"description\":\"Install the aiAxonIQ browser agent, what it collects and deliberately does not, and what the RUM section's tabs show — overview, performance, sessions, errors, API calls and assets.\",\"url\":\"https://docs.aiaxoniq.com/guides/rum/overview\",\"mainEntityOfPage\":{\"@id\":\"https://docs.aiaxoniq.com/guides/rum/overview#webpage\"},\"image\":\"https://docs.aiaxoniq.com/images/og-default.png\",\"dateModified\":\"2026-10-01T03:42:05.040Z\",\"publisher\":{\"@id\":\"https://docs.aiaxoniq.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.aiaxoniq.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"aiAxonIQ\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"aiAxonIQ","nav":{"global":null,"tabs":[{"tab":"Get started","icon":"rocket","pages":[{"title":"Get started","href":""}]},{"tab":"Send data","icon":"arrow-right-to-bracket","pages":[{"title":"Send data","href":"/send-data/overview"}]},{"tab":"Zero-code","icon":"wand-magic-sparkles","pages":[{"title":"Zero-code","href":"/zero-code/overview"}]},{"tab":"Guides","icon":"book-open","groups":[{"group":"Logs","icon":"file-lines","pages":[{"title":"Searching logs","icon":"magnifying-glass","href":"/guides/logs/search"},{"title":"Live tail","icon":"signal-stream","href":"/guides/logs/live-tail"},{"title":"Log patterns","icon":"layer-group","href":"/guides/logs/patterns"}]},{"group":"APM, metrics and traces","icon":"chart-line","pages":[{"title":"APM","icon":"chart-line","href":"/guides/apm/overview"},{"title":"Exploring traces","icon":"share-nodes","href":"/guides/traces/overview"},{"title":"Services and the service map","icon":"diagram-project","href":"/guides/services/service-map"},{"title":"Exploring metrics","icon":"chart-line","href":"/guides/metrics/overview"}]},{"group":"Infrastructure","icon":"server","pages":[{"title":"Infrastructure and Kubernetes","icon":"server","href":"/guides/infrastructure/overview"},{"title":"Kubernetes monitoring","icon":"dharmachakra","href":"/guides/kubernetes/overview"},{"title":"Database monitoring","description":"Monitor PostgreSQL, MongoDB, Redis and ClickHouse with a standard OpenTelemetry Collector — receiver configuration, how instances are identified, and what each chart needs.","icon":"database","href":"/guides/databases/overview"}]},{"group":"Real user monitoring","icon":"eye","pages":[{"title":"Real user monitoring","icon":"eye","href":"/guides/rum/overview"},{"title":"Source maps for browser errors","description":"Upload your build's source maps so browser errors show the original file, line and column — and the two rules that make an upload match an error.","icon":"file-code","href":"/guides/rum/source-maps"}]},{"group":"Visualize","icon":"table-columns","pages":[{"title":"Dashboards","icon":"table-columns","href":"/guides/dashboards/overview"}]},{"group":"Alerting and incidents","icon":"bell","pages":[{"title":"Alerting","icon":"bell","href":"/guides/alerts/overview"},{"title":"Silences and maintenance windows","icon":"bell-slash","href":"/guides/alerts/silences-maintenance"},{"title":"Escalation policies","icon":"route","href":"/guides/alerts/escalation-policies"},{"title":"Incidents","icon":"fire","href":"/guides/incidents/overview"}]},{"group":"Reliability","icon":"gauge-high","pages":[{"title":"Service level objectives","icon":"bullseye","href":"/guides/slos/overview"},{"title":"Synthetic monitoring","icon":"heart-pulse","href":"/guides/synthetics/overview"}]},{"group":"Security and audit","icon":"shield-halved","pages":[{"title":"Security events","icon":"shield-halved","href":"/guides/security/overview"},{"title":"Audit log","icon":"clipboard-list","href":"/guides/audit"}]},{"group":"AI investigation","icon":"wand-magic-sparkles","pages":[{"title":"AI features","icon":"wand-magic-sparkles","href":"/guides/ai/overview"},{"title":"AI Assistant and Investigate","icon":"sparkles","href":"/guides/ai/assistant"},{"title":"Configuring AI providers","icon":"gear","href":"/guides/ai/configuration"},{"title":"How the investigation agent is governed","icon":"shield-halved","href":"/guides/ai/agent-governance"},{"title":"Model Context Protocol (MCP) Server","icon":"network-wired","href":"/guides/ai/mcp"}]},{"group":"LLM and agent monitoring","icon":"microchip","pages":[{"title":"LLM observability","icon":"robot","href":"/guides/llm/overview"},{"title":"AgentSight","icon":"microchip","href":"/guides/agentsight/overview"}]},{"group":"Integrations","icon":"plug","pages":[{"title":"Integrations and notification channels","icon":"plug","href":"/guides/integrations/overview"},{"title":"Grafana and Prometheus clients","icon":"chart-area","href":"/guides/integrations/grafana"}]},{"group":"Account","icon":"gear","pages":[{"title":"Settings","icon":"gear","href":"/guides/settings/overview"}]}]},{"tab":"API reference","icon":"code","pages":[{"title":"API reference","href":"/api-reference/introduction"}]},{"tab":"Support","icon":"life-ring","pages":[{"title":"Support","href":"/support/troubleshooting"}]}]},"basePath":"","title":"Real user monitoring - aiAxonIQ","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":[],"chunks":[]}