Skip to content
scrapeatlas.Dashboard

List a Polymarket trader’s positions

Try in Playground

List a trader’s positions with size, average and current price, value, cost and realized and unrealized PnL. Choose open, closed, redeemable, redeemable_lost or mergeable positions, sort them, and page with the returned cursor.

GET/v1/polymarket/user-positionsx-api-key
x-api-keystringrequiredheader

Your ScrapeAtlas customer key. Create one on /account/ and set SCRAPEATLAS_API_KEY.

Query parameters
6
userstringrequiredquery

Required. Trading wallet or owner wallet (0x plus 40 hex characters), @handle, or a polymarket.com/@handle or /profile/<wallet> URL. A handle is resolved to its trading wallet from the public profile page. An owner wallet is replaced by its trading wallet.

min 1 chars · max 600 chars

Example0x1111111111111111111111111111111111111111
statusenumquery

open (default; includes settled winners not yet redeemed), closed (exited), redeemable, redeemable_lost (losing positions still held) or mergeable (complementary pairs).

one of: open, closed, redeemable, redeemable_lost, mergeable

Exampleopen
sortByenumquery

current_value, price, tokens, unrealized_pnl, realized_pnl, total_pnl or timestamp. Defaults to current_value for open positions and realized_pnl for closed ones.

one of: current_value, price, tokens, unrealized_pnl, realized_pnl, total_pnl, timestamp

directionenumquery

desc (default) or asc.

one of: asc, desc

limitstringquery

Positions per page, 1–500; defaults to 100.

cursorstringquery

Optional nextCursor from the previous response. Send the same other parameters with it; omit it for the first page.

Response fields
52
requestIdstring

Request correlation UUID.

Upstream requests, decoded response bytes and elapsed milliseconds.

accounting.upstreamRequestsinteger

Always included.

≥ 0

accounting.responseBytesinteger

Always included.

≥ 0

accounting.durationMsnumber

Always included.

≥ 0

successboolean

True when usable data is returned; inspect status and coverage for omissions.

statusenum

open (default; includes settled winners not yet redeemed), closed (exited), redeemable, redeemable_lost (losing positions still held) or mergeable (complementary pairs).

one of: success, partial

sourceUrlstring

Public Polymarket page the data describes, or the public API URL when no page exists (an order book or price history requested by token ID).

absolute HTTPS URL

fetchedAtstring

UTC retrieval time.

complete is false when a warning names an omission, such as market_limit, level_limit, point_limit, comment_row_limit or stats_unavailable.

coverage.sourcestring

Always included.

coverage.completeboolean

Always included.

coverage.warningsstring[]

Always included.

walletstring

Trading wallet the positions were read for.

Positions: proxy_wallet, condition_id, token_id, outcome, outcome_index, title, slug, event_slug and icon: the market and outcome the row belongs to. event_id, end_date, opposite_outcome, opposite_token_id, status, current_size, total_size, avg_price, current_price, current_value, entry_cost_usdc, entry_fees_usdc, total_cost_usdc, realized_pnl, unrealized_pnl, total_pnl, percent_pnl, percent_realized_pnl, first_entry_at, last_event_at (Unix seconds), redeemable, mergeable, negative_risk, archived, name, profile_image and verified.

up to 1000 items

positions.proxy_walletstring

Always included.

positions.condition_idstring

Always included.

positions.token_idstring

Always included.

positions.titlestring

Always included.

positions.slugstring

Always included.

positions.iconstring

Always included.

positions.event_slugstring

Always included.

positions.outcomestring

Always included.

positions.outcome_indexinteger

Always included.

positions.event_idstring

Always included.

positions.end_datestring

Always included.

positions.opposite_outcomestring

Always included.

positions.opposite_token_idstring

Always included.

positions.statusstring

Always included.

positions.current_sizenumber

Always included.

positions.total_sizenumber

Always included.

positions.avg_pricenumber

Always included.

positions.current_pricenumber

Always included.

positions.current_valuenumber

Always included.

positions.entry_cost_usdcnumber

Always included.

positions.entry_fees_usdcnumber

Always included.

positions.total_cost_usdcnumber

Always included.

positions.realized_pnlnumber

Always included.

positions.unrealized_pnlnumber

Always included.

positions.total_pnlnumber

Always included.

positions.percent_pnlnumber

Always included.

positions.percent_realized_pnlnumber

Always included.

positions.first_entry_atinteger

Always included.

positions.last_event_atinteger

Always included.

positions.redeemableboolean

Always included.

positions.mergeableboolean

Always included.

positions.negative_riskboolean

Always included.

positions.archivedboolean

Always included.

positions.namestring

Always included.

positions.profile_imagestring

Always included.

positions.verifiedboolean

Always included.

nextCursorstringnullable

Cursor for the next page, or null when the source has no further page.

HTTP 200 returns the success variant. Check status: partial means usable data with warnings, and failed or challenged requests carry a failure object described in Errors & responses.

Error codes
11
HTTPfailure.codeMeaning
200partialUsable data with level_limit, point_limit, market_limit, comment_row_limit or *_unavailable warnings.
400invalid_requestMissing, duplicate, conflicting, unsafe or unsupported parameters, a URL outside polymarket.com, or a cursor the source rejects.
401unauthorizedMissing or invalid worker API key.
404not_foundUnknown event, market, outcome, token, series, handle or wallet.
429upstream_rate_limitedPolymarket throttled the request; no automatic retry.
502upstream_challengedPolymarket rejected the request or answered with a challenge page.
502unsupported_pageMalformed, mismatched or non-JSON source data, or a profile page without its wallet address.
502response_too_large payload_too_complexResponse exceeded byte or parsing limits.
502unsafe_redirect request_limit upstream_errorBounded source retrieval could not complete.
503busyAll worker slots and queue places are occupied.
504timeoutTotal request deadline expired.