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

The API is the platform. Every action available in the web dashboard is also available via API. The dashboard is just one client.

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.

Keep your API key secret. It is shown only once when created. If compromised, revoke it immediately from the dashboard.

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 typeLimit
API Key (authenticated)100 requests / minute
Public endpoints30 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"
    }
}
CodeStatusMeaning
bad_request400Invalid request body or missing required fields
unauthorized401Missing or invalid API key
forbidden403Key valid but lacks permission for this resource
not_found404Resource does not exist or is not owned by your account
conflict409Conflicting state (e.g. duplicate entry)
rate_limited429Too many requests — slow down
internal_error500Server 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

GET /api/v1/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 /api/v1/leagues/{league_id}

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"
    }
}
PATCH /api/v1/leagues/{league_id}

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

GET /api/v1/leagues/{league_id}/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
POST /api/v1/leagues/{league_id}/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

GET /api/v1/seasons/{season_id}/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
POST /api/v1/seasons/{season_id}/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

GET /api/v1/divisions/{division_id}/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
POST /api/v1/divisions/{division_id}/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

GET /api/v1/teams/{team_id}/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
POST /api/v1/teams/{team_id}/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"
}
PATCH /api/v1/players/{player_id}

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..."
}
DELETE /api/v1/players/{player_id}

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...
POST /api/v1/teams/{team_id}/players/import

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

GET /api/v1/seasons/{season_id}/games

List all games in a season. Supports filtering by division, team, week, status, and date range.

Auth: Bearer {api_key}

Query parameters

ParamTypeDescription
division_idUUIDFilter by division
team_idUUIDFilter by team (home or away)
weekIntegerFilter by week number
statusStringscheduled, completed, cancelled, postponed
from_dateYYYY-MM-DDGames on or after this date
to_dateYYYY-MM-DDGames 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"
POST /api/v1/seasons/{season_id}/games

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
}
POST /api/v1/games/{game_id}/score

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"
    }
}
PATCH /api/v1/games/{game_id}

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 /api/v1/divisions/{division_id}/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

POST /api/v1/leagues/{league_id}/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

ValueDescription
leagueAll parents in the league
division:{id}All parents in a division
team:{id}All parents on a team
coachesAll coaches in the league
GET /api/v1/leagues/{league_id}/messages

List sent messages for a league, most recent first.

Auth: Bearer {api_key}

Officials

GET /api/v1/leagues/{league_id}/officials

List all officials for a league, including pay rates and assignment counts.

Auth: Bearer {api_key}

POST /api/v1/games/{game_id}/officials

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 /api/v1/officials/{official_id}/availability

Get an official's availability for a given month.

Auth: Bearer {api_key}

Query parameters

ParamDescription
monthMonth in YYYY-MM format (e.g. 2026-04)

Coaches & Compliance

GET /api/v1/leagues/{league_id}/coaches

List all coaches for a league with their compliance status.

Auth: Bearer {api_key}

PATCH /api/v1/coaches/{coach_id}/compliance

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

GET /api/v1/seasons/{season_id}/registrations

List registrations for a season. Filter by payment status or division.

Auth: Bearer {api_key}

Query parameters

ParamDescription
statusFilter by payment status (paid, pending, refunded)
division_idFilter by division UUID

GameReps Data

GET /api/v1/players/{player_id}/gamereps

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 /api/v1/teams/{team_id}/gamereps

Get aggregated GameReps data for a team: average concept levels, weakest/strongest concepts, total sessions.

Auth: Bearer {api_key}

Export

GET /api/v1/leagues/{league_id}/export/{type}

Export league data as a CSV file. Returns Content-Type: text/csv.

Auth: Bearer {api_key}

Export types

TypeDescription
rosterAll players across all teams
scheduleFull game schedule
standingsCurrent standings
scoresGame results
paymentsRegistration payments
officialsOfficial assignments and pay
complianceCoach compliance status

Query parameters

ParamDescription
season_idFilter 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.

POST /api/v1/webhooks

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"
}
GET /api/v1/webhooks

List all webhooks for the authenticated account.

Auth: Bearer {api_key}

DELETE /api/v1/webhooks/{webhook_id}

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

EventTriggerPayload includes
player.createdPlayer added to rosterPlayer object
player.removedPlayer removed from rosterPlayer ID, team ID
game.createdGame added to scheduleGame object
game.updatedGame rescheduled or editedGame object (before + after)
game.completedScore enteredGame object with scores
game.cancelledGame cancelledGame object
registration.paidPayment completedRegistration + payment
registration.refundedRefund issuedRegistration + amount
message.sentCommunication sentMessage metadata
official.assignedOfficial assigned to gameAssignment object
official.declinedOfficial declined assignmentAssignment object
compliance.updatedCoach compliance changedCoach 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 /api/v1/public/{league_slug}/schedule

Get the game schedule for a league. Defaults to the active season.

Query parameters

ParamDescription
seasonUse active for current season (default)

Example

curl https://manage.mygamereps.com/api/v1/public/hrca/schedule?season=active
GET /api/v1/public/{league_slug}/standings

Get current standings for all divisions in the active season.

Example

curl https://manage.mygamereps.com/api/v1/public/hrca/standings
GET /api/v1/public/{league_slug}/teams

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