Skip to main content
GET
/
polymarket
/
trader
/
pnl
/
{address}
/
positions
Get trader position PnL
curl --request GET \
  --url https://api.struct.to/v1/polymarket/trader/pnl/{address}/positions
[
  {
    "position_id": "<string>",
    "condition_id": "<string>",
    "market_slug": "<string>",
    "event_slug": "<string>",
    "title": "<string>",
    "image_url": "<string>",
    "outcome": "<string>",
    "outcome_index": 123,
    "won": true,
    "total_buys": 123,
    "total_sells": 123,
    "total_shares_bought": 123,
    "total_shares_sold": 123,
    "total_buy_usd": 123,
    "total_sell_usd": 123,
    "redemption_usd": 123,
    "avg_entry_price": 123,
    "avg_exit_price": 123,
    "realized_pnl_usd": 123,
    "total_fees": 123,
    "first_trade_at": 123,
    "last_trade_at": 123,
    "current_price": 123,
    "current_shares_balance": 123,
    "current_value": 123,
    "realized_pnl_pct": 123
  }
]

Documentation Index

Fetch the complete documentation index at: https://docs.struct.to/llms.txt

Use this file to discover all available pages before exploring further.

Path Parameters

address
string
required

Trader wallet address

Query Parameters

status
enum<string>
required

Required. Filter by position status Position status filter for open/closed positions.

Available options:
open,
closed
won
boolean

Filter by outcome: true (won), false (lost), only for status=closed

Search by market title

sort_by
enum<string>

Sort field (default: realized_pnl_usd)

Available options:
realized_pnl_usd,
total_buy_usd,
total_sell_usd,
redemption_usd,
total_buys,
total_sells,
total_shares_bought,
total_shares_sold,
avg_entry_price,
avg_exit_price,
total_fees,
first_trade_at,
last_trade_at,
current_value,
realized_pnl_pct,
title
sort_direction
enum<string>

Sort direction: asc, desc (default: desc)

Available options:
asc,
desc
limit
integer<int32>

Results limit (default: 10, max: 200)

offset
integer<int32>

Pagination offset

condition_id
string

Filter by market condition ID (or use market_slug)

market_slug
string

Filter by market slug (alternative to condition_id)

position_id
string

Filter by specific outcome token (position ID)

min_shares
number<double>

Minimum shares balance to include. Status filtering already treats balances below 0.01 shares as dust.

Response

200 - application/json

Position-level PnL entries for this trader. Each entry is a specific outcome token with open/closed state, avg_entry_price, avg_exit_price, and redemption info.

position_id
string | null
condition_id
string | null
market_slug
string | null
event_slug
string | null
title
string | null
image_url
string | null
outcome
string | null
outcome_index
integer<int32> | null
won
boolean | null

TRUE = won, FALSE = lost, NULL = open or sold before resolution

total_buys
integer<int64> | null
total_sells
integer<int64> | null
total_shares_bought
number<double> | null
total_shares_sold
number<double> | null
total_buy_usd
number<double> | null
total_sell_usd
number<double> | null
redemption_usd
number<double> | null

Payout on redemption (non-zero only if won)

avg_entry_price
number<double> | null

VWAP price paid per share across all buys (0–1)

avg_exit_price
number<double> | null

VWAP price received per share across all sells (0–1)

realized_pnl_usd
number<double> | null
total_fees
number<double> | null
first_trade_at
integer<int64> | null
last_trade_at
integer<int64> | null
current_price
number<double> | null

Last traded price for this outcome (0–1). NULL if market_outcomes has no price yet.

current_shares_balance
number<double> | null

Current shares held: balance / 1e6.

current_value
number<double> | null

Estimated current USD value of held shares: (balance / 1e6) * current_price. Only meaningful for open positions (balance above dust threshold).

realized_pnl_pct
number<double> | null

Realized PnL as a percentage of total spend: (realized_pnl_usd / total_buy_usd) * 100. NULL when total_buy_usd = 0.

Last modified on May 1, 2026