API Documentation
REST API for retrieving club, season, and team data.
Table of Contents
Authentication
First call POST /api/v1/license/verify with your license key. You will receive a bearer_token in return. Send that token as the Authorization: Bearer ... header on all subsequent requests.
Authorization: Bearer TI-A3F2-9KL1-8MNQ-7ZXP
Without a valid token the API returns 401 Unauthorized.
Base URL
https://teamindeling.nl/api/v1
The {club} parameter in the URL is the club's slug, e.g. sv-rood-wit-zwolle.
Verify license
/api/v1/license/verify
Checks whether a license key is valid for a given club. On success returns a <code>bearer_token</code> used to authenticate all other endpoints. Records the verification timestamp.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| license_key | string | yes | The license key |
| club_slug | string | yes | Slug of the club |
Example response
{
"valid": true,
"bearer_token": "aBcDeFgHiJkLmNoPqRsTuVwXyZ...",
"club": {
"name": "SV Rood-Wit Zwolle",
"slug": "sv-rood-wit-zwolle",
"domain": "sv-rood-wit-zwolle.nl"
},
"expires_at": "2027-06-30"
}
Error codes
Seasons — list
Auth required/api/v1/clubs/{club}/seasons
Returns only the active season by default. Pass ?all=true to retrieve all seasons.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| all | boolean | no | true = all seasons, false (default) = active only |
Example response
{
"data": [
{
"id": 14,
"name": "2025/2026",
"start_date": "2025-08-01",
"end_date": "2026-06-30",
"is_active": true
}
]
}
Season — detail
Auth required/api/v1/clubs/{club}/seasons/{season}
Returns a season including all teams and their players.
Example response
{
"data": {
"id": 14,
"name": "2025/2026",
"start_date": "2025-08-01",
"end_date": "2026-06-30",
"is_active": true,
"teams": [
{
"id": 38,
"name": "Heren 1",
"short_name": "H1",
"slug": "heren-1",
"sort_order": 0,
"season_id": 14,
"finalized_at": "2025-09-01 00:00:00",
"category": {
"id": 1,
"name": "Senioren"
},
"players": [ ... ],
"staff": [ ... ]
}
]
}
}
Error codes
Categories
Auth required/api/v1/clubs/{club}/categories
Returns all team categories for the club, sorted by order. Includes the number of teams per category.
Example response
{
"data": [
{
"id": 1,
"name": "Senioren",
"sort_order": 0,
"teams_count": 4
},
{
"id": 2,
"name": "Jeugd",
"sort_order": 1,
"teams_count": 8
}
]
}
Teams — list
Auth required/api/v1/clubs/{club}/teams
Returns all teams including players, staff, and category. Each member includes name, email, phone, date of birth, height, and jersey number. Filter by season using ?season_id or by category using ?category_id.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| season_id | integer | no | Filter by season ID |
| category_id | integer | no | Filter by category ID |
Example response
{
"data": [
{
"id": 38,
"name": "Heren 1",
"short_name": "H1",
"slug": "heren-1",
"sort_order": 0,
"season_id": 14,
"finalized_at": "2025-09-01 00:00:00",
"category": {
"id": 1,
"name": "Senioren"
},
"players": [
{
"id": 112,
"first_name": "Sander",
"last_name": "Vermeulen",
"email": "s.vermeulen@svroodzwit.nl",
"phone": "06-48271053",
"date_of_birth": "1998-04-12",
"height": 192,
"jersey_number": 7,
"position": "Setter",
"sort_order": 0,
"photo_url": "https://teamindeling.nl/storage/photos/sander-vermeulen.jpg"
}
],
"staff": [
{
"id": 7,
"first_name": "Karin",
"last_name": "Drost",
"email": null,
"phone": null,
"date_of_birth": null,
"height": null,
"jersey_number": null,
"position": "Head coach",
"sort_order": 0,
"photo_url": null
}
]
}
]
}
Team — detail
Auth required/api/v1/clubs/{club}/teams/{team}
Returns a single team including all players, staff, and category. Also includes short_name and finalized_at. The {team} parameter is the team ID.
Example response
{
"data": {
"id": 38,
"name": "Heren 1",
"short_name": "H1",
"slug": "heren-1",
"sort_order": 0,
"season_id": 14,
"finalized_at": "2025-09-01 00:00:00",
"category": {
"id": 1,
"name": "Senioren"
},
"players": [ ... ],
"staff": [ ... ]
}
}
Error codes
Players
Auth required/api/v1/clubs/{club}/players
Returns all players of the club, sorted by last name. Includes date_of_birth, height, jersey_number, can_play_multiple_teams, sportlink_id, registered_at, registration_team, positions, and photo URL.
Example response
{
"data": [
{
"id": 112,
"first_name": "Sander",
"last_name": "Vermeulen",
"full_name": "Sander Vermeulen",
"email": "s.vermeulen@svroodzwit.nl",
"phone": "06-48271053",
"date_of_birth": "1998-04-12",
"height": 192,
"jersey_number": 7,
"can_play_multiple_teams": false,
"sportlink_id": "48271",
"registered_at": "2025-08-15",
"registration_team": "Heren 1",
"positions": ["Setter"],
"photo_url": "https://teamindeling.nl/storage/photos/sander-vermeulen.jpg"
},
{
"id": 98,
"first_name": "Lotte",
"last_name": "Bakker",
"full_name": "Lotte Bakker",
"email": "l.bakker@svroodzwit.nl",
"phone": "06-31047829",
"date_of_birth": "2001-11-03",
"height": 174,
"jersey_number": 14,
"can_play_multiple_teams": true,
"sportlink_id": null,
"registered_at": null,
"registration_team": null,
"positions": ["Libero"],
"photo_url": null
}
]
}