GET/api/v2/user-agent

User agent parser API

Browser, engine, operating system, device and crawler from a User-Agent string, telling real values from frozen ones.

GEThttps://dnsrobot.netBase URL/api/v2Version/user-agentEndpoint?ua=Parameters
200 OKRecorded 2026-10-25. Send it to run the request live.
{
  "query": {
    "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
  },
  "source": "parameter",
  "empty": false,
  "browser": {
    "name": {
      "value": "Chrome",
      "fromString": "Chrome",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "version": {
      "value": "141",
      "fromString": "141.0.0.0",
      "source": "ua",
      "frozen": true,
      "note": "minor_frozen"
    }
  },
  "engine": {
    "name": {
      "value": "Blink",
      "fromString": "Blink",
      "source": "ua",
      "frozen": false,
      "note": "webkit_compat"
    },
    "version": {
      "value": "141",
      "fromString": "141.0.0.0",
      "source": "ua",
      "frozen": true,
      "note": "minor_frozen"
    }
  },
  "os": {
    "name": {
      "value": "Windows",
      "fromString": "Windows",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "version": {
      "value": null,
      "fromString": "10",
      "source": "none",
      "frozen": true,
      "note": "windows_10_or_11"
    }
  },
  "device": {
    "type": {
      "value": "desktop",
      "fromString": "desktop",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "vendor": {
      "value": null,
      "fromString": null,
      "source": "none",
      "frozen": false,
      "note": null
    },
    "model": {
      "value": null,
      "fromString": null,
      "source": "none",
      "frozen": false,
      "note": null
    }
  },
  "cpu": {
    "architecture": {
      "value": null,
      "fromString": "x86_64",
      "source": "none",
      "frozen": true,
      "note": "windows_arch_frozen"
    },
    "bitness": {
      "value": null,
      "fromString": "64",
      "source": "none",
      "frozen": true,
      "note": null
    }
  },
  "bot": null,
  "clientHints": null,
  "parser": "rules",
  "issues": [
    {
      "severity": "info",
      "code": "minor_frozen",
      "message": "Chromium sends x.0.0.0: only the major version is real."
    },
    {
      "severity": "info",
      "code": "webkit_compat",
      "message": "Chromium's \"AppleWebKit/537.36\" is a compatibility token: its engine is Blink."
    },
    {
      "severity": "info",
      "code": "windows_10_or_11",
      "message": "Windows 10 and Windows 11 both send \"Windows NT 10.0\": the string can't tell them apart (Client Hints' platformVersion can: 13 or more is Windows 11)."
    },
    {
      "severity": "info",
      "code": "windows_arch_frozen",
      "message": "\"Win64; x64\" is sent by ARM PCs too: the architecture in the string isn't proof."
    }
  ],
  "tookMs": 0
}

How it works

Parses a User-Agent string with our own rules (and bowser for the long tail): browser, engine, OS, device type, vendor and model, CPU, and the crawler when it is one (31 known crawlers with their operator, purpose and documentation, plus a generic bot pattern).

Browsers now freeze parts of the string: every Mac says macOS 10.15.7, Chrome on Android says Android 10, Windows 11 says Windows NT 10.0, Chromium's minor version is 0.0.0. Each field gives fromString and our best value separately, flags frozen tokens and explains them in issues, so a frozen token is never reported as a fact.

Without ua, your own request is parsed together with its User-Agent Client Hints headers (Sec-CH-UA*), which carry the real values where your browser sends them (clientHints). A crawler's string is only a claim: verify the crawler's IP before trusting it.

Query parameters

  • uastringoptional
    A User-Agent string, up to 2,000 characters (URL-encode it). Leave it out to parse your own request's.

Response fields

200 with this JSON object, plus tookMs, and incomplete with warnings when a source failed. Fields marked optional appear only when they apply.

  • queryobjectalways
    What was looked up, normalised (lower case, no trailing dot, IDNs as Punycode).
    • uastringalways
      The string parsed (at most its first 2,000 characters).
  • sourcestringalways
    parameter (the ua you sent) or header (your own request's).

    one of "parameter", "header"

  • emptybooleanalways
    Whether the string was empty.
  • browserobjectalways
    The browser.
    • nameobjectalways
      Its name ("Chrome", "Safari").
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
    • versionobjectalways
      Its version.
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
  • engineobjectalways
    The rendering engine.
    • nameobjectalways
      Its name ("Blink", "WebKit", "Gecko").
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
    • versionobjectalways
      Its version.
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
  • osobjectalways
    The operating system.
    • nameobjectalways
      Its name ("Windows", "macOS", "Android", "iOS").
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
    • versionobjectalways
      Its version.
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
  • deviceobjectalways
    The device.
    • typeobjectalways
      desktop, mobile, tablet, tv, console, wearable, xr or other.
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
    • vendorobjectalways
      Its maker ("Apple", "Samsung").
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
    • modelobjectalways
      Its model.
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
  • cpuobjectalways
    The CPU.
    • architectureobjectalways
      x86_64, x86, arm64, arm, ppc…
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
    • bitnessobjectalways
      64 or 32.
      Show 5 fields
      • valuestring or nullalways
        Our best true value; null when nothing can tell (a frozen token without Client Hints).
      • fromStringstring or nullalways
        What the User-Agent string itself says; null when it says nothing.
      • sourcestringalways
        Where value came from: ua (the string), hints (Client Hints), none.

        one of "ua", "hints", "feature", "none"

      • frozenbooleanalways
        The string's value is a frozen or placeholder token (macOS 10.15.7, Android 10, Chrome's x.0.0.0): never a fact.
      • notestring or nullalways
        Why the field reads as it does: a code listed with its sentence in issues.
  • botobject or nullalways
    The crawler the string names, or null for a browser.
    Show 9 fields
    • idstring or nullalways
      Our crawler id (e.g. googlebot); null for a generic bot-like string we can't name.
    • namestringalways
      The crawler's name, or the matched text.
    • versionstring or nullalways
      Its version.
    • operatorstring or nullalways
      Who runs it.
    • kindstringalways
      What it is for: search, ai-training, ai-user, ai-search, social, monitor or other.

      one of "search", "ai-training", "ai-user", "ai-search", "social", "monitor", "other"

    • docsstring or nullalways
      The operator's documentation.
    • verifiablebooleanalways
      Whether its IP can be verified (a published list, or reverse and forward DNS).
    • robotsstring or nullalways
      obeys robots.txt, may-ignore it, or token-only (a robots.txt token never sent in requests).

      one of "obeys", "may-ignore", "token-only", null

    • genericbooleanalways
      Only the generic bot pattern matched: no proof of anything.
  • clientHintsobject or nullalways
    Your request's User-Agent Client Hints (without ua only), or null.
    Show 9 fields
    • presentbooleanalways
      Whether any were sent.
    • supportstringalways
      yes (a Chromium browser), no (Firefox, Safari, any iOS browser never send them), unknown.

      one of "yes", "no", "unknown"

    • brandsarray of objectsalways
      The brands, GREASE entries dropped.
      Show 3 fields
      • brandstringalways
        The brand.
      • versionstring or nullalways
        Its major version.
      • fullVersionstring or nullalways
        Its full version, when sent.
    • platformstring or nullalways
      Sec-CH-UA-Platform.
    • platformVersionstring or nullalways
      Sec-CH-UA-Platform-Version.
    • architecturestring or nullalways
      Sec-CH-UA-Arch.
    • bitnessstring or nullalways
      Sec-CH-UA-Bitness.
    • modelstring or nullalways
      Sec-CH-UA-Model.
    • mobileboolean or nullalways
      Sec-CH-UA-Mobile.
  • parserstringalways
    Who read the string: rules (ours), bowser (the fallback) or none (nothing recognised it).

    one of "rules", "bowser", "none"

  • issuesarray of objectsalways
    Problems found in the target's configuration, worst first. Empty when there are none.
    • severitystringalways
      error breaks something, warning risks it, info is worth knowing.

      one of "error", "warning", "info"

    • codestringalways
      Stable machine-readable code.
    • messagestringalways
      The problem and what to do about it, in plain English.

Errors

Plus the errors every endpoint can return: 400 for a missing or unreadable parameter, 429 past the limit, 503 when every source failed.

Code samples

curl -G "https://dnsrobot.net/api/v2/user-agent" \
  --data-urlencode "ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
const params = new URLSearchParams({ ua: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36" });
const res = await fetch(`https://dnsrobot.net/api/v2/user-agent?${params}`);
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data.browser);
import requests

r = requests.get(
    "https://dnsrobot.net/api/v2/user-agent",
    params={"ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"},
    timeout=30,
)
data = r.json()
if not r.ok:
    raise RuntimeError(data["error"]["message"])
print(data["browser"])
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
)

func main() {
	q := url.Values{"ua": {"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"}}
	res, err := http.Get("https://dnsrobot.net/api/v2/user-agent?" + q.Encode())
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	var data map[string]any
	if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
		panic(err)
	}
	if res.StatusCode != http.StatusOK {
		panic(data["error"])
	}
	fmt.Println(data["browser"])
}
<?php
$query = http_build_query(["ua" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"]);
$context = stream_context_create(["http" => ["ignore_errors" => true, "timeout" => 30]]);
$data = json_decode(file_get_contents("https://dnsrobot.net/api/v2/user-agent?" . $query, false, $context), true);
if (isset($data["error"])) {
    throw new RuntimeException($data["error"]["message"]);
}
print_r($data["browser"]);
require "net/http"
require "json"

uri = URI("https://dnsrobot.net/api/v2/user-agent")
uri.query = URI.encode_www_form(ua: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36")
data = JSON.parse(Net::HTTP.get(uri))
raise data["error"]["message"] if data["error"]
puts data["browser"]
// Cargo.toml: reqwest = { version = "0.13", features = ["blocking", "json"] }, serde_json = "1"
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let res = reqwest::blocking::get("https://dnsrobot.net/api/v2/user-agent?ua=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F141.0.0.0+Safari%2F537.36")?;
    let ok = res.status().is_success();
    let data: serde_json::Value = res.json()?;
    if !ok {
        return Err(data["error"]["message"].to_string().into());
    }
    println!("{}", data["browser"]);
    Ok(())
}
using System.Text.Json;

using var http = new HttpClient();
var res = await http.GetAsync("https://dnsrobot.net/api/v2/user-agent?ua=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F141.0.0.0+Safari%2F537.36");
var data = JsonDocument.Parse(await res.Content.ReadAsStringAsync()).RootElement;
if (!res.IsSuccessStatusCode)
    throw new Exception(data.GetProperty("error").GetProperty("message").GetString());
Console.WriteLine(data.GetProperty("browser"));

Chrome on Windows

GET /api/v2/user-agent?ua=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F141.0.0.0+Safari%2F537.36
200 OKRecorded 2026-10-25
{
  "query": {
    "ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.…"
  },
  "source": "parameter",
  "empty": false,
  "browser": {
    "name": {
      "value": "Chrome",
      "fromString": "Chrome",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "version": {
      "value": "141",
      "fromString": "141.0.0.0",
      "source": "ua",
      "frozen": true,
      "note": "minor_frozen"
    }
  },
  "engine": {
    "name": {
      "value": "Blink",
      "fromString": "Blink",
      "source": "ua",
      "frozen": false,
      "note": "webkit_compat"
    },
    "version": {
      "value": "141",
      "fromString": "141.0.0.0",
      "source": "ua",
      "frozen": true,
      "note": "minor_frozen"
    }
  },
  "os": {
    "name": {
      "value": "Windows",
      "fromString": "Windows",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "version": {
      "value": null,
      "fromString": "10",
      "source": "none",
      "frozen": true,
      "note": "windows_10_or_11"
    }
  },
  "device": {
    "type": {
      "value": "desktop",
      "fromString": "desktop",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "vendor": {
      "value": null,
      "fromString": null,
      "source": "none",
      "frozen": false,
      "note": null
    },
    "model": {
      "value": null,
      "fromString": null,
      "source": "none",
      "frozen": false,
      "note": null
    }
  },
  "cpu": {
    "architecture": {
      "value": null,
      "fromString": "x86_64",
      "source": "none",
      "frozen": true,
      "note": "windows_arch_frozen"
    },
    "bitness": {
      "value": null,
      "fromString": "64",
      "source": "none",
      "frozen": true,
      "note": null
    }
  },
  "bot": null,
  "clientHints": null,
  "parser": "rules",
  "issues": [
    {
      "severity": "info",
      "code": "minor_frozen",
      "message": "Chromium sends x.0.0.0: only the major version is real."
    },
    {
      "severity": "info",
      "code": "webkit_compat",
      "message": "Chromium's \"AppleWebKit/537.36\" is a compatibility token: its engine is Blink."
    },
    {
      "severity": "info",
      "code": "windows_10_or_11",
      "message": "Windows 10 and Windows 11 both send \"Windows NT 10.0\": the string can't tell them apart (Client …"
    },
    // … 1 more item
  ],
  "tookMs": 0
}

Shortened for the page: long lists show their first items.

Safari on an iPhone

GET /api/v2/user-agent?ua=Mozilla%2F5.0+%28iPhone%3B+CPU+iPhone+OS+18_7+like+Mac+OS+X%29+AppleWebKit%2F605.1.15+%28KHTML%2C+like+Gecko%29+Version%2F26.0+Mobile%2F15E148+Safari%2F604.1
200 OKRecorded 2026-10-25
{
  "query": {
    "ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) …"
  },
  "source": "parameter",
  "empty": false,
  "browser": {
    "name": {
      "value": "Safari",
      "fromString": "Safari",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "version": {
      "value": "26.0",
      "fromString": "26.0",
      "source": "ua",
      "frozen": false,
      "note": null
    }
  },
  "engine": {
    "name": {
      "value": "WebKit",
      "fromString": "WebKit",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "version": {
      "value": null,
      "fromString": "605.1.15",
      "source": "none",
      "frozen": true,
      "note": "webkit_frozen"
    }
  },
  "os": {
    "name": {
      "value": "iOS",
      "fromString": "iOS",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "version": {
      "value": "26.0",
      "fromString": "18.7",
      "source": "ua",
      "frozen": true,
      "note": "ios_frozen"
    }
  },
  "device": {
    "type": {
      "value": "mobile",
      "fromString": "mobile",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "vendor": {
      "value": "Apple",
      "fromString": "Apple",
      "source": "ua",
      "frozen": false,
      "note": null
    },
    "model": {
      "value": "iPhone",
      "fromString": "iPhone",
      "source": "ua",
      "frozen": false,
      "note": "apple_model_hidden"
    }
  },
  "cpu": {
    "architecture": {
      "value": null,
      "fromString": null,
      "source": "none",
      "frozen": false,
      "note": null
    },
    "bitness": {
      "value": null,
      "fromString": null,
      "source": "none",
      "frozen": false,
      "note": null
    }
  },
  "bot": null,
  "clientHints": null,
  "parser": "rules",
  "issues": [
    {
      "severity": "info",
      "code": "webkit_frozen",
      "message": "Safari's AppleWebKit/605.1.15 no longer changes between versions."
    },
    {
      "severity": "info",
      "code": "ios_frozen",
      "message": "Safari 26 and later report iOS 18.6 or 18.7 for every newer system: the real version is Safari's…"
    },
    {
      "severity": "info",
      "code": "apple_model_hidden",
      "message": "Apple never puts the iPhone or iPad model in the string."
    }
  ],
  "tookMs": 0
}

Shortened for the page: long lists show their first items.

Googlebot Smartphone

GET /api/v2/user-agent?ua=Mozilla%2F5.0+%28Linux%3B+Android+6.0.1%3B+Nexus+5X+Build%2FMMB29P%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F141.0.7390.122+Mobile+Safari%2F537.36+%28compatible%3B+Googlebot%2F2.1%3B+%2Bhttp%3A%2F%2Fwww.google.com%2Fbot.html%29
200 OKRecorded 2026-10-25
{
  "query": {
    "ua": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko)…"
  },
  "source": "parameter",
  "empty": false,
  "browser": {
    "name": {
      "value": "Googlebot",
      "fromString": "Chrome",
      "source": "ua",
      "frozen": false,
      "note": "crawler_emulates"
    },
    "version": {
      "value": "2.1",
      "fromString": "141.0.7390.122",
      "source": "ua",
      "frozen": false,
      "note": "crawler_emulates"
    }
  },
  "engine": {
    "name": {
      "value": null,
      "fromString": "Blink",
      "source": "none",
      "frozen": false,
      "note": "crawler_emulates"
    },
    "version": {
      "value": null,
      "fromString": "141.0.7390.122",
      "source": "none",
      "frozen": false,
      "note": "crawler_emulates"
    }
  },
  "os": {
    "name": {
      "value": null,
      "fromString": "Android",
      "source": "none",
      "frozen": false,
      "note": "crawler_emulates"
    },
    "version": {
      "value": null,
      "fromString": "6.0.1",
      "source": "none",
      "frozen": false,
      "note": "crawler_emulates"
    }
  },
  "device": {
    "type": {
      "value": null,
      "fromString": "mobile",
      "source": "none",
      "frozen": false,
      "note": "crawler_emulates"
    },
    "vendor": {
      "value": null,
      "fromString": "LG",
      "source": "none",
      "frozen": false,
      "note": "crawler_emulates"
    },
    "model": {
      "value": null,
      "fromString": "Nexus 5X",
      "source": "none",
      "frozen": false,
      "note": "crawler_emulates"
    }
  },
  "cpu": {
    "architecture": {
      "value": null,
      "fromString": null,
      "source": "none",
      "frozen": false,
      "note": null
    },
    "bitness": {
      "value": null,
      "fromString": null,
      "source": "none",
      "frozen": false,
      "note": null
    }
  },
  "bot": {
    "id": "googlebot",
    "name": "Googlebot",
    "version": "2.1",
    "operator": "Google",
    "kind": "search",
    "docs": "https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers",
    "verifiable": true,
    "robots": "obeys",
    "generic": false
  },
  "clientHints": null,
  "parser": "rules",
  "issues": [
    {
      "severity": "info",
      "code": "crawler_emulates",
      "message": "A crawler's string imitates a browser and device it isn't."
    }
  ],
  "tookMs": 0
}

Shortened for the page: long lists show their first items.