Metrics
The six numbers the platform reports on itself.
Calibration per band, coverage, hold-band precision and recall, auto-closed and overturned rates, time to decision by route, and dollars approved without waiting — each { value | null, n } over a window (default 30 days), persisted daily. The demo tenant's figures are public and labelled simulated.
Metrics
| Field | Type | Notes |
|---|
| asOf | string (date-time) | |
| windowDays | integer | |
| calibration | object | Per band: labelled transfers that went bad ÷ labelled transfers. |
| calibration.clear | Measured | |
| calibration.review | Measured | |
| calibration.hold | Measured | |
| calibration.unscored | Measured | |
| coverage | object | |
| coverage.transfers | Measured | |
| coverage.programs | Measured | |
| holdBand | object | |
| holdBand.precision | Measured | |
| holdBand.recall | Measured | |
| holdBand.tp | integer | |
| holdBand.fp | integer | |
| holdBand.fn | integer | |
| autoClosed | Measured | |
| overturned | Measured | |
| timeToDecisionHours | object | |
| timeToDecisionHours.automated | object | Closed alerts routed automated. |
| timeToDecisionHours.automated.median | number | null | |
| timeToDecisionHours.automated.p90 | number | null | |
| timeToDecisionHours.automated.n | integer | |
| timeToDecisionHours.reviewed | object | Closed alerts routed reviewed. |
| timeToDecisionHours.reviewed.median | number | null | |
| timeToDecisionHours.reviewed.p90 | number | null | |
| timeToDecisionHours.reviewed.n | integer | |
| approvedWithoutWaiting | object | Clear-band transfers that never raised an alert. |
| approvedWithoutWaiting.count | integer | |
| approvedWithoutWaiting.cents | string | Integer cents as a string (bigint-safe). |
| approvedWithoutWaiting.n | integer | Scored transfers. |
| eventCoverage | object | Event families understood ÷ families known. |
| eventCoverage.value | number | null | |
| eventCoverage.n | integer | |
| eventCoverage.seen | string[] | |
Measured
A number with its n; value is null when nothing was measured.
| Field | Type | Notes |
|---|
| value | number | null | null when nothing was measured |
| n | integer | observations behind the value |
Endpoints
get/api/metrics
The six numbers for the tenant
| Auth | Bearer + X-Operator |
|---|
| Operation | Metrics · GET /api/metrics |
|---|
Parameters
| Name | In | Type | Notes |
|---|
| tenant (optional) | query | string | Tenant slug. Optional: the bearer token already proves the tenant. Pass it to be explicit. |
| days (optional) | query | integer | Window in days, 1–365 (default 30). |
Responses
200 — Every metric with its n; also persisted as today's daily snapshot. Metrics
| Field | Type | Notes |
|---|
| asOf | string (date-time) | |
| windowDays | integer | |
| calibration | object | Per band: labelled transfers that went bad ÷ labelled transfers. |
| calibration.clear | Measured | |
| calibration.review | Measured | |
| calibration.hold | Measured | |
| calibration.unscored | Measured | |
| coverage | object | |
| coverage.transfers | Measured | |
| coverage.programs | Measured | |
| holdBand | object | |
| holdBand.precision | Measured | |
| holdBand.recall | Measured | |
| holdBand.tp | integer | |
| holdBand.fp | integer | |
| holdBand.fn | integer | |
| autoClosed | Measured | |
| overturned | Measured | |
| timeToDecisionHours | object | |
| timeToDecisionHours.automated | object | Closed alerts routed automated. |
| timeToDecisionHours.automated.median | number | null | |
| timeToDecisionHours.automated.p90 | number | null | |
| timeToDecisionHours.automated.n | integer | |
| timeToDecisionHours.reviewed | object | Closed alerts routed reviewed. |
| timeToDecisionHours.reviewed.median | number | null | |
| timeToDecisionHours.reviewed.p90 | number | null | |
| timeToDecisionHours.reviewed.n | integer | |
| approvedWithoutWaiting | object | Clear-band transfers that never raised an alert. |
| approvedWithoutWaiting.count | integer | |
| approvedWithoutWaiting.cents | string | Integer cents as a string (bigint-safe). |
| approvedWithoutWaiting.n | integer | Scored transfers. |
| eventCoverage | object | Event families understood ÷ families known. |
| eventCoverage.value | number | null | |
| eventCoverage.n | integer | |
| eventCoverage.seen | string[] | |
401 — Bearer token missing or unknown. Error
| Field | Type | Notes |
|---|
| error | string | What went wrong, in one sentence. |
| requestId (optional) | string | Present once the gateway is live: the X-Request-Id of the failed request. |
Example
curl -s "https://skoor.ai/risk/api/metrics?tenant=demo&days=30" \
-H "Authorization: Bearer test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "X-Operator: you@bank.example"
get/api/governance
The model-risk record (how the AI is governed)
Generated from the live record and the running code, in the shape of SR 11-7 and NIST AI RMF: model inventory, the automated-or-reviewed boundary per program, eval-set validation and live calibration, the six metrics, change control (policy and rule versions, hash chain), human oversight (attribution, clocks, overturns, the language model's role), data rules, and a requirement-to-evidence mapping. Every number carries n; unmeasured is null. Rendered for people at /governance.
| Auth | Bearer + X-Operator |
|---|
| Operation | Metrics · GET /api/governance |
|---|
Parameters
| Name | In | Type | Notes |
|---|
| tenant (optional) | query | string | Tenant slug. Optional: the bearer token already proves the tenant. Pass it to be explicit. |
| days (optional) | query | integer | Window in days, 1–365 (default 30). |
Responses
200 — The record. GovernanceRecord
| Field | Type | Notes |
|---|
| recordVersion | string | governance-v1 |
| asOf | string (date-time) | |
| tenant | string | |
| simulated | boolean | |
| windowDays | integer | |
| inventory | object[] | |
| inventory[].id | string | |
| inventory[].name | string | |
| inventory[].version | string | |
| inventory[].kind | "deterministic" | "llm" | "rules" | |
| inventory[].decides | boolean | |
| inventory[].purpose | string | |
| inventory[].inputs | string | |
| inventory[].output | string | |
| inventory[].whereUsed | string | |
| inventory[].validation | string | |
| inventory[].evidence | string | |
| boundary | object | Policy version, auto-closable detectors and bands, minimum program history, always-reviewed and never-automated detectors, two-approver actions, hold-band rule, bands, autonomy eligibility, and each program's tier, version and granted detectors. |
| validation | object | Eval reports for the transaction Skoor, typologies and actor Skoors (cases, band accuracy, precision/recall with n, failures by case id), failuresTotal, and live calibration, hold-band precision/recall and coverage. |
| monitoring | Metrics | |
| changeControl | object | Stored policy versions (scope, version, active, createdAt), rule versions and the activation gate, the hash-chain report, and how the schema changes. |
| oversight | object | Attribution rule, decision clocks, decisions in window (total, by a person, under policy, overturned drafts, overturn rate with n), second-approver actions, the language model's role, model and whether it is configured. |
| data | object | Event coverage with the event types seen, the null rule, the no-fabrication test, retention. |
| mapping | object[] | |
| mapping[].framework | "SR 11-7" | "NIST AI RMF" | |
| mapping[].section | string | |
| mapping[].requirement | string | |
| mapping[].whereInSkoor | string | |
| mapping[].evidence | string | |
401 — Bearer token missing or unknown. Error
| Field | Type | Notes |
|---|
| error | string | What went wrong, in one sentence. |
| requestId (optional) | string | Present once the gateway is live: the X-Request-Id of the failed request. |
Example
curl -s "https://skoor.ai/risk/api/governance?tenant=demo&days=30" \
-H "Authorization: Bearer test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "X-Operator: you@bank.example"
get/api/public/metrics
The demo tenant's six numbers, public
| Auth | None (public) |
|---|
| Operation | Metrics · GET /api/public/metrics |
|---|
Parameters
| Name | In | Type | Notes |
|---|
| days (optional) | query | integer | Window in days, 1–90 (default 30; only the 30-day answer is cached for 60 s). |
Responses
200 — Metrics for the demo tenant, labelled simulated. object & Metrics
| Field | Type | Notes |
|---|
| tenant | string | |
| simulated | const true | |
| asOf | string (date-time) | |
| windowDays | integer | |
| calibration | object | Per band: labelled transfers that went bad ÷ labelled transfers. |
| calibration.clear | Measured | |
| calibration.review | Measured | |
| calibration.hold | Measured | |
| calibration.unscored | Measured | |
| coverage | object | |
| coverage.transfers | Measured | |
| coverage.programs | Measured | |
| holdBand | object | |
| holdBand.precision | Measured | |
| holdBand.recall | Measured | |
| holdBand.tp | integer | |
| holdBand.fp | integer | |
| holdBand.fn | integer | |
| autoClosed | Measured | |
| overturned | Measured | |
| timeToDecisionHours | object | |
| timeToDecisionHours.automated | object | Closed alerts routed automated. |
| timeToDecisionHours.automated.median | number | null | |
| timeToDecisionHours.automated.p90 | number | null | |
| timeToDecisionHours.automated.n | integer | |
| timeToDecisionHours.reviewed | object | Closed alerts routed reviewed. |
| timeToDecisionHours.reviewed.median | number | null | |
| timeToDecisionHours.reviewed.p90 | number | null | |
| timeToDecisionHours.reviewed.n | integer | |
| approvedWithoutWaiting | object | Clear-band transfers that never raised an alert. |
| approvedWithoutWaiting.count | integer | |
| approvedWithoutWaiting.cents | string | Integer cents as a string (bigint-safe). |
| approvedWithoutWaiting.n | integer | Scored transfers. |
| eventCoverage | object | Event families understood ÷ families known. |
| eventCoverage.value | number | null | |
| eventCoverage.n | integer | |
| eventCoverage.seen | string[] | |
404 — No demo tenant on this deployment. Error
| Field | Type | Notes |
|---|
| error | string | What went wrong, in one sentence. |
| requestId (optional) | string | Present once the gateway is live: the X-Request-Id of the failed request. |
Example
curl -s "https://skoor.ai/risk/api/public/metrics?days=30"