How to Integrate the Wahoo Cloud API (2026)
Last verified October 17, 2026 · 6 min read
Sources checked (3) · October 17, 2026
- developers.wahooligan.com/cloud — API summary, request and approval, sandbox and production apps, scope list, agreement link
- cloud-api.wahooligan.com/ — registration, rate limits, OAuth and PKCE flows, token limits, deauthorization, resources, webhooks, errors, changelog
- www.wahoofitness.com/wahoo-api-agreement — no charge currently, right to charge, no charging end users for API access, attribution
Wahoo's Cloud API connects Wahoo users to your app over OAuth 2.0 and covers profile data, heart rate and power zones, routes, plans and the upload and download of workouts. It is separate from Wahoo's iOS and Android APIs. Everything below is from Wahoo's developer portal, its live Cloud API documentation and its Public API Agreement, as read on October 17, 2026. If you are still choosing a provider, start with wearable data APIs.
Access and approval#
| Question | What Wahoo's pages say |
|---|---|
| Who can use it? | Those who request it: Wahoo is "currently limiting use of the API to those who request it" and asks about the scopes involved and your app's purpose |
| How do I apply? | Register at developers.wahooligan.com and submit an application; it shows as pending approval in your portal |
| Sandbox or production? | Separate applications: a Sandbox app cannot later be converted into a Production app, so submit two if you need both |
| What does production need? | A review by Wahoo Fitness; approved apps get a higher rate limit |
| What does it cost? | The Public API Agreement says access is "currently provided at no charge", and Wahoo reserves the right to charge in future |
The agreement adds terms worth reading before you build: you may not charge end users for access to Wahoo's API materials or anything included in them, though you can charge for functionality Wahoo does not provide, and you must attribute Wahoo using the links and logos it supplies.
Auth and scopes#
Wahoo uses the OAuth 2.0 authorization-code flow, with PKCE available for public clients. Its base URL is api.wahooligan.com.
GET https://api.wahooligan.com/oauth/authorize
?client_id=YOUR_CLIENT_ID
&redirect_uri=https://yourapp.example.com/callback
&scope=user_read%20workouts_read%20offline_data
&response_type=code
Exchange the returned code with a POST to https://api.wahooligan.com/oauth/token carrying your client_id, client_secret, the code, your redirect_uri and grant_type=authorization_code. For PKCE, set your app's "Confidential?" field to No in the portal, send a code_challenge (Wahoo accepts plain or S256) and pass the code_verifier on the token and refresh calls instead of the secret.
The developer portal lists twelve scopes: email, user_read, user_write, power_zones_read, power_zones_write, workouts_read, workouts_write, plans_read, plans_write, routes_read, routes_write and offline_data. Two rules matter. Without user_read, Wahoo says the API returns 403. And offline_data, described as receiving data even when the app is closed, is required for webhooks. Request only what you use; Wahoo says applications must only request permission for resources they intend to access or modify.
Tokens need care:
- Access tokens expire after 2 hours. Refresh with
grant_type=refresh_tokento get a new access token and a new refresh token. - Old tokens die on use, not on refresh. The previous access and refresh tokens are revoked once an API call is made with the refreshed token. Refreshing alone does not revoke anything.
- A cap per user. From January 1, 2026, an application is limited to 10 unrevoked access tokens per user, and unrevoked tokens are deleted automatically 60 days after creation. Wahoo's advice: refresh only immediately before an API request.
- File downloads do not count. Downloading a FIT file from Wahoo's CDN is not an API request, so it does not revoke previous tokens.
To disconnect a user, call DELETE https://api.wahooligan.com/v1/permissions. Portal flags can make that call, or a user revoking access from their account settings, also delete incomplete future workouts and the plans available to the user through your app.
Data: workouts, summaries, plans, routes and zones#
| Resource | What it holds |
|---|---|
| Workouts | A single workout event; it becomes structured when it references a plan |
| Workout summaries | The results of a completed workout, such as distance, duration and calories, with a link to its FIT file |
| Workout file uploads | Upload a workout file and check its processing status |
| Plans | Structured workout files with intervals and targets that play on Wahoo devices and apps |
| Routes | Routes stored for the user |
| Power zones | The user's power zones |
| Users | The authenticated user's profile, readable and updatable |
One limitation shapes what you can promise: Wahoo does not share completed workout data that originates from third-party applications, a change its changelog dates to April 1, 2025. A workout's fitness_app_id tells you the source: below 1000 is a Wahoo application, above 1000 a third party. Plans follow a library model, so create the plan once, then reference its ID from workouts; to show a plan on an ELEMNT bike computer it must be attached to a workout scheduled from today to six days out. The API returns decimal values as strings.
Webhooks#
Configure webhooks per app with three settings: webhook_enabled, webhook_url and a webhook_token that Wahoo sends with each call so you can ignore anything without it. The documented event is workout_summary, which arrives as a JSON POST with the summary, the user's ID, the workout and a FIT file URL, and it requires users to have granted offline_data.
If your endpoint does not return HTTP 200, Wahoo retries after 30 minutes, 4 hours, 24 hours and 72 hours. Duplicates are possible when files are updated or deleted, so make your handler idempotent.
Rate limits#
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, each listing the day, hour and 5-minute windows. The published limits:
| Window | Sandbox apps | Production apps |
|---|---|---|
| Every 5 minutes | 25 | 200 |
| Per hour | 100 | 1,000 |
| Per day | 250 | 5,000 |
Authentication, token refreshes and file downloads do not count against them. Wahoo asks you to contact support if you need more; a 429 means you are over.
What changed recently#
| Date (Wahoo's changelog) | Change |
|---|---|
| October 9, 2026 | Documentation notes that scopes and other app settings can be changed on the Applications page of the portal |
| October 6, 2025 | Wahoo Plans section, a Get Plans for Workout endpoint and multiple plans per workout (plan_ids) |
| July 22, 2025 | Deauthorization features documented |
| June 11, 2025 | manual, edited and name fields on workout summaries |
| April 1, 2025 | Wahoo stopped sharing workout summaries created by third-party apps |
| March 4, 2025 | Routes endpoint documented |
The token cap of 10 unrevoked access tokens per user took effect on January 1, 2026.
Gotchas and production notes#
- Plan two apps. Sandbox and Production are separate applications and a sandbox app cannot be promoted.
- Refresh late. Refresh right before a call and use the new token at once, or you will pile up unrevoked tokens against the per-user cap.
- No third-party workouts. Users who record in other apps will not see those workouts through Wahoo.
- Ask for
user_readandoffline_data. One is needed to avoid 403s, the other for webhooks. - Error 422 can mean "not approved". Wahoo lists 422 for missing or invalid parameters or an app that is not approved.
The rest of the cluster is at how to integrate a fitness or health API.
Frequently asked questions
- Is the Wahoo API free?
- Yes, for now. Wahoo's Public API Agreement says access to and use of its API materials and platform are currently provided at no charge, and that Wahoo may charge in future. It also forbids charging your end users for access to Wahoo's API materials, though you can charge for functionality Wahoo does not provide.
- How do I get access to the Wahoo Cloud API?
- Register at developers.wahooligan.com and submit an application with details about your app's purpose and scopes; it shows as pending until Wahoo approves it. Sandbox and Production are separate applications and a sandbox app cannot be converted, so submit both if you need both. Production apps go through Wahoo's review.
- What is the Wahoo token limit?
- From January 1, 2026, an application can hold at most 10 unrevoked access tokens per user, and unrevoked tokens are deleted 60 days after creation. A refresh does not revoke the old token; only an API call with the new token does. So refresh immediately before a request, not on a timer.
- Does the Wahoo API have webhooks?
- Yes. Enable webhook_enabled, set a webhook_url and a webhook_token in your app settings, and Wahoo POSTs workout_summary events as JSON for users who granted the offline_data scope. Without an HTTP 200 it retries after 30 minutes, 4 hours, 24 hours and 72 hours, and duplicates are possible.
- What are the Wahoo API rate limits?
- Sandbox apps get 25 requests every 5 minutes, 100 an hour and 250 a day; production apps 200, 1,000 and 5,000. Authentication, token refreshes and file downloads do not count, every response reports usage in X-RateLimit headers, and Wahoo raises limits on request through support.
Keep reading
Elsewhere on the site
Pages that share this one’s concepts and sources, from other sections.
Next steps
Was this page useful?
Independent comparison, last reviewed October 17, 2026. Pricing, rate limits, and feature availability change often — confirm current details in each provider’s official documentation before you commit. Product and company names are trademarks of their respective owners; AIFitnessAPI is not affiliated with, endorsed by, or sponsored by any product listed here.
← All integration guides · by AIFitnessAPI