Identity
Mobile Threat

Mobile Threat

Mobile Threat is a separate, native surface of Identity Intelligence. Where the web snapshot fingerprints a browser session, Mobile Threat evaluates a native mobile app: it fuses hardware-backed attestation, app-clone detection and man-in-the-middle interception intelligence into the same risk snapshot, exposed through the mobile* fields. It is delivered by a dedicated native mobile SDK — the web SDK does not produce these signals.

Mobile Threat is an evidence provider. Every evaluation returns a classification, a confidence and a set of findings — it never blocks on its own. You feed the verdict into your own logic and decide what to do.

⚠️

A native mobile SDK is required. The attestation and interception signals come from device-level APIs that only a native app can reach. An attestation that is declared but has no verifiable token is never treated as trusted — it returns an explicit not-verifiable result, not a pass.

How it works

Embed the native SDK

Integrate the Lunixi mobile SDK into your Android and/or iOS app. It collects a hardware attestation and the device-integrity telemetry that the server evaluation needs.

Register the app (once)

Declare your app IDs, minimum SDK/app versions and attestation requirements in the mobile app registry. Registration is what turns a raw attestation into a trust decision — an unregistered app is reported, not trusted.

Evaluate a session (server)

From your backend, call POST /identity/mobile-threat/evaluate with the SDK-provided attestation and your business context. You get back a snapshot with the mobile* classification fields.

Bind a sensitive action (optional)

For a high-assurance action — a transfer, a beneficiary add — issue a one-time trusted action token after a passing evaluation and consume it at the action endpoint, proving the action ran under the evaluated risk posture.

Attestation coverage

PlatformMechanismStatus
AndroidPlay Integrity — hardware-backed attestation of a genuine, unmodified app and deviceLive
iOSApp Attest — an Apple-attested app keyRequires per-app enrollment (register the App Attest key)
iOSDeviceCheck — Apple device-level bit storeRequires DeviceCheck credentials in the environment

Play Integrity works as soon as the Android app is registered. The iOS mechanisms are configurable: App Attest needs the app's attestation key enrolled through app-attest/register-key, and DeviceCheck needs its Apple credentials configured server-side. Until then, iOS attestation reports as not-verifiable rather than failing closed on your behalf.

App Attest enrollment (iOS)

App Attest binds a per-app cryptographic key that Apple vouches for. Enroll it in two steps from your backend:

  1. POST /identity/mobile-threat/app-attest/bootstrap-challenge — obtain a one-time challenge to hand to the SDK.
  2. POST /identity/mobile-threat/app-attest/register-key — register the SDK-generated, Apple-attested key against your app.

Once a key is registered, subsequent evaluate calls for that app can verify App Attest assertions.

Clone & interception intelligence

Beyond attestation, the evaluation reports how the app is being run and how its traffic is being carried:

DomainWhat it detects
Clone intelligenceThe app running under dual-space / app-cloning tools or inside an Android work profile — multiple instances of one app on one device
MITM intelligenceTraffic carried through a manual proxy or VPN transport, or resolved through a custom private DNS — the transport shapes that precede interception

Request

POST /identity/mobile-threat/evaluate — server-side, Authorization: Bearer <secret key>.

curl https://api-gateway.lunixi.com/api/v1/identity/mobile-threat/evaluate \
  -H "Authorization: Bearer at_live_5f3e2b1a..." \
  -H "Content-Type: application/json" \
  -d '{
    "subjectType": "customer",
    "subjectId": "cus_8f2a9c",
    "productContext": "money_transfer",
    "action": {
      "actionType": "transfer_submit",
      "beneficiaryHash": "bnf_abc",
      "challenge": "nonce_123"
    },
    "issueTrustedActionToken": true,
    "device": { "...": "attestation + integrity telemetry from the native SDK" }
  }'

POST /identity/mobile-threat/simulate runs the same evaluation pipeline against a hypothetical input so you can rehearse how a given attestation state maps to a classification — without recording a live decision. Stream lifecycle context with POST /identity/mobile-threat/timeline-event.

Snapshot

The evaluation returns the same gateway envelope ({ success, message, code, data, meta }); data is the risk snapshot, carrying the mobile fields on top of the shared identity fields.

{
  "identityRiskLevel": "medium",
  "riskScore": 58,
  "confidenceScore": 0.88,
 
  "mobilePlatform": "android",
  "mobileAppId": "io.example.app",
  "mobileAppTrusted": true,
  "mobileIntegrityClassification": "genuine",
  "mobileIntegrityConfidence": 0.93,
  "mobilePolicyStatus": "pass",
 
  "reasonCodes": ["private_dns_detected"],
  "findings": [
    { "code": "private_dns_detected", "severity": "medium", "scoreDelta": 14, "source": "mobile" }
  ]
}

Signals

FieldWhat it tells you
mobileIntegrityClassificationThe integrity verdict for the app/device (e.g. genuine vs tampered vs not-verifiable)
mobileIntegrityConfidenceConfidence in that classification
mobilePolicyStatusWhether the evaluation satisfies the policy declared for this app in the registry
mobileAppTrustedWhether the app resolves to a registered, trusted app entry
mobilePlatformandroid or ios
mobileAppId / mobileAppVersionThe declared app identifier and version

The canonical verdict is identityRiskLevel (clean | low | medium | high | critical) — Identity's own evidence-grade assessment, not a payment or fraud action. See The Risk Snapshot.

Trusted action tokens

Bind a passing evaluation to one sensitive action so the action cannot run under a different, unverified posture:

Issue

After a passing evaluate, call POST /identity/mobile-threat/trusted-action-token to mint a one-time token scoped to the action.

Consume

At your action endpoint, call POST /identity/mobile-threat/trusted-action-token/consume with the token. It is single-use — consuming it proves the action ran under the evaluated risk posture.

Reading decisions

Every evaluation is recorded, merchant-scoped and queryable:

  • GET /identity/mobile-threat/decisions — recent mobile evaluations.
  • GET /identity/mobile-threat/decisions/:id — one evaluation in full.
  • GET /identity/mobile-threat/trace/:traceId/decisions — the mobile decisions tied to a given trace.

Mobile app registry

The registry is what makes attestation meaningful — it declares which apps you trust and to what standard:

  • GET /identity/mobile-apps — list your registered apps.
  • POST /identity/mobile-apps — declare an app ID, minimum SDK/app version and attestation requirement.
  • PATCH /identity/mobile-apps/:id — update an app entry.

An app that is not registered can still be evaluated, but it resolves to mobileAppTrusted: false — the attestation is reported, not trusted.

Notes

  • Native SDK required. These signals exist only through the native mobile SDK — do not expect them on a web session.
  • Declared ≠ verified. A missing or invalid attestation token yields a not-verifiable result, never an implicit pass.
  • Configurable per platform. Android Play Integrity is live on registration; iOS App Attest requires key enrollment and DeviceCheck requires environment credentials.

Next steps