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>",
    "category": "<string>",
    "title": "<string>",
    "question": "<string>",
    "image_url": "<string>",
    "trader": {
      "address": "<string>",
      "verified_badge": true,
      "name": "<string>",
      "pseudonym": "<string>",
      "profile_image": "<string>",
      "x_username": "<string>"
    },
    "outcome": "<string>",
    "outcome_index": 123,
    "won": true,
    "total_buys": 123,
    "total_sells": 123,
    "converted_count": 123,
    "converted_shares_gained": 123,
    "converted_shares_lost": 123,
    "total_shares_bought": 123,
    "total_shares_sold": 123,
    "total_buy_usd": 123,
    "total_sell_usd": 123,
    "redemption_usd": 123,
    "merge_usd": 123,
    "convert_collateral_usd": 123,
    "avg_entry_price": 123,
    "avg_exit_price": 123,
    "avg_price": 123,
    "realized_pnl_usd": 123,
    "total_pnl_usd": 123,
    "unrealized_pnl_usd": 123,
    "total_fees": 123,
    "first_trade_at": 123,
    "last_trade_at": 123,
    "current_price": 123,
    "last_traded_price": 123,
    "current_shares_balance": 123,
    "current_value": 123,
    "realized_pnl_pct": 123,
    "total_pnl_pct": 123,
    "end_date": 123,
    "is_neg_risk": true,
    "redeemable": true,
    "mergeable": true
  }
]

Path Parameters

address
string
required

Trader wallet address

Query Parameters

status
enum<string>
required

Required. open for positions still holding shares, closed for positions that have been fully exited or resolved.

Available options:
open,
closed
won
boolean

Only valid with status=closed. true to include profitable closed positions, false for closed positions with zero or negative realized PnL.

Case-insensitive substring match on the market title. Scoped to the chosen status — results never cross the open/closed boundary.

sort_by
enum<string>

Sort field. Default: total_pnl_usd. status=open accepts: realized_pnl_usd, total_pnl_usd, unrealized_pnl_usd, merge_usd, convert_collateral_usd, converted_count, converted_shares_gained, converted_shares_lost, last_traded_price, total_buy_usd, total_sell_usd, total_buys, total_sells, total_shares_bought, total_shares_sold, avg_entry_price, avg_exit_price, avg_price, total_fees, first_trade_at, last_trade_at, current_value, realized_pnl_pct, total_pnl_pct, title, current_price, current_shares_balance, merge_count, split_count, end_date, is_neg_risk, redeemable, mergeable. status=closed accepts: realized_pnl_usd, total_pnl_usd, unrealized_pnl_usd, merge_usd, convert_collateral_usd, converted_count, converted_shares_gained, converted_shares_lost, last_traded_price, total_buy_usd, total_sell_usd, redemption_usd, total_buys, total_sells, total_shares_bought, total_shares_sold, avg_entry_price, avg_exit_price, avg_price, total_fees, first_trade_at, last_trade_at, realized_pnl_pct, total_pnl_pct, title, merge_count, split_count, end_date, is_neg_risk. Union of every sort_by value accepted by the positions endpoint across both status=open and status=closed. Note that some options are only meaningful for one status — for example current_value / current_price / redeemable / mergeable only apply to open positions, while redemption_usd only applies to closed ones. See PositionOpenPnlSortBy and PositionClosedPnlSortBy for the exact per-status whitelists.

Available options:
realized_pnl_usd,
total_pnl_usd,
unrealized_pnl_usd,
merge_usd,
convert_collateral_usd,
converted_count,
converted_shares_gained,
converted_shares_lost,
last_traded_price,
total_buy_usd,
total_sell_usd,
redemption_usd,
total_buys,
total_sells,
total_shares_bought,
total_shares_sold,
avg_entry_price,
avg_exit_price,
avg_price,
total_fees,
first_trade_at,
last_trade_at,
current_value,
realized_pnl_pct,
total_pnl_pct,
current_price,
current_shares_balance,
merge_count,
split_count,
title,
end_date,
is_neg_risk,
redeemable,
mergeable
sort_direction
enum<string>

Default: desc

Available options:
asc,
desc
limit
integer<int32>

Default 10, max 200

offset
integer<int32>

Max 3500. Takes precedence over pagination_key.

pagination_key
string

Cursor from a previous response

condition_id
string

Filter to a single market

market_slug
string

Filter by market slug

position_id
string

Filter to a single outcome token

min_shares
number<double>

Minimum shares balance to include

category
enum<string>

Filter positions to a single market category. Combinable with sort_by. Polymarket UI category.

Available options:
Politics,
Sports,
Crypto,
Finance,
Culture,
Mentions,
Weather,
Economics,
Tech

Response

Per-position PnL rows

position_id
string | null

Position ID.

condition_id
string | null

Condition ID.

market_slug
string | null

Market slug.

event_slug
string | null

Event slug.

category
string | null

Category.

title
string | null

Title.

question
string | null

Question.

image_url
string | null

Image URL.

trader
object

Trader wallet or profile.

outcome
string | null

Outcome.

outcome_index
integer<int32> | null

Outcome index.

won
boolean | null

Won.

total_buys
integer<int64> | null

Total buys.

total_sells
integer<int64> | null

Total sells.

converted_count
integer<int64> | null

Converted count.

converted_shares_gained
number<double> | null

Converted shares gained.

converted_shares_lost
number<double> | null

Converted shares lost.

total_shares_bought
number<double> | null

Total shares bought.

total_shares_sold
number<double> | null

Total shares sold.

total_buy_usd
number<double> | null

Total buy in USD.

total_sell_usd
number<double> | null

Total sell in USD.

redemption_usd
number<double> | null

Redemption in USD.

merge_usd
number<double> | null

USD value from merge activity.

convert_collateral_usd
number<double> | null

Convert collateral in USD.

avg_entry_price
number<double> | null

Average entry price.

avg_exit_price
number<double> | null

Average exit price.

avg_price
number<double> | null

Volume-weighted average trade price across buys and sells.

realized_pnl_usd
number<double>

Realized PnL in USD.

total_pnl_usd
number<double>

Total PnL in USD.

unrealized_pnl_usd
number<double>

Unrealized PnL in USD.

total_fees
number<double> | null

Total fees.

first_trade_at
integer<int64> | null

First trade at timestamp.

last_trade_at
integer<int64> | null

Last trade at timestamp.

current_price
number<double> | null

Current price.

last_traded_price
number<double> | null

Last traded price.

current_shares_balance
number<double> | null

Current shares balance.

current_value
number<double> | null

Current value.

realized_pnl_pct
number<double> | null

Realized PnL percent.

total_pnl_pct
number<double> | null

Total PnL percent.

end_date
integer<int64> | null

End date timestamp.

is_neg_risk
boolean | null

Whether neg risk is true.

redeemable
boolean | null

Redeemable.

mergeable
boolean | null

Mergeable.

Last modified on June 17, 2026