> ## 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.

# Estimate Run

> Minutes and tokens for the create body, from throughput measured on this robot's own runs. Tokens are
reserved at create and whatever training does not use is refunded.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/rl_runs/estimate
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/estimate:
    post:
      tags:
        - RL runs
      summary: Estimate Run
      description: >-
        Minutes and tokens for the create body, from throughput measured on this
        robot's own runs. Tokens are

        reserved at create and whatever training does not use is refunded.
      operationId: estimate_run_v1_rl_runs_estimate_post
      parameters:
        - $ref: '#/components/parameters/KiteVersion'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RlRunCreate'
            example:
              budget:
                iterations: 500
                max_tokens: 400
              description: >-
                Walk forward at a steady pace with a level body and alternating
                feet.
              from:
                policy: 4d574ce4c547
              hardware_tier: gcp_gpu_l4
              metadata:
                example: rl_runs/walk.json
              outputs:
                formats:
                  - onnx
                  - pt
                  - torchscript
                videos:
                  - command:
                      vx: 0.3
                    seconds: 8
              robot: open_duck_mini_v2
              seeds: 1
              task:
                commands:
                  vx:
                    - 0.2
                    - 0.4
                  vy:
                    - -0.05
                    - 0.05
                  yaw:
                    - -0.2
                    - 0.2
                objective: velocity
              title: 'Open Duck: steady walk (fine-tuned)'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RlEstimate'
              example:
                capped: false
                minutes_per_run: 9.1
                object: rl_estimate
                runs: 1
                startup_minutes: 5
                tokens: 167
                tokens_per_run: 167
        '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
        '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:
    RlRunCreate:
      properties:
        robot:
          type: string
          title: Robot
          description: See GET /v1/rl_runs/catalog
        engine:
          anyOf:
            - type: string
            - type: 'null'
          title: Engine
          description: >-
            The dated trainer to use (default: the latest, or the parent's for a
            fork or continue of your run). A run keeps its engine
        task:
          $ref: '#/components/schemas/RlTask'
        budget:
          $ref: '#/components/schemas/RlBudget'
        seeds:
          anyOf:
            - type: integer
            - items:
                type: integer
              type: array
          title: Seeds
          description: >-
            A count (1-5) or explicit seeds: one run per seed, sharing a
            `group_id`
          default: 1
        from:
          anyOf:
            - $ref: '#/components/schemas/RlFrom'
            - type: 'null'
        outputs:
          $ref: '#/components/schemas/RlOutputs'
        hardware_tier:
          anyOf:
            - type: string
            - type: 'null'
          title: Hardware Tier
          description: See GET /v1/rl_runs/catalog (default `gcp_gpu_l4`)
        visibility:
          type: string
          enum:
            - private
            - public
          title: Visibility
          description: >-
            `public` lists the run in the policy catalog once it finishes with a
            `pass` verdict
          default: private
        title:
          anyOf:
            - type: string
              maxLength: 120
            - type: 'null'
          title: Title
        description:
          anyOf:
            - type: string
              maxLength: 2000
            - type: 'null'
          title: Description
          description: >-
            What the behavior should look like; the report's judge compares the
            clip against it
        metadata:
          additionalProperties:
            type: string
          type: object
          title: Metadata
          description: Your labels, echoed on the run
        webhook_metadata:
          anyOf:
            - type: object
            - type: 'null'
          title: Webhook Metadata
          description: Echoed on the run and its events
      type: object
      required:
        - robot
        - task
      title: RlRunCreate
      description: Train a policy. Only `robot` and `task.objective` are required.
      examples:
        - budget:
            iterations: 500
            max_tokens: 400
          description: >-
            Walk forward at a steady pace with a level body and alternating
            feet.
          from:
            policy: 4d574ce4c547
          hardware_tier: gcp_gpu_l4
          metadata:
            example: rl_runs/walk.json
          outputs:
            formats:
              - onnx
              - pt
              - torchscript
            videos:
              - command:
                  vx: 0.3
                seconds: 8
          robot: open_duck_mini_v2
          seeds: 1
          task:
            commands:
              vx:
                - 0.2
                - 0.4
              vy:
                - -0.05
                - 0.05
              yaw:
                - -0.2
                - 0.2
            objective: velocity
          title: 'Open Duck: steady walk (fine-tuned)'
    RlEstimate:
      properties:
        object:
          type: string
          enum:
            - rl_estimate
          const: rl_estimate
          title: Object
          default: rl_estimate
        minutes_per_run:
          type: number
          title: Minutes Per Run
          description: Training minutes, from throughput measured on this robot
        tokens_per_run:
          type: integer
          title: Tokens Per Run
        runs:
          type: integer
          title: Runs
        tokens:
          type: integer
          title: Tokens
          description: Reserved at create; unused tokens are refunded
        capped:
          type: boolean
          title: Capped
          description: '`budget.max_tokens` will stop the run before `iterations`'
        startup_minutes:
          type: integer
          title: Startup Minutes
          description: Getting a machine and compiling; not billed
      type: object
      required:
        - minutes_per_run
        - tokens_per_run
        - runs
        - tokens
        - capped
        - startup_minutes
      title: RlEstimate
      examples:
        - capped: false
          minutes_per_run: 9.1
          object: rl_estimate
          runs: 1
          startup_minutes: 5
          tokens: 167
          tokens_per_run: 167
    ApiErrorResponse:
      properties:
        error:
          $ref: '#/components/schemas/ApiErrorBody'
      type: object
      required:
        - error
      title: ApiErrorResponse
      description: Every /v1 error has this shape.
    RlTask:
      properties:
        objective:
          type: string
          enum:
            - velocity
            - imitation
            - balance
          title: Objective
          description: >-
            `velocity`: walk, turn or stand on command. `imitation`: follow a
            reference motion (`motion`). `balance`: stand on a scene item
            (`item`)
        commands:
          anyOf:
            - $ref: '#/components/schemas/RlCommands'
            - type: 'null'
          description: velocity only
        motion:
          anyOf:
            - type: string
            - type: 'null'
          title: Motion
          description: 'imitation only: the motion id of the clip to imitate'
        item:
          anyOf:
            - type: integer
              minimum: 0
            - type: 'null'
          title: Item
          description: 'balance only: the index of the scene item to stand on'
        scene:
          $ref: '#/components/schemas/RlScene'
        params:
          additionalProperties:
            type: number
          type: object
          title: Params
          description: >-
            Reward and randomization parameters to override; GET
            /v1/rl_runs/catalog lists every one with its default and bounds
      type: object
      required:
        - objective
      title: RlTask
      description: What to learn.
    RlBudget:
      properties:
        preset:
          anyOf:
            - type: string
              enum:
                - probe
                - standard
            - type: 'null'
          title: Preset
          description: >-
            `probe`: 300 iterations, a first signal in minutes. `standard` (the
            default): the iterations this objective was verified with
        iterations:
          anyOf:
            - type: integer
              maximum: 6000
              minimum: 10
            - type: 'null'
          title: Iterations
          description: Overrides the preset
        num_envs:
          anyOf:
            - type: integer
              maximum: 8192
              minimum: 16
            - type: 'null'
          title: Num Envs
          description: Parallel worlds (default 2048)
        max_tokens:
          anyOf:
            - type: integer
              minimum: 1
            - type: 'null'
          title: Max Tokens
          description: >-
            Per run: training stops, keeping its policy, once it has used this
            many tokens
      type: object
      title: RlBudget
    RlFrom:
      properties:
        run:
          anyOf:
            - type: string
            - type: 'null'
          title: Run
          description: One of your runs (`rlr_…`)
        policy:
          anyOf:
            - type: string
            - type: 'null'
          title: Policy
          description: A public policy's id, from kiteml.com/rl-studio
        mode:
          type: string
          enum:
            - fork
            - continue
          title: Mode
          description: >-
            `fork`: its weights and training schedule, with this run's spec and
            a fresh optimizer. `continue`: also its optimizer (your runs only)
          default: fork
        checkpoint:
          anyOf:
            - type: integer
              minimum: 0
            - type: 'null'
          title: Checkpoint
          description: 'A saved iteration of `run` (default: its latest)'
      type: object
      title: RlFrom
      description: Start from another policy instead of from scratch.
    RlOutputs:
      properties:
        formats:
          items:
            type: string
            enum:
              - onnx
              - pt
              - torchscript
          type: array
          title: Formats
        videos:
          items:
            $ref: '#/components/schemas/RlVideoRequest'
          type: array
          maxItems: 4
          title: Videos
          description: One clip per command
        huggingface:
          anyOf:
            - $ref: '#/components/schemas/RlHuggingFace'
            - type: 'null'
          description: Also upload the bundle to your Hub account
      type: object
      title: RlOutputs
      description: >-
        Extras beyond what every run produces (ONNX, the checkpoint, the scene,
        one clip, the report).
    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
    RlCommands:
      properties:
        vx:
          anyOf:
            - items:
                type: number
              type: array
              maxItems: 2
              minItems: 2
            - type: 'null'
          title: Vx
          description: Forward speed, m/s
        vy:
          anyOf:
            - items:
                type: number
              type: array
              maxItems: 2
              minItems: 2
            - type: 'null'
          title: Vy
          description: Sideways speed, m/s
        yaw:
          anyOf:
            - items:
                type: number
              type: array
              maxItems: 2
              minItems: 2
            - type: 'null'
          title: Yaw
          description: Turn rate, rad/s
      type: object
      title: RlCommands
      description: >-
        Ranges each episode's command is drawn from, [low, high]. Omitted ones
        keep the robot's verified band.
    RlScene:
      properties:
        items:
          items:
            $ref: '#/components/schemas/RlItem'
          type: array
          maxItems: 8
          title: Items
      type: object
      title: RlScene
    RlVideoRequest:
      properties:
        command:
          additionalProperties:
            type: number
          type: object
          title: Command
          description: '{vx, vy, yaw} to hold for the clip'
        seconds:
          type: number
          maximum: 20
          minimum: 1
          title: Seconds
          default: 10
      type: object
      required:
        - command
      title: RlVideoRequest
    RlHuggingFace:
      properties:
        repo_id:
          type: string
          maxLength: 200
          title: Repo Id
          description: >-
            Model repo name; the namespace is your connected Hugging Face
            account
        private:
          type: boolean
          title: Private
          default: true
      type: object
      required:
        - repo_id
      title: RlHuggingFace
    RlItem:
      properties:
        shape:
          type: string
          enum:
            - sphere
            - box
            - capsule
          title: Shape
        size:
          items:
            type: number
            maximum: 0.6
            minimum: 0.005
          type: array
          maxItems: 3
          minItems: 1
          title: Size
          description: >-
            sphere [radius]; box [half x, half y, half z]; capsule [radius, half
            length]; each 0.005-0.6 m
        pos:
          items:
            type: number
            maximum: 3
            minimum: -3
          type: array
          maxItems: 2
          minItems: 2
          title: Pos
          description: '[x, y] on the floor, m from the spawn (within 3 m)'
        mass:
          type: number
          maximum: 20
          minimum: 0.01
          title: Mass
          description: kg
        label:
          anyOf:
            - type: string
              maxLength: 40
            - type: 'null'
          title: Label
        color:
          anyOf:
            - items:
                type: number
                maximum: 1
                minimum: 0
              type: array
              maxItems: 3
              minItems: 3
            - type: 'null'
          title: Color
          description: RGB, 0-1
        roll_friction:
          anyOf:
            - type: number
              maximum: 0.05
              minimum: 0
            - type: 'null'
          title: Roll Friction
          description: 0 rolls freely; ~0.01 for a ball the robot stands on
        spin_friction:
          anyOf:
            - type: number
              maximum: 0.05
              minimum: 0
            - type: 'null'
          title: Spin Friction
      type: object
      required:
        - shape
        - size
        - pos
        - mass
      title: RlItem
      description: >-
        A physical item in the training scene: a free body with mass and
        collision.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        A Kite API key (`kite_...`), from **Platform API → Keys** in the
        dashboard.

````