---
title: "Get SEBI compliance dashboard"
method: GET
path: "/api/v1/sebi/dashboard"
tags: ["SEBI Compliance"]
---

# Get SEBI compliance dashboard

`GET /api/v1/sebi/dashboard`

## Request

- Base URL: `https://orchestrator.getaxonflow.com`
- URL: `https://orchestrator.getaxonflow.com/api/v1/sebi/dashboard`
- Auth: none declared
- TypeScript: <https://skmtc.dev/getaxonflow/apis/axonflow-orchestrator-api/docs/api/v1/sebi/dashboard/get.ts> (a function with typed inputs; its response is checked against the schema)

Returns a comprehensive SEBI compliance dashboard including:
- Overall compliance score and status
- 5-year retention status
- PII detection/redaction metrics (PAN, Aadhaar)
- Policy violation summary with trend
- HITL review queue

**Enterprise Feature**: Available only for Indian financial services deployments.

## Response `200`

SEBI compliance dashboard data

- SEBIDashboard: SEBI compliance dashboard data
  - `framework` 'SEBI_AI_ML' | 'DPDP_ACT_2023' | 'SEBI_DPDP_COMBINED': SEBI compliance framework identifier
  - `overall_score` integer: Overall compliance score (0-100)
  - `overall_status` 'COMPLIANT' | 'NON_COMPLIANT' | 'UNKNOWN': Compliance status indicator. `WARNING` was in this enum and is removed (#3435 R7): no code path assigns it. The three values below are the only ones the server writes (sebi_audit_export_service.go GetRetentionStatus). `UNKNOWN` was MISSING and is the common answer, not an edge case: it is returned whenever the retention period or the record counts backing a row could not be measured, and `audit_retention_config` ships EMPTY on a stock migration-applied database, so a stock deployment reports UNKNOWN for every data type. A readiness CHECK speaks a different vocabulary on a different schema: see SEBIComplianceCheck.status, which carries `pass`/`fail`/`warning`/`unknown` and is NOT this enum.
  - `last_audit_export` string, date-time: Timestamp of last audit export
  - `retention_status` SEBIRetentionResponse: 5-year retention compliance status
    - `tenant_id` string: The scope key the retention rows were read for. This property was documented as `org_id: integer` and the server has never emitted it (#3435 R8): the struct field is `TenantID string \`json:"tenant_id"\`` (sebi_audit_export_types.go SEBIRetentionStatusResponse), so the documented property was absent from every response and the one the server does send was undocumented.
    - `framework` 'SEBI_AI_ML' | 'DPDP_ACT_2023' | 'SEBI_DPDP_COMBINED': SEBI compliance framework identifier
    - `compliance_status` 'COMPLIANT' | 'NON_COMPLIANT' | 'UNKNOWN': Compliance status indicator. `WARNING` was in this enum and is removed (#3435 R7): no code path assigns it. The three values below are the only ones the server writes (sebi_audit_export_service.go GetRetentionStatus). `UNKNOWN` was MISSING and is the common answer, not an edge case: it is returned whenever the retention period or the record counts backing a row could not be measured, and `audit_retention_config` ships EMPTY on a stock migration-applied database, so a stock deployment reports UNKNOWN for every data type. A readiness CHECK speaks a different vocabulary on a different schema: see SEBIComplianceCheck.status, which carries `pass`/`fail`/`warning`/`unknown` and is NOT this enum.
    - `status` SEBIDataTypeRetentionStatus[]
      - `data_type` 'policy_violations' | 'llm_calls' | 'decision_chain' | 'hitl_oversight' | 'pii_redactions' | 'all': Type of audit data
      - `retention_days` integer: The retention period in force. READ IT WITH `retention_configured`: when that is false this is the platform's compiled-in default, which is what WOULD be applied and is not evidence that anything was configured.
      - `retention_configured` boolean: Whether `retention_days` was read from this organisation's audit_retention_config row. False on every stock deployment, where that table ships empty; and structurally always false for `llm_calls` and `pii_redactions`, which audit_retention_defaults does not seed under those keys.
      - `oldest_record` string, date-time
      - `newest_record` string, date-time
      - `total_records` integer
      - `archived_records` integer
      - `storage_bytes` integer
      - `compliance_status` 'COMPLIANT' | 'NON_COMPLIANT' | 'UNKNOWN': Compliance status indicator. `WARNING` was in this enum and is removed (#3435 R7): no code path assigns it. The three values below are the only ones the server writes (sebi_audit_export_service.go GetRetentionStatus). `UNKNOWN` was MISSING and is the common answer, not an edge case: it is returned whenever the retention period or the record counts backing a row could not be measured, and `audit_retention_config` ships EMPTY on a stock migration-applied database, so a stock deployment reports UNKNOWN for every data type. A readiness CHECK speaks a different vocabulary on a different schema: see SEBIComplianceCheck.status, which carries `pass`/`fail`/`warning`/`unknown` and is NOT this enum.
      - `last_cleanup` string, date-time
      - `report_state` 'not_available' | 'enabled_empty' | 'populated': Whether the figures on this row were actually READ. `not_available` means the retention configuration, the record counts, or both could not be measured, and the row is then not a compliance assertion.
      - `error` string: The verbatim cause when report_state is not_available.
      - `error_kind` 'store_absent' | 'query_failed' | 'not_configured': Classifies that cause. `not_configured` is the common one: the retention read RAN and found no row. `section_not_implemented` is NOT in this enum, though the shared classifier can produce it (#3435 R8). It is constructed at exactly one site, the export dispatcher's default arm, which this endpoint never reaches. See SEBISectionStatus.error_kind for the mirror.
    - `next_cleanup` string, date-time: Next scheduled cleanup
  - `readiness` SEBIComplianceReadiness: SEBI audit readiness assessment
    - `ready` boolean: Organization is ready for audit
    - `score` integer: Readiness score (0-100)
    - `checks` SEBIComplianceCheck[]
      - `name` string: Check name
      - `description` string: What the check verifies
      - `status` 'pass' | 'fail' | 'warning' | 'unknown': `unknown` was MISSING from this enum and is emitted on the stock path (#3435 R8), so a generated strict client failed to deserialise GET /api/v1/sebi/audit/readiness on every stock deployment. A control this deployment cannot INSPECT must not be reported as one it has, so `unknown` is distinct from `fail`. THREE of the five checks assign it (sebi_audit_export_service.go: Retention Configuration, PII Detection Policies, Human Oversight). Human Oversight joined them in #3874, which gave that check the third answer its two siblings already had -- until then a deployment nobody could inspect was reported identically to one measured to have no oversight. #3874 removed the reason `unknown` was the STOCK answer for two of them rather than an edge case: they queried relations no migration creates (`policies`, `hitl_config`), so they could return nothing else on any deployment. They now read `static_policies` and `hitl_approval_queue`. Retention Configuration still answers `unknown` on a stock deployment, and that is CORRECT rather than pending. Its table exists, but nothing in the product ever writes a row to it, so no organisation has a configured retention period to read. Making it answerable needs a retention configuration surface that does not exist yet; reading the system defaults instead was tried and reverted, because it contradicts GET /api/v1/sebi/audit/retention, which reports the same data types as not_available on the stated grounds that a default is what WOULD be applied and not evidence of what is configured. `unknown` fails closed on `ready` for Retention Configuration and PII Detection Policies. It does NOT clear `ready` for Human Oversight, whose FAILING branch has always been a non-blocking warning: blocking on unknown alone would rank "nobody could inspect this control" as worse than "this control is absent".
      - `details` string: Additional information
    - `recommendations` string[]: Improvement recommendations
  - `violations_summary` SEBIViolationsSummary: Policy violations summary
    - `total` integer: Total violations
    - `by_severity` object
      - `critical` integer
      - `high` integer
      - `medium` integer
      - `low` integer
    - `by_type` object: Violations by type
    - `trend` 'improving' | 'stable' | 'degrading': Trend direction
  - `pii_summary` SEBIPIISummary: PII detection and redaction metrics
    - `total_detections` integer: Total PII detections
    - `total_redactions` integer: Total PII redactions
    - `by_type` object
      - `pan` integer: Indian PAN card detections
      - `aadhaar` integer: Indian Aadhaar card detections
      - `email` integer
      - `phone` integer
      - `other` integer
    - `redaction_rate_percent` number, float: Percentage of detections that were redacted
  - `hitl_reviews_pending` integer: Number of HITL reviews awaiting action
  - `last_updated` string, date-time

## Other responses

- `403`: Not authorized for SEBI compliance features

---

[API](https://skmtc.dev/getaxonflow/apis/axonflow-orchestrator-api.md) - [All operations](https://skmtc.dev/getaxonflow/apis/axonflow-orchestrator-api/llms.txt) - [OpenAPI document](https://skmtc.dev/getaxonflow/apis/axonflow-orchestrator-api/revisions/f408ef3ec9dd?raw)
