Exiting an Alphapoly Position
Prerequisites
- Backend running on
http://localhost:8000 - Wallet unlocked (action endpoints return HTTP 401 if not)
Flow
- List positions —
GET /positions(or?state=activeto filter) - Pick a position — note the
position_id - Choose action based on state:
| Situation | Action |
|---|---|
| Fully close a position | Exit — orchestrated merge + sell (preferred) |
| Sell one specific side | Sell — token_type: "wanted" |
| Clear failed entry leftovers | Sell — token_type: "unwanted" |
| Market resolved, hold both outcomes | Merge |
State is pending |
Retry |
- Confirm — require explicit user approval before executing any sell or merge
- Execute — see quick reference below
- Verify — re-fetch position; full exit shows
state: "complete"
Quick Reference
# Fully exit (orchestrated merge + sell) — preferred
POST /positions/{id}/exit
{"slippage": 10}
# Sell a side
POST /positions/{id}/sell
{"side": "target", "token_type": "wanted"}
# Merge resolved pair
POST /positions/{id}/merge
{"side": "target"}
# Retry pending
POST /positions/{id}/retry
# Check result
GET /positions/{id}
token_type Explained
When entering, the system splits pUSD into YES+NO tokens and sells the side you don't want via CLOB to recover partial cost.
"wanted"— the token you hold as your position (normal exit)"unwanted"— residual from a failed or partial entry sell (cleanup)
Typical Exit Flow
GET /positions # find position_id
POST /positions/{id}/sell # {"side":"target","token_type":"wanted"}
POST /positions/{id}/sell # {"side":"cover","token_type":"wanted"}
GET /positions/{id} # confirm state == "complete"
If unwanted balances remain after entry: POST /positions/{id}/retry
If market resolved and holding both outcomes:
POST /positions/{id}/merge # {"side":"target"}
POST /positions/{id}/merge # {"side":"cover"}
For full response schemas and error codes, see api-reference.md.
Safety Rules
These operations involve real tokens on Polygon — sells are irreversible once the CLOB order fills, and merges burn tokens permanently.
- Always list positions (
GET /positions) before acting — never guess a position_id - Never execute a sell or merge without explicit user confirmation
- After any sell/merge, re-fetch the position to verify the new state
- If a sell returns
filled: false, surface it — the user still holds the tokens