curl --request GET \
--url https://therundown.io/api/v2/events/{eventID}/plays \
--header 'X-TheRundown-Key: <api-key>'import requests
url = "https://therundown.io/api/v2/events/{eventID}/plays"
headers = {"X-TheRundown-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-TheRundown-Key': '<api-key>'}};
fetch('https://therundown.io/api/v2/events/{eventID}/plays', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://therundown.io/api/v2/events/{eventID}/plays",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-TheRundown-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://therundown.io/api/v2/events/{eventID}/plays"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-TheRundown-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://therundown.io/api/v2/events/{eventID}/plays")
.header("X-TheRundown-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://therundown.io/api/v2/events/{eventID}/plays")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-TheRundown-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"event_id": "816efd1e5767d7133b5bc70c77173a18",
"sport_id": 3,
"sport": "mlb",
"plays": [
{
"play_id": 88412031,
"sequence": 214,
"period": 6,
"half_indicator": "bottom",
"type": "single",
"description": "Bobby Witt Jr. singles on a line drive to center field.",
"score_away_after": 2,
"score_home_after": 3,
"win_probability_home": 0.71,
"occurred_at": "2026-07-04T01:12:44Z",
"mlb": {
"batter": {
"player_id": 41123,
"name": "Bobby Witt Jr.",
"team_id": 20
},
"pitch_speed_mph": 94.2,
"exit_velocity_mph": 102.8
}
}
]
}{
"error": "Live game state requires Ultra plan or higher",
"upgrade_url": "/pricing/api"
}Get play-by-play for an event
Returns the play-by-play timeline for a live or completed event — one entry per play with description, period, game clock, running score, and (as attribution rolls out) the players involved. Live game state and play-by-play require an Ultra plan or higher; keys on lower tiers receive a 403. The companion live_game_state snapshot (current inning/quarter, count, base runners, possession, and more) is embedded on live event payloads for entitled keys. Also available for streaming via the plays channel on the V2 WebSocket.
curl --request GET \
--url https://therundown.io/api/v2/events/{eventID}/plays \
--header 'X-TheRundown-Key: <api-key>'import requests
url = "https://therundown.io/api/v2/events/{eventID}/plays"
headers = {"X-TheRundown-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-TheRundown-Key': '<api-key>'}};
fetch('https://therundown.io/api/v2/events/{eventID}/plays', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://therundown.io/api/v2/events/{eventID}/plays",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-TheRundown-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://therundown.io/api/v2/events/{eventID}/plays"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-TheRundown-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://therundown.io/api/v2/events/{eventID}/plays")
.header("X-TheRundown-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://therundown.io/api/v2/events/{eventID}/plays")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-TheRundown-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"event_id": "816efd1e5767d7133b5bc70c77173a18",
"sport_id": 3,
"sport": "mlb",
"plays": [
{
"play_id": 88412031,
"sequence": 214,
"period": 6,
"half_indicator": "bottom",
"type": "single",
"description": "Bobby Witt Jr. singles on a line drive to center field.",
"score_away_after": 2,
"score_home_after": 3,
"win_probability_home": 0.71,
"occurred_at": "2026-07-04T01:12:44Z",
"mlb": {
"batter": {
"player_id": 41123,
"name": "Bobby Witt Jr.",
"team_id": 20
},
"pitch_speed_mph": 94.2,
"exit_velocity_mph": 102.8
}
}
]
}{
"error": "Live game state requires Ultra plan or higher",
"upgrade_url": "/pricing/api"
}Authorizations
Recommended API key request header for new integrations
Path Parameters
Canonical V2 event ID from the event_id field returned by event endpoints
Query Parameters
Number of plays to return. The most recent plays are selected, then returned in ascending sequence order. Values above 500 are capped.
x <= 500Pagination cursor — returns plays with sequence lower than this value. Use the lowest sequence from the previous page to walk backwards through long games.