---
title: "Send a training event"
method: POST
path: "/api/webhooks/training/metrics"
tags: ["Training"]
---

# Send a training event

`POST /api/webhooks/training/metrics`

## Request

- Base URL: `https://platform.ultralytics.com`
- URL: `https://platform.ultralytics.com/api/webhooks/training/metrics`
- Auth: HTTP bearer

Receives callbacks from an existing training process; does not provision compute. For initial training_started registration, supply project and optionally name (defaults to train); an existing username prefix selects that workspace and requires editor access; other paths belong to the caller. Retain the returned modelId, runId, and modelSlug; send modelId on subsequent events. modelUrl links to the model. Honor cancelled=true responses. checkpoint_saved promotes an uploaded checkpoint only for its runId. This contract covers Bearer API-key callbacks, including assigned workers. Existing signed cloud callbacks instead use X-Alpha-Job-Id (model ID) and X-Alpha-Signature (HMAC-SHA256 of the exact request body with the job webhook secret).

## Request body

- object
  - `modelId` string
  - `project` string
  - `name` string
  - `event` 'training_started' | 'training_progress' | 'epoch_end' | 'system_metrics' | 'console_output' | 'checkpoint_saved' | 'training_complete' | 'training_failed', required
  - `data` object, required: Event-specific callback data, preserving original field names and nested values. training_started: trainArgs, epochs, device, environment, modelInfo. epoch_end: epoch, metrics, system, fitness, modelInfo, total_epochs or epochs_total. system_metrics: cpu, memory, disk, diskIo, network, gpus. console_output: content, lineCount, chunkId, progress. checkpoint_saved: runId, modelPath (the upload response gcsPath), uploadPath. training_complete: runId, results, classNames, plots. training_failed: error, code, instanceId. training_progress: liveness data. Worker callbacks include runId when available.

## Response `200`

Event acknowledged

- object
  - `received` true, required
  - `event` string, required
  - `mode` 'cloud' | 'remote'
  - `modelId` string
  - `runId` integer: Run start time in Unix milliseconds; retain for checkpoints
  - `modelSlug` string: Final model slug assigned during registration
  - `modelUrl` string: Platform URL of the registered model
  - `cancelled` boolean: Stop training when true, including during startup
  - `action` 'training_terminated'
  - `reason` string
  - `warning` string
  - `ignored` 'stale_instance'

## Other responses

- `400`: Invalid callback or checkpoint metadata
- `401`: Missing or invalid authentication
- `403`: Workspace access, worker assignment, or storage quota denied
- `404`: Project, model, or training run not found
- `409`: Checkpoint training run is no longer active
- `429`: Rate limit exceeded

## Changes

- **2026-10-16** `92e81a3d5295`: 1 info
  - added the optional property `modelUrl` to the response with the `200` status
- **2026-09-14** `54ba6c79aa6f`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/ultralytics/apis/ultralytics-platform-api/changes/api/webhooks/training/metrics/post.md)

---

[API](https://skmtc.dev/ultralytics/apis/ultralytics-platform-api.md) - [All operations](https://skmtc.dev/ultralytics/apis/ultralytics-platform-api/llms.txt) - [OpenAPI document](https://skmtc.dev/ultralytics/apis/ultralytics-platform-api/revisions/9c562e23b0e4?raw)
