SKOOR Risk Money movement. Skoored by AI.

Report

Actor, program and weekly reports, plus the examiner record.

Reports are built from rows the platform already persisted: the current Skoor with its reasons, history and band transitions, transfers in the window, alerts and dispositions. The record is two hash chains per tenant (dispositions, actions); verification recomputes every hash and reports the first break, and the export is JSON lines an examiner can walk for a date range.

ActorReport

No percentiles across banks; n and confidence say how much history stands behind the number.

FieldTypeNotes
kindconst "actor"
type"entity" | "counterparty" | "agent"
idstring
namestring | null
programIdstring (uuid)
generatedAtstring (date-time)
currentobject | null
historySkoorPoint[]
transitionsBandTransition[]
signalTrendsobject | null
transfersTransfersSummary
alertsobject[]
alerts[].idstring (uuid)
alerts[].detectorstring
alerts[].statusstring
alerts[].routestring | null
alerts[].openedAtstring (date-time)
alerts[].summarystring
dispositionsobject[]
dispositions[].alertIdstring (uuid)
dispositions[].decidedBystring
dispositions[].decisionstring
dispositions[].overturnsDraftboolean | null
dispositions[].createdAtstring (date-time)

ProgramReport

FieldTypeNotes
kindconst "program"
idstring (uuid)
namestring
generatedAtstring (date-time)
currentobject | null
historyobject[]
history[].asOfstring (date-time)
history[].programSkoorinteger | null
history[].band"clear" | "review" | "hold" | "unscored"
history[].ninteger
transitionsBandTransition[]
krisRecord<string, KriValue>
kriDeltasobject[]
kriDeltas[].namestring
kriDeltas[].fromnumber | null
kriDeltas[].tonumber | null
kriDeltas[].deltanumber | null
kriDeltas[].statusFromstring | null
kriDeltas[].statusTostring
kriDeltas[].ninteger
rankobject | null
transfersTransfersSummary
alertsByDetectorobject[]
alertsByDetector[].detectorstring
alertsByDetector[].routestring | null
alertsByDetector[].countinteger

WeeklyReport

FieldTypeNotes
kindconst "weekly"
keystringweekly:<programId>:<week>
programIdstring (uuid)
programNamestring
isoWeekstringe.g. 2026-W37
fromstring (date-time)
tostring (date-time)
generatedAtstring (date-time)
programSkoorobject
programSkoor.currentinteger | null
programSkoor.priorinteger | null
programSkoor.bandstring
programSkoor.ninteger
krisobject[]
kris[].namestring
kris[].valuenumber | null
kris[].priornumber | null
kris[].deltanumber | null
kris[].statusstring
kris[].priorStatusstring | null
kris[].ninteger
kris[].unitstring
kris[].thresholdnumber | null
alertsobject
alerts.totalinteger
alerts.byDetectorobject[]
alerts.byDetector[].detectorstring
alerts.byDetector[].routestring | null
alerts.byDetector[].countinteger
alerts.byStatusRecord<string, integer>
enteredHoldobject[]
enteredHold[].typestring
enteredHold[].idstring
enteredHold[].skoorinteger | null
enteredHold[].ninteger
enteredHold[].atstring (date-time)
dispositionsobject
dispositions.totalinteger
dispositions.byPlatforminteger
dispositions.byPersoninteger
dispositions.overturnedinteger
timeToDecisionHoursobjectClosed alerts in the week.
timeToDecisionHours.mediannumber | null
timeToDecisionHours.p90number | null
timeToDecisionHours.ninteger
transfersobject
transfers.countinteger
transfers.volumeCentsstringInteger cents as a string (bigint-safe).
transfers.returnsobject
transfers.returns.anyinteger
transfers.returns.unauthorizedinteger
transfers.bandsRecord<string, integer>
summarystringPlain-text summary written from a template, never a model.

ChainReport

FieldTypeNotes
okboolean
checkedinteger
firstBreakAtobject | null
chainsobject
chains.dispositionsobject
chains.dispositions.okboolean
chains.dispositions.checkedinteger
chains.actionsobject
chains.actions.okboolean
chains.actions.checkedinteger

RecordLine

One JSON object per line. policy first ({version, source: tenant|default, from, to}); then every Alert, Disposition and Action in the range, in time order, with all their fields.

FieldTypeNotes
kind"policy" | "alert" | "disposition" | "action"

Endpoints

get/api/reports/actor/{type}/{id}

Actor report

AuthBearer + X-Operator
OperationReport · GET /api/reports/actor/{type}/{id}

Parameters

NameInTypeNotes
typepath"entity" | "counterparty" | "agent"entity, counterparty or agent.
idpathstringActor id.
tenant (optional)querystringTenant slug. Optional: the bearer token already proves the tenant. Pass it to be explicit.

Responses

200 — The current Skoor with reasons, history, band transitions, signal trends, transfers, alerts and dispositions for the actor. ActorReport

FieldTypeNotes
kindconst "actor"
type"entity" | "counterparty" | "agent"
idstring
namestring | null
programIdstring (uuid)
generatedAtstring (date-time)
currentobject | null
historySkoorPoint[]
transitionsBandTransition[]
signalTrendsobject | null
transfersTransfersSummary
alertsobject[]
alerts[].idstring (uuid)
alerts[].detectorstring
alerts[].statusstring
alerts[].routestring | null
alerts[].openedAtstring (date-time)
alerts[].summarystring
dispositionsobject[]
dispositions[].alertIdstring (uuid)
dispositions[].decidedBystring
dispositions[].decisionstring
dispositions[].overturnsDraftboolean | null
dispositions[].createdAtstring (date-time)

400 — type must be entity, counterparty, or agent. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

401 — Bearer token missing or unknown. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

404 — Unknown actor on this tenant. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

Example

curl -s "https://skoor.ai/risk/api/reports/actor/entity/enti_sim_acme?tenant=demo" \
  -H "Authorization: Bearer test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "X-Operator: you@bank.example"

get/api/reports/program/{id}

Program report

AuthBearer + X-Operator
OperationReport · GET /api/reports/program/{id}

Parameters

NameInTypeNotes
idpathstring (uuid)Program id.
tenant (optional)querystringTenant slug. Optional: the bearer token already proves the tenant. Pass it to be explicit.

Responses

200 — The Program Risk Skoor with history, KRIs and their deltas, rank inside the bank, transfers and alerts by detector. ProgramReport

FieldTypeNotes
kindconst "program"
idstring (uuid)
namestring
generatedAtstring (date-time)
currentobject | null
historyobject[]
history[].asOfstring (date-time)
history[].programSkoorinteger | null
history[].band"clear" | "review" | "hold" | "unscored"
history[].ninteger
transitionsBandTransition[]
krisRecord<string, KriValue>
kriDeltasobject[]
kriDeltas[].namestring
kriDeltas[].fromnumber | null
kriDeltas[].tonumber | null
kriDeltas[].deltanumber | null
kriDeltas[].statusFromstring | null
kriDeltas[].statusTostring
kriDeltas[].ninteger
rankobject | null
transfersTransfersSummary
alertsByDetectorobject[]
alertsByDetector[].detectorstring
alertsByDetector[].routestring | null
alertsByDetector[].countinteger

401 — Bearer token missing or unknown. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

404 — Unknown program on this tenant. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

Example

curl -s "https://skoor.ai/risk/api/reports/program/a1e0c2d4-6b7f-4d8e-9a3b-0c1d2e3f4a55?tenant=demo" \
  -H "Authorization: Bearer test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "X-Operator: you@bank.example"

get/api/reports/weekly/{programId}

Weekly program risk report

AuthBearer + X-Operator
OperationReport · GET /api/reports/weekly/{programId}

Parameters

NameInTypeNotes
programIdpathstring (uuid)Program id.
tenant (optional)querystringTenant slug. Optional: the bearer token already proves the tenant. Pass it to be explicit.
week (optional)querystringISO week (YYYY-Www). Default: the last complete week.
rebuild (optional)query"1"Pass 1 to rebuild a stored report.

Responses

200 — The stored report for the week, built on first request. WeeklyReport

FieldTypeNotes
kindconst "weekly"
keystringweekly:<programId>:<week>
programIdstring (uuid)
programNamestring
isoWeekstringe.g. 2026-W37
fromstring (date-time)
tostring (date-time)
generatedAtstring (date-time)
programSkoorobject
programSkoor.currentinteger | null
programSkoor.priorinteger | null
programSkoor.bandstring
programSkoor.ninteger
krisobject[]
kris[].namestring
kris[].valuenumber | null
kris[].priornumber | null
kris[].deltanumber | null
kris[].statusstring
kris[].priorStatusstring | null
kris[].ninteger
kris[].unitstring
kris[].thresholdnumber | null
alertsobject
alerts.totalinteger
alerts.byDetectorobject[]
alerts.byDetector[].detectorstring
alerts.byDetector[].routestring | null
alerts.byDetector[].countinteger
alerts.byStatusRecord<string, integer>
enteredHoldobject[]
enteredHold[].typestring
enteredHold[].idstring
enteredHold[].skoorinteger | null
enteredHold[].ninteger
enteredHold[].atstring (date-time)
dispositionsobject
dispositions.totalinteger
dispositions.byPlatforminteger
dispositions.byPersoninteger
dispositions.overturnedinteger
timeToDecisionHoursobjectClosed alerts in the week.
timeToDecisionHours.mediannumber | null
timeToDecisionHours.p90number | null
timeToDecisionHours.ninteger
transfersobject
transfers.countinteger
transfers.volumeCentsstringInteger cents as a string (bigint-safe).
transfers.returnsobject
transfers.returns.anyinteger
transfers.returns.unauthorizedinteger
transfers.bandsRecord<string, integer>
summarystringPlain-text summary written from a template, never a model.

401 — Bearer token missing or unknown. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

404 — Unknown program. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

Example

curl -s "https://skoor.ai/risk/api/reports/weekly/a1e0c2d4-6b7f-4d8e-9a3b-0c1d2e3f4a55?tenant=demo&week=2026-W37" \
  -H "Authorization: Bearer test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "X-Operator: you@bank.example"

get/api/record/verify

Verify the record chains

AuthBearer + X-Operator
OperationReport · GET /api/record/verify

Parameters

NameInTypeNotes
tenant (optional)querystringTenant slug. Optional: the bearer token already proves the tenant. Pass it to be explicit.

Responses

200 — Every disposition and action hash recomputed from stored fields; the first break, if any. ChainReport

FieldTypeNotes
okboolean
checkedinteger
firstBreakAtobject | null
chainsobject
chains.dispositionsobject
chains.dispositions.okboolean
chains.dispositions.checkedinteger
chains.actionsobject
chains.actions.okboolean
chains.actions.checkedinteger

401 — Bearer token missing or unknown. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

Example

curl -s "https://skoor.ai/risk/api/record/verify?tenant=demo" \
  -H "Authorization: Bearer test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "X-Operator: you@bank.example"

Response

{
  "ok": true,
  "checked": 412,
  "firstBreakAt": null,
  "chains": {
    "dispositions": {
      "ok": true,
      "checked": 380
    },
    "actions": {
      "ok": true,
      "checked": 32
    }
  }
}

get/api/record/export

Examiner export (JSON lines)

AuthBearer + X-Operator
OperationReport · GET /api/record/export

Parameters

NameInTypeNotes
tenant (optional)querystringTenant slug. Optional: the bearer token already proves the tenant. Pass it to be explicit.
from (optional)querystring (date-time)Start of the range (ISO 8601). Default 30 days ago.
to (optional)querystring (date-time)End of the range. Default now.

Responses

200 — application/x-ndjson, served as an attachment: the policy line first, then alerts, dispositions and actions in time order. RecordLine · application/x-ndjson

FieldTypeNotes
kind"policy" | "alert" | "disposition" | "action"

400 — Bad date. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

401 — Bearer token missing or unknown. Error

FieldTypeNotes
errorstringWhat went wrong, in one sentence.
requestId (optional)stringPresent once the gateway is live: the X-Request-Id of the failed request.

Example

curl -s "https://skoor.ai/risk/api/record/export?tenant=demo&from=2026-08-18T00%3A00%3A00Z&to=2026-09-17T00%3A00%3A00Z" \
  -H "Authorization: Bearer test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "X-Operator: you@bank.example"

← All objects