curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&marketId=KXFEDDECISION-26JAN-T425"
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&granularity=day"
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&startTime=1733011200000&endTime=1735689600000"
{
"totalDeposits": "500000000",
"totalWithdrawals": "100000000",
"realizedPnl": "25000000",
"unrealizedPnl": "5000000",
"netPnl": "30000000",
"totalFeesPaid": "150000"
}
{
"totalDeposits": "500000000",
"totalWithdrawals": "100000000",
"realizedPnl": "25000000",
"unrealizedPnl": "5000000",
"netPnl": "30000000",
"totalFeesPaid": "150000",
"timeSeries": [
{
"timestamp": 1733011200000,
"cumulativePnl": "-5000000"
},
{
"timestamp": 1733097600000,
"cumulativePnl": "10000000"
},
{
"timestamp": 1733184000000,
"cumulativePnl": "25000000"
}
]
}
{
"error": "Valid Ethereum address is required"
}
Account
Get User PNL
Calculate profit and loss for a user’s trading activity
GET
/
user
/
pnl
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&marketId=KXFEDDECISION-26JAN-T425"
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&granularity=day"
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&startTime=1733011200000&endTime=1735689600000"
{
"totalDeposits": "500000000",
"totalWithdrawals": "100000000",
"realizedPnl": "25000000",
"unrealizedPnl": "5000000",
"netPnl": "30000000",
"totalFeesPaid": "150000"
}
{
"totalDeposits": "500000000",
"totalWithdrawals": "100000000",
"realizedPnl": "25000000",
"unrealizedPnl": "5000000",
"netPnl": "30000000",
"totalFeesPaid": "150000",
"timeSeries": [
{
"timestamp": 1733011200000,
"cumulativePnl": "-5000000"
},
{
"timestamp": 1733097600000,
"cumulativePnl": "10000000"
},
{
"timestamp": 1733184000000,
"cumulativePnl": "25000000"
}
]
}
{
"error": "Valid Ethereum address is required"
}
Overview
Returns a comprehensive PNL (Profit and Loss) summary for a user, including:- Realized PNL - Profit/loss from completed trades and settlements
- Unrealized PNL - Estimated profit/loss on open positions
- Net PNL - Combined realized and unrealized PNL
- Total Fees - All trading fees paid
- Time Series - Optional PNL over time
To avoid ambiguity, we denote the smallest possible multiple of USDC (0.000001 USDC) as one
uusdc,
which stands for µUSDC (micro-USDC), and denote the smallest possible multiple of a contract (0.01 contract)
as one ccontract (centicontract).User-facing USDC balances are specified as fixed-point strings (e.g. "1.2625" for USDC). Contract quantities
in the API and SDK are specified as integer ccontracts strings (e.g. "1050" for 10.50 contracts at precision 2).PNL Calculation
Realized PNL is calculated as:Realized PNL = Sell Revenue + Settlement Payouts - Buy Costs - Fees
string
required
User’s Ethereum wallet address (e.g.,
0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266)string
Filter PNL calculation to a specific market. When set, deposits and withdrawals are excluded from the calculation.
number
Start timestamp in milliseconds. Only includes transactions after this time.
number
End timestamp in milliseconds. Only includes transactions before this time.
string
default:"all"
Time-series granularity for the
timeSeries field:all- No time series returned (default)hour- Hourly PNL snapshotsday- Daily PNL snapshots
Response
string
required
Total USDC deposited in µUSDC (integer string). Excluded when filtering by
marketId.string
required
Total USDC withdrawn (claimed) in µUSDC (integer string). Excluded when filtering by
marketId.string
required
Realized profit/loss in µUSDC (integer string). Positive = profit, negative = loss.
string
required
Estimated unrealized profit/loss in µUSDC based on open positions (integer string).
string
required
Total PNL (realized + unrealized) in µUSDC (integer string).
string
required
Total trading fees paid in µUSDC (integer string).
array
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&marketId=KXFEDDECISION-26JAN-T425"
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&granularity=day"
curl "https://api.bison.markets/user/pnl?userId=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266&startTime=1733011200000&endTime=1735689600000"
{
"totalDeposits": "500000000",
"totalWithdrawals": "100000000",
"realizedPnl": "25000000",
"unrealizedPnl": "5000000",
"netPnl": "30000000",
"totalFeesPaid": "150000"
}
{
"totalDeposits": "500000000",
"totalWithdrawals": "100000000",
"realizedPnl": "25000000",
"unrealizedPnl": "5000000",
"netPnl": "30000000",
"totalFeesPaid": "150000",
"timeSeries": [
{
"timestamp": 1733011200000,
"cumulativePnl": "-5000000"
},
{
"timestamp": 1733097600000,
"cumulativePnl": "10000000"
},
{
"timestamp": 1733184000000,
"cumulativePnl": "25000000"
}
]
}
{
"error": "Valid Ethereum address is required"
}
Use Cases
Portfolio Dashboard
Display overall trading performance:const pnl = await fetch('/user/pnl?userId=0x...').then(r => r.json());
console.log(`Net P&L: $${Number(pnl.netPnl) / 1_000_000}`);
console.log(`Fees Paid: $${Number(pnl.totalFeesPaid) / 1_000_000}`);
Performance Chart
Build a PNL chart over time:const pnl = await fetch('/user/pnl?userId=0x...&granularity=day').then(r => r.json());
// pnl.timeSeries contains daily cumulative PNL points
const chartData = pnl.timeSeries.map(point => ({
date: new Date(point.timestamp),
pnl: Number(point.cumulativePnl) / 1_000_000
}));
Market-Specific Analysis
Analyze performance on a specific market:const marketPnl = await fetch(
'/user/pnl?userId=0x...&marketId=KXFEDDECISION-26JAN-T425'
).then(r => r.json());
console.log(`Market P&L: $${Number(marketPnl.realizedPnl) / 1_000_000}`);