Upsert up to 1000 trainings in a single request. Matches by trainingId or externalReferenceId within school scope; items without either are always created. Update semantics: scalar fields are a partial update (omit a field to leave it unchanged; send an explicit null to clear goals/tags/externalReferenceType). Linked collections (students, groups, professors) are a full replace: send the array to overwrite the roster, send [] to clear it, omit it to leave it untouched. metadata is an opaque flat key/value map (string or number values, stored and returned as-is). By default a match on an archived training fails with ARCHIVED_TRAINING_EXISTS; set options.allowUnarchive to true to unarchive and update it instead. Returns 200 for all success, 207 for partial success with per-item failures.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||

