Sorry for responding to an old post. I just discovered Streamlit it looks interesting. Are there any apps published that would interact with Intervals.icu or related to Running in general? I’m thinking for example taking some specific workouts performed as Test and then predicting various metrics and training zones depending on some models.
I fixed the CORS problem, I’d initially spelled “Authorization” using British English with an “s”, and then browser caching meant that the bad request kept being submitted. For the benefit of any future readers here is working code to fetch data from the intervals.icu API using browser based JavaScript.
async function fetchData() {
const base64UsernamePassword = btoa("API_KEY:YOURKEY");
const url = "https://intervals.icu/api/v1/athlete/0/wellness/2025-01-29";
try {
const response = await fetch(url, {
method: "GET",
headers: {
"Authorization": "Basic " + base64UsernamePassword,
},
});
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const data = await response.json();
console.log(data);
} catch (error) {
console.error("Error fetching data:", error);
}
}
Hope that’s helpful to someone else!
Can’t we have the Authorisation spelt the proper way?
Nice one! I tried all morning to connect but to no avail until I stumbled on this post:)
Hi, I’m begginer in this things but I’m trying get data from my specific workout and I’m getting this error:
{“status”:500,“error”:“org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type ‘java.lang.String’ to required type ‘int’; nested exception is java.lang.NumberFormatException: For input string: "13632114836"”}%
This is what I type in terminal:
curl -X GET “https://intervals.icu/api/v1/athlete/i235611/workouts/13632114836”
-H ‘accept: /’ -u “API_KEY:xxxxx”
Do you have some ideas?
I beleive you’re usigthe wrong endpoint
https://intervals.icu/api/v1/docs/swagger-ui/index.html
/api/v1/activity/{id} <<< should be this one i believe
or are you trying to get the FIT file?
also take a look here
Hello, I’m new to using APIs to access data and would like to be able to automate bringing the Gear table into Google Sheets. I tried =IMPORTDATA(“https://intervals.icu/api/athlete//gear.csv”,“,”) but that didn’t work. I know I will need to pass the API key, but I don’t know if there is a way to do it in the URL. I’m open to other ways of doing it. Can anyone help?
Thanks!
IMPORTDATA will not work that simple way you think.
You need an google AppsScript doing the job for you. Downloading the CSV, parsing to tabular format, pushing finally to the table,… as far as I can remember @William_Barnes shared an link with an example you can adjust.
Are the weekly load / duration / distance targets per sport exposed through API at all?
I think so, I am pretty sure as I am getting it. See Note 2 in thread below
tho i forgot where I found it
Yes they are through the list calendar events endpoint: GET /api/v1/athlete/{id}/events
You can specify category=TARGET to get only the targets.
Is this api function still valid? I trying to write a script to update my FTP in intervals with my TP from Xert, but I’m getting a 403 error back. I’ve double checked by atheleid and api key and both are correct.
Error 403 means access denied. Do you have the user API_KEY and as password you actual api key? Do you use basic auth not bearer?
I just did this with my API key and it worked:
curl -XPUT -u API_KEY:xxx 'https://intervals.icu/api/v1/athlete/0/sport-settings/Ride' \
-d '{ "ftp": 300 }' -H "Content-Type: application/json"
You can usually use 0 instead of the athlete ID like I did here.
Hi,
I would like to ask to add an REST API endpoint to find activities in selected bounding box?
Smth like: /athlete/{id}/activities?bounds=-54,10.11,-50.95,11.10
and it will return activites (just id will be enough actually) within this box.
Unfortunately I can’t do that at the moment. I neglected to store the start or end point on activity and the GPS data is in offline storage and not searchable. I am going to add the start and end point to the activity but it will take a very long time to get that updated from the GPS data.
Is it possible to add pagination for GET /api/v1/athlete/{id}/activities
with page size and offset? Current limit
works, but doesn’t give any information how much more data you have.
I left that out because it is much more efficient to query that data using the oldest and newest parameters. So rather page by month or 3 months.
I figured out that I can do this for activities with routes. Will try get it done soon.
I am trying to send feedback comments to an Intervals.icu activity but they are not reaching the platform. I share my implementation and would appreciate any hints.
- Endpoint and authentication
Method: POST
URL:
https://intervals.icu/api/v1/activity/{activity_id}/messages
Headers:
http
Authorisation: Basic <base64(‘API_KEY:{tu_api_key}’)>
Content type: application/json
Payload (JSON):
{ ‘message’: ‘Your feedback comment here’ }
2) Python integration class
import base64
import requests
IntervalsAPI class:
def init(self, athlete_id, api_key):
self.base_url = ‘https://intervals.icu’
auth_str = f ‘API_KEY:{api_key}’
self.headers = {
‘Authorization": f “Basic {base64.b64encode(auth_str.encode()).decode()}”,
‘Content-Type": ’application/json’
}
def post_activity_comment(self, activity_id, comment):
url = f"{self.base_url}/api/v1/activity/{activity_id}/messages’
payload = {‘message’: comment}
resp = requests.post(url, headers=self.headers, json=payload)
print(resp.status_code, resp.text) # To debug
resp.raise_for_status()
return resp.json()
- Call from Streamlit
if st.button(‘Post feedback’):
response = intervals_api.post_activity_feedback(
activity_details[‘id’],
st.session_state.athlete_feedback
)
if isinstance(response, dict) and ‘error’ in response:
st.error(f ‘Error posting: {response[’error‘]}’)
else:
st.success("Comment posted successfully.
You need to use ‘content’ in the payload and not ‘message’. Here is a example with curl:
curl -XPOST -u API_KEY:xxx 'https://intervals.icu/api/v1/activity/i75453212/messages' \
-d '{ "content": "Hello!" }' -H "Content-Type: application/json"