Available Studies¶
We support various types of studies that can be run with Surfmeter Automator.
The studies are defined by the type of the measurement, and the specific subject. For a background on this concept, please check out the Concepts section.
If you want to know which types of studies are available to configure, refer to the subjects section for a complete list of subjects and the all configurable parameters.
Below you will find service-specific notes for particular types of studies and subjects, which should help you configure and understand how these services are measured by us.
Video Studies¶
Video is our main focus, as you may already know, and video websites are all kind of different. In general, the configuration of video studies is quite similar: you provide a subject and the url of the video you want to measure. In some cases, special parameters are required, like login credentials or, in the case of live streaming, channel names. Below you will find some examples for the most common video services; any service not listed here can be easily configured using the general parameters shown in the public config.
For information about the measurement results and statistics available for video studies, see Video Measurement Statistics.
Gold Standard Video URLs
We maintain a reference JSON file with tested video URLs for all supported video subjects.
amazon¶
Currently we only support playback of trailers on Amazon, so you must set the subject to amazon_trailer and pass the link to a known trailer URL as the src. Example:
{
"id": "STUDY_AMAZON",
"subject": "amazon_trailer",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.amazon.de/gp/video/detail/B08PKYTLQC?autoplay=trailer",
"contentType": "trailer"
},
"playMode": "normal"
}
}
ardmediathek¶
The ARD Mediathek provides access to German public broadcasting content. We support both feature videos and live streams.
For feature videos, set src to the video URL and contentType to feature:
{
"id": "STUDY_ARDMEDIATHEK",
"subject": "ardmediathek",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.ardmediathek.de/video/geschichte-und-entdeckungen/mythos-gotthard-pass-der-pioniere/swr/Y3JpZDovL3N3ci5kZS9hZXgvbzE0NDkxMjE/",
"contentType": "feature"
},
"playMode": "normal"
}
}
For live streams, use the live URL with contentType set to live:
{
"id": "STUDY_ARDMEDIATHEK_LIVE",
"subject": "ardmediathek",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.ardmediathek.de/live/Y3JpZDovL2Rhc2Vyc3RlLmRlL2xpdmUvY2xpcC9hYmNhMDdhMy0zNDc2LTQ4NTEtYjE2Mi1mZGU4ZjY0NmQ0YzQ?toolbarType=default",
"contentType": "live"
},
"playMode": "normal"
}
}
3sat¶
3sat is a German-language public television channel. To measure 3sat content, set the subject to 3sat and provide the video URL:
{
"id": "STUDY_3SAT",
"subject": "3sat",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.3sat.de/gesellschaft/zdf-reportage/camping-adria-100.html",
"contentType": "feature"
},
"playMode": "normal"
}
}
dashjs¶
This is the most current DASH.js reference player, and you can just pass the URL of a manifest to play as a source. Example:
{
"id": "STUDY_DASHJS",
"subject": "dashjs",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://dash.akamaized.net/akamai/bbb_30fps/bbb_30fps.mpd",
"contentType": "feature"
},
"playMode": "normal"
}
}
dazn¶
This is the Dazn service. Note that it requires credentials to be passed in the credentials section.
Freemium account
We recommend creating a "freemium" account for this, as the free tier allows you to play some content. To do so, sign up to the service, add an email address and password, but when prompted for your plan (monthly or yearly), just close the tab. Then, head back to dazn.com and, on the top right, click "log in". Now you can watch free content.
To run a study, you need to set the subject to dazn and pass the name of the channel you want to measure as the channelTitle attribute. Also, set the contentType to live. Example:
{
"id": "STUDY_DAZN",
"subject": "dazn",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"channelTitle": "RISE",
"contentType": "live"
},
"playMode": "normal"
},
"credentials": {
"username": "...",
"password": "..."
}
}
disneyplus¶
This is the Disney+ website. Note that it requires credentials to be passed in the credentials section.
{
"id": "STUDY_DISNEYPLUS",
"subject": "disneyplus",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.disneyplus.com/path/to/your/video",
"contentType": "feature"
},
"playMode": "normal"
},
"credentials": {
"username": "...",
"password": "..."
}
}
facebook¶
Facebook video measurements work by providing a direct video post URL. Set the subject to facebook and pass the video URL:
{
"id": "STUDY_FACEBOOK",
"subject": "facebook",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.facebook.com/redbull/videos/10159258798605352/",
"contentType": "feature"
},
"playMode": "normal"
}
}
hlsjs¶
This is the most current HLS.js reference player, and you can just pass the URL of a manifest to play as a source. Example:
{
"id": "STUDY_HLSJS",
"subject": "hlsjs",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8",
"contentType": "feature"
},
"playMode": "normal",
}
}
Optionally, you can set the params.player attribute an object to configure the player. For example, this object could set something like:
{
"id": "STUDY_HLSJS",
"subject": "hlsjs",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8",
"contentType": "feature"
},
"playMode": "normal",
"player": {
"lowLatencyMode": true
}
}
}
joyn¶
Here, we support various live channels. Note the URL format, e.g.:
{
"id": "STUDY_JOYN",
"subject": "joyn",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.joyn.de/play/live-tv?channel_id=123",
"contentType": "live"
},
"playMode": "normal"
}
}
You must obtain the correct URL from the service itself by browsing it before.
Be aware that the Joyn service currently shows rather high initial loading delay values due to the complexity of cookie setting, API calls, and rendering of the video until it starts.
netflix¶
Note that Netflix supports three different kinds of videos:
- Feature videos
- Trailers
- Tudum trailers (Netflix's speical page at https://netflix.com/tudum)
Measuring feature videos require you to provide login credentials. Trailers and Tudum trailers do not require login credentials.
The subject for feature videos is netflix, for trailers it is netflix_trailer.
You must set the correct URL, subject and contentType for the video you want to measure.
For feature videos, set src to the watch URL of the video, and contentType to feature.
Note that regardless of the URL, we always force the video to start from the beginning (t=0), so you can use the same URL for multiple tests within the same profile.
For example:
For trailers, set src to the title URL of the video, the subject to netflix_trailer, and contentType to trailer. For example:
For Tudum trailers, set src to the tudum URL of the video, the subject to netflix_trailer, and contentType to trailer. For example:
Netflix also does not allow 1080p playback on Linux devices by default. You can use an additional extension to force Netflix to use 1080p playback. Download the extension with the ID mdlbikciddolbenfkgggdegphnhmnfcg and set it as an additional extension with the corresponding flag. Note that 4K playback is currently not possible due to DRM and performance restrictions.
orf¶
For ORF we support https://on.orf.at links. The old "TVThek" is no longer supported. We support live and feature content.
Note that ORF plays ads on first fresh playback; we will not skip these ads, so the total study time may have to be adjusted.
For feature videos, set src to the watch URL of the video, and contentType to feature. For example:
rakuten¶
Rakuten TV is a European video-on-demand service. To measure Rakuten content, set the subject to rakuten and pass the video URL with autoplay=true:
{
"id": "STUDY_RAKUTEN",
"subject": "rakuten",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://rakuten.tv/de/movies/wonder-woman-1984?autoplay=true",
"contentType": "feature"
},
"playMode": "normal"
}
}
servustv¶
This currently supports live and feature videos.
To start the live stream, simply pass the home page as a URL:
tiktok¶
TikTok works best as embedded video, so you specify a video with its URL as https://www.tiktok.com/embed/v2/<ID> where <ID> is the video ID. Example:
{
"id": "STUDY_TIKTOK",
"subject": "tiktok",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.tiktok.com/embed/v2/7397057924138323233",
"contentType": "feature"
},
"playMode": "normal"
}
}
instagram¶
Instagram works by simply specifying the URL of the video you want to measure.
{
"id": "STUDY_INSTAGRAM",
"subject": "instagram",
"type": "VIDEO",
"params": {
"duration": 15,
"timeout": 30,
"video": {
"src": "https://www.instagram.com/reel/DBRLN_ROZab/",
"contentType": "feature"
},
"playMode": "normal"
}
}
youtube¶
Youtube works by simply specifying the URL of the video you want to measure. You can use either the regular watch URL or the embed URL:
{
"id": "STUDY_YOUTUBE",
"subject": "youtube",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.youtube.com/watch?v=aqz-KE-bpKQ",
"contentType": "feature"
},
"playMode": "normal"
}
}
Alternatively, you can use the embed URL format:
{
"id": "STUDY_YOUTUBE",
"subject": "youtube",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.youtube.com/embed/aqz-KE-bpKQ",
"contentType": "feature"
},
"playMode": "normal"
}
}
Note that in the case of ads, the study will not skip them. We will create separate measurements in the report for these, and they will have a contentType of advertisement.
zattoo¶
Here, you must pass the channel name to play the live stream, and additionally a login URL as src:
{
"id": "STUDY_ZATTOO",
"subject": "zattoo",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://zattoo.com/login",
"contentType": "live",
"channelTitle": "das_erste_de"
},
"playMode": "normal"
}
}
Known channel titles are:
daserstedas_erste_dezdfrtl_deutschlandpro7_deutschland
zdfmediathek¶
The ZDF Mediathek offers live and VoD type content. For the URL, please choose the one that starts with /play.
For feature videos (documentaries, shows, etc.), use the /play/dokus or similar URL format:
{
"id": "STUDY_ZDFMEDIATHEK",
"subject": "zdfmediathek",
"type": "VIDEO",
"params": {
"duration": 60,
"timeout": 30,
"video": {
"src": "https://www.zdf.de/play/dokus/zdf-info-100/fakten-fakes-und-kundentaeuschung-die-macht-der-internetbewertungen-102",
"contentType": "feature"
},
"playMode": "normal"
}
}
For live streams, use the /play/live-tv URL format:
Web Studies¶
Web studies are used to measure the performance of web page load times. There are two types of web studies: website and lighthouse. The first run in the browser directly, the latter use the Lighthouse command line tool.
For information about the measurement results and statistics available for web studies, see Web Measurement Statistics.
Website¶
The website study loads one or more URLs in the browser and measures the performance of the page load via various metrics (see the web statistics).
To use the website study, set the subject to website and pass one or more URLs as the urls array:
{
"id": "STUDY_WEBSITE",
"subject": "website",
"type": "WEB",
"params": {
"urls": ["https://example.com", "https://example.org"]
}
}
Lighthouse¶
The lighthouse study runs the Lighthouse command line tool on one or more URLs and measures the performance of the page load via various metrics (see the web statistics). If you don't have it installed, you can install it with npm install -g lighthouse.
To use the lighthouse study, set the subject to lighthouse and pass one or more URLs as the urls array:
{
"id": "STUDY_LIGHTHOUSE",
"subject": "lighthouse",
"type": "WEB",
"params": {
"urls": ["https://example.com", "https://example.org"]
}
}
Speedtest Studies¶
Speedtest studies are used to measure the performance of the internet connection. In this section we group web-based speedtest studies, i.e. those that rely on a browser to run the speedtest. Note that for higher-bandwidth tests, you should use the network studies instead, where we offer CLI-based speedtest tools that are more accurate when connection speeds approach the Gigabit range.
For information about the measurement results available for speedtest studies, see Speedtest Measurement Statistics.
Fast.com¶
This study uses the Fast.com website to run the speedtest. To use it, set the subject to fastcom.
You can additionally configure some parameters, please check our public config for more details.
Nperf¶
This study uses the Nperf website to run the speedtest. To use it, set the subject to nperf.
Network Studies¶
Network studies are used to measure the performance of the internet connection and troubleshoot network issues. In this section we group CLI-based network studies, i.e. those that rely on a CLI tool to run the network measurement.
Network studies do not calculate explicit statistic values like other study types. Instead, they provide the raw measurement data directly through Client Reports. Each network study type has its own client report format containing the detailed results.
DNS¶
The DNS study runs the dig CLI tool to measure the performance of the DNS resolution. To use it, set the subject to dns and pass one or more hosts as the host array:
{
"id": "STUDY_DNS",
"subject": "dns",
"type": "NETWORK",
"params": {
"host": ["example.com", "example.org"]
}
}
Please check our public config for more details on the available parameters.
Results are provided in a DnsClientReport.
Ookla Speedtest¶
The Ookla Speedtest study runs the speedtest CLI tool to measure the performance of the internet connection. It requires the ookla-speedtest CLI tool to be installed.
To use it, set the subject to ooklaspeedtest:
Results are provided in an OoklaSpeedtestClientReport.
ICMP Ping¶
The ICMP Ping study runs the ping CLI tool to measure the performance of individual ICMP pings. To use it, set the subject to icmpping and pass one or more hosts as the host array:
{
"id": "STUDY_ICMPPING",
"subject": "icmpping",
"type": "NETWORK",
"params": {
"host": ["example.com", "example.org"]
}
}
Please check our public config for more details on the available parameters.
Results are provided in an IcmpPingClientReport.
Traceroute¶
The Traceroute study runs the traceroute CLI tool to measure a whole traceroute to a given host. To use it, set the subject to traceroute and pass the host as the host parameter:
{
"id": "STUDY_TRACEROUTE",
"subject": "traceroute",
"type": "NETWORK",
"params": {
"host": "example.com"
}
}
Please check our public config for more details on the available parameters.
Results are provided in a TracerouteClientReport.
HTTP Prober¶
The HTTP prober implements various tests for testing CDN delivery of large static files. It requires no additional installation when used with Surfmeter Automator.
Here is a basic configuration:
{
"id": "STUDY_HTTPPROBER",
"subject": "httpprober",
"type": "NETWORK",
"params": {
"url": "https://example.com/largefile"
}
}
You can also specify more than one URL as an array of strings. Please check our public config for more details on the available parameters.
Results are provided in an HttpProberClientReport.
The types of tests are as follows:
byte-range¶
Tests partial content delivery using HTTP Range headers to verify CDN support for byte-range requests.
What it does:
- Sends a request with
Range: bytes=0-1023header (configurable) - Validates the server responds with
206 Partial Content - Checks
Content-LengthandContent-Rangeheaders - Verifies the response body contains the expected number of bytes
- Measures response time and detailed timing information (HAR-like format, however with only millisecond precision):
- DNS lookup time
- Connection establishment time
- TLS handshake time (for HTTPS)
- Request upload time
- Response waiting time (server processing)
- Content download time
Timing Behavior:
- Default mode: Reuses connections - only first request shows DNS/TCP/TLS times, subsequent requests show 0ms (realistic for single client)
- Fresh connections mode (
--fresh-connections): Forces new TCP/TLS for each request (realistic for multiple clients connecting to CDN) - Precision: Millisecond precision only (no microseconds) due to
Date.now()limitation - DNS caching: OS-level DNS cache cannot be bypassed, so DNS times may be very low (1-3ms) after first request
Use cases:
- Testing CDN support for video/audio streaming
- Validating partial download functionality
- Checking if range requests bypass caching incorrectly
- CDN performance testing: Use
--fresh-connectionsto simulate multiple clients - Single client optimization: Use default mode to test connection reuse benefits
error-rate¶
Tests error rates during cache miss scenarios by making multiple requests with different byte ranges.
What it does:
- Makes multiple concurrent requests (default: 10 requests, 5 parallel)
- Each request uses a unique byte range to force cache misses
- Categorizes responses: 2xx (success), 4xx (client errors), 5xx (server errors)
- Tracks cache hit/miss ratios using
X-Cacheheaders when available - Calculates error rate percentage
- Measures total test duration
Use cases:
- Testing CDN origin server stability under cache miss load
- Validating CDN failover behavior
- Measuring cache miss performance impact
user-agent¶
Detects if different User-Agent strings receive different responses or are blocked.
What it does:
- Tests with multiple user agents (Windows Chrome, iPhone Safari, macOS Safari by default)
- Compares response status codes and headers across user agents
- Uses byte-range requests to minimize bandwidth
- Measures response times for each user agent
Use cases:
- Detecting bot blocking or user agent discrimination
- Testing mobile vs desktop content delivery differences
- Validating consistent CDN behavior across clients
http-compliance¶
Validates adherence to HTTP standards in response headers and behavior.
What it does:
- Checks for required HTTP headers in partial content responses
- Validates
Content-Rangeheader format and values - Verifies status codes match response types
- Reports HTTP standard violations
Use cases:
- Ensuring CDN follows HTTP/1.1 specifications
- Debugging client compatibility issues
- Validating proxy/CDN configuration
protocol¶
Tests HTTP protocol-specific features like HTTP/2 support and transfer encoding.
What it does:
- Tests HTTP/1.1 with chunked transfer encoding detection
- Optionally forces HTTP/2 connections (with
--http2flag) - Validates protocol version in responses
- Checks transfer encoding headers
Use cases:
- Verifying CDN HTTP/2 support
- Testing chunked encoding behavior
- Protocol-specific performance validation
Conferencing Studies¶
For information about the measurement results and statistics available for conferencing studies, see Conferencing Measurement Statistics.
Google Meet¶
To launch a Google Meet conferencing measurement, you need to first set up a Google Meet conferencing URL by heading to https://meet.google.com/, creating a new meeting, and then joining it.
In the host controls section, set the meeting to "Open", so that anyone can join it. Then copy its URL and replace it in the below configuration (where it is marked with XXX-XXX-XXX).
Configure the study as follows:
{
"id": "STUDY_GOOGLEMEET",
"subject": "googlemeet",
"type": "CONFERENCING",
"params": {
"duration": 30,
"url": "https://meet.google.com/XXX-XXX-XXX",
"mode": "join"
}
}
Please check our public config for more details on the available parameters.
Microsoft Teams¶
First, set up a Microsoft Teams conferencing URL by heading to https://teams.microsoft.com/. Ensure that the native application is not running, and continue with Teams on the web (at least for personal accounts, this is required to launch the admin interface). Then, in the left sidebar, click on the "Meet" icon. In the main window. Create a meeting that everyone can join (i.e., everyone can bypass the lobby). Copy the meeting link and replace it in the below configuration (where it is marked with 1234567890?p=XYZ) – we assume that this link includes a password, so you need to replace the XYZ part with the actual password. Normally this should be copy-pasteable from the browser automatically.
Configure the study as follows:
{
"id": "STUDY_MICROSOFTTEAMS",
"subject": "microsoftteams",
"type": "CONFERENCING",
"params": {
"duration": 30,
"url": "https://teams.live.com/meet/1234567890?p=XYZ",
"mode": "join"
}
}
Please check our public config for more details on the available parameters.