Skip to content

Dashboard Data API

DRAFT — Internal Developer Use Only

This API reference is for internal development teams.

Overview

What it is: The dashboard data API provides pre-aggregated identity posture metrics across six domains: accounts, identities, groups, threats, audit, and platform status. Each domain offers a current-state endpoint and a history endpoint returning weekly snapshots.

Why it matters: These endpoints are the primary data source for both Discovery's built-in dashboards and Control's custom dashboard widgets. Control caches this data locally and runs KPI calculations over it to power customer-facing identity risk dashboards.

Endpoints

MethodPathDescriptionAuth
GET/api/v1/dashboard/statusCurrent view timeJWT
GET/api/v1/dashboard/accountAccount posture metricsJWT
GET/api/v1/dashboard/account/historyAccount metrics — 52 weeksJWT
GET/api/v1/dashboard/identityIdentity counts by sourceJWT
GET/api/v1/dashboard/identity/historyIdentity metrics — 52 weeksJWT
GET/api/v1/dashboard/groupGroup counts and privilege statusJWT
GET/api/v1/dashboard/group/historyGroup metrics — 52 weeksJWT
GET/api/v1/dashboard/threatRisk scores and compromise metricsJWT
GET/api/v1/dashboard/threat/historyThreat metrics — 52 weeksJWT
GET/api/v1/dashboard/auditFailed logon countsJWT
GET/api/v1/dashboard/audit/historyAudit metrics — 365 daysJWT
GET/api/v1/dashboard/platformPlatform nodes, providers, data sourcesJWT

Common query parameter: All current-state endpoints accept an optional ?time=<ms> query parameter (milliseconds since epoch) to retrieve a historical snapshot. Defaults to the current view time.


GET /api/v1/dashboard/status

Get the current dashboard view time. This timestamp represents the most recent data aggregation point.

Request:

http
GET /api/v1/dashboard/status
Authorization: Bearer <token>

Response (200):

json
{
  "viewTime": 1707696000000
}
FieldTypeDescription
viewTimeint64Milliseconds since epoch — latest data aggregation timestamp

GET /api/v1/dashboard/account

Get current account posture metrics including counts, MFA status, stale credentials, and per-data-source breakdowns.

Request:

http
GET /api/v1/dashboard/account
Authorization: Bearer <token>

Response (200):

json
{
  "viewTime": 1707696000000,
  "count": {
    "total": 15420,
    "mapped": 12890,
    "shared": 342,
    "type": {
      "User Account": 11200,
      "Service Account": 3100,
      "Computer Account": 1120
    },
    "totalChange": 45,
    "mappedChange": 32,
    "sharedChange": -2,
    "orphaned": 1230,
    "compromised": 18
  },
  "multiFactorAuth": {
    "enabled": 9800,
    "disabled": 4620,
    "unknown": 1000,
    "provider": [
      { "name": "Microsoft Authenticator", "count": 5200 },
      { "name": "Okta Verify", "count": 3100 },
      { "name": "Duo Security", "count": 1500 }
    ],
    "providers": 3,
    "pending": 420
  },
  "account": [
    {
      "dataSourceId": "ds-ad-001",
      "dataSourceName": "Corporate AD",
      "platform": "ActiveDirectory",
      "count": 8500,
      "type": { "User Account": 7200, "Service Account": 800, "Computer Account": 500 }
    },
    {
      "dataSourceId": "ds-azure-001",
      "dataSourceName": "Azure AD",
      "platform": "AzureAD",
      "count": 4200,
      "type": { "User Account": 3800, "Service Account": 400 }
    }
  ],
  "stalePassword": [
    { "days": 90, "count": 1240, "change": -15 },
    { "days": 180, "count": 620, "change": -8 },
    { "days": 365, "count": 180, "change": 2 }
  ],
  "staleAccount": [
    { "days": 90, "count": 890, "change": -22 },
    { "days": 180, "count": 450, "change": -10 },
    { "days": 365, "count": 120, "change": 0 }
  ],
  "created": [
    { "days": 1, "count": 12, "change": 3 },
    { "days": 7, "count": 45, "change": -5 },
    { "days": 30, "count": 180, "change": 12 }
  ]
}

AccountDashboard fields

FieldTypeDescription
viewTimeint64Snapshot timestamp (ms)
countAccountCountAggregate account statistics
multiFactorAuthMultiFactorAuthMFA enrollment status
accountAccountInfo[]Per-data-source breakdown
stalePasswordCount[]Stale password counts at 90/180/365 day thresholds
staleAccountCount[]Stale account counts at 90/180/365 day thresholds
createdCount[]Newly created accounts at 1/7/30 day windows

AccountCount

FieldTypeDescription
totaluint64Total discovered accounts
mappeduint64Accounts mapped to an identity owner
shareduint64Shared accounts
typemap<string, uint64>Account count by type (User, Service, Computer)
totalChangeint64Delta from previous period
mappedChangeint64Delta from previous period
sharedChangeint64Delta from previous period
orphaneduint64Accounts with no owner
compromiseduint64Accounts flagged as compromised

MultiFactorAuth

FieldTypeDescription
enableduint32Accounts with MFA enabled
disableduint32Accounts with MFA disabled
unknownuint32Accounts with unknown MFA status
providerMfaProvider[]Breakdown by MFA provider
providersuint32Total number of distinct MFA providers
pendinguint32Accounts with pending MFA enrollment

AccountInfo

FieldTypeDescription
dataSourceIdstringData source unique identifier
dataSourceNamestringDisplay name
platformstringPlatform type (ActiveDirectory, AzureAD, Okta, Linux, etc.)
countuint64Total accounts from this data source
typemap<string, uint64>Account count by type within this data source

Count (used by stalePassword, staleAccount, created)

FieldTypeDescription
daysuint32Threshold in days (e.g., 90, 180, 365)
countuint32Number of matching accounts
changeint32Delta from previous period

GET /api/v1/dashboard/account/history

Get weekly account posture snapshots for the past 52 weeks. Each entry in the history array is a full AccountDashboard object with a different viewTime.

Request:

http
GET /api/v1/dashboard/account/history
Authorization: Bearer <token>

Response (200):

json
{
  "history": [
    {
      "viewTime": 1707696000000,
      "count": { "total": 15420, "mapped": 12890, "..." : "..." },
      "multiFactorAuth": { "enabled": 9800, "..." : "..." },
      "account": [ "..." ],
      "stalePassword": [ "..." ],
      "staleAccount": [ "..." ],
      "created": [ "..." ]
    },
    {
      "viewTime": 1707091200000,
      "count": { "total": 15375, "..." : "..." },
      "...": "..."
    }
  ]
}

Each element follows the same AccountDashboard structure defined above.


GET /api/v1/dashboard/identity

Get current identity counts broken down by data source.

Request:

http
GET /api/v1/dashboard/identity
Authorization: Bearer <token>

Response (200):

json
{
  "viewTime": 1707696000000,
  "total": 3200,
  "identity": [
    {
      "dataSourceId": "ds-ad-001",
      "dataSourceName": "Corporate AD",
      "platform": "ActiveDirectory",
      "count": 2100
    },
    {
      "dataSourceId": "ds-azure-001",
      "dataSourceName": "Azure AD",
      "platform": "AzureAD",
      "count": 1100
    }
  ]
}

IdentityDashboard fields

FieldTypeDescription
viewTimeint64Snapshot timestamp (ms)
totaluint64Total identity owners
identityIdentityInfo[]Per-data-source breakdown

IdentityInfo

FieldTypeDescription
dataSourceIdstringData source unique identifier
dataSourceNamestringDisplay name
platformstringPlatform type
countuint64Identity count from this source

GET /api/v1/dashboard/identity/history

Get weekly identity snapshots for the past 52 weeks.

Request:

http
GET /api/v1/dashboard/identity/history
Authorization: Bearer <token>

Response (200):

json
{
  "history": [
    {
      "viewTime": 1707696000000,
      "total": 3200,
      "identity": [ "..." ]
    }
  ]
}

GET /api/v1/dashboard/group

Get current group counts including privileged group breakdowns.

Request:

http
GET /api/v1/dashboard/group
Authorization: Bearer <token>

Response (200):

json
{
  "viewTime": 1707696000000,
  "total": 890,
  "privileged": 45,
  "group": [
    {
      "dataSourceId": "ds-ad-001",
      "dataSourceName": "Corporate AD",
      "platform": "ActiveDirectory",
      "count": 620,
      "privileged": 32
    },
    {
      "dataSourceId": "ds-azure-001",
      "dataSourceName": "Azure AD",
      "platform": "AzureAD",
      "count": 270,
      "privileged": 13
    }
  ]
}

GroupDashboard fields

FieldTypeDescription
viewTimeint64Snapshot timestamp (ms)
totaluint64Total groups
privilegeduint64Groups flagged as high-privilege
groupGroupInfo[]Per-data-source breakdown

GroupInfo

FieldTypeDescription
dataSourceIdstringData source unique identifier
dataSourceNamestringDisplay name
platformstringPlatform type
countuint64Group count from this source
privilegeduint64Privileged groups from this source

GET /api/v1/dashboard/group/history

Get weekly group snapshots for the past 52 weeks.

Request:

http
GET /api/v1/dashboard/group/history
Authorization: Bearer <token>

Response (200):

json
{
  "history": [
    {
      "viewTime": 1707696000000,
      "total": 890,
      "privileged": 45,
      "group": [ "..." ]
    }
  ]
}

GET /api/v1/dashboard/threat

Get current threat and risk metrics including per-tenant risk scores, account threat distribution, compromise indicators, and risk impact categories.

Request:

http
GET /api/v1/dashboard/threat
Authorization: Bearer <token>

Response (200):

json
{
  "viewTime": 1707696000000,
  "tenantThreat": {
    "overall": 42.5,
    "privileged": 68.3,
    "service_accounts": 31.2
  },
  "account": [
    {
      "name": "Corporate AD",
      "low": 7200,
      "moderate": 1800,
      "critical": 120
    },
    {
      "name": "Azure AD",
      "low": 3500,
      "moderate": 600,
      "critical": 45
    }
  ],
  "compromise": {
    "name": "Compromise Summary",
    "identity": 8,
    "account": 18,
    "highRisk": 12
  },
  "impacts": {
    "stale_credentials": 35.2,
    "orphaned_accounts": 22.8,
    "excessive_privilege": 18.5,
    "mfa_gaps": 15.1,
    "shared_accounts": 8.4
  }
}

ThreatDashboard fields

FieldTypeDescription
viewTimeint64Snapshot timestamp (ms)
tenantThreatmap<string, double>Aggregate risk scores by category
accountAccountThreat[]Per-data-source threat distribution
compromiseCompromiseThreatSummary of compromised entities
impactsmap<string, double>Risk impact scores by category

AccountThreat

FieldTypeDescription
namestringData source or category name
lowuint32Accounts with low risk
moderateuint32Accounts with moderate risk
criticaluint32Accounts with critical risk

CompromiseThreat

FieldTypeDescription
namestringSummary label
identityuint32Compromised identity owners
accountuint32Compromised accounts
highRiskuint32High-risk compromised entities

GET /api/v1/dashboard/threat/history

Get weekly threat snapshots for the past 52 weeks.

Request:

http
GET /api/v1/dashboard/threat/history
Authorization: Bearer <token>

Response (200):

json
{
  "history": [
    {
      "viewTime": 1707696000000,
      "tenantThreat": { "overall": 42.5, "..." : "..." },
      "account": [ "..." ],
      "compromise": { "..." : "..." },
      "impacts": { "..." : "..." }
    }
  ]
}

GET /api/v1/dashboard/audit

Get current audit metrics, primarily failed logon data.

Request:

http
GET /api/v1/dashboard/audit
Authorization: Bearer <token>

Response (200):

json
{
  "viewTime": 1707696000000,
  "failedLogon": 3420,
  "failedLogons": {
    "1707609600000": 120,
    "1707613200000": 85,
    "1707616800000": 210,
    "1707620400000": 95
  }
}

AuditDashboard fields

FieldTypeDescription
viewTimeint64Snapshot timestamp (ms)
failedLogonuint64Total failed logons in current period
failedLogonsmap<uint64, uint64>Failed logon counts bucketed by timestamp (ms)

GET /api/v1/dashboard/audit/history

Get daily audit snapshots for the past 365 days.

Request:

http
GET /api/v1/dashboard/audit/history
Authorization: Bearer <token>

Response (200):

json
{
  "history": [
    {
      "viewTime": 1707696000000,
      "failedLogon": 3420,
      "failedLogons": { "..." : "..." }
    }
  ]
}

GET /api/v1/dashboard/platform

Get platform infrastructure status including Discovery nodes, authentication providers, and data source collection status.

Request:

http
GET /api/v1/dashboard/platform
Authorization: Bearer <token>

Response (200):

json
{
  "viewTime": 1707696000000,
  "tenant": "acme-corp",
  "version": "2026.2.0",
  "provider": [
    {
      "id": "oidc-azure",
      "name": "Azure AD SSO",
      "registered": 450,
      "pendingSignup": 12,
      "pendingApproval": 3
    }
  ],
  "client": [
    { "id": "node-001", "name": "dc-collector-01", "online": true },
    { "id": "node-002", "name": "cloud-collector-01", "online": true },
    { "id": "node-003", "name": "linux-collector-01", "online": false }
  ],
  "dataSource": [
    {
      "id": "ds-ad-001",
      "name": "Corporate AD",
      "type": "ActiveDirectory",
      "lastCollection": {
        "success": true,
        "status": "completed",
        "entities": 12500,
        "accounts": 8500,
        "groups": 620,
        "roles": 0,
        "running": false,
        "startTime": 1707688800000,
        "finishTime": 1707690600000
      },
      "dailySuccess": 24,
      "dailyFailures": 0
    }
  ]
}

PlatformDashboard fields

FieldTypeDescription
viewTimeint64Snapshot timestamp (ms)
tenantstringTenant identifier
versionstringDiscovery platform version
providerOpenIdProvider[]Configured authentication providers
clientPlatformClient[]Discovery collector/node status
dataSourceDataSource[]Data source collection status

OpenIdProvider

FieldTypeDescription
idstringProvider unique identifier
namestringDisplay name
registereduint32Users registered via this provider
pendingSignupuint32Users awaiting signup completion
pendingApprovaluint32Users awaiting admin approval

PlatformClient

FieldTypeDescription
idstringNode unique identifier
namestringNode display name
onlineboolWhether the node is currently online

DataSource

FieldTypeDescription
idstringData source unique identifier
namestringDisplay name
typestringPlatform type
lastCollectionLastCollectionMost recent collection run
dailySuccessint64Successful collections in the past 24h
dailyFailuresint64Failed collections in the past 24h

LastCollection

FieldTypeDescription
successboolWhether the collection succeeded
statusstringStatus text (completed, failed, partial)
entitiesuint32Total entities collected
accountsuint32Accounts collected
groupsuint32Groups collected
rolesuint32Roles collected
runningboolWhether a collection is currently running
startTimeint64Collection start (ms since epoch)
finishTimeint64Collection end (ms since epoch)

Control Integration — Custom Dashboards

Control's custom dashboard system consumes Discovery dashboard data through a two-layer approach:

Data flow

Diagram description: A sequence diagram showing the data flow between Discovery, Control (Cache), KPI Calculator, and Dashboard Widget. During periodic sync, Control requests account data, account history, threat data, and full entity data from Discovery. During dashboard rendering, the KPI Calculator reads cached entities, applies filters and aggregation, and sends KPI results to the Dashboard Widget for visualization.

What Control caches from these endpoints

Discovery endpointControl entityWidget data it feeds
/dashboard/accountACCOUNTS aggregateRisk distribution, MFA gaps, stale credentials
/dashboard/account/historyACCOUNTS time seriesRisk trend lines, credential age trending
/dashboard/threatThreat scoresRisk score widgets, compromise indicators
/dashboard/threat/historyThreat time seriesRisk reduction trending
/dashboard/groupGROUPS aggregatePrivileged group counts
/dashboard/identityOWNERS aggregateIdentity-to-account mapping ratios
/dashboard/platformPlatform healthCollection status, node availability

Key fields for KPI widget filters

Control's KPI system defines widgets using filters over these Discovery-sourced fields:

KPI filter patternDiscovery source fieldWidget example
total_threat IN ['HIGH','CRITICAL']AccountThreat.critical + AccountThreat.moderateHigh Risk Accounts Over Time
privileged=true AND managed_by_pam IS NULLAccountCount.type cross-ref vault statusUnvaulted Privileged Accounts
password_age_90 IS NOT NULLstalePassword[days=90].countStale Credentials (90+ days)
status IN ['disabled','inactive']AccountCount filteredDisabled Privileged Accounts
account_no_owner IS NOT NULLAccountCount.orphanedOrphaned Privileged Accounts

Prebuilt dashboard templates in Control

Control ships three default dashboards built from Discovery data:

  1. Identity Risk Reduction — High risk accounts trend, risk distribution pie, average risk score, unvaulted privileged count
  2. PAM/Vaulting Impact — Vaulted vs unvaulted privileged, high risk unvaulted, orphaned privileged, privileged by type
  3. Privileged Account Hygiene — Stale credentials trend, password age distribution, disabled privileged, inactive accounts

Hydden Documentation and Training Hub