DocumentationBulk export
Volleyball match data export
GET/v1/export/matches
Every match between two days in one call, up to 184 days at a time: the full match record with sets, venue, referees, attendance and coaches. Built for loading a season into your own database without paging.
Parameters
Parameters marked required must be sent; the rest are optional. 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 |
|---|---|---|---|
from | date | First day of a range. Send with to; a range covers 31 days at most. | 2023-08-30 |
to | date | Last day of the range, included. | 2023-08-30 |
discipline | enum | One of indoor, beach. | indoor |
gender | enum | One of men, women, mixed. | women |
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 between two days in one call, with sets, venue, officials and coaches (up to 184 days) curl "https://api.volleyballapi.com/v1/export/matches?from=2023-08-30&to=2023-08-30&gender=women" \ -H "Authorization: Bearer $VBA_KEY"
$q = http_build_query(['from' => '2023-08-30', 'to' => '2023-08-30', 'gender' => 'women']); $ch = curl_init('https://api.volleyballapi.com/v1/export/matches?' . $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/export/matches", params={"from": "2023-08-30", "to": "2023-08-30", "gender": "women"}, headers={"Authorization": f"Bearer {os.environ['VBA_KEY']}"}, ) print(r.json()["data"])
const res = await fetch("https://api.volleyballapi.com/v1/export/matches?from=2023-08-30&to=2023-08-30&gender=women", { 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": [
{
"id": "mt_tsgn6rdt",
"discipline": "beach",
"gender": "women",
"status": "finished",
"current_set": null,
"date": "2023-08-30",
"time_local": "21:00",
"start_utc": null,
"competition": {
"id": "cp_ad93tcps",
"name": "yuh Beachmasters Bern",
"season": 2023
},
"round": null,
"pool": null,
"team_a": { "id": "tm_hshj0353", "name": "Hüberli/Brunner" },
"team_b": { "id": "tm_5zxmphfc", "name": "Betschart, M./Marolf" },
"score": { "a": 2, "b": 0 },
"winner": "a",
"sets": [
{ "set": 1, "a": 21, "b": 16, "duration_s": 1140 },
{ "set": 2, "a": 21, "b": 18, "duration_s": 1140 }
],
"sets_complete": true,
"duration_s": 2280,
"updated_utc": "2026-09-29T12:37:06Z",
"venue": "Court CC",
"city": null,
"country_code": null,
"spectators": null,
"referees": [],
"weather": null
},
{
"id": "mt_40454qnx",
"discipline": "beach",
"gender": "women",
"status": "finished",
"current_set": null,
"date": "2023-08-30",
"time_local": "16:00",
"start_utc": null,
"competition": {
"id": "cp_ad93tcps",
"name": "yuh Beachmasters Bern",
"season": 2023
},
"round": null,
"pool": null,
"team_a": { "id": "tm_f0dnkt3x", "name": "Menia/Lutz A." },
"team_b": { "id": "tm_16wy4gb5", "name": "Kernen/Annique" },
"score": { "a": 2, "b": 0 },
"winner": "a",
"sets": [
{ "set": 1, "a": 21, "b": 9, "duration_s": 840 },
{ "set": 2, "a": 21, "b": 15, "duration_s": 1140 }
],
"sets_complete": true,
"duration_s": 1980,
"updated_utc": "2026-09-29T12:37:06Z",
"venue": "Court CC",
"city": null,
"country_code": null,
"spectators": null,
"referees": [],
"weather": null
}
],
"meta": {
"plan": "Complete",
"from": "2023-08-30",
"to": "2023-08-30",
"count": 25
}
}Fields
| Field | Type | What it holds |
|---|---|---|
data[] | array | One full match record per match, as /v1/matches/{id} gives it, in date order |
id | string | Stable match id, mt_ |
discipline | enum | indoor or beach |
gender | enum | men, women or mixed |
meta.from, meta.to, meta.count | mixed | The range and how many matches it holds |
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 a required parameter left out |
| 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 Complete plans.