curl --request GET \
--url https://api.4casters.io/user/v2/getGraded \
--header 'Authorization: <api-key>'import requests
url = "https://api.4casters.io/user/v2/getGraded"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.4casters.io/user/v2/getGraded', 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.4casters.io/user/v2/getGraded",
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: <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://api.4casters.io/user/v2/getGraded"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<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://api.4casters.io/user/v2/getGraded")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.4casters.io/user/v2/getGraded")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"graded": [
{
"game": {
"isSpecials": true,
"tournamentName": "<string>",
"periodName": "<string>",
"id": "<string>",
"league": "<string>",
"live": true,
"sport": "<string>",
"participants": [
{
"id": "<string>",
"longName": "<string>",
"shortName": "<string>",
"homeAway": "home",
"futuresSide": "<string>",
"mainPitcher": "<string>",
"score": 123,
"rotationNumber": "<string>"
}
],
"eventName": "<string>",
"ended": true,
"parentGameID": "<string>",
"start": "2026-08-01T00:00:00.000Z"
},
"id": "<string>",
"type": "moneyline",
"bet": 123,
"txID": "<string>",
"closed": false,
"ticketNumber": "<string>",
"odds": 123,
"fee": "<string>",
"risk": "<string>",
"win": "<string>",
"origin": "wager",
"cancelled": false,
"outcome": "winner",
"graded": true,
"createdAt": "2026-08-01T00:00:00.000Z",
"adminRefund": true,
"wagerRequestID": "<string>",
"userReference": "<string>",
"isPostArb": true,
"matchedTime": "2026-08-01T00:00:00.000Z",
"settledAt": "2026-08-01T00:00:00.000Z",
"platform": "<string>",
"result": "<string>",
"participantID": "<string>",
"spread": 123,
"total": 123,
"OU": "over",
"side": "yes",
"market": "<string>"
}
],
"summary": {
"pnl": 123,
"volume": 123
}
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Get graded bets
Your settled (graded) bets whose game started inside a date window, one row per fill, plus a P&L summary.
Rows are per fill: an order that matched three times is three rows, each with its own txID. You appear as the taker (origin: "wager") on orders you took and as the maker (origin: "offer") on orders you posted that were taken; bet and odds are always from your side. Each row embeds its game.
The window is capped at 35 days. Omit startDate for your full history; an explicit window wider than 35 days is rejected with 400 rather than silently truncated. To poll for newly settled bets without guessing dates, use getGradedSince.
Dates match the start time of the game, not the settlement time, so a bet that settles late still falls in its game’s window. Any ISO 8601 string is accepted.
Settlement amounts are ledger-anchored: fee is the commission actually charged on the fill, risk is stake plus fee, win is gross winnings minus fee, and result is the signed P&L. Makers pay no commission.
This endpoint is rate limited to 60 requests per minute per user on top of the global limit; a 429 carries Retry-After.
Also accepts POST with the same parameters sent as a JSON body.
curl --request GET \
--url https://api.4casters.io/user/v2/getGraded \
--header 'Authorization: <api-key>'import requests
url = "https://api.4casters.io/user/v2/getGraded"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.4casters.io/user/v2/getGraded', 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.4casters.io/user/v2/getGraded",
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: <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://api.4casters.io/user/v2/getGraded"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<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://api.4casters.io/user/v2/getGraded")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.4casters.io/user/v2/getGraded")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"graded": [
{
"game": {
"isSpecials": true,
"tournamentName": "<string>",
"periodName": "<string>",
"id": "<string>",
"league": "<string>",
"live": true,
"sport": "<string>",
"participants": [
{
"id": "<string>",
"longName": "<string>",
"shortName": "<string>",
"homeAway": "home",
"futuresSide": "<string>",
"mainPitcher": "<string>",
"score": 123,
"rotationNumber": "<string>"
}
],
"eventName": "<string>",
"ended": true,
"parentGameID": "<string>",
"start": "2026-08-01T00:00:00.000Z"
},
"id": "<string>",
"type": "moneyline",
"bet": 123,
"txID": "<string>",
"closed": false,
"ticketNumber": "<string>",
"odds": 123,
"fee": "<string>",
"risk": "<string>",
"win": "<string>",
"origin": "wager",
"cancelled": false,
"outcome": "winner",
"graded": true,
"createdAt": "2026-08-01T00:00:00.000Z",
"adminRefund": true,
"wagerRequestID": "<string>",
"userReference": "<string>",
"isPostArb": true,
"matchedTime": "2026-08-01T00:00:00.000Z",
"settledAt": "2026-08-01T00:00:00.000Z",
"platform": "<string>",
"result": "<string>",
"participantID": "<string>",
"spread": 123,
"total": 123,
"OU": "over",
"side": "yes",
"market": "<string>"
}
],
"summary": {
"pnl": 123,
"volume": 123
}
}
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}{
"error": "<string>"
}Authorizations
The auth token returned by POST /user/login (data.user.auth), sent as the raw header value — no Bearer prefix.
Query Parameters
Start of the window (inclusive), matched against the game start time. Omit for your full history.
"2026-08-01T00:00:00.000Z"
End of the window (exclusive), matched against the game start time. Defaults to now.
"2026-08-01T00:00:00.000Z"
Response
OK
Show child attributes
Show child attributes
Was this page helpful?