DocumentationMatches
Live volleyball scores API
GET/v1/matches/live
Every match being played this minute, indoor and beach, with the running score of each set and the set in play. Scores refresh every 15 seconds; meta says when the data last changed and how many seconds behind it is.
Parameters
All optional.
| Name | Type | What it does | Example |
|---|---|---|---|
discipline | enum | One of indoor, beach. | indoor |
gender | enum | One of men, women, mixed. | men |
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.
# Every match being played now, with the running set scores curl "https://api.volleyballapi.com/v1/matches/live" \ -H "Authorization: Bearer $VBA_KEY"
$ch = curl_init('https://api.volleyballapi.com/v1/matches/live'); 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/live", headers={"Authorization": f"Bearer {os.environ['VBA_KEY']}"}, ) print(r.json()["data"])
const res = await fetch("https://api.volleyballapi.com/v1/matches/live", { headers: { "X-API-Key": process.env.VBA_KEY }, }); const { data, meta } = await res.json();
Response
Every answer is data plus meta. meta carries last_change, seconds_behind and poll_seconds, so your app can say how fresh the scores are. This is a real answer to the request above, counted 2026-10-12, with long lists cut short.
{
"data": [
{
"id": "mt_veezrkx2",
"discipline": "indoor",
"gender": "women",
"status": "live",
"current_set": 3,
"date": "2026-10-12",
"time_local": "10:00",
"start_utc": "2026-10-12T10:00:00Z",
"competition": { "id": "cp_yc5gn71m", "name": "KOVO Cup Women", "season": 2026 },
"round": null,
"pool": null,
"team_a": { "id": "tm_7c17ptyv", "name": "GS Caltex W" },
"team_b": { "id": "tm_h20hqfkq", "name": "Expressway Co W" },
"score": { "a": 0, "b": 2 },
"winner": null,
"sets": [
{ "set": 1, "a": 18, "b": 25, "duration_s": null },
{ "set": 2, "a": 18, "b": 25, "duration_s": null },
{ "set": 3, "a": 14, "b": 11, "duration_s": null }
],
"sets_complete": true,
"duration_s": null,
"updated_utc": "2026-10-12T11:20:33Z"
}
],
"meta": {
"plan": "Complete",
"count": 1,
"last_change": "2026-10-12T11:20:02Z",
"seconds_behind": 90,
"poll_seconds": 15
}
}Fields
| Field | Type | What it holds |
|---|---|---|
id | string | Stable match id, mt_ |
discipline | enum | indoor or beach |
gender | enum | men, women or mixed |
status | enum | scheduled, live, finished, awarded or cancelled |
current_set | int | The set being played, while live; otherwise null |
date, time_local | date, time | The venue's calendar day and clock |
start_utc | datetime | Scheduled start in UTC, ISO 8601 |
competition | object | id, name and season |
round, pool | string | "Semifinals", "Pool B", or null |
team_a, team_b | object | id and name: a club, a national team or a beach pair |
score | object | Sets won by each side |
winner | enum | a or b, null until finished |
sets | array | Each set: number, points each side, duration in seconds |
sets_complete | bool | false when the source's set scores do not add up to its result, so some sets are missing |
duration_s | int | Match length in seconds |
updated_utc | datetime | When anything in the match last changed |
Errors
Errors come back as {"error": {"code", "message", "docs"}}, with plan and pricing added when a plan would answer. Every error.
| HTTP | Code | When |
|---|---|---|
| 400 | bad_request | A value of the wrong shape |
| 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 |
| 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 Live and Complete plans.