On this page

Purpose-bound profiles

Collect for an event, not forever

Start with a small profile, bind collection to a server-known action, and enable expensive or sensitive probes only when their purpose is explicit.

Profile rules

  • Use a fresh action or session ID supplied by the application backend.
  • Use consentFor(...) as an allowlist and field projection for minimization.
  • Keep benchmark, fork-test, timing, numeric, and transaction probes off unless the flow requires them.
  • Do not reuse one collection indefinitely across unrelated actions.
  • Do not convert the raw event into a client-side score or verdict.

Login

Use low-cost identity, app, integrity, posture, locale, runtime, and network context. Collect immediately before submitting credentials or completing an identity-provider callback.

const loginConfig = {
  probes: {
    geolocation: {enabled: false},
    media_bluetooth_apps: {enabled: false},
    transaction_safety: {enabled: false},
    gpu_benchmark: {enabled: false},
    audio_latency: {enabled: false},
    runtime_timing: {enabled: false},
    numeric_consistency: {enabled: false},
    os_integrity_fork_test: {enabled: false},
  },
};

const observations = await deviceIntel.collect({
  sessionId: loginActionId,
  config: loginConfig,
});

Registration

Registration often needs app provenance, environment consistency, and coarse country or locale comparison. Keep precise location off unless the product has a separate documented purpose and existing permission.

Recommended core

device_identity, application, os_integrity, device_security_posture, locale, and runtime.

Conditional

network and telephony when country, VPN, proxy, or SIM context has been approved for this flow.

Avoid by default

Location coordinates, accessibility inventory, known-app observations, and active benchmarks.

Checkout or payment

Bind collection to the server-created order or payment attempt. The backend should compare freshness and action binding before using any derived feature.

const observations = await deviceIntel.collect({
  sessionId: paymentAttemptId,
  config: {
    probes: {
      application: {
        fields: {
          include: [
            "appVersion",
            "appBuild",
            "bundleId",
            "installerPackage",
            "signingCertificateSha256",
            "isDebuggable",
          ],
        },
      },
      transaction_safety: {enabled: false},
    },
  },
});

Account recovery

Account recovery is high impact. Collect current context, but keep recovery available when telemetry is missing, unavailable, or unusual. Strong authenticated recovery factors and server history remain primary.

Root, jailbreak, emulator, VPN, accessibility, and remote-access observations all have legitimate explanations. They are review context, not identity proof.

Protected action with transaction context

transaction_safety uses a two-stage Android observation window. Collect once when the protected UI opens, then again immediately before its final action.

const protectedConfig = {
  probes: {
    transaction_safety: {enabled: true, timeoutMs: 900},
  },
};

await deviceIntel.collect({
  sessionId: protectedActionId,
  config: protectedConfig,
});

// Immediately before confirmation:
const observations = await deviceIntel.collect({
  sessionId: protectedActionId,
  config: protectedConfig,
});

Android capture observations additionally require the host to declare the applicable install-time permission. See the exact transaction integration instructions.

Send through the host API

Use your existing authenticated API client, idempotency key, retry policy, and request-size controls. The SDK performs no network request.