---
title: "Read one milestone version"
method: GET
path: "/projects/{project_id}/versions/{version_id}"
tags: ["project-versions"]
---

# Read one milestone version

`GET /projects/{project_id}/versions/{version_id}`

Return one milestone and the manifest it was closed with.

Args:
    project_id: Project the milestone belongs to.
    version_id: Milestone to read.
    auth: Authenticated caller.

Returns:
    The milestone, plus its stored manifest once it has been closed.

## Path parameters

- `project_id` string, uuid, required
- `version_id` string, uuid, required

## Response `200`

Successful Response

- ProjectVersionDetailResponse — One milestone plus the manifest it was closed with.
  - `version` ProjectVersionResponse, required — A single project milestone.
    - `id` string, required
    - `project_id` string, required
    - `team_id` string, required
    - `version_number` integer, required
    - `status` 'current' | 'frozen' | 'abandoned', required — Lifecycle of a project milestone version (EDD section 9.1).
    - `objective` string, nullable, required
    - `carryover_summary` string, required
    - `champion` ChampionRef, required — What a milestone settled on, as exactly one populated target.
      - `training_job_id` string, nullable — Fine-tune chosen as champion.
      - `base_model` string, nullable — Catalog base model chosen as champion.
    - `created_by` string, required
    - `closed_by` string, nullable, required
    - `closed_at` string, date-time, nullable, required
    - `created_at` string, date-time, required
  - `manifest` CarryoverManifestPayload — Deterministic snapshot of a milestone's contents.
    - `schema_version` integer, required — Manifest shape version.
    - `version` ManifestVersionRef, required — Identity of the milestone a manifest describes.
      - `id` string, required — Milestone UUID.
      - `number` integer, required — Monotonic per-project version number.
      - `objective` string, nullable — Goal set when the version opened.
    - `training_jobs` ManifestTrainingJob[]
      - `id` string, required — Training job UUID.
      - `model_name` string, nullable — Customer-facing model name.
      - `version_number` string, required — Version within the model lineage.
      - `base_model` string, required — Base model it was trained from.
      - `status` string, required — Raw persisted training status.
      - `deployable` boolean, required — Whether the artifact may serve traffic.
      - `not_deployable_reason` string, nullable — Stable reason code when the artifact cannot serve traffic.
    - `datasets` ManifestDataset[]
      - `id` string, required — Dataset UUID; an exact immutable version.
      - `name` string, required — Dataset name.
      - `version_number` string, required — Version within the dataset lineage.
    - `experiments` ManifestExperiment[]
      - `id` string, required — Experiment UUID.
      - `title` string, nullable — Agent-generated display name.
      - `stage` 'scoping' | 'preparing_data' | 'training' | 'evaluating' | 'complete' | 'blocked' | 'cancelled', required — Agent-owned workflow stage of an Experiment (EDD section 0.2).
    - `champion` ChampionRef — What a milestone settled on, as exactly one populated target.
      - `training_job_id` string, nullable — Fine-tune chosen as champion.
      - `base_model` string, nullable — Catalog base model chosen as champion.

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/pioneer/apis/brain-api.md) · [All operations](https://skmtc.net/pioneer/apis/brain-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/pioneer/brain-api/revisions/b92f75fd3b61/schema)
