Get native staking portfolio history
curl --request GET \
--url https://api.starke.finance/v1/stake/wallets/portfolioimport requests
url = "https://api.starke.finance/v1/stake/wallets/portfolio"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.starke.finance/v1/stake/wallets/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.starke.finance/v1/stake/wallets/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.starke.finance/v1/stake/wallets/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.starke.finance/v1/stake/wallets/portfolio")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.starke.finance/v1/stake/wallets/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[
{
"baseStakeAndRewardsSol": 102.5,
"baseStakeAndRewardsUsd": 15400.625,
"rewardsSol": 2.5,
"rewardsUsd": 375.625,
"timestamp": "2026-11-01T00:00:00.000Z"
}
]{
"errors": [
{
"path": "<string>",
"message": "<string>"
}
]
}Native staking
Get native staking portfolio history
Returns the SOL staked by the wallets in ids, across all their stake accounts, at each point of the window, oldest first. Each point has timestamp; baseStakeAndRewardsSol, the stake plus rewards; rewardsSol, the rewards earned so far; and both in USD at the SOL price of that point (baseStakeAndRewardsUsd, rewardsUsd). The list is empty when the wallets have no stake accounts.
GET
/
v1
/
stake
/
wallets
/
portfolio
Get native staking portfolio history
curl --request GET \
--url https://api.starke.finance/v1/stake/wallets/portfolioimport requests
url = "https://api.starke.finance/v1/stake/wallets/portfolio"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.starke.finance/v1/stake/wallets/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.starke.finance/v1/stake/wallets/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.starke.finance/v1/stake/wallets/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.starke.finance/v1/stake/wallets/portfolio")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.starke.finance/v1/stake/wallets/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[
{
"baseStakeAndRewardsSol": 102.5,
"baseStakeAndRewardsUsd": 15400.625,
"rewardsSol": 2.5,
"rewardsUsd": 375.625,
"timestamp": "2026-11-01T00:00:00.000Z"
}
]{
"errors": [
{
"path": "<string>",
"message": "<string>"
}
]
}Query Parameters
Comma-separated staker wallet addresses, 1 to 50 of them.
The start of the window, an ISO 8601 date-time.
Pattern:
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$The end of the window, an ISO 8601 date-time, not before start_time.
Pattern:
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$The spacing of the points: 15mins, 1hour or 1day.
Available options:
15mins, 1hour, 1day Response
One entry for each point in the window.