Overview
Garmin sends data to Open Wearables via two webhook types:- PING: Contains callback URLs with temporary tokens to fetch data
- PUSH: Contains inline activity metadata and wellness summaries
These endpoints are designed to be called by Garmin’s servers, not by your application. Configure webhook URLs in the Garmin Connect Developer Portal.
Authentication
Requiresgarmin-client-id header to verify the request originates from Garmin.
PING Webhook
Endpoint
POST /api/v1/webhooks/garmin/ping
Description
Receives PING notifications when new data is available. The payload contains callback URLs that must be fetched to retrieve the actual data.Headers
Garmin OAuth client ID for verification
Request Body
Garmin sends a JSON payload with data type arrays. When multiple backfill requests occur within 5 minutes, responses may be batched into a single payload.Example PING Payload
Response
Number of items successfully processed
List of error messages encountered during processing
Results for activity processing:
garmin_user_id: Garmin user identifierinternal_user_id: Open Wearables user UUIDactivities_count: Number of activities fetchedstatus: “fetched” or error state
Results per wellness data type (sleeps, dailies, epochs, etc.):
processed: Items fetched from callback URLsaved: Items successfully saved to databaseerrors: List of errors for this typeitems: Detailed results per user
List of user IDs for which next backfill type was triggered
If present, results of permission scope updates:
updated: Number of connections updatederrors: List of errors
If present, results of connection revocations:
revoked: Number of connections revokederrors: List of errors
Example Response
200 - Success
401 - Unauthorized
500 - Internal Error
PUSH Webhook
Endpoint
POST /api/v1/webhooks/garmin/push
Description
Receives PUSH notifications with inline data. Activity metadata and wellness summaries are included directly in the payload (no callback URL).Headers
Garmin OAuth client ID for verification
Request Body
Garmin sends a JSON payload with inline data arrays.Example PUSH Payload
Supported Data Types
All 16 Garmin data types are processed:- activities: Workouts and exercises
- activityDetails: Detailed activity metrics
- sleeps: Sleep sessions
- dailies: Daily summaries (steps, calories, etc.)
- epochs: Intraday activity samples
- bodyComps: Body composition measurements
- hrv: Heart rate variability
- stressDetails: Stress level data
- respiration: Respiration rate
- pulseOx: Blood oxygen saturation
- bloodPressures: Blood pressure readings
- userMetrics: User profile metrics
- skinTemp: Skin temperature
- healthSnapshot: Health snapshots
- moveiq: Auto-detected activities
- mct: Movement data
Response
Number of activities processed
Number of activities saved to database
List of error messages
Results for each activity:
activity_id: Garmin activity IDname: Activity nametype: Activity type (RUNNING, CYCLING, etc.)garmin_user_id: Garmin user IDinternal_user_id: Open Wearables user UUIDrecord_ids: Array of created EventRecord UUIDsstatus: “saved”, “duplicate”, “user_not_found”, or “validation_error”
Results per wellness data type:
processed: Number of items receivedsaved: Number of items saved
List of user IDs for which next backfill type was triggered
Example Response
200 - Success
Special Events
Permission Changes
When a user changes their data sharing permissions in Garmin Connect, auserPermissionsChange array is included:
scope field is updated to reflect the new permissions.
Deregistrations
When a user removes the app from Garmin Connect, aderegistrations array is included:
revoked.
Health Check
Endpoint
GET /api/v1/webhooks/garmin/health
Description
Health check endpoint for monitoring webhook availability.Response
200 - OK
Setup Guide
- Configure webhook URLs in the Garmin Connect Developer Portal
- Set both PING and PUSH notification URLs:
- PING:
https://your-domain.com/api/v1/webhooks/garmin/ping - PUSH:
https://your-domain.com/api/v1/webhooks/garmin/push
- PING:
- Ensure your server includes the
garmin-client-idheader in responses - Test with Garmin’s webhook testing tool
Webhook Batching
When multiple backfill requests occur within 5 minutes, Garmin may batch responses into a single webhook call. This is normal behavior and handled automatically.Error Handling
- Webhooks always return HTTP 200 to prevent Garmin from retrying
- Errors are logged and included in the
errorsarray - Individual item failures don’t stop processing of other items
- User not found errors are logged but don’t cause webhook failure
Related Endpoints
- Sync Data - Manually trigger data sync
- Get Backfill Status - Check sync progress
