---
title: "Retrieve a job"
method: GET
path: "/v1/fine_tuning/jobs/{job_id}"
tags: ["fine-tuning"]
---

# Retrieve a job

`GET /v1/fine_tuning/jobs/{job_id}`

Poll a job until `status` is `succeeded`, `failed`, or `cancelled`. On success, `fine_tuned_model` is the name you predict against.

## Path parameters

- `job_id` string, required — The `ftjob-` prefixed id returned when the job was created.

## Response `200`

The job.

- FineTuningJob — An OpenAI-compatible `fine_tuning.job`, with additive Reflex fields (`labels`, `trained_examples`, `result`, `suffix`).
  - `id` string, required — Job id, prefixed `ftjob-`.
  - `object` string, required — Always `fine_tuning.job`.
  - `model` string, required — What the job trained from: the reflex you warm-started from, or the from-scratch base for a cold start.
  - `created_at` integer, required — Unix timestamp (seconds) at creation.
  - `finished_at` integer, nullable, required — Unix timestamp at a terminal state, else null.
  - `fine_tuned_model` string, nullable, required — Served model name once `succeeded` (the `suffix`, or the job id if none).
  - `status` 'queued' | 'validating_files' | 'running' | 'succeeded' | 'failed' | 'cancelled', required — `validating_files` is the data-prep phase for `generate`/`label_data` jobs.
  - `labels` string[], required — The classes this job trained on.
  - `trained_examples` integer, required — Number of training examples.
  - `hyperparameters` object, required — Fully managed.
    - `n_epochs` integer, required — Passes over the training set.
    - `batch_size` string, required — Batch size, always `auto`.
    - `learning_rate_multiplier` string, required — Learning-rate multiplier, always `auto`.
  - `result` object, nullable, required — `{accuracy, f1_score}` when `succeeded`, else null. Each value may be null.
    - `accuracy` number, nullable, required — Held-out accuracy of the trained model.
    - `f1_score` number, nullable, required — Held-out macro F1 of the trained model.
  - `error` object, nullable, required — `{code, message, param}` when `failed`, else null.
    - `code` string, nullable, required — Machine-readable failure code.
    - `message` string, nullable, required — Human-readable reason the training job failed.
    - `param` string, nullable, required — The request field that caused the failure.
  - `suffix` string, nullable, required — The suffix supplied at creation, else null.

## Other responses

- `400` — Malformed request — missing or invalid fields.
- `401` — Missing or invalid API key.
- `404` — The requested resource does not exist.
- `429` — Rate limited — retry after the interval in the Retry-After header.
- `500` — Internal error — safe to retry with backoff.

## Changes

- **2026-08-13** `b9a74274b2ab` — 2 warning, 32 info
  - removed the optional property `error/type` from the response with the `401` status
  - removed the optional property `error/type` from the response with the `404` status
  - api operation id `getReflexJob` removed and replaced with `getFineTuningJob`
  - the endpoint scheme security `bearerAuth` was added to the API
  - …30 more

[Change history](https://skmtc.dev/morphllm/apis/morph-api/changes/v1/fine_tuning/jobs/:job_id/get.md)

---

[API](https://skmtc.dev/morphllm/apis/morph-api.md) · [All operations](https://skmtc.dev/morphllm/apis/morph-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/morphllm/morph-api/revisions/b9a74274b2ab/schema)
