Segment by browser, OS, device and country
RUM sessions carry four context dimensions, so you can ask questions like “is LCP worse on mobile?” or “which browser is throwing this error?” without instrumenting anything yourself.
Where each value comes from
Section titled “Where each value comes from”| Dimension | Derived from |
|---|---|
browser | The User-Agent, parsed server side |
os | The User-Agent, parsed server side |
device_type | The User-Agent, parsed server side |
country | The client IP address, looked up at ingest |
Country comes from an IP-to-country database bundled with the ingest service, so the address never leaves it, and it is never stored or logged. A visitor on a VPN or corporate proxy is placed where that exit is. Country headers sent by the client are ignored. IP geolocation by DB-IP, CC BY 4.0.
Values you will see
Section titled “Values you will see”device_type is a closed set: desktop, mobile, tablet, bot, or empty.
os normalizes to Windows, macOS, iOS, Android or Linux where it can, and otherwise passes through whatever was detected, so less common values do appear.
browser covers the mainstream engines: Chrome, Firefox, Safari, Edge, Opera and similar. Requests from HTTP libraries such as curl or scripted clients are left empty.
country is an uppercase ISO 3166-1 alpha-2 code such as US or DE. Anything that is not exactly two letters is discarded, so USA or United States will not be stored.
Unknown values are stored as an empty string, not the literal text unknown. Dashboard breakdowns show that bucket as Unknown for countries and Not set for the other dimensions. Sessions recorded before a dimension was introduced stay empty, so a range spanning that date shows a large empty-value block for the earlier period: missing data, not a change in your traffic.
Filtering and breaking down
Section titled “Filtering and breaking down”Dimension filters are exact, case-sensitive matches on the stored value: Chrome, not chrome; US, not us. To see which values exist, ask the facets endpoint (below) rather than guessing.
The examples use an API key exported as SITEQWALITY_API_KEY and the application’s ID as APP_ID.
Overview
Section titled “Overview”curl -G "https://api.siteqwality.com/rum/$APP_ID/overview" \ -H "Authorization: Bearer $SITEQWALITY_API_KEY" \ --data-urlencode "from=2026-08-01T00:00:00Z" \ --data-urlencode "to=2026-08-02T00:00:00Z" \ --data-urlencode "browser=Chrome" \ --data-urlencode "device_type=mobile"from and to default to the last 30 days. Optional filters: country, browser, os, device_type, and url (a case-insensitive substring of the page URL).
The response includes two breakdowns:
| Breakdown | Depth |
|---|---|
country_breakdown | Top 20 by session count |
browser_breakdown | Top 10 by session count |
Sessions
Section titled “Sessions”curl -G "https://api.siteqwality.com/rum/$APP_ID/sessions" \ -H "Authorization: Bearer $SITEQWALITY_API_KEY" \ --data-urlencode "from=2026-08-01T00:00:00Z" \ --data-urlencode "to=2026-08-02T00:00:00Z" \ --data-urlencode "os=iOS" \ --data-urlencode "has_error=true"Accepts browser, os, country and device_type alongside the other session filters; see the RUM reference.
Facets
Section titled “Facets”The values each dimension actually takes in a range, with session counts. The dashboard’s session filter dropdowns come from here.
curl -G "https://api.siteqwality.com/rum/$APP_ID/facets" \ -H "Authorization: Bearer $SITEQWALITY_API_KEY" \ --data-urlencode "from=2026-08-01T00:00:00Z" \ --data-urlencode "to=2026-08-02T00:00:00Z"{ "data": { "browser": [{ "value": "Chrome", "session_count": 412 }, { "value": "Safari", "session_count": 133 }], "os": [{ "value": "Windows", "session_count": 280 }], "country": [{ "value": "US", "session_count": 201 }, { "value": "DE", "session_count": 64 }], "device_type": [{ "value": "desktop", "session_count": 390 }, { "value": "mobile", "session_count": 155 }] }}Each list holds the top 50 non-empty values by session count, with exact counts.
Errors and dimensions
Section titled “Errors and dimensions”These dimensions live on session measurements only; individual error and detail events do not carry them. Segment sessions by browser or device and reach errors through those sessions, rather than filtering an error list directly by browser. The overview’s top errors do honor a dimension filter, by keeping errors from sessions that match it.