Identity
The Risk Snapshot

The Risk Snapshot

Every call to analyze (or analyze-sync) returns one object: the IdentityDecisionSnapshot. It is a flat, explainable record — a canonical verdict, four top-line scores, per-family signal fields, and a finding surface that tells you why the verdict came out the way it did. Identity is a standalone evidence provider: the snapshot describes risk, it does not act on it.

The snapshot carries a single verdict field — identityRiskLevel. It is identity's own evidence-grade assessment of the session, not a fraud or payment action. There is no block/allow field: you read the level, the scores and the findings, and you decide. Feed it into your own rules, your Fraud Detection logic, or your checkout.

The response envelope

Gateway responses share one envelope — { success, message, code, data, meta }. The snapshot is always in data:

{
  "success": true,
  "message": "Analysis complete",
  "code": "IDENTITY_ANALYZED",
  "data": { /* IdentityDecisionSnapshot — everything below */ },
  "meta": { "traceId": "trc_01HV3K9X..." }
}

The canonical verdict

identityRiskLevel is the one enum that summarises the session. It is graded from identity's own evidence — do not read it as an instruction to approve or decline.

FieldTypeMeaning
identityRiskLevelclean | low | medium | high | criticalIdentity's evidence-grade risk band for the session
identityRiskPolicyVersionstringThe policy version that produced the level — pin it so grading changes are auditable
⚠️

identityRiskLevel is the only verdict enum in the snapshot. Everything else is a signal, a score, or a finding. There is no separate "decision" or "action" field — that surface belongs to your own logic.

The scores

Four normalised scores sit at the top of the snapshot. Treat them as continuous signals, not thresholds — you choose where your own cut-offs fall.

FieldRangeWhat it tells you
riskScore0–100Overall risk magnitude for the session
confidenceScore0–1How much evidence backs the assessment
similarityScore0–1How closely this session matches known good history for the subject
stabilityScore0–1How stable the device/identity signal is across sessions

Signal families

Below the scores, the snapshot groups signals by family. Each family is documented in depth on its own page; the tables here are the field reference.

Device & continuity

Whether this device/actor has been seen before and how stable the match is. Full detail: Device & Continuity.

FieldTypeMeaning
knownDevicebooleanThe device has been seen before for this merchant
stableDevicebooleanThe fingerprint is stable across recent sessions
sameDeviceProbability0–1Likelihood this is the same physical device as prior sessions
sameBrowserProbability0–1Likelihood this is the same browser instance
sameActorProbability0–1Likelihood the same person is behind this and prior sessions
matchedClusterIdstring | nullThe device cluster this session was matched into
clusterStabilityScore0–1How stable that cluster has been over time
clusterRiskScore0–100Aggregate risk of the matched cluster
continuityDriftReasonsstring[]Why continuity confidence dropped (e.g. new hardware attributes)
continuityEvidenceobject[]Evidence records behind the continuity match

Network intelligence

VPN/proxy/Tor/hosting posture plus geo, ASN and ISP. Full detail: Network Intelligence.

FieldTypeMeaning
networkCategorystringNetwork type (e.g. residential, hosting, vpn, proxy)
networkRiskScore0–100Risk magnitude of the network path
networkPosturestringSummary posture label for the network
ipCountry / ipRegion / ipCitystringIP geolocation
geoConfidence0–1Confidence in the geolocation
asnnumberAutonomous system number
ispstringInternet service provider
providerstringNetwork/hosting provider label
hostingRiskstringHosting/datacenter risk level
geoConflictDetectedbooleanGeo signals disagree (e.g. IP vs declared)
networkMatchedSourcesstring[]Which intelligence sources matched
networkMatchedArtifactsstring[]Which network artifacts matched

Bot & automation

Bot classification, automation/abuse signals and declared/verified-bot trust. Full detail: Bot & Automation.

FieldTypeMeaning
botClassificationstringBot verdict (e.g. human, automation_likely, verified_bot)
botConfidence0–1Confidence in the bot classification
botSignalsstring[]The individual automation/abuse signals observed
botTrustOutcomestringOutcome of declared/verified-bot evaluation
botTrustTierstringTrust tier assigned to a recognised bot
botTrustDeclaredbooleanThe client declared itself as an automated agent
botIssuerId / botKeyId / botActorIdstringIdentifiers of a registered, verified bot

Mobile integrity

Present only for native-mobile sessions. Full detail: Mobile Threat.

FieldTypeMeaning
mobileIntegrityClassificationstringAttested device/app integrity verdict
mobileIntegrityConfidence0–1Confidence in the integrity verdict
mobilePolicyStatusstringResult against your mobile app policy
mobileAppTrustedbooleanThe app matched a trusted registry entry
mobilePlatformstringios / android
mobileAppId / mobileAppVersionstringReported app identity

Tamper & privacy

Browser-integrity/tamper posture and privacy-tooling posture.

FieldTypeMeaning
tamperClassificationstringBrowser-integrity/tamper verdict (e.g. clean, tampered)
tamperConfidence0–1Confidence in the tamper verdict
privacyPosturestringPrivacy-tooling posture (e.g. hardened, anti-detect)
privacyConfidence0–1Confidence in the privacy posture

Boolean flags

Fast, top-level booleans for the highest-signal conditions.

FieldMeaning
vpnDetectedSession arrived over a commercial VPN
proxyDetectedSession arrived over a proxy/relay
torDetectedSession arrived from a Tor exit node
ipBlacklistedThe IP is on a block list
fingerprintBlacklistedThe device fingerprint is on a block list
deviceTokenBlacklistedThe device token is on a block list

The verdict surface

The snapshot is explainable: alongside the scores and signals, it carries the reasons behind them.

FieldTypeWhat it carries
reasonCodesstring[]Machine-readable codes summarising the drivers
tagsstring[]Descriptive labels attached to the session
riskFlagsstring[]The risk conditions that fired
findingsobject[]The explained drivers — one entry per contributing signal
featuresobjectA map of raw feature values used in the assessment

Each entry in findings breaks down a single contributing signal:

Finding fieldMeaning
codeThe finding's stable code
severitylow | medium | high (relative weight of this driver)
scoreDeltaHow much this finding moved the risk score
sourceWhich signal family it came from (device, network, bot, …)
descriptionHuman-readable explanation

Every signal family also exposes an evidence and method breakdown — each signal carries the evidence and the method that produced it, so a verdict is never a black box. Read findings for the explained drivers and the per-family evidence for the raw provenance.

A full snapshot

A complete data payload, with the real field names:

{
  "identityRiskLevel": "high",
  "identityRiskPolicyVersion": "2026-07-01",
 
  "riskScore": 72,
  "confidenceScore": 0.91,
  "similarityScore": 0.38,
  "stabilityScore": 0.55,
 
  "knownDevice": true,
  "stableDevice": true,
  "sameDeviceProbability": 0.97,
  "sameBrowserProbability": 0.88,
  "sameActorProbability": 0.74,
  "matchedClusterId": "clu_3b1d",
  "clusterStabilityScore": 0.62,
  "clusterRiskScore": 66,
  "continuityDriftReasons": ["timezone_shift"],
 
  "networkCategory": "vpn",
  "networkRiskScore": 61,
  "networkPosture": "anonymizing",
  "ipCountry": "NL",
  "ipRegion": "North Holland",
  "ipCity": "Amsterdam",
  "geoConfidence": 0.84,
  "asn": 60068,
  "isp": "Example ISP",
  "provider": "Example Network",
  "hostingRisk": "high",
  "geoConflictDetected": true,
  "networkMatchedArtifacts": ["vpn_range"],
 
  "botClassification": "automation_likely",
  "botConfidence": 0.70,
  "botSignals": ["headless_hints", "input_cadence_synthetic"],
  "botTrustOutcome": "unverified",
  "botTrustDeclared": false,
 
  "tamperClassification": "tampered",
  "tamperConfidence": 0.81,
  "privacyPosture": "anti_detect",
  "privacyConfidence": 0.66,
 
  "vpnDetected": true,
  "proxyDetected": false,
  "torDetected": false,
  "ipBlacklisted": false,
  "fingerprintBlacklisted": false,
  "deviceTokenBlacklisted": false,
 
  "reasonCodes": ["vpn_detected", "automation_likely", "browser_tampered"],
  "tags": ["anonymizing_network"],
  "riskFlags": ["network", "bot", "tamper"],
  "findings": [
    { "code": "vpn_detected",      "severity": "medium", "scoreDelta": 18, "source": "network", "description": "Commercial VPN range" },
    { "code": "automation_likely", "severity": "high",   "scoreDelta": 26, "source": "bot",     "description": "Synthetic input cadence" },
    { "code": "browser_tampered",  "severity": "high",   "scoreDelta": 22, "source": "tamper",  "description": "Impossible feature combination" }
  ],
  "features": { "input_entropy": 0.12, "canvas_delta": 0.44 }
}

Fields appear only when the relevant signal is present. Mobile-integrity fields, for example, are absent on browser sessions, and matchedClusterId is null when a session matches no cluster. Always read defensively.

Next steps