---
url: /docs/api/core/functions/createWorkoutKRD.md
---
[**@kaiord/core**](../README.md)

***

[@kaiord/core](../README.md) / createWorkoutKRD

# Function: createWorkoutKRD()

> **createWorkoutKRD**(`workout`, `options?`): `object`

Defined in: [packages/core/src/domain/converters/workout-to-krd.converter.ts:21](https://github.com/pablo-albaladejo/kaiord/blob/3eacbe62ef72342d970523967cc5155b5935bb85/packages/core/src/domain/converters/workout-to-krd.converter.ts#L21)

Creates a valid KRD envelope for a structured workout.

Validates unknown input against workoutSchema before wrapping.
Designed as a validation boundary for agent-provided data.

## Parameters

### workout

`unknown`

Unknown data to validate and wrap in KRD format

### options?

`CreateWorkoutKRDOptions`

Optional overrides (created timestamp for testability)

## Returns

`object`

Valid KRD with type "structured_workout"

### events?

> `optional` **events?**: `object`\[]

### extensions?

> `optional` **extensions?**: `object`

#### Index Signature

\[`key`: `string`]: `unknown`

#### extensions.course?

> `optional` **course?**: `unknown`

#### extensions.course_points?

> `optional` **course_points?**: `unknown`

#### extensions.fit?

> `optional` **fit?**: `unknown`

#### extensions.health?

> `optional` **health?**: `object`

##### Index Signature

\[`key`: `string`]: `unknown`

#### extensions.health.bodyComposition?

> `optional` **bodyComposition?**: `object`

#### extensions.health.bodyComposition.basalMetabolicRateKcal?

> `optional` **basalMetabolicRateKcal?**: `number`

#### extensions.health.bodyComposition.bmi?

> `optional` **bmi?**: `number`

#### extensions.health.bodyComposition.bodyFatPercent?

> `optional` **bodyFatPercent?**: `number`

#### extensions.health.bodyComposition.bodyWaterPercent?

> `optional` **bodyWaterPercent?**: `number`

#### extensions.health.bodyComposition.boneMassKilograms?

> `optional` **boneMassKilograms?**: `number`

#### extensions.health.bodyComposition.externalId?

> `optional` **externalId?**: `string`

#### extensions.health.bodyComposition.kaiordRecordId?

> `optional` **kaiordRecordId?**: `string`

#### extensions.health.bodyComposition.kind

> **kind**: `"bodyComposition"`

#### extensions.health.bodyComposition.leanMassKilograms?

> `optional` **leanMassKilograms?**: `number`

#### extensions.health.bodyComposition.measuredAt

> **measuredAt**: `string`

#### extensions.health.bodyComposition.sourceBridgeId?

> `optional` **sourceBridgeId?**: `string`

#### extensions.health.bodyComposition.version

> **version**: `string` = `healthVersionSchema`

#### extensions.health.bodyComposition.visceralFatRating?

> `optional` **visceralFatRating?**: `number`

#### extensions.health.daily?

> `optional` **daily?**: `object`

#### extensions.health.daily.activeCalories

> **activeCalories**: `number`

#### extensions.health.daily.date

> **date**: `string`

#### extensions.health.daily.externalId?

> `optional` **externalId?**: `string`

#### extensions.health.daily.floorsClimbed?

> `optional` **floorsClimbed?**: `number`

#### extensions.health.daily.intensityMinutes

> **intensityMinutes**: `object`

#### extensions.health.daily.intensityMinutes.moderate

> **moderate**: `number`

#### extensions.health.daily.intensityMinutes.vigorous

> **vigorous**: `number`

#### extensions.health.daily.kaiordRecordId?

> `optional` **kaiordRecordId?**: `string`

#### extensions.health.daily.kind

> **kind**: `"daily"`

#### extensions.health.daily.restingCalories

> **restingCalories**: `number`

#### extensions.health.daily.sourceBridgeId?

> `optional` **sourceBridgeId?**: `string`

#### extensions.health.daily.steps

> **steps**: `number`

#### extensions.health.daily.version

> **version**: `string` = `healthVersionSchema`

#### extensions.health.hrv?

> `optional` **hrv?**: `object`

#### extensions.health.hrv.externalId?

> `optional` **externalId?**: `string`

#### extensions.health.hrv.kaiordRecordId?

> `optional` **kaiordRecordId?**: `string`

#### extensions.health.hrv.kind

> **kind**: `"hrv"`

#### extensions.health.hrv.measuredAt

> **measuredAt**: `string`

#### extensions.health.hrv.measurementWindow

> **measurementWindow**: `"overnight"` | `"spot"`

#### extensions.health.hrv.rMSSD

> **rMSSD**: `number`

#### extensions.health.hrv.score?

> `optional` **score?**: `number`

#### extensions.health.hrv.sourceBridgeId?

> `optional` **sourceBridgeId?**: `string`

#### extensions.health.hrv.version

> **version**: `string` = `healthVersionSchema`

#### extensions.health.sleep?

> `optional` **sleep?**: `object`

#### extensions.health.sleep.endTime

> **endTime**: `string`

#### extensions.health.sleep.externalId?

> `optional` **externalId?**: `string`

#### extensions.health.sleep.kaiordRecordId?

> `optional` **kaiordRecordId?**: `string`

#### extensions.health.sleep.kind

> **kind**: `"sleep"`

#### extensions.health.sleep.restingHeartRate?

> `optional` **restingHeartRate?**: `number`

#### extensions.health.sleep.score?

> `optional` **score?**: `number`

#### extensions.health.sleep.sourceBridgeId?

> `optional` **sourceBridgeId?**: `string`

#### extensions.health.sleep.stages

> **stages**: `object`\[]

#### extensions.health.sleep.startTime

> **startTime**: `string`

#### extensions.health.sleep.totalDurationSeconds?

> `optional` **totalDurationSeconds?**: `number`

#### extensions.health.sleep.version

> **version**: `string` = `healthVersionSchema`

#### extensions.health.stress?

> `optional` **stress?**: `object`

#### extensions.health.stress.averageLevel

> **averageLevel**: `number`

#### extensions.health.stress.endTime

> **endTime**: `string`

#### extensions.health.stress.externalId?

> `optional` **externalId?**: `string`

#### extensions.health.stress.kaiordRecordId?

> `optional` **kaiordRecordId?**: `string`

#### extensions.health.stress.kind

> **kind**: `"stress"`

#### extensions.health.stress.peakLevel

> **peakLevel**: `number`

#### extensions.health.stress.sourceBridgeId?

> `optional` **sourceBridgeId?**: `string`

#### extensions.health.stress.startTime

> **startTime**: `string`

#### extensions.health.stress.version

> **version**: `string` = `healthVersionSchema`

#### extensions.health.weight?

> `optional` **weight?**: `object`

#### extensions.health.weight.externalId?

> `optional` **externalId?**: `string`

#### extensions.health.weight.kaiordRecordId?

> `optional` **kaiordRecordId?**: `string`

#### extensions.health.weight.kind

> **kind**: `"weight"`

#### extensions.health.weight.measuredAt

> **measuredAt**: `string`

#### extensions.health.weight.sourceBridgeId?

> `optional` **sourceBridgeId?**: `string`

#### extensions.health.weight.version

> **version**: `string` = `healthVersionSchema`

#### extensions.health.weight.weightKilograms

> **weightKilograms**: `number`

#### extensions.structured_workout?

> `optional` **structured_workout?**: `unknown`

### laps?

> `optional` **laps?**: `object`\[]

### metadata

> **metadata**: `object` = `krdMetadataSchema`

#### metadata.created

> **created**: `string`

#### metadata.manufacturer?

> `optional` **manufacturer?**: `string`

#### metadata.product?

> `optional` **product?**: `string`

#### metadata.serialNumber?

> `optional` **serialNumber?**: `string`

#### metadata.sport?

> `optional` **sport?**: `string`

##### See

sportSchema for known sport values. Accepts custom strings for forward compatibility.

Optional at the metadata level because health-metric KRD types
(sleep, weight, HRV, daily wellness, body composition, stress)
have no associated sport. A conditional refinement on `krdSchema`
still requires `sport` for the three legacy workout/activity/course
types so v1.x consumers see no change for those.

#### metadata.subSport?

> `optional` **subSport?**: `string`

### records?

> `optional` **records?**: `object`\[]

### sessions?

> `optional` **sessions?**: `object`\[]

### type

> **type**: `"structured_workout"` | `"recorded_activity"` | `"course"` | `"sleep_record"` | `"weight_measurement"` | `"hrv_summary"` | `"daily_wellness"` | `"body_composition"` | `"stress_episode"` = `fileTypeSchema`

### version

> **version**: `string`

## Throws

If workout validation fails
