Skip to content
AF

The fitness API openness index

Compiled November 6, 2026 · 13 APIs · 8 checks · CC BY 4.0

This index counts which of eight developer basics 13 wearable and health-data APIs document on their own pages: a self-serve start, a sandbox or test mode, public pricing, published rate limits, signed webhooks, PKCE, refresh tokens, and a call that disconnects a user or deletes their data. The most often documented is published rate limits (11 of 13); the least is pkce (2 of 12). Every mark links the vendor's own sentence. A basic the pages read do not mention is shown as not documented, never as missing, and each score is a plain count with no weighting and no rank.

The index

Alphabetical, so the order says nothing. A mark links the vendor’s sentence further down the page.

APISelf-serve startSandbox or test modePublic pricingPublished rate limitsSigned webhooksPKCERefresh tokensDisconnect or deletion callCount
Concept2 LogbookConcept2 Logbook, Self-serve start: DocumentedConcept2 Logbook, Sandbox or test mode: DocumentedConcept2 Logbook, Public pricing: Not documented in the pages readConcept2 Logbook, Published rate limits: DocumentedConcept2 Logbook, Signed webhooks: Not documented in the pages readConcept2 Logbook, PKCE: Not documented in the pages readConcept2 Logbook, Refresh tokens: DocumentedConcept2 Logbook, Disconnect or deletion call: Documented5/8
COROSCOROS, Self-serve start: The docs say otherwiseCOROS, Sandbox or test mode: Not documented in the pages readCOROS, Public pricing: Not documented in the pages readCOROS, Published rate limits: DocumentedCOROS, Signed webhooks: Not documented in the pages readCOROS, PKCE: Not documented in the pages readCOROS, Refresh tokens: DocumentedCOROS, Disconnect or deletion call: Documented3/8
DexcomDexcom, Self-serve start: DocumentedDexcom, Sandbox or test mode: DocumentedDexcom, Public pricing: Not documented in the pages readDexcom, Published rate limits: DocumentedDexcom, Signed webhooks: Not documented in the pages readDexcom, PKCE: Not documented in the pages readDexcom, Refresh tokens: DocumentedDexcom, Disconnect or deletion call: Not documented in the pages read4/8
GarminGarmin, Self-serve start: The docs say otherwiseGarmin, Sandbox or test mode: DocumentedGarmin, Public pricing: Not documented in the pages readGarmin, Published rate limits: Not documented in the pages readGarmin, Signed webhooks: Not documented in the pages readGarmin, PKCE: Not documented in the pages readGarmin, Refresh tokens: Not documented in the pages readGarmin, Disconnect or deletion call: Not documented in the pages read1/8
Google Health APIGoogle Health API, Self-serve start: DocumentedGoogle Health API, Sandbox or test mode: Not documented in the pages readGoogle Health API, Public pricing: Not documented in the pages readGoogle Health API, Published rate limits: DocumentedGoogle Health API, Signed webhooks: DocumentedGoogle Health API, PKCE: Not documented in the pages readGoogle Health API, Refresh tokens: DocumentedGoogle Health API, Disconnect or deletion call: Documented5/8
OuraOura, Self-serve start: DocumentedOura, Sandbox or test mode: DocumentedOura, Public pricing: DocumentedOura, Published rate limits: DocumentedOura, Signed webhooks: DocumentedOura, PKCE: DocumentedOura, Refresh tokens: DocumentedOura, Disconnect or deletion call: Documented8/8
Polar AccessLinkPolar AccessLink, Self-serve start: DocumentedPolar AccessLink, Sandbox or test mode: Not documented in the pages readPolar AccessLink, Public pricing: DocumentedPolar AccessLink, Published rate limits: DocumentedPolar AccessLink, Signed webhooks: DocumentedPolar AccessLink, PKCE: Not documented in the pages readPolar AccessLink, Refresh tokens: Not applicablePolar AccessLink, Disconnect or deletion call: Documented5/7
StravaStrava, Self-serve start: DocumentedStrava, Sandbox or test mode: DocumentedStrava, Public pricing: DocumentedStrava, Published rate limits: DocumentedStrava, Signed webhooks: Not documented in the pages readStrava, PKCE: Not documented in the pages readStrava, Refresh tokens: DocumentedStrava, Disconnect or deletion call: Documented6/8
SuuntoSuunto, Self-serve start: The docs say otherwiseSuunto, Sandbox or test mode: DocumentedSuunto, Public pricing: DocumentedSuunto, Published rate limits: Not documented in the pages readSuunto, Signed webhooks: Not documented in the pages readSuunto, PKCE: Not documented in the pages readSuunto, Refresh tokens: Not documented in the pages readSuunto, Disconnect or deletion call: Not documented in the pages read2/8
TerraTerra, Self-serve start: Not documented in the pages readTerra, Sandbox or test mode: DocumentedTerra, Public pricing: DocumentedTerra, Published rate limits: DocumentedTerra, Signed webhooks: DocumentedTerra, PKCE: Not applicableTerra, Refresh tokens: Not applicableTerra, Disconnect or deletion call: Not documented in the pages read4/6
WahooWahoo, Self-serve start: The docs say otherwiseWahoo, Sandbox or test mode: DocumentedWahoo, Public pricing: DocumentedWahoo, Published rate limits: DocumentedWahoo, Signed webhooks: The docs say otherwiseWahoo, PKCE: DocumentedWahoo, Refresh tokens: DocumentedWahoo, Disconnect or deletion call: Documented6/8
WHOOPWHOOP, Self-serve start: DocumentedWHOOP, Sandbox or test mode: DocumentedWHOOP, Public pricing: DocumentedWHOOP, Published rate limits: DocumentedWHOOP, Signed webhooks: DocumentedWHOOP, PKCE: Not documented in the pages readWHOOP, Refresh tokens: DocumentedWHOOP, Disconnect or deletion call: Documented7/8
WithingsWithings, Self-serve start: DocumentedWithings, Sandbox or test mode: DocumentedWithings, Public pricing: DocumentedWithings, Published rate limits: DocumentedWithings, Signed webhooks: The docs say otherwiseWithings, PKCE: Not documented in the pages readWithings, Refresh tokens: DocumentedWithings, Disconnect or deletion call: Not documented in the pages read5/8
Documented by8 of 1310 of 138 of 1311 of 135 of 132 of 129 of 118 of 13
  • ✓ Documented: the vendor's page states it (the mark links the quote)
  • ✗ The vendor's page says otherwise, for example that access needs approval (the mark links the quote)
  • n.d. Not documented in the pages read, which is not the same as no
  • n/a Does not apply to how this API authenticates or issues tokens

What each check asks

Self-serve start
Can a developer create credentials and start building without an application being approved first? Documented when the vendor's page says you can register an app or client yourself, or that a new app works for a small number of users before review. Absent when the page says access starts with a request the vendor approves.
Sandbox or test mode
Is there a sandbox, demo user, test environment or development tier? Documented when the vendor's page names a sandbox, demo user, test or development environment, or a development-only tier.
Public pricing
Does the vendor state on a public page what API access costs, including that it is free? Documented when a vendor page states a price or states that access is free or at no charge. A page that says terms are tailored, with no number, is not counted.
Published rate limits
Does the vendor publish its request limits, or state that there are none? Read from the rate-limit calculator: documented when it lists at least one limit with its number, or the vendor's statement that the API is not rate limited; not documented when the calculator lists the vendor as publishing no number.
Signed webhooks
Are webhook requests cryptographically signed, so a receiver can verify the body? Read from the webhook library: documented when the vendor's scheme is an HMAC the verifier recomputes, or its page says the payload is signed. Absent when the vendor documents a shared token instead, which proves the sender knows a secret but not that the body is untouched.
PKCE
Does the OAuth documentation describe PKCE (code_challenge and code_verifier)? Read from the OAuth playground: documented when PKCE is recommended or supported on the vendor's page.
Refresh tokens
Is the refresh-token flow documented? Read from the OAuth playground: documented when the vendor's page describes refreshing (the call, or that refresh tokens rotate). Not applicable when the vendor says access tokens do not expire.
Disconnect or deletion call
Is there a documented API call that disconnects a user (revoke, deauthorize, deregister) or deletes their data? Documented when the vendor's page names an endpoint or API method that revokes a user's authorization, deregisters the user, or deletes their data. A setting the user changes on the vendor's site is not counted.

Each API, check by check

Concept2 Logbook: 5/8 documented

The Concept2 Logbook guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✓ Documented

You set up and manage your own client on the API Keys page.

To use it, you’ll need to set up an API key on the "API Keys" page. There, you can set up and manage your own client and get the client information needed to authenticate users using OAuth.

Apps that write data develop on log-dev and need Concept2's approval for the live API.

If you are writing data to the Logbook, before using the live API, you must first develop against the development server and database on https://log-dev.concept2.com . When ready, please contact Concept2 for approval for the live API.

Sandbox or test mode✓ Documented

A development server and database at log-dev.concept2.com.

Applications requesting write permissions should be set up on log-dev.concept2.com .

Public pricingn.d. Not documented in the pages read

The developer pages read state no price.

Published rate limits✓ Documented

Concept2 says the API is not currently rate limited, that this may change, and that abuse will bring rate limits or removal of access.

The API is not currently rate limited. This may change in the future. Abuse of the API will result in either rate limits or removal of access.

Signed webhooksn.d. Not documented in the pages read

Concept2 has a webhook for results added, updated or deleted; the pages read describe no signature.

Through your self-service developer portal, you can register and manage a webhook that will fire when a relevant result is added, updated, or deleted.

PKCEn.d. Not documented in the pages read

Not mentioned on the Logbook API pages read.

Refresh tokens✓ Documented

Every application gets the authorization-code and refresh grants.

All applications have access to the Authorization Code and Refresh grant types.

Disconnect or deletion call✓ Documented

DELETE on a result deletes that workout.

DELETE api/users/me/results/123 will delete a specific workout

README badge:

Concept2 Logbook openness

[![Concept2 Logbook openness](https://aifitnessapi.com/badges/openness/concept2.svg)](https://aifitnessapi.com/openness-index#openness-concept2)

Badge text: Concept2 Logbook openness: 5/8 documented

COROS: 3/8 documented

The COROS guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✗ The docs say otherwise

Partner API access is by application: a form and an email to COROS.

To apply, submit your platform details using the form below and email

COROS lists a registered company among the requirements.

Registered company with authorized technical representative

Sandbox or test moden.d. Not documented in the pages read

The help-center articles read name no sandbox or test environment.

Public pricingn.d. Not documented in the pages read

The help-center articles read state no price.

Published rate limits✓ Documented

1,000 per minute.

Rate limit: 1,000 calls/minute

Signed webhooksn.d. Not documented in the pages read

COROS lists webhook push in its Partner API but the articles read show no payload or signature.

PKCEn.d. Not documented in the pages read

Not mentioned in the help-center articles read.

Refresh tokens✓ Documented

The Partner API's OAuth 2.0 list includes refresh.

OAuth 2.0 (authorize, access token, refresh, deauthorize, bind state)

Disconnect or deletion call✓ Documented

The Partner API lists a deauthorize call.

OAuth 2.0 (authorize, access token, refresh, deauthorize, bind state)

README badge:

COROS openness

[![COROS openness](https://aifitnessapi.com/badges/openness/coros.svg)](https://aifitnessapi.com/openness-index#openness-coros)

Badge text: COROS openness: 3/8 documented

Dexcom: 4/8 documented

The Dexcom guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✓ Documented

Registration is free and gives you app credentials.

Registration is simple and free, however, and provides access to app credentials and Support Requests .

Limited Access covers up to 5 users for testing with real data; more needs Dexcom's review.

Limited access allows you to authenticate up to 5 users for testing with real data.

Sandbox or test mode✓ Documented

A sandbox environment at sandbox-api.dexcom.com with sandbox users.

To target the sandbox environment, use https://sandbox-api.dexcom.com as the base URL for requests.

Public pricingn.d. Not documented in the pages read

Registration is free; the pages read state no price for full access, which follows a technical and commercial review.

Once application is complete, Dexcom will setup a technical and commercial review of your app.

Published rate limits✓ Documented

60,000 per hour.

Request frequency is limited to 60,000 calls per app per hour. If the limit is exceeded, an HTTP 429 response is returned.

Signed webhooksn.d. Not documented in the pages read

Dexcom's webhook documentation was not among the pages read.

PKCEn.d. Not documented in the pages read

Not mentioned. Dexcom also requires tokens and the client secret to live on your server, not on a phone.

Refresh tokens✓ Documented

Each refresh token works once and is replaced by a new one; each lasts at most a year. A 400 on refresh means it is no longer valid: send the user through login again.

Each refresh_token can be used only once.

Disconnect or deletion calln.d. Not documented in the pages read

Users can revoke access on Dexcom.com; the pages read name no API call for it.

Users can revoke their authorization at any time at Dexcom.com by signing in to their account and changing their authorizations in Permissions.

README badge:

Dexcom openness

[![Dexcom openness](https://aifitnessapi.com/badges/openness/dexcom.svg)](https://aifitnessapi.com/openness-index#openness-dexcom)

Badge text: Dexcom openness: 4/8 documented

Garmin: 1/8 documented

The Garmin guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✗ The docs say otherwise

Access starts with a request Garmin approves.

After you request access to the Garmin Connect Developer Program and your request has been approved, you will be granted access to the Garmin Developer Portal and can get started on your integration right away.

Sandbox or test mode✓ Documented

An evaluation environment for testing, after approval.

After approval, you will have access to an evaluation environment to test the Garmin Connect Health API.

Public pricingn.d. Not documented in the pages read

Enterprise terms are tailored; the current program pages read state no Starter price.

Designed for companies operating at scale requiring capabilities beyond Starter Access. Available options and commercial terms are tailored based on business and technical requirements.

Published rate limitsn.d. Not documented in the pages read

Garmin's public program pages publish no request limits; the overview gives Starter a "Limited" user capacity without a number.

Push only Historical Data Not included User Capacity Limited

Signed webhooksn.d. Not documented in the pages read

No public Garmin page read shows a push payload or how it is signed.

PKCEn.d. Not documented in the pages read

Garmin's OAuth reference was not among the pages read; the program FAQ says only that the APIs use OAuth 2.0.

Refresh tokensn.d. Not documented in the pages read

Garmin's OAuth reference was not among the pages read.

Disconnect or deletion calln.d. Not documented in the pages read

The program pages read name no deregistration or deletion call.

README badge:

Garmin openness

[![Garmin openness](https://aifitnessapi.com/badges/openness/garmin.svg)](https://aifitnessapi.com/openness-index#openness-garmin)

Badge text: Garmin openness: 1/8 documented

Google Health API: 5/8 documented

The Google Health API guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✓ Documented

A new OAuth client works unverified, capped at 100 users.

By default, newly created OAuth clients are in an unverified state with a cap of 100 users for both testing and production purposes.

Sandbox or test moden.d. Not documented in the pages read

The unverified state is the same for testing and production; the pages read name no separate sandbox.

Public pricingn.d. Not documented in the pages read

The pages read state no price for the API.

Published rate limits✓ Documented

Default quotas, per project (daily): 86.4M requests / day; per project (minutely): 120,000 requests / minute; per user (minutely): 300 requests / minute.

300 requests / minute

Signed webhooks✓ Documented

Google sends the endpointAuthorization secret you configured in the Authorization header. It also signs the raw JSON with Tink (ECDSA P-256, SHA-256), base64 in GOOGLE-HEALTH-API-SIGNATURE, keys rotated every 30 days and published as a JSON keyset.

the raw JSON payload of every outgoing webhook notification is signed with a private key using Tink's PublicKeySign

PKCEn.d. Not documented in the pages read

Not described on Google's web-server OAuth page, which the OAuth playground follows.

Refresh tokens✓ Documented

access_type=offline gets a refresh token on the first exchange only. Refresh tokens last until revoked or expired, and Google caps how many it issues per client and user.

Refresh tokens are valid until the user revokes access or the refresh token expires.

Disconnect or deletion call✓ Documented

batchDelete deletes a user's data points.

Use the `batchDelete` method to delete an array of a user's Fitbit app data.

README badge:

Google Health API openness

[![Google Health API openness](https://aifitnessapi.com/badges/openness/google-health.svg)](https://aifitnessapi.com/openness-index#openness-google-health)

Badge text: Google Health API openness: 5/8 documented

Oura: 8/8 documented

The Oura guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✓ Documented

A new app works for up to 10 users; Oura's approval is needed beyond that.

By default, API Applications have a ten user limit. If you want to release your application to a wider audience, your application needs to be approved.

Sandbox or test mode✓ Documented

A sandbox endpoint with fake data for every data type.

Fake user data that you can access without an Oura account. There is a corresponding sandbox endpoint to each available data type.

Public pricing✓ Documented

Free for personal and commercial applications.

Yes, the Oura API is free to use for both personal and commercial applications.

Published rate limits✓ Documented

5,000 per 5 minutes.

The Oura API is limited to 5000 requests per 5-minute period.

Signed webhooks✓ Documented

HMAC-SHA256 keyed by your client secret over the x-oura-timestamp value followed by JSON.stringify(body), hex, upper-case, in x-oura-signature.

hmac.update(timestamp + JSON.stringify(body));

PKCE✓ Documented

Recommended. code_challenge_method must be S256; the verifier is 43 to 128 characters, hashed with SHA-256 and base64url-encoded without padding.

between 43 and 128 characters long (inclusive), then hash it with SHA256 and encode the digest in base64url format without padding

Refresh tokens✓ Documented

grant_type=refresh_token at the token URL returns a new access token and a new refresh token; each refresh token works once.

The refresh token is single-use, meaning it is invalidated after being used.

Disconnect or deletion call✓ Documented

A token revocation endpoint.

https://api.ouraring.com/oauth/revoke?access_token={access_token}

README badge:

Oura openness

[![Oura openness](https://aifitnessapi.com/badges/openness/oura.svg)](https://aifitnessapi.com/openness-index#openness-oura)

Badge text: Oura openness: 8/8 documented

Polar AccessLink: 5/7 documented

The Polar AccessLink guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✓ Documented

Any registered Polar Flow user can create an API client.

Any registered Polar Flow user can create API client to AccessLink by filling application details at https://admin.polaraccesslink.com

Sandbox or test moden.d. Not documented in the pages read

The AccessLink reference read names no sandbox or test environment.

Public pricing✓ Documented

Free of charge at the moment; Polar reserves the right to charge.

At the moment Polar offers the use and activation of Polar API's free of charge.

Published rate limits✓ Documented

500 + 20 per user per 15 minutes; 5,000 + 100 per user per 24 hours.

15min rate limit: 500 + number of users x 20

Signed webhooks✓ Documented

HMAC-SHA256 of the payload, keyed by the signature_secret_key returned once when you create the webhook, hex, in Polar-Webhook-Signature; the event type is in Polar-Webhook-Event.

Hash-based message authentication code (HMAC SHA-256) is used to sign every webhook payload Accesslink sends.

PKCEn.d. Not documented in the pages read

Not mentioned on the AccessLink reference.

Refresh tokensn/a Not applicable

No refresh flow is documented: the token response lists no refresh_token, and the reference says access tokens do not expire unless revoked.

Access tokens will not expire unless explicitly revoked by partners or users.

Disconnect or deletion call✓ Documented

Deregistering a user revokes the token.

When partner wishes no longer to receive user data, user can be de-registered. This will revoke the access token authorized by user.

README badge:

Polar AccessLink openness

[![Polar AccessLink openness](https://aifitnessapi.com/badges/openness/polar.svg)](https://aifitnessapi.com/openness-index#openness-polar)

Badge text: Polar AccessLink openness: 5/7 documented

Strava: 6/8 documented

The Strava guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✓ Documented

Any registered Strava user can create an application.

Any registered Strava user can obtain an access_token by first creating an application at https://www.strava.com/settings/api .

Strava calls a Strava subscription a prerequisite for creating an app.

A Strava subscription is a prerequisite for creating an app.

Sandbox or test mode✓ Documented

New apps start in single-player mode, to build and test against your own data.

All new applications start in single-player mode. This is the default state where only your own Strava account can authenticate with the app, which lets you build and test your integration against your own data.

Public pricing✓ Documented

Currently at no charge.

Access to and use of the Strava API Materials and the Strava Platform are currently provided at no charge.

Published rate limits✓ Documented

100 non-upload, per 15 minutes; 1,000 non-upload, per day; 200 overall, per 15 minutes; 2,000 overall, per day (New app (default); 2 tiers published).

rate limit allows 100 requests every 15 minutes, with up to 1,000 requests per day.

Signed webhooksn.d. Not documented in the pages read

No signature is documented for event POSTs. Subscription validation is a GET with hub.mode, hub.challenge and hub.verify_token; echo hub.challenge as JSON.

The query string of this GET request will contain a "hub.challenge" field that you must use to validate your callback address.

PKCEn.d. Not documented in the pages read

Not mentioned on Strava's Authentication page.

Refresh tokens✓ Documented

Refresh with grant_type=refresh_token. If the current access token expires in more than an hour, the same one comes back; once a new refresh token is returned the old one stops working.

Once a new refresh token is returned, the older refresh token is invalidated immediately.

Disconnect or deletion call✓ Documented

Deauthorizing invalidates every token the app holds for the athlete.

Applications can revoke access to an athlete’s data. This will invalidate all refresh tokens and access tokens that the application has for the athlete

README badge:

Strava openness

[![Strava openness](https://aifitnessapi.com/badges/openness/strava.svg)](https://aifitnessapi.com/openness-index#openness-strava)

Badge text: Strava openness: 6/8 documented

Suunto: 2/8 documented

The Suunto guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✗ The docs say otherwise

Applications are reviewed weekly; the wait is up to two weeks.

The applications are reviewed on weekly bases, so you have to wait few days prior getting the acceptance. There is maximum two week waiting period.

Sandbox or test mode✓ Documented

A Development API with every endpoint and smaller request limits.

The Development API includes all the endpoints but has smaller request limits.

Public pricing✓ Documented

Suunto does not charge for the API.

We do not charge from the use of the API.

Published rate limitsn.d. Not documented in the pages read

Suunto says the developer API is rate-limited and has smaller limits than production, but publishes neither number.

There developer API has same capabilities as the production API. However, the number of calls you can do with developer API are rate-limited.

Signed webhooksn.d. Not documented in the pages read

Not documented on Suunto's FAQ. The webhook address is set in your app's OAuth settings in Suunto API Zone and must be publicly reachable.

You can setup the webhook in your app oauth settings under your profile in Suunto Apizone

PKCEn.d. Not documented in the pages read

Not mentioned on Suunto's quick-start or FAQ.

Refresh tokensn.d. Not documented in the pages read

The token response includes a refresh_token, but the pages read here document no refresh request, so the OAuth playground prints none.

"refresh_token": "<JWT_REFRESH_TOKEN>"

Disconnect or deletion calln.d. Not documented in the pages read

The API Zone pages read name no deauthorization or deletion call.

README badge:

Suunto openness

[![Suunto openness](https://aifitnessapi.com/badges/openness/suunto.svg)](https://aifitnessapi.com/openness-index#openness-suunto)

Badge text: Suunto openness: 2/8 documented

Terra: 4/6 documented

The Terra guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve startn.d. Not documented in the pages read

The pages read describe the dashboard's credentials but not whether a new account is reviewed.

Sandbox or test mode✓ Documented

Testing and staging environments, each capped at 50 users.

Note that for testing & staging, there is a user limit of 50 users on each environment.

Public pricing✓ Documented

Published plans from $399 a month billed annually.

Subscriptions start from $399 per month billed annually, or $499 per month billed monthly. That includes 100,000 Unified API credits each month, and you only pay extra if your usage goes beyond them.

Published rate limits✓ Documented

6,000 requested days per hour, per user.

your code has issued requests for this user totalling more than 6,000 days in the current hour

Signed webhooks✓ Documented

terra-signature: t=<timestamp>,v1=<signature>; HMAC-SHA256 keyed by the webhook's signing secret over the timestamp, a "." and the raw body. Ignore schemes other than v1.

Compute an HMAC with the SHA256 hash function. Use the endpoint’s signing secret as the key, and use the signed_payload string as the message.

PKCEn/a Not applicable

Your server calls Terra with a dev-id and an API key; the pages read describe no OAuth client on your side.

dev-id string Required Your developer ID for authentication and tracking

Refresh tokensn/a Not applicable

Your server calls Terra with a dev-id and an API key; the pages read describe no OAuth client on your side.

dev-id string Required Your developer ID for authentication and tracking

Disconnect or deletion calln.d. Not documented in the pages read

Terra sends a deauth event when a user disconnects; the pages read name no call your app makes for it.

deauth Occurs when a user deauthenticates through the Terra

README badge:

Terra openness

[![Terra openness](https://aifitnessapi.com/badges/openness/terra.svg)](https://aifitnessapi.com/openness-index#openness-terra)

Badge text: Terra openness: 4/6 documented

Wahoo: 6/8 documented

The Wahoo guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✗ The docs say otherwise

Wahoo limits the API to those who request it.

Wahoo Fitness is currently limiting use of the API to those who request it, as well as provide more information about the scopes involved and the purpose of the application.

Sandbox or test mode✓ Documented

Sandbox and Production are separate applications.

Sandbox and Production are separate applications. A Sandbox app cannot later be converted into a Production app.

Public pricing✓ Documented

Currently at no charge; Wahoo reserves the right to charge.

Access to and use of the Wahoo API Materials and Wahoo Platform are currently provided at no charge.

Published rate limits✓ Documented

25 per 5 minutes; 100 per hour; 250 per day (Sandbox; 2 tiers published).

Requests every 5 Min: 25 200

Signed webhooks✗ The docs say otherwise

No signature. Wahoo sends the webhook_token you set in the app's webhook settings inside the JSON body; ignore any request without it.

Specify a token that you would like us to send. Any request that doesn't include this token should be ignored.

PKCE✓ Documented

Supported once the app's Confidential field is set to No; S256 or plain. With PKCE the token and refresh calls send code_verifier instead of client_secret.

The Wahoo API does allow users to use the PKCE flow for authorization.

Refresh tokens✓ Documented

Refresh returns a new access and refresh token. The previous pair is revoked only when an API call uses the new access token, so refresh just before a request: apps are limited to 10 unrevoked tokens per user.

Access tokens should only be refreshed immediately prior to making an API request.

Disconnect or deletion call✓ Documented

DELETE /v1/permissions deauthorizes the user.

DELETE https://api.wahooligan.com/v1/permissions

README badge:

Wahoo openness

[![Wahoo openness](https://aifitnessapi.com/badges/openness/wahoo.svg)](https://aifitnessapi.com/openness-index#openness-wahoo)

Badge text: Wahoo openness: 6/8 documented

WHOOP: 7/8 documented

The WHOOP guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✓ Documented

Build and test on the 10-member Sandbox tier without a request.

Every new app starts on the Sandbox tier, which allows up to 10 WHOOP members to connect. You can build and test on Sandbox without submitting a request. When you need more members, request the next tier from the Developer Dashboard .

A WHOOP membership is required to develop an app.

You must have a WHOOP membership to develop an app on the Developer Platform. Your WHOOP account is also your WHOOP developer login.

Sandbox or test mode✓ Documented

Every new app starts on the Sandbox tier.

Every new app starts on the Sandbox tier, which allows up to 10 WHOOP members to connect.

Public pricing✓ Documented

Currently at no charge, with notice before that changes.

Access to and use of the APIs is currently provided at no charge. In the event WHOOP decides to start charging for use of the APIs in the future, WHOOP will provide Company with prior notice.

Published rate limits✓ Documented

100 per minute; 10,000 per day.

All clients are subject to two sets of rate limiting for requests. By default, clients may only send: 100 requests per minute. 10,000 requests per day.

Signed webhooks✓ Documented

Base64 of HMAC-SHA256, keyed by your client secret, over the X-WHOOP-Signature-Timestamp value (milliseconds since epoch) followed by the raw body, in X-WHOOP-Signature.

calculated_signature_string = base64Encode(HMACSHA256(timestamp_header + raw_http_request_body, client_secret))

PKCEn.d. Not documented in the pages read

Not mentioned on the WHOOP OAuth page or API reference read here.

Refresh tokens✓ Documented

Using the refresh token invalidates the existing access tokens; the refresh token in the response replaces the old one, and of two simultaneous refreshes only the first succeeds.

Existing access tokens are invalidated once your app uses the refresh token to generate a new access token.

Disconnect or deletion call✓ Documented

The revokeUserOauthAccess endpoint.

To revoke an access token, you can use the revokeUserOauthAccess API endpoint.

README badge:

WHOOP openness

[![WHOOP openness](https://aifitnessapi.com/badges/openness/whoop.svg)](https://aifitnessapi.com/openness-index#openness-whoop)

Badge text: WHOOP openness: 7/8 documented

Withings: 5/8 documented

The Withings guide lists every page read. Share: card (PNG) · link to this row

CheckStateWhat the vendor’s page says
Self-serve start✓ Documented

No prerequisites to get access.

There are no prerequisites, and free access is provided.

Sandbox or test mode✓ Documented

mode=demo signs in a demo user.

you can use the optional parameter mode with the value demo . You will be redirected to the authorisation page and automatically logged in as a demo user.

Public pricing✓ Documented

Free access on the public API.

There are no prerequisites, and free access is provided.

Withings' developer site, as captured on October 16, 2026, said Withings+ becomes required on the free plan from October 12, 2026.

Withings+ becomes required on the Start for Free API plan from October 12, 2026.

Published rate limits✓ Documented

120 per minute.

The standard Withings API enforces a 120 requests-per-minute limit across your application

Signed webhooks✗ The docs say otherwise

No body signature. Append a secret query parameter to the callback URL (Withings' example: ?token=<random-secret>) and check it, plus an allowlist of the IP ranges Withings publishes as DNS TXT records.

Your handler reads token from the incoming request and rejects any value that doesn't match the secret you configured.

PKCEn.d. Not documented in the pages read

Not mentioned on the Withings authorization or token pages.

Refresh tokens✓ Documented

Withings says to call the same requesttoken service with the refresh token and always keep the new refresh token, but its snippet shows only the code exchange, so the OAuth playground prints no refresh command rather than guess its parameters.

To request a new access_token using the refresh_token, call the requesttoken webservice

Disconnect or deletion calln.d. Not documented in the pages read

The developer-guide pages read name no revoke or deletion call.

README badge:

Withings openness

[![Withings openness](https://aifitnessapi.com/badges/openness/withings.svg)](https://aifitnessapi.com/openness-index#openness-withings)

Badge text: Withings openness: 5/8 documented

How the index is built

Four checks are read straight from data the site already keeps for its tools. PKCE and refresh tokens come from the OAuth playground’s per-vendor facts; published rate limits from the rate-limit calculator (and Google’s generated quota table); signed webhooks from the webhook payload library and the check each vendor gets in the webhook verifier. When one of those changes, the index changes with it at the next build.

The other four, self-serve start, sandbox, public pricing and a disconnect or deletion call, are one quote each, copied verbatim from an evidence file the site already holds for an integration guide or a pricing page. Those files are re-read against the live vendor pages every week by the source-quotes check, so a sentence a vendor removes turns the check red.

The count is documented basics over the basics that apply. A basic the pages read do not mention scores nothing and is labeled as not documented: it is a statement about what was read, not a finding that the vendor lacks it. Nothing is weighted and nothing is ranked; the table is alphabetical. KinesteX, which funds this site, makes a motion SDK rather than a wearable-data API, so it is not in the index.

Not scored

Every vendor’s count is also a README badge, and every API in the graveyard has a status badge: embeds and badges.

Frequently asked questions

How is the openness score counted?

One point for each of the eight basics the vendor's own pages document, divided by the basics that apply to that API. Nothing is weighted, so a sandbox counts the same as PKCE. A basic counts only when a quoted vendor sentence states it; Polar AccessLink is scored out of 7 and Terra is scored out of 6, because some basics do not apply to how they authenticate or issue tokens.

Does “not documented” mean a vendor lacks that feature?

No. It means the pages this site read for its integration guides, OAuth playground, webhook library and rate-limit calculator do not state it. A vendor may support PKCE or sign webhooks without saying so on those pages. Where a vendor's page does say something else, such as access needing approval or a shared token instead of a signature, the cell quotes it and is marked separately.

Which wearable APIs describe PKCE in their OAuth documentation?

2 of the 12 APIs here with an OAuth flow: Oura and Wahoo. The others' authorization pages, as read for the OAuth playground, do not mention it.

Which wearable APIs sign the webhooks they send?

Google Health API, Oura, Polar AccessLink, Terra and WHOOP: 5 of 13. Wahoo and Withings document a shared token instead, which proves the sender knows a secret but not that the body is unchanged.

Why are HealthKit and Health Connect not in the openness index?

They are on-device frameworks. There is no developer account to apply for, request limit, webhook or OAuth client to check, so the eight basics do not describe them.

Next step

Turning this into a choice of API:

By AIFitnessAPI. Cite as: AIFitnessAPI, “The fitness API openness index,” https://aifitnessapi.com/openness-index, compiled November 6, 2026.