The volleyball data API for developers.
Live scores, results, rally-by-rally points and player figures for indoor and beach volleyball. One key, one JSON shape, from world championships to national leagues.
By the numbers
526,062 matches. 13.1M rallies. One call away.
Every indoor and beach match we hold, from world tours to national leagues, in one JSON shape. Your key is free and works in the next thirty seconds.
- No card
- 50 calls a day
- Yesterday's results, free
$ curl https://api.volleyballapi.com/v1/results/yesterday \
-H "Authorization: Bearer YOUR_KEY"
{ "data": [
{ "team_a": { "name": "MOYA Radomka Radom" },
"team_b": { "name": "LOTTO Chemik Police" },
"score": { "a": 0, "b": 3 },
"sets": [{ "a": 20, "b": 25 }, { "a": 18, "b": 25 }, { "a": 25, "b": 27 }] },
...
],
"meta": { "plan": "Free key", "total": 43 } }
225,964 beach, 300,098 indoor
across 82,188 matches, about 160 each
316 leagues, 3,147 seasons
beach 2005, indoor 2001, rallies 2019
Volleyball results API
Every match, every set, in clean JSON since 2001.
Indoor and beach volleyball results for men, women and youth: world tours, continental championships and the top leagues of 27 countries, merged so each match appears once. Every result carries the set-by-set score, match and set durations, round, pool and venue, updated every 15 seconds while a match is live.
GET /v1/results/yesterdayGET /v1/matches?date=2017-08-26GET /v1/matches/liveOne match, as the API returns it
200 OK{
"id": "mt_0psf8rp2",
"discipline": "indoor",
"gender": "men",
"status": "finished",
"date": "2017-08-26",
"time_local": "17:50",
"start_utc": "2017-08-26T14:00:00Z",
"competition": { "id": "cp_wqxyp8gn",
"name": "Boys' U19 World Championship",
"season": 2017 },
"pool": "Semifinals",
"team_a": { "id": "tm_drr98vzn", "name": "Japan" },
"team_b": { "id": "tm_tkazz6yt", "name": "Russia" },
"score": { "a": 0, "b": 3 },
"winner": "b",
"sets": [
{ "set": 1, "a": 17, "b": 25, "duration_s": 1200 },
{ "set": 2, "a": 23, "b": 25, "duration_s": 1500 },
{ "set": 3, "a": 28, "b": 30, "duration_s": 1860 }
],
"sets_complete": true,
"duration_s": 4560
}
The match object
GET /v1/matches/{id}| Field | Type | What it holds |
|---|---|---|
| id | string | stable match id, mt_0psf8rp2 |
| discipline | enum | indoor or beach |
| gender | enum | men, women or mixed |
| status | enum | scheduled, live, finished or cancelled |
| current_set | int | the set being played, while live |
| date, time_local | date | 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" |
| team_a, team_b | object | id and name: a club, a national team or a beach pair |
| score | object | sets won, {"a": 3, "b": 1} |
| winner | enum | a or b |
| sets | array | each set: number, points each side, duration |
| duration_s | int | match length in seconds |
| venue, city, country_code | string | where it was playedone match |
| spectators | int | official attendanceone match |
| referees | array | first and second refereeone match |
Ask for exactly the matches you need
GET /v1/matches| Parameter | Accepts | Example | Real answer |
|---|---|---|---|
| date | one day, in venue time | /v1/matches?date=2017-08-26 | 206matches |
| from, to | any range up to 31 days | ?from=2026-10-01&to=2026-10-31&gender=women | 1,790matches |
| discipline | indoor or beach | ?date=2026-11-12&discipline=beach | 0matches |
| gender | men, women or mixed | ?gender=women | |
| status | scheduled, live, finished, cancelled | ?status=live | 1live now |
| competition | a competition id | /v1/competitions/{id}/matches | 16,947competitions |
| team | a team id, under every name it plays as | /v1/teams?q=poland | 22teams |
| page, per_page, cursor | up to 200 rows a page, or a cursor | ?per_page=200&page=2 |
Live score apps and widgets
Running set scores and the current set for every match in play, refreshed every 15 seconds, with a seconds-behind figure in every answer.
/v1/matches/live/v1/results/yesterdayPrediction and betting models
Years of set scores, durations and head-to-head records to train on, plus rally-by-rally data for side-out and break-point rates.
/v1/head-to-head/pointsFantasy, media and graphics
Upcoming fixtures, results as they finish and player figures for club leagues, ready for previews, recaps and on-screen graphics.
/v1/competitions/playersResearch and analysis
One consistent shape across tours and leagues since 2001, stable ids for teams and players, and pages of up to 200 rows for bulk pulls.
/v1/teams/{id}/matchesVolleyball point-by-point API
Every rally: who served, who won, the score after it.
13.1M rallies from 82,188 matches, rally by rally since 2019 and arriving live while a match is played. Work out side-out and break-point rates, runs, momentum and clutch performance for any team, set or season, without watching a single video.
Set 3, rally by rally
Yenisey W v Leningradka WThe rally object
GET /v1/matches/{id}/points| Field | Type | What it holds |
|---|---|---|
| set | int | set number, 1 to 5 |
| a, b | int | the score after the rally |
| won_by | enum | a or b, the side that won the rally |
| served_by | enum | a or b, the side that served it |
| rallies | array | every rally of the set, in the order played |
{ "data": { "match": "mt_3snvqtp8",
"sets": [{ "set": 3, "rallies": [
{ "a": 1, "b": 0, "won_by": "a", "served_by": "a" },
{ "a": 1, "b": 1, "won_by": "b", "served_by": "a" },
...
]}]},
"meta": { "rallies": 144 } }
Side-out rate
How often a team wins the rally when the other side serves: the core measure of reception and first attack.
won_by != served_by
/ rallies receivedBreak points
Rallies won on your own serve. The number that decides close sets, by team, rotation or season.
won_by == served_by
and served_by == teamRuns and momentum
Longest scoring runs, lead changes and comebacks, set by set, in the exact order the rallies happened.
consecutive won_by
per setClutch points
Performance from 20-20 in indoor and 18-18 on the beach, where sets are actually won and lost.
rallies where a, b
both >= 2013.1M rallies, ready to modelOn the Live, Archive and Complete plans, with the free key for everything else.
Volleyball data coverage
Coverage you can count, not a list of promises.
526,062 matches across 16,947 competitions: world and continental championships, the Beach Pro Tour, and the top national leagues of 27 countries, with live scores from 316 leagues and cups worldwide. Every figure on this page is counted from the database the API answers from.
Where every match comes from
served once eachIndoor and beach
?discipline=How far back each kind of data goes
2001 to todayInternational indoor
World Championships, the Volleyball Nations League, World Cups, Olympic tournaments and qualifiers, club world championships and continental championships, men's, women's and youth.
Beach volleyball
Pairs, pools and knockout rounds from the world tour, the Beach Pro Tour, world championships, Olympic tournaments and continental tours, with set durations.
National leagues
Top-flight leagues and cups from 2009, with full match sheets and player figures from the federations of 27 countries.
Volleyball API for developers
From key to first result in one minute.
A plain REST API over HTTPS with JSON answers in one envelope, keys in a header, stable ids, page or cursor pagination and rate headers on every response. 22 endpoints, an OpenAPI file for code generators and an llms.txt for AI tools.
Get a free key
Sign in with Google. Your key is shown once; it works straight away, no card.
vba_6c1f...e9 (40 characters)Send it in a header
As a Bearer token or in X-API-Key. Keys in the address are refused, so they never end up in logs.
Authorization: Bearer $VBA_KEYRead data and meta
Every answer is data plus meta: counts, pages, the next cursor and your plan.
{ "data": [...], "meta": { ... } }Every endpoint
https://api.volleyballapi.com| Endpoint | What it returns | Plans |
|---|---|---|
| /v1/matches/live | every match in play, with the running set scores | LiveComplete |
| /v1/results/yesterday | yesterday's finished matches | All plans |
| /v1/matches | matches by day or range, discipline, gender, status, competition or team | All plans |
| /v1/matches/{id} | one match: teams, result, every set, venue, spectators, referees | All plans |
| /v1/matches/{id}/points | every rally: the score after it, who won it, who served | LiveArchiveComplete |
| /v1/matches/{id}/players | per-player points, serve, reception, attack and block | ArchiveComplete |
| /v1/competitions | competitions, newest first, by discipline, gender, season or name | All plans |
| /v1/competitions/{id} | one competition, with its dates and match count | All plans |
| /v1/competitions/{id}/matches | a competition's matches | All plans |
| /v1/competitions/{id}/standings | league and pool tables worked out from the results | All plans |
| /v1/teams | teams and beach pairs, found by name | All plans |
| /v1/teams/{id} | one team, its kind, federation and players | All plans |
| /v1/teams/{id}/matches | a team's matches, newest first | All plans |
| /v1/players | players, found by name | All plans |
| /v1/players/{id} | one player, their teams and their career | All plans |
| /v1/head-to-head | every meeting of two teams, with the record between them | LiveArchiveComplete |
| /v1/usage | your plan, calls today and this month, your limits | All plans |
# Every match being played now curl https://api.volleyballapi.com/v1/matches/live \ -H "Authorization: Bearer $VBA_KEY" # One day, beach only, 200 a page curl "https://api.volleyballapi.com/v1/matches?date=2026-11-12&discipline=beach&per_page=200" \ -H "X-API-Key: $VBA_KEY" # Every rally of a match curl https://api.volleyballapi.com/v1/matches/mt_3snvqtp8/points \ -H "Authorization: Bearer $VBA_KEY"
// Yesterday's results $ch = curl_init('https://api.volleyballapi.com/v1/results/yesterday'); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('VBA_KEY')], CURLOPT_RETURNTRANSFER => true, ]); $res = json_decode(curl_exec($ch), true); foreach ($res['data'] as $m) { printf("%s %d-%d %s\n", $m['team_a']['name'], $m['score']['a'], $m['score']['b'], $m['team_b']['name']); } // MOYA Radomka Radom 0-3 LOTTO Chemik Police
# Break points in every set of a match import os, requests r = requests.get( "https://api.volleyballapi.com/v1/matches/mt_3snvqtp8/points", headers={"Authorization": f"Bearer {os.environ['VBA_KEY']}"}, ) for s in r.json()["data"]["sets"]: breaks = sum(1 for p in s["rallies"] if p["won_by"] == p["served_by"]) print(s["set"], len(s["rallies"]), "rallies", breaks, "break points")
// Page through a month with the cursor let url = "https://api.volleyballapi.com/v1/matches?from=2026-10-01&to=2026-10-31"; const all = []; while (url) { const res = await fetch(url, { headers: { "X-API-Key": process.env.VBA_KEY } }); const { data, meta } = await res.json(); all.push(...data); url = meta.next_cursor ? `https://api.volleyballapi.com/v1/matches?cursor=${meta.next_cursor}` : null; } console.log(all.length, "matches");
Errors that tell you what to fix
| HTTP | Code | When |
|---|---|---|
| 400 | bad_request | a value is the wrong shape, or a key was sent in the address |
| 401 | unauthorized | no key, or a key that is not known or was revoked |
| 403 | upgrade_required | the plan does not include this; the answer names the plans that do |
| 404 | not_found | no endpoint, match, team or player with that id |
| 422 | unknown_parameter | a parameter the 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 |
| 500 | server_error | our fault; it is logged and looked at |
X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-ResetX-Quota-LimitX-Quota-RemainingX-Quota-ResetRetry-AfterVolleyball data for AI agents
Ask Claude, ChatGPT or Cursor about any match.
An MCP server on every plan. Add it once with your key and your assistant can look up live scores, results, rallies and head-to-head records itself, and answer with real figures instead of guesses.
A question, answered from the data
Tools your assistant gets
/mcp| live_matches | matches being played now |
| results_yesterday | yesterday's finished matches |
| matches | matches by day, range, competition or team |
| match | one match in full |
| match_points | every rally of a match |
| head_to_head | every meeting of two teams |
| search_teams | find a team or beach pair |
| search_players | find a player |
{ "mcpServers": { "volleyball": {
"url": "https://volleyballapi.com/mcp",
"headers": { "Authorization": "Bearer YOUR_KEY" } } } }
Volleyball API pricing
Start free. Pay for live, rallies or the archive.
Every plan uses the same API and the same JSON. Upgrade or cancel at any time; limits change the moment you do, and nothing is ever charged for going over. Pay yearly and two months are free.
Free key
to try it and for hobby projects
- Yesterday's and today's matches
- Competitions, teams, players
- 10 calls a minute
- Live scores
- Point by point
- History before yesterday
Live
for live score apps and widgets
- Live scores every 15 seconds
- Point by point
- Last 30 days of matches
- Head to head
- 60 calls a minute
- Player figures
Archive
for models, research and back catalogues
- Every match since 2001
- Point by point
- Player figures
- Head to head
- 60 calls a minute
- Live scores
Complete
everything, for products in production
- Live scores every 15 seconds
- Every match since 2001
- Point by point
- Player figures
- Head to head
- 120 calls a minute
Compare the plans
Every feature, line by line| Free | Live | Archive | Complete | |
|---|---|---|---|---|
| Price a month | $0 | $39 | $39 | $79 |
| Price a year | $0 | $390 | $390 | $790 |
| Calls a minute | 10 | 60 | 60 | 120 |
| Calls included | 50 a day | 50k a month | 50k a month | 250k a month |
| Matches you can read | yesterday on | last 30 days | since 2001 | since 2001 |
| Live scores | – | ✓ | – | ✓ |
| Point by point | – | ✓ | ✓ | ✓ |
| Player figures | – | – | ✓ | ✓ |
| Head to head | – | ✓ | ✓ | ✓ |
| Commercial use | – | ✓ | ✓ | ✓ |
| MCP for AI agents | ✓ | ✓ | ✓ | ✓ |
Prices in US dollars. Card charges appear as DEVELOPERDATA.NET. Questions about a charge: developerdata.net/support.
Questions
Before you sign up.
Anything else is in the documentation, or ask us at support.
What is the Volleyball API?
A REST API with live scores, results, set scores, rally-by-rally points and player figures for indoor and beach volleyball, as JSON, with an MCP server for AI agents.
How far back does the data go?
Beach volleyball internationals from 2005, indoor internationals from 2001, league and cup results from 2009, rally-by-rally data from 2019 and player figures from 2009.
How live are the live scores?
Matches in play refresh every 15 seconds. Every answer says when the data last changed and how many seconds behind it is, so your app can show it honestly.
Which competitions are covered?
World Championships, the Volleyball Nations League, World Cups, Olympic tournaments, the Beach Pro Tour and continental events, plus 316 leagues and cups and the top leagues of 27 countries.
Indoor and beach, men and women?
Both disciplines; men's, women's and youth competitions; club and national teams; beach pairs as teams with their two players.
Is there a free volleyball API?
Yes. The free key gives yesterday's and today's matches, competitions, teams and players, 50 calls a day, with no card.
What happens when I reach my limit?
You get a 429 with the time your allowance resets, and every response carries rate and quota headers so you can see it coming. Nothing is charged automatically.
Can I use it in a commercial product?
Yes, on the paid plans: apps, sites, betting and fantasy products, broadcast graphics. The terms set out what you can show and redistribute.
Do ids stay the same?
Yes. Every match, competition, team and player has a stable id (mt_, cp_, tm_, pl_) that never changes, and a match recorded twice is served once under one id.
Who runs Volleyball API?
A small team that builds sports and data APIs. The company behind it is named in the terms, and support answers every ticket.
526,062 matches are waiting.
Your free key works in thirty seconds. Yesterday's results, competitions, teams and players, 50 calls a day, no card.