Measurement Data¶
The test results are structured as an object. The actual results depend on the type of test being run. In the following, we will describe the results for the different tests.
General Fields¶
The results from our mobile SDK are aligned with the results you get from our Surfmeter Automator solution. They are only slightly different in a few minor aspects due to the different environments (mobile vs. desktop).
For a general overview of the data structure, see our reference.
Here are additional fields that are specific to the mobile SDK:
| Property | Type | Description |
|---|---|---|
client_reports |
Array | Client-reported data captured during the test. See Client Reports. Video tests include a P.1203 Client Report. |
statistics_input |
Object | Raw data used to calculate statistics. This field is experimental and may change. |
geolocation_trace |
Array | Location samples collected while the test runs. The array is empty when location is unavailable or not permitted. |
connection_detail_trace |
Array | Connection snapshots collected while the test runs. The available fields depend on the platform, device, connection type, and permissions. |
Connection and Location Traces¶
Android and iOS use the same top-level trace names and common field names. Both collectors run only for the duration of a test.
The SDK records an initial connection snapshot when the operating system reports the network state. It adds another entry whenever an available connection value changes. Timestamp changes alone do not create duplicate entries.
Location updates are separate entries in geolocation_trace. Missing permissions or unavailable location data do not fail the test.
The listener-facing report has this shape:
{
"connection_detail_trace": [
{
"type": "WifiConnectionDetail",
"is_internet_reachable": true,
"is_connection_expensive": false,
"ip_address": "192.0.2.14",
"subnet": 24,
"ssid": "Example Lab",
"bssid": "00:11:22:33:44:55",
"client_time": "2026-09-09T12:00:00.000Z",
"client_time_skewed": "2026-09-09T12:00:00.000Z"
}
],
"geolocation_trace": [
{
"type": "MeasurementGeolocation",
"latitude": 48.2085,
"longitude": 16.3721,
"accuracy": 4.8,
"speed": 0.2,
"client_time": "2026-09-09T12:00:01.000Z",
"client_time_skewed": "2026-09-09T12:00:01.000Z"
}
]
}
The upload layer converts these arrays to the nested attributes expected by the Surfmeter server. Apps should use the listener-facing names shown above.
geolocation_trace¶
Each entry describes one location update.
| Field | Type | Availability | Description |
|---|---|---|---|
type |
String | Android and iOS | Always MeasurementGeolocation for a test sample. |
latitude |
Number | Android and iOS | Latitude in decimal degrees. |
longitude |
Number | Android and iOS | Longitude in decimal degrees. |
accuracy |
Number | Android and iOS | Estimated horizontal accuracy in metres. |
speed |
Number | Android and iOS, when available | Device speed in metres per second. iOS omits this field when Core Location reports no valid speed. |
client_time |
String | Android and iOS | ISO 8601 time at which the SDK created the sample. |
client_time_skewed |
String | Android and iOS | Client time after clock-skew handling. It currently matches client_time in both mobile SDKs. |
Android location detail depends on ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION. See Android permissions.
iOS records only precise locations. Denied access, disabled Location Services, reduced accuracy, or the absence of an update produces an empty trace and does not fail the test. See Measurement Context and Privacy on iOS.
connection_detail_trace¶
These fields are shared across Android and iOS where the operating system makes them available:
| Field | Type | Availability | Description |
|---|---|---|---|
type |
String | Android and iOS | WifiConnectionDetail, MobileConnectionDetail, EthernetConnectionDetail, VpnConnectionDetail, or UndefinedConnectionDetail. Android can also report other platform-specific types. |
is_internet_reachable |
Boolean | Android and iOS | Whether the active path has internet connectivity. |
is_connection_expensive |
Boolean | Android and iOS | Whether the operating system considers the connection metered or expensive. |
ip_address |
String | Android and iOS, when available | A local IPv4 or IPv6 address for the active interface. |
subnet |
Integer | Android and iOS, when available | Network prefix length, such as 24 for an IPv4 /24 network. |
client_time |
String | Android and iOS | ISO 8601 time at which the SDK created the snapshot. |
client_time_skewed |
String | Android and iOS | Client time after clock-skew handling. It currently matches client_time in both mobile SDKs. |
iOS Fields and Limitations¶
The iOS SDK can add these fields:
| Field | Connection | Requirement | Description |
|---|---|---|---|
ssid |
Wi-Fi | Access WiFi Information capability and values provided by iOS | Current Wi-Fi network name. |
bssid |
Wi-Fi | Access WiFi Information capability and values provided by iOS | Current Wi-Fi access-point identifier. |
mobile_network_type |
Cellular | Radio technology provided by Core Telephony | Values include GPRS, EDGE, UMTS, HSDPA, HSUPA, CDMA, LTE, NRNSA, and NR. |
iOS does not provide public App Store APIs for Wi-Fi RSSI, frequency, or link speed, or for cellular signal strength and cell identity. These Android fields are omitted instead of estimated. See Measurement Context and Privacy on iOS for the complete permission and disclosure requirements.
Android Basic Network Fields¶
| Field | Required Permission | Minimum Android Version | Notes |
|---|---|---|---|
type |
ACCESS_NETWORK_STATE |
All | Connection type, such as Wi-Fi or mobile. |
is_internet_reachable |
ACCESS_NETWORK_STATE |
All | Whether the active network has internet capability. |
is_connection_expensive |
ACCESS_NETWORK_STATE |
All | Whether Android considers the active network metered. |
ip_address |
None | All | Local IPv4 or IPv6 address. |
subnet |
None | All | Network prefix length. |
client_time |
None | All | Sample time in ISO 8601 format. |
client_time_skewed |
None | All | Clock-skew-adjusted sample time. |
Android Wi-Fi Fields¶
| Field | Required Permission | Minimum Android Version | Notes |
|---|---|---|---|
ssid |
ACCESS_WIFI_STATE |
All | Current Wi-Fi network name. |
bssid |
ACCESS_WIFI_STATE |
All | Current Wi-Fi access-point identifier. |
signal_strength |
ACCESS_WIFI_STATE |
All | Signal level normalized to 0–100. |
frequency |
ACCESS_WIFI_STATE |
All | Frequency in MHz. |
link_speed |
ACCESS_WIFI_STATE |
All | Link speed in Mbps. |
link_speed_rx |
ACCESS_WIFI_STATE |
Q (29) | Current receive link speed in Mbps. |
link_speed_tx |
ACCESS_WIFI_STATE |
Q (29) | Current transmit link speed in Mbps. |
rssi |
ACCESS_WIFI_STATE |
All | Raw received signal strength. |
dbm |
ACCESS_WIFI_STATE |
All | Same value as RSSI. |
Android Mobile Network Fields¶
| Field | Required Permission | Minimum Android Version | Notes |
|---|---|---|---|
mobile_network_type |
READ_PHONE_STATE |
All | Radio technology such as LTE or NR. |
is_roaming |
None | All | Whether the device is roaming. |
mno |
None | All | Mobile network operator. |
mcc |
None | All | Mobile country code. |
mnc |
None | All | Mobile network code. |
GSM details:
| Field | Required Permission | Minimum Android Version | Notes |
|---|---|---|---|
cid |
ACCESS_FINE_LOCATION |
All | Cell ID. |
lac |
ACCESS_FINE_LOCATION |
All | Location area code. |
arfcn |
ACCESS_FINE_LOCATION |
N (24) | Absolute radio-frequency channel number. |
bsic |
ACCESS_FINE_LOCATION |
N (24) | Base station identity code. |
signal_level |
ACCESS_FINE_LOCATION |
All | Android signal level. |
asu_level |
ACCESS_FINE_LOCATION |
All | Signal level in ASU. |
dbm |
ACCESS_FINE_LOCATION |
All | Signal strength in dBm. |
rssi |
ACCESS_FINE_LOCATION |
R (30) | Received signal strength indicator. |
LTE details:
| Field | Required Permission | Minimum Android Version | Notes |
|---|---|---|---|
cid |
ACCESS_FINE_LOCATION |
All | Cell ID. |
enodeb_id |
ACCESS_FINE_LOCATION |
All | Derived eNodeB ID. |
pci |
ACCESS_FINE_LOCATION |
All | Physical cell ID. |
tac |
ACCESS_FINE_LOCATION |
All | Tracking area code. |
arfcn |
ACCESS_FINE_LOCATION |
N (24) | Absolute radio-frequency channel number. |
signal_level |
ACCESS_FINE_LOCATION |
All | Android signal level. |
asu_level |
ACCESS_FINE_LOCATION |
All | Signal level in ASU. |
rsrp |
ACCESS_FINE_LOCATION |
O (26) | Reference Signal Received Power. |
rsrq |
ACCESS_FINE_LOCATION |
O (26) | Reference Signal Received Quality. |
rssnr |
ACCESS_FINE_LOCATION |
Q (29) | Reference signal-to-noise ratio. |
5G NR details:
| Field | Required Permission | Minimum Android Version | Notes |
|---|---|---|---|
nci |
ACCESS_FINE_LOCATION |
Q (29) | NR cell identity. |
pci |
ACCESS_FINE_LOCATION |
Q (29) | Physical cell ID. |
tac |
ACCESS_FINE_LOCATION |
Q (29) | Tracking area code. |
nrarfcn |
ACCESS_FINE_LOCATION |
Q (29) | NR absolute radio-frequency channel number. |
signal_level |
ACCESS_FINE_LOCATION |
Q (29) | Android signal level. |
dbm |
ACCESS_FINE_LOCATION |
Q (29) | Signal strength in dBm. |
asu_level |
ACCESS_FINE_LOCATION |
Q (29) | Signal level in ASU. |
ssrsrp |
ACCESS_FINE_LOCATION |
Q (29) | SS Reference Signal Received Power. |
ssrsrq |
ACCESS_FINE_LOCATION |
Q (29) | SS Reference Signal Received Quality. |
sssinr |
ACCESS_FINE_LOCATION |
Q (29) | SS signal-to-noise and interference ratio. |
Android can also provide WCDMA, CDMA, and TDSCDMA fields. See the general connection-data reference for the complete radio-field matrix.
Diagnostics¶
Further, there is a diagnostics: object containing diagnostic information – but this is experimental and may be changed in the future.
It currently contains the following:
test_settings: Object with test-specific settingsclient_version: Version of the Quality SDK used (same as above)
ExoPlayerQualityTest¶
For the statistic values, see here.
VideoQualityTest¶
For the statistic values, see here.
WebQualityTest¶
For the statistic values, see here.