---
title: "Resume Dedicated Run"
method: POST
path: "/api/v1/training/runs/{run_id}/resume"
tags: ["training"]
---

# Resume Dedicated Run

`POST /api/v1/training/runs/{run_id}/resume`

## Request

- Base URL: `https://api.primeintellect.ai`
- URL: `https://api.primeintellect.ai/api/v1/training/runs/{run_id}/resume`
- Auth: HTTP bearer

Resume a PAUSED dedicated run as a new run from its checkpoint.

The new run reuses the paused run's config, team, name, mode, image and
GPU type, attaches its volume and starts from its last checkpoint.
`gpuType` and `imageTag` override the stored ones; secrets are sent
again because they are dropped once a run deploys.

## Path parameters

- `run_id` string, required

## Request body

- ResumeDedicatedRunRequest: Wire payload for resuming a PAUSED dedicated run. Everything else comes from the paused run; secrets are sent again because the platform drops them once a run deploys.
  - `wandbApiKey` string, nullable: W&B key. On the PENDING fast-path it's materialised straight into the run's k8s Secret. On the QUEUED path it's stashed AES-encrypted on the RFTRun row so the drainer can rebuild the same Secret at promotion time without re-prompting.
  - `hfToken` string, nullable: HF token for gated/private model downloads. Same storage rules as wandbApiKey above.
  - `secrets` object, nullable: Arbitrary env-var secrets projected into trainer / inference / orchestrator / env-server pods (parity with the LoRA path). Keys must be uppercase POSIX env-var names (e.g. 'OPENAI_API_KEY'); WANDB_API_KEY / HF_TOKEN / PRIME_API_KEY are reserved — use the dedicated fields for those. Materialised into the per-run k8s Secret. Held encrypted on the RFTRun row only for the sync -> dispatch-task hop, then cleared once the run deploys (or on stop / delete / rollback); never returned by any read endpoint.
  - `gpuType` string, nullable: GPU type to resume on. Omit for the paused run's type.
  - `imageTag` string, nullable: prime-rl image tag to resume with. Omit for the paused run's image.

## Response `201`

Successful Response

- CreateDedicatedRunResponse
  - `runId` string, required
  - `jobId` string, required
  - `tokenValue` string, required: PRIME_API_KEY for this run. Returned once — the platform stores only the token id.
  - `onDemand` boolean: True when this run landed on billed shared capacity rather than a cluster the caller holds an allocation on. Derived at dispatch, not requested.
  - `gpuType` string, nullable: GPU type the run was placed on.
  - `pricePerGpuHour` number, nullable: USD per GPU-hour this run will be charged, discount applied and frozen for its lifetime. NULL on reserved capacity, which bills nothing per-hour. Echoed so a caller who named no gpuType sees the rate now rather than at invoice time.
  - `estimatedCostPerHour` number, nullable: price_per_gpu_hour multiplied by the run's GPU count.
  - `isBeta` boolean: True when this run used on-demand capacity, which is in beta. False on the reserved path, which is GA.

## Other responses

- `401`: Authorization failed
- `422`: Invalid request data

## Changes

> 49 revisions in range; 1 not diffed.

- **2026-10-18** `b820211a51de`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/primeintellect/apis/pi-api/changes/api/v1/training/runs/:run_id/resume/post.md)

---

[API](https://skmtc.dev/primeintellect/apis/pi-api.md) - [All operations](https://skmtc.dev/primeintellect/apis/pi-api/llms.txt) - [OpenAPI document](https://skmtc.dev/primeintellect/apis/pi-api/revisions/7f032a9306b0?raw)
