> For the complete documentation index, see [llms.txt](https://docs.tryterra.co/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tryterra.co/help-center/help-topics/data-api-sdk/extra-features-scores-graphs-teams-nutrition-cgm/planned-workout-push-to-watch.md).

# Can I send workouts to Apple, Garmin and COROS watches?

Pushing a workout to a watch is exactly what the Planned Workouts API is for: define a structured workout as a template, then schedule it to a user and it…

Pushing a workout to a watch is exactly what the **Planned Workouts API** is for: define a structured workout as a template, then schedule it to a user and it syncs to their connected device.

By provider:

* **Garmin, COROS, Wahoo, Suunto, Zepp, Huawei, TrainingPeaks and Hevy** work entirely server-side through the API, with no app changes. Support differs by provider: Huawei takes running workouts only and can't update or delete them on the device, and Hevy takes strength routines only.
* **Apple** has no cloud API for this. The iOS SDK writes the workout on the iPhone through Apple's WorkoutKit, so it needs the SDK integrated and only lands on an Apple Watch paired to that iPhone. It needs iOS 17 or later, a device that supports workout scheduling, and Apple's workout scheduling permission, which is separate from Health permissions.

The flow is **two calls**:

{% stepper %}
{% step %}
**POST `/workouts`** to create the template.
{% endstep %}

{% step %}
**POST `/workouts/{workout_id}/plan?user_id=...`** to push it to a specific athlete, with their max HR, FTP, and planned date. The response returns `planned_workout_id`, plus `provider_workout_id` for providers other than Apple.
{% endstep %}
{% endstepper %}

**Build on these endpoints rather than the older `/v2/plannedWorkout` endpoint**, which isn't part of the published API reference.

Each schedule call pushes a new workout, and there is no idempotency key.

Intervals.icu is read only: you can list an athlete's planned workouts there, but not push to it. Zwift isn't supported. See [provider compatibility](https://docs.tryterra.co/planned-workouts-api/provider-compatibility) for what each provider accepts, and the [Planned Workouts API overview](https://docs.tryterra.co/planned-workouts-api/overview).

## Apple from the mobile SDKs

**Native iOS:** create and schedule the workout with the two calls above, then call `enablePlannedWorkoutBackendSync(enabled: true)` after connecting Apple Health. The SDK then syncs pending workouts to WorkoutKit. `enablePlannedWorkoutBackendSync` and `syncPlannedWorkoutsFromBackend` ask the user for the scheduling permission if they haven't answered yet. The automatic sync when the SDK starts never asks, so it does nothing until that permission is granted. See [Planned Workout Sync](https://docs.tryterra.co/unified-api/mobile-only-sources/ios-swift).

**React Native and Flutter:** the backend sync methods aren't available in these packages. Build the workout in your app and call `postPlannedWorkout` with the Apple Health connection instead, for example `postPlannedWorkout(Connections.APPLE_HEALTH, payload)` in terra-react 1.8.6 or later. It returns an error if the permission is missing or the device can't schedule workouts.

For `postPlannedWorkout`, `planned_date` must be an ISO 8601 timestamp with a timezone and no fractional seconds. `2026-07-02T07:00:00Z` works. `2026-07-02T07:00:00.000Z`, which is what JavaScript's `toISOString()` returns, fails with an invalid date format error.
