01Overview

This documentation describes how to fetch your data from the CC Athletics database through REST API endpoints.

Quick Start
  1. Get an API key from your ForceMate Cloud dashboard. Open Organisations, find your organisation (you must be an "Owner"), click the gear icon, then click Manage API keys.
  2. Include the API key in the X-API-Key header for all requests.
  3. Use the endpoints below to retrieve your data.

Base URL

https://europe-west1-forcemate-desktop.cloudfunctions.net

02Authentication

API Key

  • Each API request requires a valid API key.
  • Include the API key in the X-API-Key header.
  • API keys are generated and managed in ForceMate Cloud: click your organisation's name at the top of the side navigation to open the Organisation Access page, click the gear icon on your organisation's card, then click Manage API Keys.
  • Only organisation Owners can manage API keys — for Coaches the button is disabled. Keys are scoped to the organisation they are created in.

Example request

curl https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes \
  -H "X-API-Key: fm_your_api_key_here"
Security note: Never share your API key publicly or commit it to version control. Treat it as you would a password.

03API Endpoints

GET /get_teams

Description: Retrieve all teams for your organisation.

Request example

curl https://europe-west1-forcemate-desktop.cloudfunctions.net/get_teams \
  -H "X-API-Key: fm_your_api_key_here"

Response format

{
  "teams": [
    {
      "id": "team_001",
      "name": "Example Team A",
      "creation_date": 1623456789000
    },
    {
      "id": "team_002",
      "name": "Example Team B",
      "creation_date": 1623456789000
    },
    {
      "id": "team_003",
      "name": "Example Team C",
      "creation_date": 1623456789000
    }
  ]
}
View teams.json →
GET /get_athletes

Description: Retrieve athletes including all recordings (optionally filtered by team and other parameters).

Query parameters

Parameter Type Required Description
team_id string Optional Filter athletes by specific team
min_birth_year integer Optional Filter athletes born on or after this year (e.g., 1990)
max_birth_year integer Optional Filter athletes born on or before this year (e.g., 2005)
tests_date_from string Optional Filter tests recorded on or after this date. Format: YYYY-MM-DD (e.g., 2024-01-01)
tests_date_to string Optional Filter tests recorded on or before this date. Format: YYYY-MM-DD (e.g., 2024-12-31)
analysis_type string Optional Filter by type of analysis. Valid values: "jump", "pogo", "isometric", "cop" (Center of Pressure)
jump_types string Optional Comma-separated list of jump types to include. Only applies when analysis_type is "jump" (e.g., "cmj,sj,dj")
with_armswing boolean Optional Filter CMJ jumps by armswing. Valid values: "true" (only jumps with armswing), "false" (only jumps without armswing). If not specified, returns all CMJ jumps regardless of armswing.
isometric_exercise_names string Optional Comma-separated list of isometric exercise names to include. Only applies when analysis_type is "isometric" (e.g., "Mid-thigh pull,Squat")

Request examples

Basic request (all athletes):

curl https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes \
  -H "X-API-Key: fm_your_api_key_here"

Filter by team:

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes?team_id=team_123" \
  -H "X-API-Key: fm_your_api_key_here"

Filter by birth year and test dates:

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes?min_birth_year=1995&max_birth_year=2005&tests_date_from=2024-01-01&tests_date_to=2024-12-31" \
  -H "X-API-Key: fm_your_api_key_here"

Filter by analysis type (jump tests only):

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes?analysis_type=jump" \
  -H "X-API-Key: fm_your_api_key_here"

Filter by specific jump types (CMJ and SJ only):

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes?analysis_type=jump&jump_types=cmj,sj" \
  -H "X-API-Key: fm_your_api_key_here"

Filter CMJ jumps with armswing only:

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes?analysis_type=jump&jump_types=cmj&with_armswing=true" \
  -H "X-API-Key: fm_your_api_key_here"

Filter CMJ jumps without armswing only:

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes?analysis_type=jump&jump_types=cmj&with_armswing=false" \
  -H "X-API-Key: fm_your_api_key_here"

Filter isometric exercises:

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes?analysis_type=isometric&isometric_exercise_names=Mid-thigh%20pull,Squat" \
  -H "X-API-Key: fm_your_api_key_here"

Filter by CoP (Center of Pressure) tests:

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_athletes?analysis_type=cop" \
  -H "X-API-Key: fm_your_api_key_here"

Response format — basic structure

{
  "athletes": [
    {
      "id": "-ExampleAthleteId005",
      "name": "James Anderson",
      "team_id": "team_001",
      "player_info": {
        "birth_date": 606231196000,
        "gender": "male",
        "height_cm": 189,
        "weight_kg": 82
      },
      "recordings": []
    },
    {
      "id": "-ExampleAthleteId006",
      "name": "Lisa Thompson",
      "team_id": "team_002",
      "player_info": {
        "birth_date": 606231196000,
        "gender": "male",
        "height_cm": 189,
        "weight_kg": 82
      },
      "recordings": []
    },
    {
      "id": "-ExampleAthleteId007",
      "name": "Robert Martinez",
      "team_id": "team_001",
      "player_info": null,
      "recordings": []
    }
  ],
  "total": 3
}
View athletes_basic.json →

Complete response with jump recording

{
  "athletes": [
    {
      "id": "-ExampleAthleteId003",
      "name": "Michael Davis",
      "team_id": "team_003",
      "player_info": {
        "birth_date": 889311600000,
        "gender": "male",
        "height_cm": 190,
        "weight_kg": 93
      },
      "recordings": [
        {
          "id": "-ExampleRecordingId003",
          "date": 1711788938468,
          "device_type": "PLATE_DEVICE",
          "channel_amount": 1,
          "sample_rate": 960,
          "firmware_version": "1.4.0",
          "forcemate_version": "1.9.1",
          "exercise_name": "",
          "comment": "",
          "injured": false,
          "team_name": "Example Team C",
          "full_file_storage_path": "organisations/example_org/athletes/-ExampleAthleteId003/jump_recordings/2024_03_30-09_55_38.csv",
          "jump_analysis": [
            {
              "selected_by_user": true,
              "plot_start_index": 13369,
              "plot_end_index": 18961,
              "path_to_this_jump_raw_csv": "organisations/example_org/athletes/-ExampleAthleteId003/single_jumps_raw_data/2024_03_30-09_55_38_0.csv",
              "plot_annotations": {
                "body_mass": 95.24,
                "body_weight": 934.34,
                "jump_type": "cmj",
                "leg_stance": "dual_leg",
                "single_plate_used": 1,
                "jump_start_time": 16.563,
                "takeoff_time": 17.734,
                "landing_time": 18.395,
                "flight_threshold": 2.925,
                "peak_force_time": 17.626
              },
              "metric_table": {
                "jump_height_ft": 0.536,
                "jump_height_ni": 0.517,
                "peak_force": 2445.79,
                "peak_power": 6656.72,
                "takeoff_velocity": 3.187,
                "contact_time": 1.17,
                "flight_time": 0.661,
                "rsi": 0.564,
                "rsi_modified": 0.442,
                "rsi_exponential": 0.458,
                "body_mass": 95.24,
                "avg_braking_force": 1495.32,
                "avg_braking_power": -1129.59,
                "avg_braking_velocity": -0.837,
                "avg_propulsive_force": 2063.48,
                "avg_propulsive_power": 3472.27,
                "avg_propulsive_velocity": 1.796,
                "avg_rfd": 1423.14,
                "braking_duration": 0.206,
                "braking_end_time": 17.465,
                "braking_rfd": 1509.97,
                "braking_work": -232.97,
                "decel_rfd": 942.34,
                "force_peak_power": 2271.17,
                "force_zero_velo": 2035.09,
                "min_braking_velocity": -1.232,
                "net_impulse": 303.57,
                "peak_braking_force": 2035.09,
                "peak_braking_power": -1385.69,
                "peak_propulsive_force": 2445.79,
                "peak_propulsive_power": 6656.72,
                "peak_propulsive_velocity": 3.304,
                "peak_velocity": 3.304,
                "propulsive_duration": 0.267,
                "propulsive_work": 929.55,
                "time_to_peak_force": 1.062,
                "unweight_duration": 0.694,
                "unweight_end_time": 17.258,
                "velocity_peak_power": 2.93,
                "fp1_peak_force": 1228.45,
                "fp2_peak_force": 1217.34,
                "fp1_net_impulse": 152.78,
                "fp2_net_impulse": 150.79,
                "fp1_avg_rfd": 715.32,
                "fp2_avg_rfd": 707.82,
                "fp1_braking_rfd": 758.12,
                "fp2_braking_rfd": 751.85,
                "fp1_decel_rfd": 475.44,
                "fp2_decel_rfd": 466.9,
                "fp1_ttpf": 1.062,
                "fp2_ttpf": 1.064,
                "peak_force_symmetry_index": 0.91,
                "net_impulse_symmetry_index": 1.32,
                "avg_rfd_symmetry_index": 1.05,
                "braking_rfd_symmetry_index": 0.84,
                "decel_rfd_symmetry_index": 1.85,
                "ttpf_symmetry_index": -0.19
              }
            }
          ]
        }
      ]
    }
  ],
  "total": 1
}
View athlete_with_jump.json →
GET /get_csv_download_url

Description: Retrieve a download link for a CSV file of a raw jump or isometric recording (raw Newton values in 1–2 columns, depending on number of plates used).

Query parameters

Parameter Type Required Description
path string Required Path where the CSV file is stored. Get this from a jump result or isometric trial via the key path_to_this_jump_raw_csv or path_to_raw_csv.
downsample_factor integer Optional An integer above 1 to downsample the data. For example, with 960 Hz raw data, factor 20 yields 48 Hz. A Savitzky–Golay filter prevents aliasing.

Request example

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_csv_download_url?path=organisations/frC6h5a/recordings/raw_data.csv" \
  -H "X-API-Key: fm_your_api_key_here"

With downsampling

curl "https://europe-west1-forcemate-desktop.cloudfunctions.net/get_csv_download_url?path=organisations/frC6h5a/recordings/raw_data.csv&downsample_factor=20" \
  -H "X-API-Key: fm_your_api_key_here"

Response format

{
  "download_url": "https://storage.googleapis.com/forcemate-desktop.appspot.com/organisations/frC6h5a..."
}
Note: The download URL is temporary and will expire. Download the file promptly after receiving the URL.

04Error Handling

The API uses standard HTTP status codes to indicate success or failure of requests.

Common error codes

401 Unauthorized

Invalid or missing API key. Check that your API key is correct and included in the X-API-Key header.

500 Internal Server Error

Unexpected server-side issue. If this persists, contact support.

Error response format

{
  "error": "Unauthorized",
  "message": "Invalid API key provided"
}

05Rate Limits

Rate limits are applied to prevent abuse and ensure fair usage of the API.

Important: Rate limits apply per API key. Contact support for specific rate limit details or to request increased limits for your use case.

Rate limit headers

When rate limits are enforced, the API will return the following headers:

  • X-RateLimit-Limit — The maximum number of requests allowed
  • X-RateLimit-Remaining — The number of requests remaining
  • X-RateLimit-Reset — The time when the rate limit resets (Unix timestamp)

06Complete Response Examples

These examples show the complete structure of responses you'll receive from the API, based on real data.

Athlete with jump recording (CMJ test)

{
  "athletes": [
    {
      "id": "-ExampleAthleteId003",
      "name": "Michael Davis",
      "team_id": "team_003",
      "player_info": {
        "birth_date": 889311600000,
        "gender": "male",
        "height_cm": 190,
        "weight_kg": 93
      },
      "recordings": [
        {
          "id": "-ExampleRecordingId003",
          "date": 1711788938468,
          "device_type": "PLATE_DEVICE",
          "channel_amount": 1,
          "sample_rate": 960,
          "firmware_version": "1.4.0",
          "forcemate_version": "1.9.1",
          "exercise_name": "",
          "comment": "",
          "injured": false,
          "team_name": "Example Team C",
          "full_file_storage_path": "organisations/example_org/athletes/-ExampleAthleteId003/jump_recordings/2024_03_30-09_55_38.csv",
          "jump_analysis": [
            {
              "selected_by_user": true,
              "plot_start_index": 13369,
              "plot_end_index": 18961,
              "path_to_this_jump_raw_csv": "organisations/example_org/athletes/-ExampleAthleteId003/single_jumps_raw_data/2024_03_30-09_55_38_0.csv",
              "plot_annotations": {
                "body_mass": 95.24,
                "body_weight": 934.34,
                "jump_type": "cmj",
                "leg_stance": "dual_leg",
                "single_plate_used": 1,
                "jump_start_time": 16.563,
                "takeoff_time": 17.734,
                "landing_time": 18.395,
                "flight_threshold": 2.925,
                "peak_force_time": 17.626
              },
              "metric_table": {
                "jump_height_ft": 0.536,
                "jump_height_ni": 0.517,
                "peak_force": 2445.79,
                "peak_power": 6656.72,
                "takeoff_velocity": 3.187,
                "contact_time": 1.17,
                "flight_time": 0.661,
                "rsi": 0.564,
                "rsi_modified": 0.442,
                "rsi_exponential": 0.458,
                "body_mass": 95.24,
                "avg_braking_force": 1495.32,
                "avg_braking_power": -1129.59,
                "avg_braking_velocity": -0.837,
                "avg_propulsive_force": 2063.48,
                "avg_propulsive_power": 3472.27,
                "avg_propulsive_velocity": 1.796,
                "avg_rfd": 1423.14,
                "braking_duration": 0.206,
                "braking_end_time": 17.465,
                "braking_rfd": 1509.97,
                "braking_work": -232.97,
                "decel_rfd": 942.34,
                "force_peak_power": 2271.17,
                "force_zero_velo": 2035.09,
                "min_braking_velocity": -1.232,
                "net_impulse": 303.57,
                "peak_braking_force": 2035.09,
                "peak_braking_power": -1385.69,
                "peak_propulsive_force": 2445.79,
                "peak_propulsive_power": 6656.72,
                "peak_propulsive_velocity": 3.304,
                "peak_velocity": 3.304,
                "propulsive_duration": 0.267,
                "propulsive_work": 929.55,
                "time_to_peak_force": 1.062,
                "unweight_duration": 0.694,
                "unweight_end_time": 17.258,
                "velocity_peak_power": 2.93,
                "fp1_peak_force": 1228.45,
                "fp2_peak_force": 1217.34,
                "fp1_net_impulse": 152.78,
                "fp2_net_impulse": 150.79,
                "fp1_avg_rfd": 715.32,
                "fp2_avg_rfd": 707.82,
                "fp1_braking_rfd": 758.12,
                "fp2_braking_rfd": 751.85,
                "fp1_decel_rfd": 475.44,
                "fp2_decel_rfd": 466.9,
                "fp1_ttpf": 1.062,
                "fp2_ttpf": 1.064,
                "peak_force_symmetry_index": 0.91,
                "net_impulse_symmetry_index": 1.32,
                "avg_rfd_symmetry_index": 1.05,
                "braking_rfd_symmetry_index": 0.84,
                "decel_rfd_symmetry_index": 1.85,
                "ttpf_symmetry_index": -0.19
              }
            }
          ]
        }
      ]
    }
  ],
  "total": 1
}
View athlete_with_jump.json →

07Data Structure Reference

Detailed breakdown of the data structures returned by the API.

Athlete object

Field Type Description
id string Unique identifier for the athlete
name string Full name of the athlete
team_id string ID of the team the athlete belongs to
player_info object Personal information (birth_date, gender, height_cm, weight_kg)
recordings array Array of recording objects (jump, isometric, pogo tests)

Recording object

Field Type Description
id string Unique identifier for the recording
date number Unix timestamp (milliseconds) of when the test was performed
device_type string Type of device: PLATE_DEVICE, GROIN_DEVICE, CABLE_DEVICE
sample_rate number Sample rate in Hz (typically 960)
jump_analysis array Array of jump results (only for jump tests)
isometric_analysis object Isometric test results (only for isometric tests)
pogo_analysis object Pogo jump results (only for pogo tests)
cop_analysis object Center of Pressure (CoP) test results (only for CoP tests)

Jump metrics (metric_table)

Common jump metrics
  • jump_height_ft — Jump height from flight time (meters)
  • jump_height_ni — Jump height from impulse (meters)
  • peak_force — Maximum force during jump (Newtons)
  • peak_power — Maximum power output (Watts)
  • takeoff_velocity — Velocity at takeoff (m/s)
  • contact_time — Time on ground during jump (seconds)
  • flight_time — Time in air (seconds)
  • rsi — Reactive Strength Index
  • rsi_modified — Modified RSI (jump height / contact time)

The full jump metric_table contains 300+ metrics. See Metric Definitions for complete, versioned catalogues of every metric per test type.

Device types

Device Type Value Supported Tests
PlateMate PLATE_DEVICE Jump (CMJ, SJ, DJ), Pogo, Isometric, CoP
GroinMate GROIN_DEVICE Isometric (Hip Adduction/Abduction)
CableMate CABLE_DEVICE Isometric (Cable exercises)

08Metric Definitions

Every metric that can appear in analysis results is defined in a versioned, machine-readable JSON catalogue. These are the same definition files the ForceMate apps load at runtime, so they are always in sync with the released software. Use them to map the metric IDs in API responses to display names, units, definitions and test availability.

The catalogues are public and require no API key.

Catalogue Tests covered File
Jump CMJ, SJ, DJ, CMRJ — bilateral and unilateral jump_metric_table_en.json
Isometric IMTP and all other isometric tests (PlateMate, GroinMate, CableMate) isometric_metric_table_en.json
Pogo Pogo jumps pogo_metric_table_en.json
Center of Pressure Balance / CoP tests cop_metric_table_en.json
Golf Golf swing analysis golf_metric_table_en.json

File structure

{
  "version": "1.0.0",
  "last_updated": "2026-07-21",
  "groups": {
    "impulse": { "name": "Impulse", "explanation": "..." }
  },
  "metrics": {
    "fp1_net_impulse": {
      "name": "Net Impulse - Left",
      "explanation": "The Left impulse (bodyweight subtracted) applied during the braking+propulsive phase",
      "unit": "N·s",
      "decimals": 0,
      "group": "impulse",
      "laterality": "left",
      "valid_jump_types": ["cmj", "sj", "cmrj"]
    }
  }
}
Field Meaning
metric key The metric ID. Matches the keys used in metric_table objects in API responses 1:1.
name Display name as shown in the ForceMate apps.
explanation Short definition of the metric.
unit Measurement unit. An empty unit means the metric is dimensionless (ratios and indices such as rsi and rsi_modified). BW means multiples of bodyweight; body-mass-normalized metrics state it explicitly (N/kg, W/kg, N·s/kg).
decimals Number of decimals used when the value is displayed.
group Key into groups, used to organize related metrics.
laterality Whether the value describes the left plate, the right plate, or the total. Left/right variants only exist for bilateral trials recorded on dual plates.
valid_jump_types Jump catalogue only: the jump types the metric exists for (cmj, sj, dj, cmrj).

Versioning

Change detection

Each catalogue carries a top-level version (semantic version) and last_updated date. The version is bumped whenever anything in the file changes — metrics added, renamed or removed, or changed units, definitions or availability. Pin the version you validated your integration against, and re-check version and last_updated periodically to detect changes.

09Integration Examples

Ready-to-use code examples for integrating with the CC Athletics API.

Python

import requests
import json
from datetime import datetime

# Configuration
API_KEY = 'fm_your_api_key_here'
BASE_URL = 'https://europe-west1-forcemate-desktop.cloudfunctions.net'

# Headers for authentication
headers = {
    'X-API-Key': API_KEY
}

# Get all teams
def get_teams():
    response = requests.get(f'{BASE_URL}/get_teams', headers=headers)
    if response.status_code == 200:
        return response.json()
    else:
        print(f'Error: {response.status_code}')
        return None

# Get athletes with filters
def get_athletes(team_id=None, analysis_type=None):
    params = {}
    if team_id:
        params['team_id'] = team_id
    if analysis_type:
        params['analysis_type'] = analysis_type

    response = requests.get(f'{BASE_URL}/get_athletes', headers=headers, params=params)
    if response.status_code == 200:
        return response.json()
    else:
        print(f'Error: {response.status_code}')
        return None

# Process jump data
def process_jump_data(athletes_data):
    for athlete in athletes_data['athletes']:
        print(f"Athlete: {athlete['name']}")

        for recording in athlete.get('recordings', []):
            if 'jump_analysis' in recording:
                date = datetime.fromtimestamp(recording['date'] / 1000)
                print(f"  Test Date: {date.strftime('%Y-%m-%d')}")

                for jump in recording['jump_analysis']:
                    if jump.get('selected_by_user'):
                        metrics = jump['metric_table']
                        print(f"    Jump Height: {metrics.get('jump_height_ft', 0):.3f} m")
                        print(f"    Peak Force: {metrics.get('peak_force', 0):.1f} N")
                        print(f"    Peak Power: {metrics.get('peak_power', 0):.1f} W")

# Main execution
if __name__ == '__main__':
    teams = get_teams()
    if teams:
        print(f"Found {len(teams['teams'])} teams")

    athletes = get_athletes(analysis_type='jump')
    if athletes:
        print(f"Found {athletes['total']} athletes")
        process_jump_data(athletes)

JavaScript / Node.js

const axios = require('axios');

const API_KEY = 'fm_your_api_key_here';
const BASE_URL = 'https://europe-west1-forcemate-desktop.cloudfunctions.net';

const api = axios.create({
  baseURL: BASE_URL,
  headers: { 'X-API-Key': API_KEY }
});

async function findBestJumper(teamId) {
  try {
    const response = await api.get('/get_athletes', {
      params: { team_id: teamId, analysis_type: 'jump' }
    });

    let bestJump = { height: 0, athlete: null };

    response.data.athletes.forEach(athlete => {
      athlete.recordings?.forEach(recording => {
        recording.jump_analysis?.forEach(jump => {
          if (jump.selected_by_user && jump.metric_table.jump_height_ft > bestJump.height) {
            bestJump = {
              height: jump.metric_table.jump_height_ft,
              athlete: athlete.name,
              force: jump.metric_table.peak_force,
              power: jump.metric_table.peak_power
            };
          }
        });
      });
    });

    console.log('Best Jump:', bestJump);
    return bestJump;
  } catch (error) {
    console.error('Error:', error.response?.status || error.message);
  }
}

async function downloadCSV(path, downsampleFactor = null) {
  try {
    const params = { path };
    if (downsampleFactor) params.downsample_factor = downsampleFactor;
    const response = await api.get('/get_csv_download_url', { params });
    console.log('Download URL:', response.data.download_url);
    return response.data.download_url;
  } catch (error) {
    console.error('Error getting CSV:', error.response?.status || error.message);
  }
}

findBestJumper('team_123');
Pro tip: Use these examples as a starting point for your integration. Handle errors properly and implement appropriate caching strategies for production use.

10Best Practices

Keep your API key confidential. Never share it publicly or commit it to version control.
Use HTTPS for all API requests. All endpoints require secure connections.
Implement proper error handling. Always check response status codes and handle errors gracefully.
Cache responses when appropriate. Reduce unnecessary API calls by caching data that doesn't change frequently.
Use query parameters efficiently. Filter data at the API level to reduce payload size and processing time.
Monitor your usage. Keep track of your API usage to avoid hitting rate limits.

Example: secure API key storage

# Store API key in environment variable
export CC_API_KEY="fm_your_api_key_here"

# Use in your application
curl https://europe-west1-forcemate-desktop.cloudfunctions.net/get_teams \
  -H "X-API-Key: $CC_API_KEY"

11Support

Need help with the API? We're here to assist you.

Contact

Common issues

API key not working
  • Ensure the key is correctly copied (no extra spaces)
  • Check that the key hasn't expired
  • Verify the key is for the correct environment
  • Make sure you're using the X-API-Key header
No data returned
  • Check your filter parameters are correct
  • Ensure date formats are YYYY-MM-DD
  • Verify the team_id exists in your organisation
  • Check that data exists for the specified time period
CSV download issues
  • Ensure the path parameter is URL-encoded
  • Download the file promptly (URLs expire)
  • Check that the path exists in your athlete data
  • Verify downsample_factor is a positive integer