---
title: "Bulk Update Providers"
method: PUT
path: "/api/v1/oauth/providers"
tags: ["Internal: Providers"]
---

# Bulk Update Providers

`PUT /api/v1/oauth/providers`

Bulk update provider settings.

Accepts a map of provider_id -> is_enabled and updates all providers at once.
This is the primary endpoint for the admin UI to save checkbox states.

## Request body

- BulkProviderSettingsUpdate — Schema for bulk updating provider enabled/disabled state.
  - `providers` object, required — Map of provider_id -> is_enabled

## Response `200`

Successful Response

- ProviderSettingRead[]
  - `provider` string, required — Provider identifier (e.g., 'apple', 'garmin')
  - `name` string, required — Display name (e.g., 'Apple Health', 'Garmin')
  - `has_cloud_api` boolean, required — Whether provider uses cloud OAuth API
  - `is_enabled` boolean, required — Whether provider is enabled by admin
  - `icon_url` string, required — Relative URL to provider icon (e.g., '/static/provider-icons/garmin.svg'). Resolve against the API base URL.
  - `live_sync_mode` 'pull' | 'webhook'
  - `live_sync_configurable` boolean — Whether the admin can switch live_sync_mode for this provider.
  - `data_granularity` 'daily' | 'hourly' | 'raw' — How finely a provider's 24/7 data is stored. DAILY — one aggregated value per day (server-side rollup). HOURLY — one aggregated value per hour (server-side rollup). RAW — every individual reading (no aggregation), where the provider supports it.

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/openwearables/apis/open-wearables-api.md) · [All operations](https://skmtc.net/openwearables/apis/open-wearables-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/openwearables/open-wearables-api/versions/37c1c527cd8f/schema)
