Get public pack positions by account
curl --request GET \
--url https://api.limitless.exchange/parlay/{account}/positionsimport requests
url = "https://api.limitless.exchange/parlay/{account}/positions"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.limitless.exchange/parlay/{account}/positions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.limitless.exchange/parlay/{account}/positions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.limitless.exchange/parlay/{account}/positions"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.limitless.exchange/parlay/{account}/positions")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitless.exchange/parlay/{account}/positions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"status": "ACTIVE",
"stakeAmount": "<string>",
"collateralDeposited": "<string>",
"multiplierOffered": "<string>",
"isClaimed": true,
"createdAt": "<string>",
"legs": [
{
"id": "<string>",
"legIndex": 123,
"marketId": 123,
"conditionId": "<string>",
"outcome": "YES",
"priceAtCreation": "<string>",
"resolutionStatus": "LOST",
"marketSlug": "<string>",
"marketTitle": "<string>",
"marketImageUrl": "<string>",
"group": {
"id": 123,
"slug": "<string>",
"title": "<string>",
"leagueName": "<string>",
"homeTeam": "<string>",
"awayTeam": "<string>",
"homeScore": 123,
"awayScore": 123,
"startMatchTimestamp": 123
},
"leagueName": "<string>",
"startMatchTimestamp": 123,
"resolvedAt": "2023-11-07T05:31:56Z",
"esportsPropType": "map_handicap",
"outcomeLabels": [
"<string>"
],
"outcomeImageUrls": [
"<string>"
]
}
],
"resolvedAt": "2023-11-07T05:31:56Z",
"sourcePack": {
"id": "<string>",
"name": "<string>"
}
}
],
"limit": 123,
"page": 123,
"totalPages": 123,
"totalRows": 123
}Public Portfolio
Get User Pack Positions (Public)
Returns a profile’s public pack (parlay) positions by Ethereum address, newest first. Only ACTIVE, WON, and LOST positions are included.
GET
/
parlay
/
{account}
/
positions
Get public pack positions by account
curl --request GET \
--url https://api.limitless.exchange/parlay/{account}/positionsimport requests
url = "https://api.limitless.exchange/parlay/{account}/positions"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.limitless.exchange/parlay/{account}/positions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.limitless.exchange/parlay/{account}/positions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.limitless.exchange/parlay/{account}/positions"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.limitless.exchange/parlay/{account}/positions")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.limitless.exchange/parlay/{account}/positions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"status": "ACTIVE",
"stakeAmount": "<string>",
"collateralDeposited": "<string>",
"multiplierOffered": "<string>",
"isClaimed": true,
"createdAt": "<string>",
"legs": [
{
"id": "<string>",
"legIndex": 123,
"marketId": 123,
"conditionId": "<string>",
"outcome": "YES",
"priceAtCreation": "<string>",
"resolutionStatus": "LOST",
"marketSlug": "<string>",
"marketTitle": "<string>",
"marketImageUrl": "<string>",
"group": {
"id": 123,
"slug": "<string>",
"title": "<string>",
"leagueName": "<string>",
"homeTeam": "<string>",
"awayTeam": "<string>",
"homeScore": 123,
"awayScore": 123,
"startMatchTimestamp": 123
},
"leagueName": "<string>",
"startMatchTimestamp": 123,
"resolvedAt": "2023-11-07T05:31:56Z",
"esportsPropType": "map_handicap",
"outcomeLabels": [
"<string>"
],
"outcomeImageUrls": [
"<string>"
]
}
],
"resolvedAt": "2023-11-07T05:31:56Z",
"sourcePack": {
"id": "<string>",
"name": "<string>"
}
}
],
"limit": 123,
"page": 123,
"totalPages": 123,
"totalRows": 123
}Returns a user’s pack (parlay) positions by Ethereum address, newest first. Public, no authentication required. The response includes only
ACTIVE, WON, and LOST positions; internal lifecycle states never appear here.
When to use
Use this endpoint to render a packs positions list on a public profile view. Pass any wallet address; you do not need to be that user. For your own positions with private fields (wallet, transaction hashes, vig), use the authenticated positions endpoint instead.Response contract
The200 body is a paginated page: data, limit, page, totalPages, and totalRows.
- Each position carries its status, stake, multiplier, claim state (
isClaimed), leg details, and the source pack it was bought from (nullfor custom packs). - The public payload deliberately excludes wallet addresses, token IDs, transaction hashes, and vig fields.
- The API sorts positions by creation time, newest first.
Filtering and pagination
statusnarrows the list to a single status:ACTIVE,WON, orLOST. Any other value returns400 Bad Request. Omit it to return all three.- The API clamps
limitserver-side to the range 1-50. The default is 20. offsetdefaults to 0. The API caps it at 10,000; a larger offset returns400 Bad Request.totalRowsalways reflects the full matching count, whiletotalPagesstops at the last browsable page under the offset cap.
Address handling
Theaccount path parameter accepts a checksummed (EIP-55) or lowercase Ethereum address. A malformed address returns 400 Bad Request. An address with no profile returns 404 Not Found.
Caching
Responses carryCache-Control: public, max-age=5, s-maxage=15, so CDN edges may serve a cached copy for up to 15 seconds. Status and claim state can trail the live database by roughly 30 seconds in the worst case. The authenticated owner endpoint is uncached.Path Parameters
User Ethereum address
Example:
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
Query Parameters
Page size. Clamped server-side to the range 1-50.
Required range:
1 <= x <= 50Number of positions to skip. Offsets above 10000 return 400.
Required range:
0 <= x <= 10000Filter to a single status. Omit to return all public statuses.
Available options:
ACTIVE, WON, LOST Response
Paginated public pack positions, newest first