---
title: "Will your sync schedule fit the API’s rate limit?"
canonical: "https://aifitnessapi.com/tools/rate-limit-calculator"
markdown: "https://aifitnessapi.com/tools/rate-limit-calculator.md"
type: "tool"
last_reviewed: "2026-11-05"
description: "Users × sync frequency × endpoints against WHOOP, Strava, Oura, Polar, Withings, Google Health and more: which documented limit binds first, what to do."
publisher: "AIFitnessAPI — funded by KinesteX; first-party pages disclose it"
cite_as: "\"Will your sync schedule fit the API’s rate limit?\", AIFitnessAPI, https://aifitnessapi.com/tools/rate-limit-calculator"
---

# 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.

- Canonical: https://aifitnessapi.com/tools/rate-limit-calculator
- Last reviewed: 2026-11-05
- Publisher: AIFitnessAPI (https://aifitnessapi.com)
- Cite as: "Will your sync schedule fit the API’s rate limit?", AIFitnessAPI, https://aifitnessapi.com/tools/rate-limit-calculator

---

*[Interactive: the calculator (users, syncs per day, endpoints per sync, timing), with the scenario kept in the URL, in the browser at https://aifitnessapi.com/tools/rate-limit-calculator; not reproduced in this mirror.]*

## Every documented limit

### WHOOP

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Default | per minute | 100 requests per minute | whole 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](https://developer.whoop.com/docs/developing/rate-limiting/)) |
| Default | per day | 10,000 requests per day | whole 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](https://developer.whoop.com/docs/developing/rate-limiting/)) |

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](https://developer.whoop.com/docs/developing/webhooks/))
- Ask for a rate limit increase from the Developer Dashboard (Open Request) ([source](https://developer.whoop.com/docs/developing/rate-limiting/))

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/whoop-api)

### Strava

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| New app (default) | non-upload, per 15 minutes | 100 requests per 15 minutes | whole app | “rate limit allows 100 requests every 15 minutes, with up to 1,000 requests per day.” ([source](https://developers.strava.com/docs/rate-limits/)) |
| New app (default) | non-upload, per day | 1,000 requests per day | whole app | “rate limit allows 100 requests every 15 minutes, with up to 1,000 requests per day.” ([source](https://developers.strava.com/docs/rate-limits/)) |
| New app (default) | overall, per 15 minutes | 200 requests per 15 minutes | whole app | “The default overall rate limit allows 200 requests every 15 minutes, with up to 2,000 requests per day.” ([source](https://developers.strava.com/docs/rate-limits/)) |
| New app (default) | overall, per day | 2,000 requests per day | whole app | “The default overall rate limit allows 200 requests every 15 minutes, with up to 2,000 requests per day.” ([source](https://developers.strava.com/docs/rate-limits/)) |
| Self-service upgrade | read, per 15 minutes | 200 requests per 15 minutes | whole 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](https://developers.strava.com/docs/getting-started/)) |
| Self-service upgrade | read, per day | 2,000 requests per day | whole 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](https://developers.strava.com/docs/getting-started/)) |
| Self-service upgrade | overall, per 15 minutes | 400 requests per 15 minutes | whole 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](https://developers.strava.com/docs/getting-started/)) |
| Self-service upgrade | overall, per day | 4,000 requests per day | whole 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](https://developers.strava.com/docs/getting-started/)) |

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](https://developers.strava.com/docs/rate-limits/))
- Throttle backfills by reading the rate-limit response headers ([source](https://developers.strava.com/docs/rate-limits/))

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/strava-api)

### Oura

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Default | per 5 minutes | 5,000 requests per 5 minutes | not stated (applied to whole app) | “The Oura API is limited to 5000 requests per 5-minute period.” ([source](https://cloud.ouraring.com/v2/static/json/openapi-1.43.json)) |

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](https://cloud.ouraring.com/v2/static/json/openapi-1.43.json))
- One historical request when a user connects, then webhooks ([source](https://cloud.ouraring.com/v2/static/json/openapi-1.43.json))
- Retry from the rate-limit headers rather than a fixed-interval backoff ([source](https://cloud.ouraring.com/v2/static/json/openapi-1.43.json))

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/oura-api)

### Polar AccessLink

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Dynamic | per 15 minutes | 500 + 20 × users requests per 15 minutes | whole app | “15min rate limit: 500 + number of users x 20” ([source](https://www.polar.com/accesslink-api/)) |
| Dynamic | per 24 hours | 5,000 + 100 × users requests per day | whole app | “24h rate limit: 5000 + number of users x 100” ([source](https://www.polar.com/accesslink-api/)) |

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](https://www.polar.com/accesslink-api/swagger.yaml))

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/polar-api)

### Withings

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Standard | per minute | 120 requests per minute | whole app | “The standard Withings API enforces a 120 requests-per-minute limit across your application” ([source](https://developer.withings.com/developer-guide/v3/integration-guide/public-health-data-api/data-api/notifications/notification-overview/)) |

Withings says the limit applies across your application.

#### Mitigations Withings documents

- Notifications: Withings POSTs when new data arrives, then you fetch ([source](https://developer.withings.com/developer-guide/v3/integration-guide/public-health-data-api/data-api/notifications/notification-overview/))
- Fetch with lastupdate to get everything changed since your last sync ([source](https://developer.withings.com/developer-guide/v3/integration-guide/public-health-data-api/data-api/fetch-data-example/))

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/withings-api)

### Wahoo

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Sandbox | per 5 minutes | 25 requests per 5 minutes | whole app | “Requests every 5 Min: 25 200” ([source](https://cloud-api.wahooligan.com/)) |
| Sandbox | per hour | 100 requests per hour | whole app | “Requests per Hour: 100 1000” ([source](https://cloud-api.wahooligan.com/)) |
| Sandbox | per day | 250 requests per day | whole app | “Requests per Day: 250 5000” ([source](https://cloud-api.wahooligan.com/)) |
| Production | per 5 minutes | 200 requests per 5 minutes | whole app | “Requests every 5 Min: 25 200” ([source](https://cloud-api.wahooligan.com/)) |
| Production | per hour | 1,000 requests per hour | whole app | “Requests per Hour: 100 1000” ([source](https://cloud-api.wahooligan.com/)) |
| Production | per day | 5,000 requests per day | whole app | “Requests per Day: 250 5000” ([source](https://cloud-api.wahooligan.com/)) |

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](https://cloud-api.wahooligan.com/))
- Ask support for higher throughput ([source](https://cloud-api.wahooligan.com/))

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/wahoo-api)

### Dexcom

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Default | per hour | 60,000 requests per hour | whole 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](https://developer.dexcom.com/docs/dexcomv3/endpoint-overview)) |

Dexcom limits calls per app.

#### Mitigations Dexcom documents

- None in the pages read.

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/dexcom-api)

### COROS (Partner API)

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Partner API | per minute | 1,000 requests per minute | not stated (applied to whole app) | “Rate limit: 1,000 calls/minute” ([source](https://support.coros.com/api/v2/help_center/en-us/sections/53180979524884/articles.json)) |

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](https://support.coros.com/api/v2/help_center/en-us/sections/53180979524884/articles.json))

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/coros-api)

### TeamUp

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Default | per minute, per caller | 250 requests per minute | per 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](https://docs.goteamup.com/api-reference/rate-limits)) |

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](https://docs.goteamup.com/guides/getting-started))

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/teamup-api)

### Wodify

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Default | per second (sustained) | 5 requests per second | not stated (applied to whole app) | “Rate 5 requests per second” ([source](https://docs.wodify.com/docs/rate-limiting)) |
| Default | per calendar month | 500,000 requests per 31 days | not stated (applied to whole app) | “Quota 500,000 requests per month” ([source](https://docs.wodify.com/docs/rate-limiting)) |

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](https://docs.wodify.com/docs/rate-limiting))
- Batch requests instead of looping single calls ([source](https://docs.wodify.com/docs/rate-limiting))
- Cache data you reference often ([source](https://docs.wodify.com/docs/rate-limiting))

Sources read 2026-10-17 · [guide](https://aifitnessapi.com/integrate/wodify-api)

### Terra

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Data-read endpoints | requested days per hour, per user | 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” ([source](https://docs.tryterra.co/reference/health-and-fitness-api/rate-limits)) |

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](https://tryterra.co/))
- Ranges over a month go through to_webhook and arrive asynchronously ([source](https://docs.tryterra.co/unified-api/managing-user-health-data/requesting-historical-data))
- Terra handles retries and backoff against the providers' own limits ([source](https://docs.tryterra.co/unified-api/getting-started))

Sources read 2026-11-05 · [guide](https://aifitnessapi.com/integrate/terra-api)

### Google Health API

| Tier | Limit | Allowed | Scope | Vendor's words |
|---|---|---|---|---|
| Default quotas | per minute, per user | 300 requests per minute | per user | “300 requests / minute” ([source](https://developers.google.com/health/rate-limits)) |
| Default quotas | per minute, per project | 120,000 requests per minute | whole app | “120,000 requests / minute” ([source](https://developers.google.com/health/rate-limits)) |
| Default quotas | per day, per project | 86,400,000 requests per day | whole app | “86.4M requests / day” ([source](https://developers.google.com/health/rate-limits)) |
| Unverified app | per minute, per user | 300 requests per minute | per user | “300 requests / minute” ([source](https://developers.google.com/health/rate-limits)) |
| Unverified app | per minute, per project | 120,000 requests per minute | whole app | “120,000 requests / minute” ([source](https://developers.google.com/health/rate-limits)) |
| Unverified app | per day, per project | 86,400,000 requests per day | whole app | “86.4M requests / day” ([source](https://developers.google.com/health/rate-limits)) |
| Unverified app | per second, all users (unverified app) | 250 requests per second | whole app | “Unverified applications: Max 250 QPS total (capped at 100 users @ 2.5 QPS per user)” ([source](https://developers.google.com/health/rate-limits)) |
| Unverified app | per second, per user (unverified app) | 2.5 requests per second | per user | “Unverified applications: Max 250 QPS total (capped at 100 users @ 2.5 QPS per user)” ([source](https://developers.google.com/health/rate-limits)) |

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](https://developers.google.com/health/rate-limits))
- Webhooks for 28 data types ([source](https://developers.google.com/health/data-types))

Sources read 2026-10-31 · [guide](https://aifitnessapi.com/google-health-api/access-and-limits)

## 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](https://log.concept2.com/developers/documentation/)) [Guide](https://aifitnessapi.com/integrate/concept2-api).
- **Garmin: not documented.** Garmin's public program pages publish no request limits; the overview gives Starter a "Limited" user capacity without a number. ([source](https://developer.garmin.com/gc-developer-program/overview/)) [Guide](https://aifitnessapi.com/integrate/garmin-api), 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](https://apizone.suunto.com/faq)) [Guide](https://aifitnessapi.com/integrate/suunto-api), 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](https://developers.mindbodyonline.com/WebhooksDocumentation)) [Guide](https://aifitnessapi.com/integrate/mindbody-api), 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](https://api-portal.glofox.com/api-portal/glofox/api/openapi-reference.html)) [Guide](https://aifitnessapi.com/integrate/glofox-api), 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](https://aifitnessapi.com/integrate/samsung-health-api), 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](https://aifitnessapi.com/integrate/mariana-tek-api), 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](https://developers.google.com/health/about)) [Guide](https://aifitnessapi.com/google-health-api), 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](https://aifitnessapi.com/fix/health-connect-rate-limit).

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

## The other 16 tools

- [Which error is this?](https://aifitnessapi.com/tools/error-diagnoser): Paste an error string and get the matching HKError.Code case in Apple's wording, plus the guide that covers it.
- [Sum it or average it?](https://aifitnessapi.com/tools/aggregation-checker): Whether Apple describes a quantity type as cumulative or discrete, with the sentence that says so.
- [Apple type, Android record](https://aifitnessapi.com/tools/identifier-translator): Two-way lookup between HealthKit identifiers and Health Connect records — verified pairs only.
- [HealthKit permission builder](https://aifitnessapi.com/tools/permission-builder): Pick the types your app touches: the Info.plist keys, the toShare/toRead Swift, and the Health Connect record names.
- [HealthKit query generator](https://aifitnessapi.com/tools/query-generator): Pick a quantity type and a window; get the HKStatisticsQuery with the aggregation option Apple's own prose states.
- [Fitness app stack generator](https://aifitnessapi.com/tools/stack-generator): Answer four questions and get the HealthKit types and APIs that survive them, with the exclusions shown.
- [Synthetic health data generator](https://aifitnessapi.com/tools/sample-data): Seeded synthetic HealthKit, Health Connect and Google Health API fixtures as JSON or CSV, with per-record UTC offsets.
- [Is this webhook real?](https://aifitnessapi.com/tools/webhook-verifier): Paste an Oura, WHOOP, Terra, Polar, Strava, Withings, Wahoo or Google Health API webhook: the vendor's documented check, run in your browser.
- [Wearable OAuth playground](https://aifitnessapi.com/tools/oauth-playground): Pick Oura, WHOOP, Strava, Polar, Withings, Wahoo, Dexcom, Suunto or Google Health: documented endpoints and scopes, an authorize URL, a PKCE pair and token curl. Sends nothing.
- [Starter scaffold generator](https://aifitnessapi.com/tools/starter-scaffold): Pick Express, Next.js or FastAPI and Oura, WHOOP, Polar, Strava or Wahoo: a tested project skeleton with OAuth routes, a token store and verified webhooks, as a .zip.
- [Pose keypoint playground](https://aifitnessapi.com/tools/keypoint-playground): Click a joint and see its index in BlazePose, COCO, OpenPose, ML Kit and Apple Vision, then copy an index map built from matching names only.
- [Exercise form rules](https://aifitnessapi.com/tools/exercise-form-rules): The joint-angle thresholds open-source exercise trackers use for squats, push-ups, lunges, planks, curls and presses, each quoted from its code; null where none says.
- [Exercise taxonomy crosswalk](https://aifitnessapi.com/tools/exercise-taxonomy-crosswalk): free-exercise-db, wger and ExerciseDB v1 categories, equipment and muscles against HealthKit and Health Connect workout types, matched by name only.
- [Health data schema converter](https://aifitnessapi.com/tools/schema-converter): Paste a HealthKit export row, Health Connect record or Google Health API data point and see it in one unified schema, each field traced to its source.
- [Fitbit to Google Health API map](https://aifitnessapi.com/tools/fitbit-to-google-health): Search every Fitbit Web API endpoint and see its Google Health API data type, method and scopes from Google's migration tables, or that none is listed.
- [Deprecation scanner](https://aifitnessapi.com/tools/deprecation-scanner): Paste code or a manifest and find Fitbit Web API, Google Fit and other retired fitness API calls, each with its replacement. Also a GitHub Action.

The planners and demos — the API picker, the cost planner, the side-by-side comparison, the day-boundary demo, the pose-model benchmark, the Bluetooth heart-rate lab and the step lab — are listed with these on [free tools for health-app builders](https://aifitnessapi.com/tools).

## Next step

Turning this into a choice of API:

- [The Best Wearable Health-Data Aggregator APIs (2026)](https://aifitnessapi.com/fitness-apis/health-data-aggregator-apis)
- [Health data aggregator API pricing: what Terra, Junction, Rook, Spike and four more charge](https://aifitnessapi.com/pricing/health-data-aggregator-pricing)
- [Integration Guides](https://aifitnessapi.com/integrate)
