---
title: "Get Risk Assessment"
method: GET
path: "/risk-assessment/assessments/{risk_assessment_id}"
tags: ["risk-assessment"]
---

# Get Risk Assessment

`GET /risk-assessment/assessments/{risk_assessment_id}`

## Request

- Base URL: `https://api.kobaltlabs.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.kobaltlabs.com/risk-assessment/assessments/{risk_assessment_id}`
- Auth: none declared

The run overview in one request (F-9).

Carries every factor's status, progress and rating, so a 60-factor run is
driven by this single poll rather than one poll per row.

## Path parameters

- `risk_assessment_id` string, uuid, required

## Response `200`

Successful Response

- RiskAssessmentDetail: Everything the run overview needs, in one request (rule F-9). Per-factor status/progress/rating live on the nested rows precisely so a 60-factor run is driven by this single poll rather than 60 per-row polls.
  - `risk_assessment_id` string, uuid, required
  - `vendor_id` string, uuid, required
  - `status` 'queued' | 'running' | 'complete' | 'failed', required: Lifecycle of one whole assessment of one company.
  - `created` string, date-time, required
  - `started_at` string, date-time, nullable, required
  - `completed_at` string, date-time, nullable, required
  - `factor_count` integer, required
  - `factors_reviewed` integer, required
  - `factors_rated` integer, required
  - `error` string, nullable, required
  - `research_agent_run_id` string, uuid, nullable, required
  - `research_run` AgentRunRef
    - `agent_run_id` string, uuid, required
    - `status` 'pending' | 'running' | 'completed' | 'failed', required
    - `started_at` string, date-time, nullable, required
    - `finished_at` string, date-time, nullable, required
    - `error` string, nullable, required
  - `stream_keys` string[]
  - `dossier` DossierRef, required
    - `artifact_id` string, uuid, required
    - `title` string, required
    - `step_count` integer, nullable
    - `source_count` integer, nullable
  - `rating_options` RatingOptionView[]
    - `option_id` string, uuid, required
    - `label` string, required
    - `position` integer, required
    - `hex_color` string, nullable, required
  - `areas` RiskAreaWithFactors[]
    - `risk_area` RiskAreaRef, required
      - `risk_area_id` string, uuid, nullable, required
      - `name` string, required
    - `display_order` integer, required
    - `factors` FactorAssessmentSummary[]
      - `factor_assessment_id` string, uuid, required
      - `risk_factor` FactorRef, required
        - `risk_factor_id` string, uuid, nullable, required
        - `slug` string, required
        - `name` string, required
      - `status` 'queued' | 'running' | 'complete' | 'error', required: Lifecycle of one factor's assessment within a run. There is no deferral state: a factor either produces a rating its rationale can defend, or it errors. Missing evidence is narrated in the rationale.
      - `progress_pct` integer, nullable, required
      - `current_activity` string, nullable, required
      - `suggested_rating` RatingOptionView, required: One level of the tenant's INHERENT_RISK_LEVEL scale. The scale is per-tenant and variable length, so the UI renders N cells from this list rather than assuming five. `position` is 1-based and derived from order, not from `order_index`, which may be sparse.
        - `option_id` string, uuid, required
        - `label` string, required
        - `position` integer, required
        - `hex_color` string, nullable, required
      - `manual_rating` RatingOptionView, required: One level of the tenant's INHERENT_RISK_LEVEL scale. The scale is per-tenant and variable length, so the UI renders N cells from this list rather than assuming five. `position` is 1-based and derived from order, not from `order_index`, which may be sparse.
        - `option_id` string, uuid, required
        - `label` string, required
        - `position` integer, required
        - `hex_color` string, nullable, required
      - `effective_rating` RatingOptionView, required: One level of the tenant's INHERENT_RISK_LEVEL scale. The scale is per-tenant and variable length, so the UI renders N cells from this list rather than assuming five. `position` is 1-based and derived from order, not from `order_index`, which may be sparse.
        - `option_id` string, uuid, required
        - `label` string, required
        - `position` integer, required
        - `hex_color` string, nullable, required
      - `review_state` 'proposed' | 'approved' | 'overridden', required: Where a human reviewer stands on the agent's proposed rating. Written by the approval workflow (M5); until then every completed factor sits at PROPOSED, which is what renders the "Kobalt proposed" chip.
      - `reviewer_name` string, nullable, required
      - `reviewed_at` string, date-time, nullable, required
      - `citation_count` integer, required
      - `distinct_document_count` integer, required
      - `step_count` integer, nullable, required
      - `duration_ms` integer, nullable, required
      - `error` string, nullable, required
      - `agent_run_id` string, uuid, nullable, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/kobaltlabs/apis/fastapi.md) - [All operations](https://skmtc.dev/kobaltlabs/apis/fastapi/llms.txt) - [OpenAPI document](https://skmtc.dev/kobaltlabs/apis/fastapi/revisions/8587332d5e43?raw)
