GET /traders/{address}/categories: Per-Category Breakdown
curl --request GET \
--url https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categoriesimport requests
url = "https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories', 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://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories")
.asString();require 'uri'
require 'net/http'
url = URI("https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodyTrader Data API
GET /traders/{address}/categories: Per-Category Breakdown
Per-category PnL and volume breakdown for the wallet.
GET
/
trader-analytics
/
traders
/
{address}
/
categories
GET /traders/{address}/categories: Per-Category Breakdown
curl --request GET \
--url https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categoriesimport requests
url = "https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories', 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://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories")
.asString();require 'uri'
require 'net/http'
url = URI("https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_bodySign each request with a fresh HMAC signature. The cURL and HTTP header values below are placeholders, not reusable credentials. For runnable signing code, use request signing examples. Python examples use the signed session from that page; Node.js examples use its
bravadoFetch helper.GET https://partner-api.bravadotrade.com/trader-analytics/traders/{address}/categories
Category values changed 2026-09-12 (Polymarket only).
category now comes from the
same canonical classification the PnL and
volume leaderboards’ category field reads, so a
wallet’s dominant category here and on the board can no longer disagree. Previously this
endpoint used a different, less reliable heuristic (the lowest-numbered Polymarket tag on
the market’s event) that could surface a raw entity name instead of a topic — e.g.
"Iran" or "patriots" instead of Geopolitics or Sports. If you cached or hardcoded
any of the old values, re-check them: casing is now consistent, and several buckets
(Sports especially) now include markets that used to appear under a narrower or noisier
label. The response shape is unchanged. On predict.fun, categories still come from that
venue’s own tag tree and were not affected by this change — they use a different
vocabulary from the leaderboard’s category field, which is not available on that venue
at all yet.Path Parameters
Query Parameters
string
default:"all"
Rolling time window. Accepted values:
1h, 4h, 24h, 7d, 30d, 90d, 365d, all.Response
An array of category breakdown objects.Example
curl -G https://partner-api.bravadotrade.com/trader-analytics/traders/0xabc.../categories \
-H "X-BRAVADO-API-KEY: $BRAVADO_API_KEY" \
-H "X-BRAVADO-TIMESTAMP: <unix-ms>" \
-H "X-BRAVADO-SIGNATURE: <signature-for-this-request>" \
-d window=90d
[
{
"category": "Politics",
"realized_pnl": "2100.440000",
"volume_usdc": "18400.000000",
"trades": 210,
"win_rate": "0.7123"
}
]