---
title: "Update Training Job"
method: PATCH
path: "/felix/training-jobs/{job_id}"
tags: ["felix"]
---

# Update Training Job

`PATCH /felix/training-jobs/{job_id}`

Patch a training job. Currently exposes only ``project_id``.

Delegates to :func:`services.projects.movement.assign_resource_to_project`
which owns the visibility check, target-project gating, and the
service-role ``UPDATE``. Send ``project_id: null`` to unassign the job
from its project.

Movement is **label-only**: only ``training_jobs.project_id`` changes.
Dependent rows that carry their own ``project_id`` (``deployments``,
``inferences``, ``model_evaluations``) are intentionally not cascaded.
Callers needing aggregate-model movement must update dependents
explicitly.

## Path parameters

- `job_id` string, required

## Request body

- TrainingJobUpdate — Thin PATCH body for ``PATCH /felix/training-jobs/{job_id}``. Exposes only ``project_id``. Send ``null`` to unassign the training job from its current project. Unknown fields are rejected with HTTP 422. Movement semantics: this endpoint moves only the ``training_jobs.project_id`` label. It does NOT cascade ``project_id`` updates to dependent rows (``deployments``, ``inferences``, ``model_evaluations``) which each carry their own ``project_id``. Those records remain attached to their original project. Callers needing aggregate-model movement must update the dependents explicitly.
  - `project_id` string, nullable — Project ID (UUID) to assign the training job to, or null to unassign.

## Response `200`

Successful Response

- UpdateResourceProjectResponse — Response for project assignment update.
  - `success` boolean, required
  - `message` string, required

## 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/31dfe831e079/schema)
