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 can be generated and managed in your ForceMate Cloud dashboard. Open Organisations, find your organisation (you must be an "Owner"), click the gear icon, then click Manage API keys.

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

Loading...
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

Loading...
View athletes_basic.json →

Complete response with jump recording

Loading...
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)

Loading...
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 metric_table contains 40+ metrics for comprehensive jump analysis.

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)

08Integration 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.

09Best 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"

10Support

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