Skip to content

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.

DimensionDerived from
browserThe User-Agent, parsed server side
osThe User-Agent, parsed server side
device_typeThe User-Agent, parsed server side
countryThe 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.

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.

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.

Terminal window
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:

BreakdownDepth
country_breakdownTop 20 by session count
browser_breakdownTop 10 by session count
Terminal window
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.

The values each dimension actually takes in a range, with session counts. The dashboard’s session filter dropdowns come from here.

Terminal window
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.

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.