Synpath
Account

Positions

Position changes as the venue reports them.

WSSawait stream.watch_positions(market_ids=None)SDK stream · your process · venue credentials

Self-hosted. Opened from your own process straight to the venue. Nothing here runs on Synpath's servers.

Each event carries a Position, net on the YES leg. Polymarket has no position channel; read positions over REST there.

Venues

VenueSupportNotes
PolymarketNot offeredNo position channel on the venue. has["watch_positions"] is false.
KalshiSupported
Polymarket USSupported
OpinionNot offered

Parameters

NameTypeDescription
market_idslist[str] | NoneOnly these markets. Omit for every market.

PositionEvent

A position changed.

NameTypeDescription
venuestringWhich venue the event came from.
received_atintegerWhen this process received it, ms since epoch.
positionPositionThe position, as in the REST API.
import asyncio
from synpath import PolymarketTrading, PolymarketUserStream, load_credentials, require

trading = PolymarketTrading(require("polymarket", load_credentials()))
stream = PolymarketUserStream(trading=trading)                 # derives the CLOB credentials

from synpath import PositionEvent

async def main():
    async with stream:
        await stream.watch_positions()          # Polymarket: not offered, read REST instead
        async for event in stream:
            if isinstance(event, PositionEvent):
                p = event.position
                print(p.market_id, p.side, p.contracts)

asyncio.run(main())
PositionEvent
{
  "venue": "kalshi",
  "received_at": 1790077592174,
  "position": {
    "market_id": "kalshi:KXELONMARS-99",
    "side": "long",
    "contracts": "2",
    "entry_price": "0.10",
    "…": "the full Position"
  }
}