Overview
The GameReps League Management API lets you read and write league data programmatically. Build custom integrations, sync with external systems, or connect AI agents to manage your league through conversation.
Base URL:
https://manage.mygamereps.com/api/v1
All requests and responses use JSON. All endpoints are under /api/v1/.
Authentication
API Keys
Generate API keys from Dashboard > Settings > API. Pass the key in the Authorization header:
Authorization: Bearer grlm_live_a1b2c3d4e5f6...
Keys use the format grlm_live_{32_random_chars}. An API key inherits the permissions of the account that created it and can only access that account's leagues.
Coach Tokens
Coach tokens provide scoped access for coaches. Pass the token in the Authorization header:
Authorization: CoachToken {coach_token}
Coach tokens allow read access to the team roster and write access to score entry only.
Public Endpoints No Auth
Public league data (schedule, standings, team names) is accessible without authentication, scoped by league slug. These return the same data visible on public web pages, with sensitive fields (parent email, phone, compliance details) excluded.
GET /api/v1/public/{league_slug}/schedule
GET /api/v1/public/{league_slug}/standings
GET /api/v1/public/{league_slug}/teams
Rate Limits
All endpoints are rate limited to prevent abuse.
| Auth type | Limit |
|---|---|
| API Key (authenticated) | 100 requests / minute |
| Public endpoints | 30 requests / minute |
Every response includes rate limit headers:
X-RateLimit-Limit: 100 X-RateLimit-Remaining: 87 X-RateLimit-Reset: 1712000000
Errors
Errors return a standard JSON structure:
{
"error": {
"code": "not_found",
"message": "Player with ID abc123 not found",
"status": 404
},
"meta": {
"request_id": "req_abc123"
}
}
| Code | Status | Meaning |
|---|---|---|
bad_request | 400 | Invalid request body or missing required fields |
unauthorized | 401 | Missing or invalid API key |
forbidden | 403 | Key valid but lacks permission for this resource |
not_found | 404 | Resource does not exist or is not owned by your account |
conflict | 409 | Conflicting state (e.g. duplicate entry) |
rate_limited | 429 | Too many requests — slow down |
internal_error | 500 | Server error — contact support |
Pagination
All list endpoints return paginated results. Default page size is 50, maximum 200.
{
"data": [ ... ],
"meta": {
"total": 147,
"page_size": 50,
"cursor": "eyJpZCI6IjEyMyJ9",
"has_more": true,
"request_id": "req_abc123"
}
}
Pass ?limit=100 to change page size. To fetch the next page, pass ?cursor={cursor} from the previous response.
Leagues
List all leagues owned by the authenticated account.
Auth: Bearer {api_key}
Example
curl -H "Authorization: Bearer grlm_live_xxx" \ https://manage.mygamereps.com/api/v1/leagues
Response
{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "HRCA Flag Football",
"slug": "hrca",
"sport": "flag_football",
"plan_tier": "pro",
"gamereps_enabled": true,
"created_at": "2026-03-01T00:00:00Z"
}
],
"meta": { "total": 1, "page_size": 50, "has_more": false }
}
Get a single league with full details including settings and compliance requirements.
Auth: Bearer {api_key}
Example
curl -H "Authorization: Bearer grlm_live_xxx" \ https://manage.mygamereps.com/api/v1/leagues/550e8400...
Response
{
"data": {
"id": "550e8400...",
"name": "HRCA Flag Football",
"slug": "hrca",
"sport": "flag_football",
"plan_tier": "pro",
"gamereps_enabled": true,
"require_background_check": true,
"require_safesport": false,
"require_concussion_training": false,
"settings": {},
"created_at": "2026-03-01T00:00:00Z",
"updated_at": "2026-03-15T00:00:00Z"
}
}
Update league fields. Only include fields you want to change.
Auth: Bearer {api_key}
Request body
{
"name": "HRCA Indoor Flag Football",
"gamereps_enabled": true
}
Example
curl -X PATCH \
-H "Authorization: Bearer grlm_live_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"HRCA Indoor Flag Football"}' \
https://manage.mygamereps.com/api/v1/leagues/550e8400...
Seasons
List all seasons for a league.
Auth: Bearer {api_key}
Example
curl -H "Authorization: Bearer grlm_live_xxx" \ https://manage.mygamereps.com/api/v1/leagues/550e8400.../seasons
Create a new season. Returns 201 Created.
Auth: Bearer {api_key}
Request body
{
"name": "Fall 2026",
"start_date": "2026-09-01",
"end_date": "2026-11-15"
}
Example
curl -X POST \
-H "Authorization: Bearer grlm_live_xxx" \
-H "Content-Type: application/json" \
-d '{"name":"Fall 2026","start_date":"2026-09-01","end_date":"2026-11-15"}' \
https://manage.mygamereps.com/api/v1/leagues/550e8400.../seasons
Divisions
List all divisions in a season, ordered by sort_order.
Auth: Bearer {api_key}
Example
curl -H "Authorization: Bearer grlm_live_xxx" \ https://manage.mygamereps.com/api/v1/seasons/660e8400.../divisions
Create a new division. Returns 201 Created.
Auth: Bearer {api_key}
Request body
{
"name": "12U",
"min_age": 11,
"max_age": 12,
"sort_order": 3
}
Teams
List all teams in a division, including coach token and player count.
Auth: Bearer {api_key}
Example
curl -H "Authorization: Bearer grlm_live_xxx" \ https://manage.mygamereps.com/api/v1/divisions/880e8400.../teams
Create a new team. A coach token is auto-generated. Returns 201 Created.
Auth: Bearer {api_key}
Request body
{
"name": "Chiefs",
"coach_first_name": "Jane",
"coach_last_name": "Smith",
"color": "#E31837"
}
Players
List all players on a team, including parent contact info and GameReps tokens.
Auth: Bearer {api_key}
Example
curl -H "Authorization: Bearer grlm_live_xxx" \ https://manage.mygamereps.com/api/v1/teams/aa0e8400.../players
Add a player to a team. A GameReps token is auto-generated if GameReps is enabled. Returns 201 Created.
Auth: Bearer {api_key}
Request body
{
"first_name": "Andrew",
"last_name": "Rowley",
"date_of_birth": "2017-09-22",
"jersey_number": "12",
"parent_name": "Camille Rowley",
"parent_email": "camille@example.com",
"parent_phone": "+13035551234"
}
Update player fields. Include team_id to move a player to a different team.
Auth: Bearer {api_key}
Request body
{
"jersey_number": "15",
"team_id": "bb0e8400..."
}
Remove a player from the roster. Returns 204 No Content.
Auth: Bearer {api_key}
Example
curl -X DELETE \ -H "Authorization: Bearer grlm_live_xxx" \ https://manage.mygamereps.com/api/v1/players/cc0e8400...
Bulk import multiple players at once. Returns count of created players and any errors.
Auth: Bearer {api_key}
Request body
{
"players": [
{ "first_name": "Alice", "last_name": "Rowley", "jersey_number": "7" },
{ "first_name": "Andrew", "last_name": "Rowley", "jersey_number": "12" },
{ "first_name": "Atticus", "last_name": "Rowley", "jersey_number": "4" }
]
}
Response
{
"data": {
"created": 3,
"errors": [],
"players": [ ... ]
}
}
Games & Schedule
List all games in a season. Supports filtering by division, team, week, status, and date range.
Auth: Bearer {api_key}
Query parameters
| Param | Type | Description |
|---|---|---|
division_id | UUID | Filter by division |
team_id | UUID | Filter by team (home or away) |
week | Integer | Filter by week number |
status | String | scheduled, completed, cancelled, postponed |
from_date | YYYY-MM-DD | Games on or after this date |
to_date | YYYY-MM-DD | Games on or before this date |
Example
curl -H "Authorization: Bearer grlm_live_xxx" \ "https://manage.mygamereps.com/api/v1/seasons/660e8400.../games?week=1&status=scheduled"
Create a new game. Returns 201 Created.
Auth: Bearer {api_key}
Request body
{
"division_id": "880e8400...",
"home_team_id": "aa0e8400...",
"away_team_id": "bb0e8400...",
"field_id": "ff0e8400...",
"game_date": "2026-04-05",
"game_time": "10:00",
"week_number": 1
}
Enter the final score for a game. Sets status to "completed". Works with both API key and coach token auth.
Auth: Bearer {api_key} or CoachToken {token}
Request body
{
"home_score": 21,
"away_score": 14
}
Response
{
"data": {
"id": "ee0e8400...",
"home_score": 21,
"away_score": 14,
"status": "completed",
"score_entered_by": "api:grlm_live_xxx",
"score_entered_at": "2026-04-05T12:30:00Z"
}
}
Reschedule or cancel a game. Update date, time, field, status, or notes.
Auth: Bearer {api_key}
Reschedule example
curl -X PATCH \
-H "Authorization: Bearer grlm_live_xxx" \
-H "Content-Type: application/json" \
-d '{"game_date":"2026-04-12","game_time":"11:00"}' \
https://manage.mygamereps.com/api/v1/games/ee0e8400...
Cancel example
curl -X PATCH \
-H "Authorization: Bearer grlm_live_xxx" \
-H "Content-Type: application/json" \
-d '{"status":"cancelled","notes":"Rainout"}' \
https://manage.mygamereps.com/api/v1/games/ee0e8400...
Standings
Get computed standings for a division, ranked by wins then point differential.
Auth: Bearer {api_key} (also available via public endpoint)
Response
{
"data": [
{
"rank": 1,
"team": { "id": "aa0e8400...", "name": "Broncos" },
"wins": 4, "losses": 1, "ties": 0,
"points_for": 105, "points_against": 63,
"differential": 42, "games_played": 5
}
]
}
Messages
Send a message to parents, coaches, or a specific team. Returns 201 Created.
Auth: Bearer {api_key}
Request body
{
"recipient_scope": "team:aa0e8400...",
"channel": "email",
"subject": "Practice cancelled Saturday",
"body": "Due to weather, practice on April 5 is cancelled."
}
Recipient scope values
| Value | Description |
|---|---|
league | All parents in the league |
division:{id} | All parents in a division |
team:{id} | All parents on a team |
coaches | All coaches in the league |
List sent messages for a league, most recent first.
Auth: Bearer {api_key}
Officials
List all officials for a league, including pay rates and assignment counts.
Auth: Bearer {api_key}
Assign an official to a game with a specific role. Returns 201 Created.
Auth: Bearer {api_key}
Request body
{
"official_id": "ii0e8400...",
"role": "referee"
}
Get an official's availability for a given month.
Auth: Bearer {api_key}
Query parameters
| Param | Description |
|---|---|
month | Month in YYYY-MM format (e.g. 2026-04) |
Coaches & Compliance
List all coaches for a league with their compliance status.
Auth: Bearer {api_key}
Update a coach's compliance status (background check, SafeSport, concussion training).
Auth: Bearer {api_key}
Request body
{
"background_check_status": "cleared",
"background_check_date": "2026-03-01",
"safesport_status": "complete",
"safesport_expiry": "2027-03-01"
}
Registration Pro
List registrations for a season. Filter by payment status or division.
Auth: Bearer {api_key}
Query parameters
| Param | Description |
|---|---|
status | Filter by payment status (paid, pending, refunded) |
division_id | Filter by division UUID |
GameReps Data
Get a player's GameReps progress: per-concept mastery levels, accuracy, and session count.
Auth: Bearer {api_key}
Response
{
"data": {
"player_token": "alice1",
"game_url": "https://mygamereps.com/hrca/alice1",
"total_sessions": 14,
"total_plays": 247,
"concept_levels": {
"pre_snap_read": { "level": 3, "accuracy": 0.82, "attempts": 45 },
"motion_diagnostic": { "level": 2, "accuracy": 0.75, "attempts": 38 },
"slant_read": { "level": 4, "accuracy": 0.88, "attempts": 52 }
},
"last_session": "2026-04-03T19:30:00Z"
}
}
Get aggregated GameReps data for a team: average concept levels, weakest/strongest concepts, total sessions.
Auth: Bearer {api_key}
Export
Export league data as a CSV file. Returns Content-Type: text/csv.
Auth: Bearer {api_key}
Export types
| Type | Description |
|---|---|
roster | All players across all teams |
schedule | Full game schedule |
standings | Current standings |
scores | Game results |
payments | Registration payments |
officials | Official assignments and pay |
compliance | Coach compliance status |
Query parameters
| Param | Description |
|---|---|
season_id | Filter by season (required for schedule/standings/scores) |
Example
curl -H "Authorization: Bearer grlm_live_xxx" \ -o roster.csv \ "https://manage.mygamereps.com/api/v1/leagues/550e8400.../export/roster"
Webhooks
Register webhook URLs to receive real-time notifications when events occur in your league. Payloads are signed with HMAC-SHA256 using your webhook secret.
Register a new webhook endpoint. Returns 201 Created.
Auth: Bearer {api_key}
Request body
{
"url": "https://myapp.example.com/webhooks/gamereps",
"events": ["game.completed", "player.created", "registration.paid"],
"secret": "whsec_mywebhooksecret"
}
List all webhooks for the authenticated account.
Auth: Bearer {api_key}
Delete a webhook. Returns 204 No Content.
Auth: Bearer {api_key}
Webhook Event Reference
Webhook payloads are delivered via POST to your registered URL with an X-Webhook-Signature header containing the HMAC-SHA256 signature. Failed deliveries are retried 3 times with exponential backoff (5s, 30s, 5min). Webhooks are auto-disabled after 10 consecutive failures.
Payload format
{
"event": "game.completed",
"timestamp": "2026-04-05T12:30:00Z",
"data": {
"game": {
"id": "ee0e8400...",
"home_team": "Broncos",
"away_team": "Chiefs",
"home_score": 21,
"away_score": 14
}
}
}
Verifying signatures
Compute the HMAC-SHA256 of the raw request body using your webhook secret, then compare it to the X-Webhook-Signature header value.
# Python
import hmac, hashlib
def verify(payload_bytes, signature, secret):
expected = hmac.new(
secret.encode(), payload_bytes, hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)
// JavaScript
async function verify(payload, signature, secret) {
const encoder = new TextEncoder();
const key = await crypto.subtle.importKey(
'raw', encoder.encode(secret),
{ name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
);
const sig = await crypto.subtle.sign('HMAC', key, encoder.encode(payload));
const hex = Array.from(new Uint8Array(sig))
.map(b => b.toString(16).padStart(2, '0')).join('');
return hex === signature;
}
Available events
| Event | Trigger | Payload includes |
|---|---|---|
player.created | Player added to roster | Player object |
player.removed | Player removed from roster | Player ID, team ID |
game.created | Game added to schedule | Game object |
game.updated | Game rescheduled or edited | Game object (before + after) |
game.completed | Score entered | Game object with scores |
game.cancelled | Game cancelled | Game object |
registration.paid | Payment completed | Registration + payment |
registration.refunded | Refund issued | Registration + amount |
message.sent | Communication sent | Message metadata |
official.assigned | Official assigned to game | Assignment object |
official.declined | Official declined assignment | Assignment object |
compliance.updated | Coach compliance changed | Coach ID, field, old + new status |
Public Endpoints No Auth Required
These endpoints return league data without authentication, scoped by league slug. Sensitive fields (parent contact info, compliance details) are excluded. Rate limited to 30 requests/minute per IP.
Get the game schedule for a league. Defaults to the active season.
Query parameters
| Param | Description |
|---|---|
season | Use active for current season (default) |
Example
curl https://manage.mygamereps.com/api/v1/public/hrca/schedule?season=active
Get current standings for all divisions in the active season.
Example
curl https://manage.mygamereps.com/api/v1/public/hrca/standings
List all teams in a league's active season. Returns team name, color, and division only.
Example
curl https://manage.mygamereps.com/api/v1/public/hrca/teams
GameReps League Management API v1 — Built for developers, coaches, and AI agents.
Questions? Contact support@mygamereps.com