01Overview
This documentation describes how to fetch your data from the CC Athletics database through REST API endpoints.
- 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.
- Include the API key in the
X-API-Keyheader for all requests. - 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-Keyheader. - 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"
03API Endpoints
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...
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...
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..."
}
04Error Handling
The API uses standard HTTP status codes to indicate success or failure of requests.
Common error codes
Invalid or missing API key. Check that your API key is correct and included in the X-API-Key header.
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.
Rate limit headers
When rate limits are enforced, the API will return the following headers:
X-RateLimit-Limit— The maximum number of requests allowedX-RateLimit-Remaining— The number of requests remainingX-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.
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)
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 Indexrsi_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');
09Best Practices
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-Keyheader
No data returned
- Check your filter parameters are correct
- Ensure date formats are
YYYY-MM-DD - Verify the
team_idexists in your organisation - Check that data exists for the specified time period
CSV download issues
- Ensure the
pathparameter is URL-encoded - Download the file promptly (URLs expire)
- Check that the path exists in your athlete data
- Verify
downsample_factoris a positive integer