> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dataspike.io/llms.txt
> Use this file to discover all available pages before exploring further.

# List a case's decision history (dashboard)

> The append-only decision journal for one KYB case — every manual verdict recorded on it, newest first, in a {data, has_next} envelope. Mirrors the KYC (docver) manual_changes endpoint. Each row carries the from/to status, the source and the timestamp. A `system` row is an automatic status write by the pipeline (no verdict / account); a `manual` row is an officer's approve/reject and carries the verdict, the reviewer (account id + resolved email) and the comment. Changing a decision appends a new row; rows are never mutated.

Auth: web session, org-scoped (same access as viewing the case). Tenancy from the path — a case in another org returns 404.

**Iteration 1 (contract only):** returns an empty page until the decision journal is persisted in a follow-up.



## OpenAPI

````yaml https://api.dataspike.io/openapi/kyb/public.json get /webapi/v4/kyb/organization/{organizationId}/verifications/{caseId}/decisions
openapi: 3.1.0
info:
  description: Know Your Business (KYB) — case creation and the embedded onboarding widget.
  title: Dataspike KYB API
  version: '1.0'
servers: []
security: []
paths:
  /webapi/v4/kyb/organization/{organizationId}/verifications/{caseId}/decisions:
    get:
      tags:
        - KYB Verifications
      summary: List a case's decision history (dashboard)
      description: >-
        The append-only decision journal for one KYB case — every manual verdict
        recorded on it, newest first, in a {data, has_next} envelope. Mirrors
        the KYC (docver) manual_changes endpoint. Each row carries the from/to
        status, the source and the timestamp. A `system` row is an automatic
        status write by the pipeline (no verdict / account); a `manual` row is
        an officer's approve/reject and carries the verdict, the reviewer
        (account id + resolved email) and the comment. Changing a decision
        appends a new row; rows are never mutated.


        Auth: web session, org-scoped (same access as viewing the case). Tenancy
        from the path — a case in another org returns 404.


        **Iteration 1 (contract only):** returns an empty page until the
        decision journal is persisted in a follow-up.
      operationId: >-
        GET_/webapi/v4/kyb/organization/:organizationId/verifications/:caseId/decisions
      parameters:
        - description: Organization id.
          in: path
          name: organizationId
          required: true
          schema:
            type: string
        - description: KYB case id (the `id` from the list).
          in: path
          name: caseId
          required: true
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: d5293a33-1d10-4aa2-8ff9-4a2c9a2d1e19
            application/xml:
              schema:
                $ref: d5293a33-1d10-4aa2-8ff9-4a2c9a2d1e19
          description: OK
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrCaseNotFound'
            application/xml:
              schema:
                $ref: '#/components/schemas/ErrCaseNotFound'
          description: Case not found.
        default:
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DecisionHistoryPage'
            application/xml:
              schema:
                $ref: '#/components/schemas/DecisionHistoryPage'
          description: Decision history page.
      security:
        - Session: []
components:
  schemas:
    ErrCaseNotFound:
      description: ErrCaseNotFound schema
      example:
        code: case_not_found
        message: Case not found
      properties:
        code:
          example: email_otp_expired
          type: string
        message:
          example: OTP has expired
          type: string
        param:
          nullable: true
          type: string
      type: object
    DecisionHistoryPage:
      description: DecisionHistoryPage schema
      example:
        data:
          - id: 019f17aa-1b2c-73d4-95e6-0123456789ab
            verdict: approved
            from_status: manual_review
            to_status: approved_manually
            source: manual
            account_id: a0f2c1d4e5b6a7c8
            account_email: officer@acme.com
            account_full_name: Michael Jordan
            comment: UBO documents verified against the registry.
            created_at: '2026-07-23T18:04:05.000Z'
          - id: 019f17a0-9c1d-72c8-818e-819652540700
            from_status: under_review
            to_status: manual_review
            source: system
            created_at: '2026-07-23T08:16:31.000Z'
        has_next: false
      properties:
        data:
          items:
            properties:
              account_email:
                example: officer@acme.com
                nullable: true
                type: string
              account_full_name:
                example: Michael Jordan
                nullable: true
                type: string
              account_id:
                example: a0f2c1d4e5b6a7c8
                nullable: true
                type: string
              comment:
                example: UBO documents verified against the registry.
                nullable: true
                type: string
              created_at:
                example: '2026-07-23T18:04:05.000Z'
                type: string
              from_status:
                example: manual_review
                type: string
              id:
                example: 019f17aa-1b2c-73d4-95e6-0123456789ab
                type: string
              source:
                example: manual
                type: string
              to_status:
                example: approved_manually
                type: string
              verdict:
                example: approved
                nullable: true
                type: string
            type: object
          type: array
        has_next:
          type: boolean
      type: object
  securitySchemes:
    Session:
      description: Session cookie for web dashboard authentication.
      in: cookie
      name: ds-prod-session
      type: apiKey

````