DocumentationMatches
Volleyball results API
GET/v1/results/yesterday
Every match that finished yesterday, in UTC days, with the set-by-set score and durations. Readable on every plan, including the free key: one call a day keeps a results page or a bot up to date.
Parameters
All optional.
| Name | Type | What it does | Example |
|---|---|---|---|
discipline | enum | One of indoor, beach. | indoor |
gender | enum | One of men, women, mixed. | men |
page | int | Page number, from 1. Adds totals to meta. | 2 |
per_page | int | Rows a page, 1 to 200. 50 when not sent. | 200 |
cursor | string | The next_cursor from the last answer. Send it alone. |
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.
# Yesterday's finished matches curl "https://api.volleyballapi.com/v1/results/yesterday?per_page=2" \ -H "Authorization: Bearer $VBA_KEY"
$q = http_build_query(['per_page' => '2']); $ch = curl_init('https://api.volleyballapi.com/v1/results/yesterday?' . $q); 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/results/yesterday", params={"per_page": "2"}, headers={"Authorization": f"Bearer {os.environ['VBA_KEY']}"}, ) print(r.json()["data"])
const res = await fetch("https://api.volleyballapi.com/v1/results/yesterday?per_page=2", { headers: { "X-API-Key": process.env.VBA_KEY }, }); const { data, meta } = await res.json();
Response
Every answer is data plus meta. meta carries the date the answer is for. This is a real answer to the request above, counted 2026-10-12, with long lists cut short.
{
"data": [
{
"id": "mt_4vmgxbgt",
"discipline": "beach",
"gender": "women",
"status": "finished",
"current_set": null,
"date": "2026-10-11",
"time_local": "18:30",
"start_utc": null,
"competition": {
"id": "cp_q7pht7xy",
"name": "AVC Beach Tour 2nd Doha Open",
"season": 2026
},
"round": null,
"pool": null,
"team_a": { "id": "tm_nq8d633z", "name": "Shiba/Reika" },
"team_b": { "id": "tm_6xvdf9ph", "name": "Mirna/Lara" },
"score": { "a": 2, "b": 0 },
"winner": "a",
"sets": [
{ "set": 1, "a": 21, "b": 17, "duration_s": 840 },
{ "set": 2, "a": 21, "b": 7, "duration_s": 720 }
],
"sets_complete": true,
"duration_s": 1560,
"updated_utc": "2026-10-11T16:22:03Z"
},
{
"id": "mt_3wkjvm5z",
"discipline": "beach",
"gender": "women",
"status": "finished",
"current_set": null,
"date": "2026-10-11",
"time_local": "17:40",
"start_utc": null,
"competition": {
"id": "cp_q7pht7xy",
"name": "AVC Beach Tour 2nd Doha Open",
"season": 2026
},
"round": null,
"pool": null,
"team_a": { "id": "tm_1p51kx6j", "name": "Ren/Non" },
"team_b": { "id": "tm_88mm88wy", "name": "S.Samitta/K.Somruedee" },
"score": { "a": 2, "b": 1 },
"winner": "a",
"sets": [
{ "set": 1, "a": 22, "b": 20, "duration_s": 1140 },
{ "set": 2, "a": 11, "b": 21, "duration_s": 840 },
{ "set": 3, "a": 15, "b": 7, "duration_s": 600 }
],
"sets_complete": true,
"duration_s": 2580,
"updated_utc": "2026-10-11T15:42:29Z"
}
],
"meta": {
"plan": "Complete",
"date": "2026-10-11",
"count": 2,
"next_cursor": "eyJvIjoyLCJwIjoyfQ",
"page": 1,
"per_page": 2,
"total": 210,
"total_pages": 105,
"next_page": 2,
"prev_page": null
}
}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, or per_page outside 1 to 200 |
| 401 | unauthorized | No key, or a key that is not known or was revoked |
| 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.