curl --request GET \
--url https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats', 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://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"playerId": "<string>",
"season": 123,
"scope": "all",
"appearances": 123,
"gamesStarted": 123,
"battersFaced": 123,
"outs": 123,
"pitches": 123,
"h": 123,
"r": 123,
"er": 123,
"bb": 123,
"ibb": 123,
"hbp": 123,
"k": 123,
"hr": 123,
"doubles": 123,
"triples": 123,
"groundballs": 123,
"flyballs": 123,
"linedrives": 123,
"popups": 123,
"hardHits": 123,
"barrels": 123,
"zonePitches": 123,
"zoneSwings": 123,
"zoneContacts": 123,
"chasePitches": 123,
"chaseSwings": 123,
"firstPitches": 123,
"firstPitchStrikes": 123,
"fastballs": 123,
"wins": 123,
"losses": 123,
"qualityStarts": 123,
"cheapWins": 123,
"toughLosses": 123,
"runSupport": 123,
"inheritedRunners": 123,
"inheritedRunnersScored": 123,
"ip": 123,
"era": 123,
"whip": 123,
"fip": 123,
"xfip": 123,
"siera": 123,
"kPct": 123,
"bbPct": 123,
"avgAgainst": 123,
"woba": 123,
"fbVelo": 123,
"gbFbRatio": 123,
"barrelPct": 123,
"hardHitPct": 123,
"zContactPct": 123,
"chasePct": 123,
"fStrikePct": 123,
"avgIpPerAppearance": 123,
"babip": 123,
"lobPct": 123,
"eMinusF": 123,
"xwobaAgainst": 123,
"qsPct": 123,
"irsPct": 123,
"runSupportPerStart": 123,
"wpa": 123,
"aLI": 123,
"pLI": 123
},
"_meta": {
"request_id": "<string>",
"served_from": "live",
"cache_ttl_seconds": 123,
"provenance": {},
"availability": {}
}
}Player pitching stats
MLB-only route. Returns the canonical player pitching stats
document for a player, season, and scope from
player_pitching_stats — ERA / WHIP / FIP / SIERA plus
Statcast-derived peripherals (FB velo, barrel%, xwOBA-against).
Requires the stats entitlement (a paid plan). See Responses & Errors for the success envelope and availability rules.
curl --request GET \
--url https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats', 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://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sportquanta.com/v1/mlb/players/{id}/pitching-stats")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": {
"playerId": "<string>",
"season": 123,
"scope": "all",
"appearances": 123,
"gamesStarted": 123,
"battersFaced": 123,
"outs": 123,
"pitches": 123,
"h": 123,
"r": 123,
"er": 123,
"bb": 123,
"ibb": 123,
"hbp": 123,
"k": 123,
"hr": 123,
"doubles": 123,
"triples": 123,
"groundballs": 123,
"flyballs": 123,
"linedrives": 123,
"popups": 123,
"hardHits": 123,
"barrels": 123,
"zonePitches": 123,
"zoneSwings": 123,
"zoneContacts": 123,
"chasePitches": 123,
"chaseSwings": 123,
"firstPitches": 123,
"firstPitchStrikes": 123,
"fastballs": 123,
"wins": 123,
"losses": 123,
"qualityStarts": 123,
"cheapWins": 123,
"toughLosses": 123,
"runSupport": 123,
"inheritedRunners": 123,
"inheritedRunnersScored": 123,
"ip": 123,
"era": 123,
"whip": 123,
"fip": 123,
"xfip": 123,
"siera": 123,
"kPct": 123,
"bbPct": 123,
"avgAgainst": 123,
"woba": 123,
"fbVelo": 123,
"gbFbRatio": 123,
"barrelPct": 123,
"hardHitPct": 123,
"zContactPct": 123,
"chasePct": 123,
"fStrikePct": 123,
"avgIpPerAppearance": 123,
"babip": 123,
"lobPct": 123,
"eMinusF": 123,
"xwobaAgainst": 123,
"qsPct": 123,
"irsPct": 123,
"runSupportPerStart": 123,
"wpa": 123,
"aLI": 123,
"pLI": 123
},
"_meta": {
"request_id": "<string>",
"served_from": "live",
"cache_ttl_seconds": 123,
"provenance": {},
"availability": {}
}
}Authorizations
Send a workspace API token in the Authorization: Bearer <token> header.
Path Parameters
Query Parameters
Required season year. Missing, invalid, or out-of-range values return invalid_query_parameter.
1920 <= x <= 2100all, home, away, l3, l7, l10, vs_lhh, vs_rhh Response
Pitching-stats payload.
Hide child attributes
Hide child attributes
all, home, away, l3, l7, l10, vs_lhp, vs_rhp, vs_lhh, vs_rhh, late_inning, vs_risp, first_pitch, two_strike, full_count Pitches in the chase region (Statcast zones 11–14) — the Chase% denominator.
Swings at chase-region pitches — the Chase% numerator.
First pitch of each plate appearance — the F-Strike% denominator.
First pitches that were strikes (called / swinging / foul / in play).
Pitcher wins — W decisions across all appearances (starter + reliever).
Pitcher losses — L decisions across all appearances.
Quality starts (≥6 IP, ≤3 ER as starter). Only counted for SP usage.
Cheap wins: win as starter without recording a quality start.
Tough losses: loss despite recording a quality start.
Sum of team runs scored in games this pitcher started (run support).
Inherited runners (on base when this reliever entered, sum across appearances).
Inherited runners that came around to score. Lower = better stranding.
Expected FIP: FIP with actual HR replaced by FB × lgHR/FB — strips home-run luck out of the HR term. Null until the season's constants doc carries leagueHrPerFb.
wOBA-against, on the season's published linear weights — the same computeWoba the batter line uses, fed from the pitcher's own counters. Null when the pitcher has faced nobody.
Chase% (O-Swing%) — swings at chase-region pitches / chase-region pitches. Mirrors MlbPlateDiscipline.oSwingPct, but scoped, so the starter's card can show it per handedness / venue / trailing window.
F-Strike% — first pitches that were strikes / first pitches.
BABIP-against = (H − HR) / (AB − K − HR + SF).
Left-On-Base % — fraction of base-runners stranded. LOB% = (H + BB + HBP − R) / (H + BB + HBP − 1.4·HR) League-average sits ≈70 %; well above suggests run-prevention luck, well below suggests bad sequencing (or true skill in either direction over multiple seasons).
ERA − FIP. Positive = under-performing peripherals (BABIP / LOB% bad luck).
xwOBA-against from per-pitch hit data. Mirrors the batter's xwoba.
QS as a percentage of starts (null when gamesStarted = 0).
IRS% = inheritedRunnersScored / inheritedRunners (null when IR = 0).
Run support per start (null when gamesStarted = 0).
WPA — sum of Δ(WE) credited to the pitcher across the season.
Average leverage index of plays the pitcher faced (1.0 = neutral).
Peak (max) LI of any play the pitcher faced.
Hide child attributes
Hide child attributes
live, cache Response cache TTL; independent of source freshness. Omitted when zero.
Endpoint-specific availability context, including soccer roster coverage.