GET
/api/v1/portfolio
Quotient intelligence for a Polymarket wallet's portfolio
Parameters
| Name | In | Type | Description |
|---|---|---|---|
| wallet | query, required | string | Polymarket wallet address (proxy wallet) |
| size_threshold | query | number | Minimum position size to include (passed to the Polymarket data API) |
| include_perps | query | boolean | Also fetch Polymarket perps positions for the wallet |
Response fields
| Field | Type | Meaning |
|---|---|---|
| wallet | string | |
| as_of | string | |
| value_usd | number | Sum of open position values |
| positions_count | integer | |
| covered_count | integer | |
| unmatched_count | integer | |
| positions_capped | boolean | True when the wallet may hold more than the 1500-position fetch cap |
| positions | PortfolioPosition[] | |
| unmatched | object[] | Positions with no matching Quotient market |
| perps | object | Only when include_perps=true |
Billing and limits
Calls are billed to prepaid credits, or per call over x402. The price above is the reference price; the 402 challenge returned at request time is what a call actually costs.
One request may be in flight at a time, and request starts must be at least one second apart. A rejected 429 is not billed. See rate limits.
curl
curl -H "x-quotient-api-key: qt_…" \
"https://quotient-api-gateway.onrender.com/api/v1/portfolio"200 · application/json
{
"wallet": "…",
"as_of": "…",
"value_usd": 0,
"positions_count": 0,
"covered_count": 0,
"unmatched_count": 0,
"positions_capped": false,
"positions": [
{
"condition_id": "…",
"title": "…",
"slug": "…",
"event_slug": "…",
"outcome": "…",
"size": 0,
"avg_price": 0,
"cur_price": 0,
"current_value_usd": 0,
"cash_pnl": 0,
"percent_pnl": 0,
"redeemable": false,
"end_date": "…",
"quotient": {
"covered": false,
"market": {},
"forecast": {
"venue": "polymarket",
"market": {
"venue": "polymarket",
"nativeMarketId": "…",
"nativeEventId": "…",
"seriesTicker": "…",
"marketKey": "…",
"slug": "…",
"marketUrl": "…",
"sourceUrl": "…"
},
"id": "…",
"probability": 0,
"created_at": "…",
"delta_from_prior": 0,
"refresh_reason": "…",
"bluf": "…",
"thesis": "…",
"resolution_pathway": {
"criteria": "…",
"crux": "…",
"deadline": "…",
"source": "…"
},
"conviction_tier": 0,
"relationships": {
"assets": [
null
],
"markets": [
null
],
"signals": [
null
],
"truncated": {
"assets": null,
"markets": null,
"signals": null
}
}
},
"signal": {
"id": "…",
"side": "YES",
"created_at": "…",
"status": "actionable",
"retired_reason": "resolved",
"relationships": {
"assets": [
null
],
"markets": [
null
],
"signals": [
null
],
"truncated": {
"assets": null,
"markets": null,
"signals": null
}
}
},
"convergence": {
"aligned": false,
"q_side": "YES",
"q_value_cents": 0,
"entry_cost_cents": 0,
"current_cost_cents": 0,
"distance_to_convergence_cents": 0,
"converge_upside_pct": 0,
"priced_at": "…"
}
}
}
],
"unmatched": [
{
"condition_id": "…",
"title": "…",
"slug": "…"
}
],
"perps": {
"positions": [
{
"symbol": "…",
"size": 0,
"entry_price": 0,
"unrealized_pnl": 0,
"return_on_equity": 0
}
],
"equity": 0,
"oil_signal": {
"id": "…",
"state": "bullish",
"z": 0,
"intensity": "…",
"reading_date": "…",
"relationships": {
"assets": [
{}
],
"markets": [
{}
],
"signals": [
{}
],
"truncated": {
"assets": false,
"markets": false,
"signals": false
}
}
},
"error": "…"
}
}