List a league's payout ledger (read-only)
curl --request GET \
--url https://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments \
--header 'Authorization: Bearer <token>'import requests
url = "https://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments', 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://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments",
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://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments"
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://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments")
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": [
{
"id": "<string>",
"positionId": "<string>",
"officialId": "<string>",
"amountCents": 123,
"amountDollars": 123,
"currency": "<string>",
"paidAt": "2023-11-07T05:31:56Z",
"failureCode": "<string>",
"failureMessage": "<string>",
"createdAt": "2023-11-07T05:31:56Z"
}
]
}{
"error": "unauthorized"
}{
"error": "league_not_found"
}Payments
List a league's payout ledger (read-only)
Newest first. There is no v1 endpoint to create or settle payments — payments are produced by in-app organizer actions.
GET
/
leagues
/
{leagueId}
/
payments
List a league's payout ledger (read-only)
curl --request GET \
--url https://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments \
--header 'Authorization: Bearer <token>'import requests
url = "https://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments', 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://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments",
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://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments"
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://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://whistle.huddleup-sports.com/api/v1/leagues/{leagueId}/payments")
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": [
{
"id": "<string>",
"positionId": "<string>",
"officialId": "<string>",
"amountCents": 123,
"amountDollars": 123,
"currency": "<string>",
"paidAt": "2023-11-07T05:31:56Z",
"failureCode": "<string>",
"failureMessage": "<string>",
"createdAt": "2023-11-07T05:31:56Z"
}
]
}{
"error": "unauthorized"
}{
"error": "league_not_found"
}Authorizations
Partner API key: Authorization: Bearer whk_…. Keys are issued by the Whistle team (email tommy@huddleup-sports.com), shown once at issuance, and bound to your source namespace — they access only your leagues (plus explicit grants) and your webhook endpoints. Any auth failure returns 401 {"error":"unauthorized"}; the API never returns 403 — out-of-scope resources answer 404 exactly like nonexistent ones.
Path Parameters
Whistle league id (id from league responses).
Response
Array of payments
Show child attributes
Show child attributes
Last modified on July 10, 2026
⌘I

