DOCS LLMs

Telemetry

Telemetry

Supported licensing requests can include an optional telemetry object with device and app information. LicenseSeat uses this enrichment to power per-product analytics: DAU/MAU, version adoption, platform distribution, geographic breakdown, and stale device detection.

Official SDKs may attach this enrichment automatically, according to their version and configuration. If you're building a custom integration, this page describes the telemetry format and what each field is used for.

The optional telemetry object is distinct from the data required to perform licensing. Successful licensing requests still create an activity footprint containing the event, license/product context, installation fingerprint when present, request time, and source IP even when optional telemetry is disabled.

The Telemetry Object

Include a telemetry key in the JSON body of any POST request:

{
  "license_key": "XXXX-XXXX-XXXX-XXXX",
  "fingerprint": "mac-a1b2c3d4-e5f6g7h8",
  "telemetry": {
    "sdk_name": "swift",
    "sdk_version": "0.4.2",
    "os_name": "macOS",
    "os_version": "15.2.0",
    "platform": "native",
    "device_model": "MacBookPro18,1",
    "app_version": "2.1.0",
    "app_build": "42",
    "device_type": "desktop",
    "architecture": "arm64",
    "cpu_cores": 10,
    "memory_gb": 32,
    "locale": "en_US",
    "language": "en",
    "timezone": "America/New_York",
    "screen_resolution": "3456x2234",
    "display_scale": 2.0
  }
}

Fields

These fields are stored as dedicated database columns and are directly queryable in the analytics dashboard:

Field Type Description Used for
sdk_name String SDK identifier such as swift, js, cpp, csharp, or rust SDK distribution
sdk_version String Version of the LicenseSeat SDK SDK adoption tracking
os_name String Operating system name (macOS, iOS, Windows, Linux, Android) Platform distribution
os_version String OS version (e.g., 15.2.0) OS distribution
platform String Runtime environment: native, node, browser, electron, react-native, deno, bun, unity Platform analytics
device_model String SDK-reported model value; semantics vary by SDK and can include a machine name Device analytics
app_version String Host app version Version adoption charts
app_build String Host app build number Build tracking
device_type String Device form factor: phone, tablet, desktop, watch, tv, server, unknown Device type distribution
architecture String CPU architecture: arm64, x64, x86 Architecture distribution
cpu_cores Integer Number of CPU cores Hardware segmentation
memory_gb Integer Total RAM in GB (rounded) Hardware segmentation
locale String Full locale (e.g., en_US, pt_BR) Localization insights
language String 2-letter ISO 639-1 code (e.g., en, pt, es) -- extracted from locale Language distribution

Additional Metadata

These fields are stored in the JSONB metadata column:

Field Type Description SDKs
screen_resolution String Screen resolution as WIDTHxHEIGHT Swift, JS (browser), C++
display_scale Number Display pixel ratio (1.0, 2.0, 3.0) Swift, JS (browser)
browser_name String Browser name (Chrome, Safari, Firefox, Edge) JS (browser only)
browser_version String Browser version JS (browser only)
runtime_version String Runtime version (e.g., .NET 9.0.0, Node 20.11.0) JS, C#
timezone String IANA timezone (e.g., America/New_York) All SDKs

All fields are optional. Send what you have -- partial telemetry is better than none.

Which Endpoints Accept Telemetry

Telemetry is captured on these endpoints:

Endpoint Event type
activate activation
deactivate deactivation
validate validation
heartbeat heartbeat
machine-file checkout machine_file_checkout

Every successful request to these endpoints creates a footprint with the telemetry data, the request IP (for geolocation), and the event type. See the API quickstart and interactive reference for the complete endpoint contracts.

How the SDKs Handle It

Consult the SDK-specific configuration. Several official SDKs enable telemetry by default, but availability and opt-out controls differ by SDK version.

Swift SDK

Swift 0.4.2 includes telemetry by default on supported licensing POST requests. Disable the optional object explicitly when the host application does not need LicenseSeat analytics:

LicenseSeatStore.shared.configure(
    apiKey: "pk_live_xxxxxxxx",
    productSlug: "your-product"
) { config in
    config.telemetryEnabled = false
}

// When enabled, the optional telemetry object contains:

// What gets collected:
// - sdk_name: "swift"
// - sdk_version: from LicenseSeatConfig.sdkVersion
// - os_name: "macOS", "iOS", "tvOS", "watchOS", "visionOS"
// - os_version: from ProcessInfo.operatingSystemVersion
// - platform: "native"
// - device_model: from sysctlbyname("hw.model")
// - app_version: from CFBundleShortVersionString
// - app_build: from CFBundleVersion
// - device_type: "desktop", "phone", "tablet", "watch", "tv", "headset"
// - architecture: "arm64" or "x64"
// - cpu_cores: from ProcessInfo.processorCount
// - memory_gb: from ProcessInfo.physicalMemory (rounded)
// - locale: from Locale.current.identifier
// - language: 2-letter code from locale
// - timezone: from TimeZone.current.identifier
// - screen_resolution: native pixel resolution
// - display_scale: backingScaleFactor / UIScreen.scale

The Swift SDK also creates a random app-scoped installation identifier and persists it in Keychain on Apple platforms. It sends that required seat-binding value as the top-level fingerprint, independently of telemetryEnabled. Legacy clients may still use the device_id field name, but fingerprint is the canonical wire term.

Custom Integrations

If you're building a custom SDK or integration, collect whatever fields are available on your platform and include them in the telemetry object:

import platform
import requests

requests.post(
    "https://licenseseat.com/api/v1/products/my-app/licenses/validate",
    headers={"Authorization": "Bearer pk_live_xxx"},
    json={
        "license_key": "XXXX-XXXX-XXXX-XXXX",
        "fingerprint": get_device_fingerprint(),
        "telemetry": {
            "sdk_name": "python",
            "sdk_version": "0.1.0",
            "os_name": platform.system(),
            "os_version": platform.release(),
            "platform": "native",
            "device_type": "desktop",
            "architecture": platform.machine(),
            "app_version": "1.0.0"
        }
    }
)
var body = new {
    license_key = "XXXX-XXXX-XXXX-XXXX",
    fingerprint = GetDeviceFingerprint(),
    telemetry = new {
        sdk_name = "csharp",
        sdk_version = "0.5.0",
        os_name = Environment.OSVersion.Platform.ToString(),
        os_version = Environment.OSVersion.Version.ToString(),
        platform = "native",
        device_type = "desktop",
        architecture = RuntimeInformation.ProcessArchitecture.ToString(),
        app_version = Assembly.GetExecutingAssembly().GetName().Version.ToString()
    }
};

What Powers the Analytics Dashboard

The telemetry data feeds directly into your product's analytics dashboard in LicenseSeat. The dashboard offers 7, 30, and 90 day time range selectors.

KPI Cards

  • DAU — Daily Active Users (unique devices today)
  • MAU — Monthly Active Users (unique devices this month)
  • Unique Devices — Over selected time range
  • Total Events — All telemetry events in range

Charts & Distributions

Section Metrics Based on
Daily Active Devices Bar chart of unique devices per day fingerprint counts
Geographic Distribution World map + country breakdown IP geolocation (automatic)
Version Adoption Donut + stacked area chart app_version
Runtime Environment OS versions, platforms, device types os_name, os_version, platform, device_type
Hardware Architecture, CPU cores histogram, memory histogram architecture, cpu_cores, memory_gb

LicenseSeat Section

Metric Description
Seats Utilization percentage (used/total across all licenses)
Stale Devices Devices with no heartbeat in 7+ days
SDK Versions Distribution of sdk_version values
SDK Platforms Distribution of sdk_name (swift, js, cpp, csharp, rust)

Geolocation

In addition to the telemetry fields you send, LicenseSeat automatically resolves geolocation from the request IP address. This provides country, city, region, coordinates, and timezone -- no extra work needed from the SDK.

Privacy

You can omit the optional telemetry object; the API's licensing decisions work the same without that enrichment. This does not make a licensing request anonymous: license/product identifiers, an installation fingerprint when applicable, event timing, and the server-visible source IP are still required or recorded for service operation, abuse prevention, and licensing analytics.

Persistent identifiers, IP-derived location, request activity, and diagnostic attributes can be personal data or data linked to a user under platform policy and privacy law even when they do not contain a person's name. Integrators remain responsible for an accurate privacy notice, lawful basis/consent where required, retention and deletion behavior, and their complete App Store or marketplace disclosures. Disabling optional telemetry alone does not establish GDPR or other legal compliance.