Getting Started
Code Examples
curl, Python, and JavaScript examples for common operations.
Replace $ENDPOINT and $TOKEN with the credentials provided during onboarding.
curl — basic analysis
curl -X POST $ENDPOINT -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"settings":"{\"fixedSpeed\":false,\"fit\":true,\"returnPrediction\":true}","data":"[{\"time\":0,\"hr\":80,\"speed\":2.5},{\"time\":60,\"hr\":140,\"speed\":2.5}]"}'
Python — full analysis with stats
import json
import requests
ENDPOINT = "$ENDPOINT" # provided during onboarding
TOKEN = "$TOKEN"
settings = {
"fixedSpeed": False,
"fit": True,
"returnPrediction": True,
"returnStats": True,
"weight": 75,
"height": 178,
"age": 32,
"gender": "male",
"sport": "running"
}
# Your HR + speed data (one dict per sample)
data = [
{"time": t, "hr": hr, "speed": spd}
for t, hr, spd in zip(
range(300),
[80 + 60*(1 - 2.718**(-t/60)) for t in range(300)],
[3.0] * 300
)
]
payload = {
"settings": json.dumps(settings),
"data": json.dumps(data)
}
response = requests.post(
ENDPOINT,
json=payload,
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=300
)
result = response.json()["result"]
# Always use the Bayesian-refined parameters (trueE, trueVmax, trueP)
print(f"E={result['trueE']:.2f} Vmax={result['trueVmax']:.2f} m/s P={result['trueP']:.0f} bpm")
print(f"Confidence: {result.get('trueConfidence', result['confidence']):.2f}")
# Derived stats (computed from the fitted parameters)
stats = result["stats"]
print(f"VO2max: {stats['vo2max']:.1f}")
print(f"MFI: {stats['mfi']:.2f}")
print(f"RMR: {stats['energy']['rmr_kcal_day']:.0f} kcal/day")
print(f"Session calories: {stats['energy']['session_calories']:.0f} kcal")
Python — multi-session with Bayesian memory
memory = None
for session_data in all_sessions:
payload = {
"settings": json.dumps({"fixedSpeed": False, "fit": True}),
"data": json.dumps(session_data)
}
if memory:
payload["memory"] = json.dumps(memory)
response = requests.post(ENDPOINT, json=payload,
headers={"Authorization": f"Bearer {TOKEN}"})
result = response.json()
# Update memory for next session
memory = result.get("memory")
# Use the Bayesian-refined parameters
true_e = result["result"].get("trueE", result["result"]["E"])
true_vmax = result["result"].get("trueVmax", result["result"]["Vmax"])
print(f"Session: E={true_e:.2f} Vmax={true_vmax:.2f} m/s conf={memory['confidence']:.1f}")
JavaScript — WASM SDK (runs locally)
import { analyse } from '@driftline/sdk';
const settings = {
fixedSpeed: false,
fit: true,
returnStats: true,
weight: 75,
height: 178,
age: 32,
gender: "male",
sport: "running"
};
const data = hrSamples.map((hr, i) => ({
time: i,
hr: hr,
speed: speedSamples[i]
}));
const input = {
settings: JSON.stringify(settings),
data: JSON.stringify(data)
};
// Runs locally, no network call, no auth needed
const result = await analyse(JSON.stringify(input));
const output = JSON.parse(result);
console.log("E:", output.result.trueE);
console.log("Vmax:", output.result.trueVmax, "m/s");
console.log("VO2max:", output.result.stats?.vo2max);
JavaScript — REST API
const response = await fetch(ENDPOINT, {
method: "POST",
headers: {
"Authorization": `Bearer ${token}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
settings: JSON.stringify({ fixedSpeed: false, fit: true }),
data: JSON.stringify(sessionData)
})
});
const { result } = await response.json();
Team sports — squad analysis
# Analyze each player's session, accumulate squad averages
squad_results = []
for player in squad:
payload = {
"settings": json.dumps({
"fixedSpeed": False, "fit": True,
"returnStats": True, "sport": "team_sports"
}),
"data": json.dumps(player.session_data)
}
if player.memory:
payload["memory"] = json.dumps(player.memory)
resp = requests.post(ENDPOINT, json=payload,
headers={"Authorization": f"Bearer {TOKEN}"})
result = resp.json()["result"]
squad_results.append(result)
# Compute squad averages from Bayesian estimates
mean_e = sum(r["trueE"] for r in squad_results) / len(squad_results)
mean_vmax = sum(r["trueVmax"] for r in squad_results) / len(squad_results)
# Re-analyze with squad context for archetype classification
for player, result in zip(squad, squad_results):
payload = {
"settings": json.dumps({
"fixedSpeed": False, "fit": True,
"returnStats": True, "sport": "team_sports",
"squadMeanE": mean_e,
"squadMeanVmax": mean_vmax
}),
"data": json.dumps(player.session_data)
}
resp = requests.post(ENDPOINT, json=payload,
headers={"Authorization": f"Bearer {TOKEN}"})
archetype = resp.json()["result"]["stats"]["team_sports"]["archetype"]
print(f"{player.name}: {archetype}")