Skip to content
AF
Integration Guides

How to Integrate the Wahoo Cloud API (2026)

Last verified October 17, 2026 · 6 min read

Sources checked (3) · October 17, 2026
Wahoo's Cloud API connects Wahoo users to your app over OAuth 2.0 for profile data, power zones, plans, routes and workouts. Wahoo limits it to developers who request it: you register at developers.wahooligan.com, submit an app for approval, and production apps go through a further review for a higher rate limit. Access is currently free under Wahoo's Public API Agreement. Access tokens last 2 hours, apps are capped at 10 unrevoked tokens per user from January 1, 2026, webhooks deliver workout summaries, and Wahoo does not share workouts recorded in third-party apps.

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#

QuestionWhat 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_token to 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#

ResourceWhat it holds
WorkoutsA single workout event; it becomes structured when it references a plan
Workout summariesThe results of a completed workout, such as distance, duration and calories, with a link to its FIT file
Workout file uploadsUpload a workout file and check its processing status
PlansStructured workout files with intervals and targets that play on Wahoo devices and apps
RoutesRoutes stored for the user
Power zonesThe user's power zones
UsersThe 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:

WindowSandbox appsProduction apps
Every 5 minutes25200
Per hour1001,000
Per day2505,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, 2026Documentation notes that scopes and other app settings can be changed on the Applications page of the portal
October 6, 2025Wahoo Plans section, a Get Plans for Workout endpoint and multiple plans per workout (plan_ids)
July 22, 2025Deauthorization features documented
June 11, 2025manual, edited and name fields on workout summaries
April 1, 2025Wahoo stopped sharing workout summaries created by third-party apps
March 4, 2025Routes 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_read and offline_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.

All 113 questions in Integration Guides →

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