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

# Get Report

> The verdict and how it was reached: each check with its value and limit, the metrics (24 worlds × 12 s,
training noise on), the judge's read of the clip, and which checkpoint was chosen over which.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/rl_runs/{run_id}/report
openapi: 3.1.0
info:
  title: Kite Platform API
  description: >-
    Public API for Kite. Authenticate with `Authorization: Bearer kite_...`, and
    send `Kite-Version: 2026-09-27` to pin the dated contract your code was
    written against (without it you get 2026-09-27). Every response carries the
    version that served it.
  version: '2026-09-27'
servers:
  - url: https://api.kiteml.com
    description: Kite Platform API
security:
  - bearerAuth: []
tags:
  - name: Augmentations
    description: Generate new episodes from a LeRobot dataset.
  - name: Training runs
    description: Fine-tune a policy on a dataset, one run per policy.
  - name: Twins
    description: Rebuild a robot episode as an interactable MuJoCo scene (private beta).
  - name: RL runs
    description: >-
      Train a robot policy in simulation from a task spec; get the policy, its
      scene and a verdict.
  - name: Catalog
    description: Policies, hardware tiers, and dataset inspection.
  - name: Operations
    description: Poll any run by its id.
  - name: Webhooks
    description: Endpoints that receive events, and the event log.
  - name: API keys
    description: The key making the request.
  - name: Usage
    description: Token usage and credit balance.
paths:
  /v1/rl_runs/{run_id}/report:
    get:
      tags:
        - RL runs
      summary: Get Report
      description: >-
        The verdict and how it was reached: each check with its value and limit,
        the metrics (24 worlds × 12 s,

        training noise on), the judge's read of the clip, and which checkpoint
        was chosen over which.
      operationId: get_report_v1_rl_runs__run_id__report_get
      parameters:
        - name: run_id
          in: path
          required: true
          schema:
            type: string
            title: Run Id
        - $ref: '#/components/parameters/KiteVersion'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RlReport'
              example:
                best_checkpoint: 500
                checkpoints_compared: []
                checks:
                  - limit: <= 2
                    name: falls_per_min
                    passed: true
                    value: 0.42
                  - limit: '>= 0.75'
                    name: survival
                    passed: true
                    value: 0.917
                  - limit: <= 15
                    name: pitch_offset_deg
                    passed: true
                    value: 3.55
                  - limit: '>= 0.5'
                    name: tracking
                    passed: true
                    value: 0.648
                  - limit: '>= 0.2'
                    name: alternation
                    passed: true
                    value: 0.455
                judge:
                  confidence: 0.72
                  diagnosis: >-
                    The frames show the robot translating steadily toward the
                    camera with a level torso and consistent upright posture,
                    with feet swinging past one another rather than shuffling in
                    place, so the forward-walk command is met. Gait quality is
                    mediocre though: alternation is only 0.455 (partially
                    in-phase / irregular swing timing) and lin-vel tracking is
                    0.648 with a slight yaw drift, so the pace is not perfectly
                    steady or straight.
                  matches: true
                  suggestions:
                    - factor: 1.4
                      weight: air_time
                    - factor: 1.2
                      weight: track_lin
                    - factor: 1.2
                      weight: slip
                    - factor: 1.15
                      weight: track_yaw
                    - factor: 1.1
                      weight: action_rate_final
                media:
                  commands:
                    - command:
                        vx: 0.3
                      video: media/video_vx0.3.mp4
                  sheet: media/sheet.jpg
                  thumbnail: media/thumbnail.jpg
                  video: media/video.mp4
                metrics:
                  alternation: 0.455
                  amp_ratio: 0.909
                  falls_per_min: 0.42
                  'n': 24
                  pitch_offset_deg: 3.55
                  seconds: 12
                  speed_bl: 1.348
                  stand_h: 0.197
                  step_amp: 0.0315
                  step_amp_bl: 0.16
                  survivors: 22
                  tracking: 0.648
                  upright_frac: 1
                  yaw_rate: 0.111
                  yaw_track: 0.945
                object: rl_report
                objective: velocity
                verdict: pass
        '400':
          description: >-
            Invalid request (`parameter_invalid`, `unsupported_version`, ...);
            `param` names the field
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
        '401':
          description: Missing or invalid API key (`unauthenticated`)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
        '403':
          description: >-
            The key lacks a scope this route needs (`missing_scope`), or the
            feature is not enabled for the account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
          description: >-
            No such resource (`resource_not_found`); another account's ids
            answer the same
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
          description: >-
            Conflicts with the resource's state or an earlier request (e.g.
            `not_cancelable`, `idempotency_key_reused`)
        '429':
          description: >-
            Rate or concurrency limited (`rate_limit_exceeded`,
            `concurrency_limit_exceeded`, `capacity_exceeded`); honor
            `Retry-After`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiErrorResponse'
components:
  parameters:
    KiteVersion:
      name: Kite-Version
      in: header
      required: false
      description: >-
        The dated contract your code was written against. Without it you get
        2026-09-27; every response says which version served it.
      schema:
        type: string
        enum:
          - '2026-09-27'
        default: '2026-09-27'
  schemas:
    RlReport:
      properties:
        object:
          type: string
          enum:
            - rl_report
          const: rl_report
          title: Object
          default: rl_report
        objective:
          type: string
          title: Objective
        verdict:
          type: string
          title: Verdict
          description: >-
            `pass` when every check passes; `needs_review` when they pass but
            the judge disagrees; else `fail`
        checks:
          items:
            $ref: '#/components/schemas/RlCheck'
          type: array
          title: Checks
        metrics:
          type: object
          title: Metrics
          description: Measured over 24 worlds × 12 s with training noise on
        judge:
          anyOf:
            - type: object
            - type: 'null'
          title: Judge
          description: >-
            A vision model's read of the clip against `description`: advice, not
            the verdict
        best_checkpoint:
          type: integer
          title: Best Checkpoint
        checkpoints_compared:
          items:
            type: object
          type: array
          title: Checkpoints Compared
        media:
          type: object
          title: Media
      type: object
      required:
        - objective
        - verdict
        - checks
        - metrics
        - best_checkpoint
        - checkpoints_compared
        - media
      title: RlReport
      examples:
        - best_checkpoint: 500
          checkpoints_compared: []
          checks:
            - limit: <= 2
              name: falls_per_min
              passed: true
              value: 0.42
            - limit: '>= 0.75'
              name: survival
              passed: true
              value: 0.917
            - limit: <= 15
              name: pitch_offset_deg
              passed: true
              value: 3.55
            - limit: '>= 0.5'
              name: tracking
              passed: true
              value: 0.648
            - limit: '>= 0.2'
              name: alternation
              passed: true
              value: 0.455
          judge:
            confidence: 0.72
            diagnosis: >-
              The frames show the robot translating steadily toward the camera
              with a level torso and consistent upright posture, with feet
              swinging past one another rather than shuffling in place, so the
              forward-walk command is met. Gait quality is mediocre though:
              alternation is only 0.455 (partially in-phase / irregular swing
              timing) and lin-vel tracking is 0.648 with a slight yaw drift, so
              the pace is not perfectly steady or straight.
            matches: true
            suggestions:
              - factor: 1.4
                weight: air_time
              - factor: 1.2
                weight: track_lin
              - factor: 1.2
                weight: slip
              - factor: 1.15
                weight: track_yaw
              - factor: 1.1
                weight: action_rate_final
          media:
            commands:
              - command:
                  vx: 0.3
                video: media/video_vx0.3.mp4
            sheet: media/sheet.jpg
            thumbnail: media/thumbnail.jpg
            video: media/video.mp4
          metrics:
            alternation: 0.455
            amp_ratio: 0.909
            falls_per_min: 0.42
            'n': 24
            pitch_offset_deg: 3.55
            seconds: 12
            speed_bl: 1.348
            stand_h: 0.197
            step_amp: 0.0315
            step_amp_bl: 0.16
            survivors: 22
            tracking: 0.648
            upright_frac: 1
            yaw_rate: 0.111
            yaw_track: 0.945
          object: rl_report
          objective: velocity
          verdict: pass
    ApiErrorResponse:
      properties:
        error:
          $ref: '#/components/schemas/ApiErrorBody'
      type: object
      required:
        - error
      title: ApiErrorResponse
      description: Every /v1 error has this shape.
    RlCheck:
      properties:
        name:
          type: string
          title: Name
        value:
          type: number
          title: Value
        limit:
          type: string
          title: Limit
        passed:
          type: boolean
          title: Passed
      type: object
      required:
        - name
        - value
        - limit
        - passed
      title: RlCheck
    ApiErrorBody:
      properties:
        type:
          type: string
          title: Type
          description: >-
            invalid_request_error, authentication_error, permission_error,
            not_found_error, conflict_error, rate_limit_error, or api_error
        code:
          type: string
          title: Code
          description: 'Machine-readable: branch on this, not on the message'
        message:
          type: string
          title: Message
        param:
          anyOf:
            - type: string
            - type: 'null'
          title: Param
          description: The request field the error is about, when there is one
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Request Id
          description: Also in the X-Request-Id header; quote it to support
        details:
          anyOf:
            - type: object
            - type: 'null'
          title: Details
          description: >-
            Extra data for some codes (e.g. the cameras a dataset does have, for
            camera_not_found)
      type: object
      required:
        - type
        - code
        - message
      title: ApiErrorBody
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        A Kite API key (`kite_...`), from **Platform API → Keys** in the
        dashboard.

````