DocumentationMatches
Volleyball lineups API
GET/v1/matches/{id}/lineups
Who started every set and where: the six players in court zones 1 to 6 for each team, the players who came on during the set, liberos marked, and both head coaches. Rotations, substitution patterns and coach records in one call.
Parameters
Days you can read depend on your plan: the free key reads today and yesterday, Live the last 30 days, Archive and Complete every season since 2001.
| Name | Type | What it does | Example |
|---|---|---|---|
id | path | The match id, in the address. Required. | mt_y6t4v607 |
Request
Send your key in the Authorization header as a Bearer token, or in X-API-Key. A key in the address is refused, so it never ends up in a log.
# Starting six by court zone for every set, the players who came on, and both head coaches curl "https://api.volleyballapi.com/v1/matches/mt_y6t4v607/lineups" \ -H "Authorization: Bearer $VBA_KEY"
$ch = curl_init('https://api.volleyballapi.com/v1/matches/mt_y6t4v607/lineups'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VBA_KEY')], CURLOPT_RETURNTRANSFER => true, ]); $res = json_decode(curl_exec($ch), true); print_r($res['data']);
import os, requests r = requests.get( "https://api.volleyballapi.com/v1/matches/mt_y6t4v607/lineups", headers={"Authorization": f"Bearer {os.environ['VBA_KEY']}"}, ) print(r.json()["data"])
const res = await fetch("https://api.volleyballapi.com/v1/matches/mt_y6t4v607/lineups", { headers: { "X-API-Key": process.env.VBA_KEY }, }); const { data, meta } = await res.json();
Response
Every answer is data plus meta. This is a real answer to the request above, counted 2026-10-12, with long lists cut short.
{
"data": {
"match": "mt_y6t4v607",
"coaches": { "team_a": "Isacsson Johan", "team_b": "Eriksson Per" },
"sets": [
{
"set": 1,
"team_a": {
"starters": [
{
"zone": 1,
"player": { "id": "pl_rjay30dv", "name": "Kurppa Mauri" },
"shirt": "12",
"libero": false
},
{
"zone": 2,
"player": { "id": "pl_dkpvvtwd", "name": "Shurdhi Alvi" },
"shirt": "19",
"libero": false
},
{
"zone": 3,
"player": { "id": "pl_3gy482nb", "name": "Nilsson Wilhelm" },
"shirt": "7",
"libero": false
},
{
"zone": 4,
"player": { "id": "pl_aamwxjx3", "name": "Moberg Tomasz" },
"shirt": "11",
"libero": false
},
...
],
"came_on": [
{
"player": { "id": "pl_29p7fr5j", "name": "Johansson Albert" },
"shirt": "8",
"libero": true
}
]
},
"team_b": {
"starters": [
{
"zone": 1,
"player": { "id": "pl_e1q7abdc", "name": "Hästö Jon" },
"shirt": "10",
"libero": false
},
{
"zone": 2,
"player": { "id": "pl_wex4g1w5", "name": "Hedberg Albin" },
"shirt": "12",
"libero": false
},
{
"zone": 3,
"player": { "id": "pl_he2gtvy4", "name": "Gustafsson Viktor" },
"shirt": "5",
"libero": false
},
{
"zone": 4,
"player": { "id": "pl_gw5df6z1", "name": "VAGULS Gvido" },
"shirt": "3",
"libero": false
},
...
],
"came_on": [
{
"player": { "id": "pl_2hy4yjg3", "name": "Emanuelsson Johan" },
"shirt": "13",
"libero": true
}
]
}
},
{
"set": 2,
"team_a": {
"starters": [
{
"zone": 1,
"player": { "id": "pl_rjay30dv", "name": "Kurppa Mauri" },
"shirt": "12",
"libero": false
},
{
"zone": 2,
"player": { "id": "pl_dkpvvtwd", "name": "Shurdhi Alvi" },
"shirt": "19",
"libero": false
},
{
"zone": 3,
"player": { "id": "pl_3gy482nb", "name": "Nilsson Wilhelm" },
"shirt": "7",
"libero": false
},
{
"zone": 4,
"player": { "id": "pl_aamwxjx3", "name": "Moberg Tomasz" },
"shirt": "11",
"libero": false
},
...
],
"came_on": [
{
"player": { "id": "pl_29p7fr5j", "name": "Johansson Albert" },
"shirt": "8",
"libero": true
}
]
},
"team_b": {
"starters": [
{
"zone": 1,
"player": { "id": "pl_e1q7abdc", "name": "Hästö Jon" },
"shirt": "10",
"libero": false
},
{
"zone": 2,
"player": { "id": "pl_wex4g1w5", "name": "Hedberg Albin" },
"shirt": "12",
"libero": false
},
{
"zone": 3,
"player": { "id": "pl_he2gtvy4", "name": "Gustafsson Viktor" },
"shirt": "5",
"libero": false
},
{
"zone": 4,
"player": { "id": "pl_gw5df6z1", "name": "VAGULS Gvido" },
"shirt": "3",
"libero": false
},
...
],
"came_on": [
{
"player": { "id": "pl_ratj3gmc", "name": "Kronstrand Noa" },
"shirt": "1",
"libero": false
},
{
"player": { "id": "pl_2hy4yjg3", "name": "Emanuelsson Johan" },
"shirt": "13",
"libero": true
}
]
}
},
{
"set": 3,
"team_a": {
"starters": [
{
"zone": 1,
"player": { "id": "pl_rjay30dv", "name": "Kurppa Mauri" },
"shirt": "12",
"libero": false
},
{
"zone": 2,
"player": { "id": "pl_dkpvvtwd", "name": "Shurdhi Alvi" },
"shirt": "19",
"libero": false
},
{
"zone": 3,
"player": { "id": "pl_3gy482nb", "name": "Nilsson Wilhelm" },
"shirt": "7",
"libero": false
},
{
"zone": 4,
"player": { "id": "pl_aamwxjx3", "name": "Moberg Tomasz" },
"shirt": "11",
"libero": false
},
...
],
"came_on": [
{
"player": { "id": "pl_mpe1paze", "name": "Ringqvist Joacim" },
"shirt": "2",
"libero": false
},
{
"player": { "id": "pl_ggzpcn7v", "name": "Rune Andreas" },
"shirt": "3",
"libero": false
},
{
"player": { "id": "pl_b2fbxw8g", "name": "Larsson Martin" },
"shirt": "6",
"libero": false
},
{
"player": { "id": "pl_29p7fr5j", "name": "Johansson Albert" },
"shirt": "8",
"libero": true
}
]
},
"team_b": {
"starters": [
{
"zone": 1,
"player": { "id": "pl_e1q7abdc", "name": "Hästö Jon" },
"shirt": "10",
"libero": false
},
{
"zone": 2,
"player": { "id": "pl_wex4g1w5", "name": "Hedberg Albin" },
"shirt": "12",
"libero": false
},
{
"zone": 3,
"player": { "id": "pl_he2gtvy4", "name": "Gustafsson Viktor" },
"shirt": "5",
"libero": false
},
{
"zone": 4,
"player": { "id": "pl_gw5df6z1", "name": "VAGULS Gvido" },
"shirt": "3",
"libero": false
},
...
],
"came_on": [
{
"player": { "id": "pl_2hy4yjg3", "name": "Emanuelsson Johan" },
"shirt": "13",
"libero": true
}
]
}
}
]
},
"meta": { "plan": "Complete", "sets": 3 }
}Fields
| Field | Type | What it holds |
|---|---|---|
match | string | The match id |
coaches | object | team_a and team_b: each head coach's name, or null |
sets | array | One entry a set: set, team_a, team_b |
starters | array | The starting six by court zone 1 to 6 (zone 1 serves first): zone, player, shirt, libero |
came_on | array | Players who came on during the set: player, shirt, libero |
meta.sets | int | Sets with a lineup |
Errors
Errors come back as {"error": {"code", "message", "docs"}}, with plan and pricing added when a plan would answer. Every error.
| HTTP | Code | When |
|---|---|---|
| 401 | unauthorized | No key, or a key that is not known or was revoked |
| 403 | upgrade_required | Your plan does not include this endpoint; the answer names the plans that do |
| 404 | not_found | An id that does not exist |
| 422 | unknown_parameter | A parameter this endpoint does not take; the answer lists the ones it does |
| 429 | rate_limited | Too many calls this minute; Retry-After says when to try again |
| 429 | quota_exceeded | The day's or month's allowance is used; the answer says when it resets |
Try it
Fill in what you need; the request is built as you type. Paste your key to run it here, straight against the API. This endpoint answers on the Archive and Complete plans.