Volleyball API
DocumentationLiveCoveragePricingMCPStatusSign inGet a free key

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.

PlansFree keyLiveArchiveComplete
Base URLhttps://api.volleyballapi.com
Rows a page50, up to 200

Parameters

All optional.

NameTypeWhat it doesExample
disciplineenumOne of indoor, beach.indoor
genderenumOne of men, women, mixed.men
pageintPage number, from 1. Adds totals to meta.2
per_pageintRows a page, 1 to 200. 50 when not sent.200
cursorstringThe 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"

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.

200 application/json
{
  "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

FieldTypeWhat it holds
idstringStable match id, mt_
disciplineenumindoor or beach
genderenummen, women or mixed
statusenumscheduled, live, finished, awarded or cancelled
current_setintThe set being played, while live; otherwise null
date, time_localdate, timeThe venue's calendar day and clock
start_utcdatetimeScheduled start in UTC, ISO 8601
competitionobjectid, name and season
round, poolstring"Semifinals", "Pool B", or null
team_a, team_bobjectid and name: a club, a national team or a beach pair
scoreobjectSets won by each side
winnerenuma or b, null until finished
setsarrayEach set: number, points each side, duration in seconds
sets_completeboolfalse when the source's set scores do not add up to its result, so some sets are missing
duration_sintMatch length in seconds
updated_utcdatetimeWhen 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.

HTTPCodeWhen
400bad_requestA value of the wrong shape, or per_page outside 1 to 200
401unauthorizedNo key, or a key that is not known or was revoked
422unknown_parameterA parameter this endpoint does not take; the answer lists the ones it does
429rate_limitedToo many calls this minute; Retry-After says when to try again
429quota_exceededThe 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.