curl
ADDR=0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb
curl "https://api.arcus.xyz/v1/portfolio?address=${ADDR}"import requests
r = requests.get(
"https://api.arcus.xyz/v1/portfolio",
params={"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"},
)
print(r.json())
const url = new URL("https://api.arcus.xyz/v1/portfolio");
url.searchParams.set("address", "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb");
const res = await fetch(url);
console.log(await res.json());
const options = {method: 'GET'};
fetch('https://api.arcus.xyz/v1/portfolio', 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.arcus.xyz/v1/portfolio",
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.arcus.xyz/v1/portfolio"
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.arcus.xyz/v1/portfolio")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/portfolio")
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{
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"accountIndex": 4,
"generatedAt": 123,
"lifetimeVolume": "1234567.89",
"data": [
[
"totalDay"
]
]
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}Public
Get portfolio history
Returns bundled account-equity and PnL time series for the requested address across preset ranges (24h, 7d, 30d, all-time) and per product (total/perp).
GET
/
v1
/
portfolio
curl
ADDR=0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb
curl "https://api.arcus.xyz/v1/portfolio?address=${ADDR}"import requests
r = requests.get(
"https://api.arcus.xyz/v1/portfolio",
params={"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"},
)
print(r.json())
const url = new URL("https://api.arcus.xyz/v1/portfolio");
url.searchParams.set("address", "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb");
const res = await fetch(url);
console.log(await res.json());
const options = {method: 'GET'};
fetch('https://api.arcus.xyz/v1/portfolio', 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.arcus.xyz/v1/portfolio",
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.arcus.xyz/v1/portfolio"
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.arcus.xyz/v1/portfolio")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcus.xyz/v1/portfolio")
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{
"address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb",
"accountIndex": 4,
"generatedAt": 123,
"lifetimeVolume": "1234567.89",
"data": [
[
"totalDay"
]
]
}{
"error": "Invalid request body",
"code": "GEO_RESTRICTED"
}{
"error": "rate limited",
"reason": "account_empty",
"retryAfterMs": 850,
"clientId": "my-order-42"
}The response body shown here is a static example, not live data. After you click Send, your live result appears in a separate panel headed 200 OK. The panel under the status-code tabs is a fixed sample from the spec — its field values (fees, prices, sizes, IDs, timestamps) are placeholders. Use Send, or call the endpoint, for current values.
accountEquityHistory (absolute equity) and pnlHistory (period profit and loss, rebased so each timeframe starts at 0).
Data points are [timestamp_us, "decimal_value"] tuples. Values are stringified to preserve precision; clients should treat them as decimals, not floats.
No authentication header is required.Query Parameters
Master Ethereum address for this API key (must match address from POST /createApiKey for the same key). Required on REST for account-scoped reads and for place/cancel. Invalid hex → 400; mismatch with key → 403.
20-byte EVM address as hex: optional 0x or 0X prefix and exactly 40 hexadecimal digits. API responses normalize to lowercase a–f after 0x.
Pattern:
^(0x|0X)?[0-9a-fA-F]{40}$Response
Portfolio history bundle.
Was this page helpful?