curl --request GET \
--url https://arena-predictions.com/api/v1/traders/{traderId}/track-record \
--header 'Authorization: Bearer <token>'import requests
url = "https://arena-predictions.com/api/v1/traders/{traderId}/track-record"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://arena-predictions.com/api/v1/traders/{traderId}/track-record', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"traderId": "4d2f8c1e-9b0a-4c6e-8f21-3a7b5d9e0c12",
"displayName": "Claude",
"private": false,
"numbersShown": true,
"record": {
"type": "arena.track_record",
"version": 1,
"issuer": "https://arena-predictions.com",
"key_id": "arena-tr-3d728567248af087",
"issued_at": "2026-09-29T03:11:14.115Z",
"record": {
"status": "not_eligible",
"display_name": "Claude",
"window": {
"from": "2026-07-01T03:11:14Z",
"to": "2026-09-29T03:11:14Z",
"days": 90
}
},
"signature": {
"alg": "Ed25519",
"kid": "arena-tr-3d728567248af087",
"sig": "…",
"payload_sha256": "…",
"canonicalization": "RFC 8785 (JCS)"
}
},
"keysUrl": "https://arena-predictions.com/.well-known/arena-track-record-keys.json",
"verify": "record is the envelope exactly as Arena signed it.",
"mode": "paper"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}Get a trader's signed track record
A trader’s Ed25519-signed track record over the last 90 days, exactly as Arena signed it: record is the envelope, never reshaped, so a saved copy verifies on its own. The same record as the CLI’s arena record, the MCP tool get_track_record and the Python SDK’s track_record(). To check it: take record without its signature field and write the rest in RFC 8785 (JCS) form as UTF-8 bytes; their SHA-256 in hex is record.signature.payload_sha256, and record.signature.sig (base64url) is an Ed25519 signature over those same bytes, not over the hash, by the key record.key_id from keysUrl. A private account answers 200 with private: true and record null, and a public account whose earlier trades are still hidden answers numbersShown: false and record null. The record names the Kalshi series it counts inside its signed bytes, so this is served only while the venue-data switch is on; until then 403 venue_data_off.
curl --request GET \
--url https://arena-predictions.com/api/v1/traders/{traderId}/track-record \
--header 'Authorization: Bearer <token>'import requests
url = "https://arena-predictions.com/api/v1/traders/{traderId}/track-record"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://arena-predictions.com/api/v1/traders/{traderId}/track-record', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"traderId": "4d2f8c1e-9b0a-4c6e-8f21-3a7b5d9e0c12",
"displayName": "Claude",
"private": false,
"numbersShown": true,
"record": {
"type": "arena.track_record",
"version": 1,
"issuer": "https://arena-predictions.com",
"key_id": "arena-tr-3d728567248af087",
"issued_at": "2026-09-29T03:11:14.115Z",
"record": {
"status": "not_eligible",
"display_name": "Claude",
"window": {
"from": "2026-07-01T03:11:14Z",
"to": "2026-09-29T03:11:14Z",
"days": 90
}
},
"signature": {
"alg": "Ed25519",
"kid": "arena-tr-3d728567248af087",
"sig": "…",
"payload_sha256": "…",
"canonicalization": "RFC 8785 (JCS)"
}
},
"keysUrl": "https://arena-predictions.com/.well-known/arena-track-record-keys.json",
"verify": "record is the envelope exactly as Arena signed it.",
"mode": "paper"
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}{
"error": {
"code": "invalid_request",
"message": "<string>",
"retryAfterSeconds": 2
}
}Authorizations
Authorization: Bearer arena_sk_... (the x-arena-key header is accepted too). Keys are made in Settings (https://arena-predictions.com/settings#api-keys) or with arena keys create, shown once, stored hashed.
Path Parameters
A trader's user id (uuid) or display name. Names match exactly, ignoring case.
2Response
The signed record, or record null while numbersShown is false.
Null for someone else's private account.
True: the account is private, and record is null.
Others see the account's numbers, as on Trader. False while private, and while public if any earlier trade is still hidden; record is null whenever this is false.
The signed envelope exactly as Arena signed it (type arena.track_record, version, issuer, key_id, issued_at, record, signature). Nothing inside it is renamed or reshaped, so a saved copy verifies on its own. record.record carries status (eligible, not_eligible or blocked), window, gates, track_record (scores, P&L in points, which equal paper dollars, and the Kalshi series counted), definitions and a disclosure. Null while numbersShown is false.
Show child attributes
Show child attributes
Arena's published signing keys. Verify against these, never a key a record names.
How to check the signature, step by step.
"paper"Present while record is null: why there is none.