Skip to content
AF
Free Tool

Will your sync schedule fit the API’s rate limit?

Enter your active users, how often each syncs and how many endpoints a sync calls, and this works out the requests you make per window against the rate limits 13 fitness and health APIs document, including WHOOP's 100 a minute and 10,000 a day, Strava's 15-minute and daily limits, Oura's 5,000 per 5 minutes and Polar's limits that grow with registered users. It shows which limit binds first, the most users that sync pattern supports, and the mitigations each vendor documents, such as webhooks or backoff. 7 APIs whose limits are not published are listed as not documented. Every number is quoted from the vendor's page, read between 2026-10-17 and 2026-11-05; it runs in your browser.

Your traffic

72,000 requests a day · 50 a minute on average

Share this result

API and tierBinds firstYou useShareMost users at this pattern
Wahoo250 requests per dayper day · whole app · source72,00028,800%over the limit3
Strava1,000 requests per daynon-upload, per day · whole app · source72,0007,200%over the limit13
WHOOPDefault10,000 requests per dayper day · whole app · source72,000720%over the limit138
WodifyDefault500,000 requests per 31 daysper calendar month · scope not stated; applied to whole app · source2,232,000446%over the limit224
Polar AccessLinkDynamic105,000 requests per dayper 24 hours · whole app · source72,00069%no ceiling
WithingsStandard120 requests per minuteper minute · whole app · source5042%2,400
OuraDefault5,000 requests per 5 minutesper 5 minutes · scope not stated; applied to whole app · source2505%20,000
DexcomDefault60,000 requests per hourper hour · whole app · source3,0005%20,000
COROS (Partner API)Partner API1,000 requests per minuteper minute · scope not stated; applied to whole app · source505%20,000
TeamUpDefault250 requests per minuteper minute, per caller · per user · source31.2%no ceiling
Google Health API300 requests per minuteper minute, per user · per user · source31%no ceiling
TerraData-read endpoints6,000 requested days per hourrequested days per hour, per user · per user · source3<0.1%no ceiling

Every limit, at your numbers

APILimitAllowedYou useShare
Wahooper 5 minutes252501,000%
Wahooper hour1003,0003,000%
Wahooper day25072,00028,800%
Stravanon-upload, per 15 minutes100750750%
Stravanon-upload, per day1,00072,0007,200%
Stravaoverall, per 15 minutes200750375%
Stravaoverall, per day2,00072,0003,600%
WHOOPper minute1005050%
WHOOPper day10,00072,000720%
Wodifyper second (sustained)5360%
Wodifyper calendar month500,0002,232,000446%
Polar AccessLinkper 15 minutes20,5007503.7%
Polar AccessLinkper 24 hours105,00072,00069%
Withingsper minute1205042%
Ouraper 5 minutes5,0002505%
Dexcomper hour60,0003,0005%
COROS (Partner API)per minute1,000505%
TeamUpper minute, per caller25031.2%
Google Health APIper minute, per user30031%
Google Health APIper minute, per project120,00050<0.1%
Google Health APIper day, per project86,400,00072,000<0.1%
Terrarequested days per hour, per user6,0003<0.1%

Every documented limit

WHOOP

TierLimitAllowedScopeVendor’s words
Defaultper minute100 requests per minutewhole app“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.” (source)
Defaultper day10,000 requests per daywhole app“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.” (source)

WHOOP says every client may send these; the client is your app.

Mitigations WHOOP documents

  • Webhooks for workout, sleep and recovery changes, instead of polling those (source)
  • Ask for a rate limit increase from the Developer Dashboard (Open Request) (source)

Sources read 2026-10-17 · guide

Strava

TierLimitAllowedScopeVendor’s words
New app (default)non-upload, per 15 minutes100 requests per 15 minuteswhole app“rate limit allows 100 requests every 15 minutes, with up to 1,000 requests per day.” (source)
New app (default)non-upload, per day1,000 requests per daywhole app“rate limit allows 100 requests every 15 minutes, with up to 1,000 requests per day.” (source)
New app (default)overall, per 15 minutes200 requests per 15 minuteswhole app“The default overall rate limit allows 200 requests every 15 minutes, with up to 2,000 requests per day.” (source)
New app (default)overall, per day2,000 requests per daywhole app“The default overall rate limit allows 200 requests every 15 minutes, with up to 2,000 requests per day.” (source)
Self-service upgraderead, per 15 minutes200 requests per 15 minuteswhole app“Once your app is configured in your API dashboard, you can upgrade your access directly from your API Settings Dashboard. This raises your access to: Athlete capacity of 10 Read read limits: 200 requests / 15min & 2,000 requests / day Overall rate limits: 400 requests / 15min & 4,000 requests / day” (source)
Self-service upgraderead, per day2,000 requests per daywhole app“Once your app is configured in your API dashboard, you can upgrade your access directly from your API Settings Dashboard. This raises your access to: Athlete capacity of 10 Read read limits: 200 requests / 15min & 2,000 requests / day Overall rate limits: 400 requests / 15min & 4,000 requests / day” (source)
Self-service upgradeoverall, per 15 minutes400 requests per 15 minuteswhole app“Once your app is configured in your API dashboard, you can upgrade your access directly from your API Settings Dashboard. This raises your access to: Athlete capacity of 10 Read read limits: 200 requests / 15min & 2,000 requests / day Overall rate limits: 400 requests / 15min & 4,000 requests / day” (source)
Self-service upgradeoverall, per day4,000 requests per daywhole app“Once your app is configured in your API dashboard, you can upgrade your access directly from your API Settings Dashboard. This raises your access to: Athlete capacity of 10 Read read limits: 200 requests / 15min & 2,000 requests / day Overall rate limits: 400 requests / 15min & 4,000 requests / day” (source)

Strava limits usage per application, with a 15-minute and a daily limit; the 15-minute window resets on the quarter hour and the daily one at midnight UTC.

Mitigations Strava documents

  • Implement webhooks when activity polling hits the daily limit (source)
  • Throttle backfills by reading the rate-limit response headers (source)

Sources read 2026-10-17 · guide

Oura

TierLimitAllowedScopeVendor’s words
Defaultper 5 minutes5,000 requests per 5 minutesnot stated (applied to whole app)“The Oura API is limited to 5000 requests per 5-minute period.” (source)

Oura enforces a per-access-token and a per-application layer but gives this one figure without saying which layer it is, so it is applied here to your whole app, the stricter reading.

Mitigations Oura documents

  • Webhooks: Oura says customers who implement them properly have not hit rate limits (source)
  • One historical request when a user connects, then webhooks (source)
  • Retry from the rate-limit headers rather than a fixed-interval backoff (source)

Sources read 2026-10-17 · guide

Polar AccessLink

TierLimitAllowedScopeVendor’s words
Dynamicper 15 minutes500 + 20 × users requests per 15 minuteswhole app“15min rate limit: 500 + number of users x 20” (source)
Dynamicper 24 hours5,000 + 100 × users requests per daywhole app“24h rate limit: 5000 + number of users x 100” (source)

Polar scales the limit with the number of registered users and updates it daily; the users you enter are used as that number.

Mitigations Polar AccessLink documents

  • A webhook, which must answer Polar's ping when you create it (source)

Sources read 2026-10-17 · guide

Withings

TierLimitAllowedScopeVendor’s words
Standardper minute120 requests per minutewhole app“The standard Withings API enforces a 120 requests-per-minute limit across your application” (source)

Withings says the limit applies across your application.

Mitigations Withings documents

  • Notifications: Withings POSTs when new data arrives, then you fetch (source)
  • Fetch with lastupdate to get everything changed since your last sync (source)

Sources read 2026-10-17 · guide

Wahoo

TierLimitAllowedScopeVendor’s words
Sandboxper 5 minutes25 requests per 5 minuteswhole app“Requests every 5 Min: 25 200” (source)
Sandboxper hour100 requests per hourwhole app“Requests per Hour: 100 1000” (source)
Sandboxper day250 requests per daywhole app“Requests per Day: 250 5000” (source)
Productionper 5 minutes200 requests per 5 minuteswhole app“Requests every 5 Min: 25 200” (source)
Productionper hour1,000 requests per hourwhole app“Requests per Hour: 100 1000” (source)
Productionper day5,000 requests per daywhole app“Requests per Day: 250 5000” (source)

The lines read do not say whether the limit is per app or per user, so it is applied here to your whole app. Authentication, token refreshes and file downloads do not count.

Mitigations Wahoo documents

  • The workout_summary webhook (source)
  • Ask support for higher throughput (source)

Sources read 2026-10-17 · guide

Dexcom

TierLimitAllowedScopeVendor’s words
Defaultper hour60,000 requests per hourwhole app“Request frequency is limited to 60,000 calls per app per hour. If the limit is exceeded, an HTTP 429 response is returned.” (source)

Dexcom limits calls per app.

Mitigations Dexcom documents

None in the pages read.

Sources read 2026-10-17 · guide

COROS (Partner API)

TierLimitAllowedScopeVendor’s words
Partner APIper minute1,000 requests per minutenot stated (applied to whole app)“Rate limit: 1,000 calls/minute” (source)

The line read does not say whether the figure is per app or per user, so it is applied here to your whole app. The MCP path's rate limit is not stated.

Mitigations COROS (Partner API) documents

  • Partner API webhooks push workout data within about 5 minutes (source)

Sources read 2026-10-17 · guide

TeamUp

TierLimitAllowedScopeVendor’s words
Defaultper minute, per caller250 requests per minuteper user“Unless otherwise noted in an endpoint's description, the rate limit is 250 requests per minute for a caller. The caller is identified by the authenticated user or in the case of unauthenticated endpoints, the IP address.” (source)

The caller is the authenticated user (or the IP address for unauthenticated endpoints), so the limit is applied per user.

Mitigations TeamUp documents

  • Event notifications with webhooks (source)

Sources read 2026-10-17 · guide

Wodify

TierLimitAllowedScopeVendor’s words
Defaultper second (sustained)5 requests per secondnot stated (applied to whole app)“Rate 5 requests per second” (source)
Defaultper calendar month500,000 requests per 31 daysnot stated (applied to whole app)“Quota 500,000 requests per month” (source)

Wodify also allows a burst of 20 requests above the rate before throttling. The lines read do not say whether the limits are per key or per user, so they are applied here to your whole app, and a month is taken as 31 days.

Mitigations Wodify documents

  • Exponential backoff on 429 (source)
  • Batch requests instead of looping single calls (source)
  • Cache data you reference often (source)

Sources read 2026-10-17 · guide

Terra

TierLimitAllowedScopeVendor’s words
Data-read endpointsrequested days per hour, per user6,000 requested days per hourper user“your code has issued requests for this user totalling more than 6,000 days in the current hour” (source)

Terra's limit counts days of data requested, not requests: each request counts the days its date range spans. Terra says it applies rate limits on data-read endpoints.

Mitigations Terra documents

  • Deliver to a webhook (or a database, bucket or queue) instead of reading (source)
  • Ranges over a month go through to_webhook and arrive asynchronously (source)
  • Terra handles retries and backoff against the providers' own limits (source)

Sources read 2026-11-05 · guide

Google Health API

TierLimitAllowedScopeVendor’s words
Default quotasper minute, per user300 requests per minuteper user“300 requests / minute” (source)
Default quotasper minute, per project120,000 requests per minutewhole app“120,000 requests / minute” (source)
Default quotasper day, per project86,400,000 requests per daywhole app“86.4M requests / day” (source)
Unverified appper minute, per user300 requests per minuteper user“300 requests / minute” (source)
Unverified appper minute, per project120,000 requests per minutewhole app“120,000 requests / minute” (source)
Unverified appper day, per project86,400,000 requests per daywhole app“86.4M requests / day” (source)
Unverified appper second, all users (unverified app)250 requests per secondwhole app“Unverified applications: Max 250 QPS total (capped at 100 users @ 2.5 QPS per user)” (source)
Unverified appper second, per user (unverified app)2.5 requests per secondper user“Unverified applications: Max 250 QPS total (capped at 100 users @ 2.5 QPS per user)” (source)

Google states per-project and per-user limits; the per-project ones are applied here to all of your app's traffic.

Mitigations Google Health API documents

  • Back off and retry on 429 (source)
  • Webhooks for 28 data types (source)

Sources read 2026-10-31 · guide

No limit, or not documented

  • Concept2 Logbook: no limit today. Concept2 says the API is not currently rate limited, that this may change, and that abuse will bring rate limits or removal of access. source Guide.
  • Garmin: not documented. Garmin's public program pages publish no request limits; the overview gives Starter a "Limited" user capacity without a number. source Guide, read 2026-10-22.
  • Suunto: not documented. Suunto says the developer API is rate-limited and has smaller limits than production, but publishes neither number. source Guide, read 2026-10-17.
  • Mindbody: not documented. Mindbody sets daily call limits when it issues your API key, plus system limits; no public number. source Guide, read 2026-10-17.
  • Glofox: not documented. Glofox documents a 429 when you exceed the rate limit, but the sections read do not state the limit. source Guide, read 2026-10-17.
  • Samsung Health Data SDK: not documented. An on-device SDK that reads Samsung Health on the phone; Samsung's pages describe no request limits. Guide, read 2026-10-17.
  • Mariana Tek: not documented. Rate limits do not appear in the guides read, and the Admin API reference was not among them. Guide, read 2026-10-17.
  • Fitbit Web API: not documented. Google's timeline sets its turn-off for November 2, 2026; its successor, the Google Health API, is in the table above. source Guide, read 2026-10-31.

What the calculator assumes

  • Each user syncs the number of times you set, and each sync makes the number of requests you set. Paging, retries and token refreshes are extra requests the calculator does not add for you; count them in “endpoints per sync”.
  • “Spread evenly” is the average load in each window. “All at once” is a cron that syncs every user at the same moment, the worst case for per-minute limits, which is how a schedule that fits the daily limit can still get 429s.
  • A limit is applied to your whole app or to each user as the vendor states. Where the vendor gives a number without saying which (Oura, COROS, Wodify, Wahoo), it is applied to the whole app, the stricter reading, and labeled.
  • Polar’s limits grow with registered users; the users you enter stand in for that count. The Google Health API’s unverified-app tier caps an app at 100 users, per Google, so its user count is not a free choice.
  • Terra counts days of data requested rather than requests, so set the days each request asks for. Strava’s figures assume read requests; uploads count only against its overall limit.
  • On-device stores are not modeled: their quotas are per app on the phone, not per server. Health Connect’s are covered in Health Connect ERROR_RATE_LIMIT_EXCEEDED.

A free tool from AIFitnessAPI. Which of these APIs carry the metrics you need, and which push them by webhook: the API coverage matrix. A retrying fetch wrapper that reads these headers: the rate-limit fetcher recipe. More at free tools for health-app builders.

Next step

Turning this into a choice of API: