curl --request GET \
--url https://api.kamino.finance/kvaults/vaults/{pubkey}/holdersconst options = {method: 'GET'};
fetch('https://api.kamino.finance/kvaults/vaults/{pubkey}/holders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.kamino.finance/kvaults/vaults/{pubkey}/holders"
response = requests.get(url)
print(response.text)false{
"snapshotTakenAt": "2025-03-01T12:00:00.000Z",
"totalSharesIssued": "1234.56789",
"holderCount": 123,
"result": [
{
"wallet": "VEG1EMtttdHunMbSza8uoms1R18VXmYSph2bBpHcSJd",
"sharesHeld": "1234.56789",
"sharesInFarm": "1234.56789",
"totalShares": "1234.56789",
"pctOfSharesIssued": "1234.56789",
"usdAmount": "1234.56789"
}
],
"paginationToken": "eyJsYXN0SWQiOjgxfQ=="
}{
"error": "Invalid query request",
"details": [
{
"code": "invalid_union",
"errors": [
[
{
"code": "custom",
"path": [],
"message": "Invalid date string"
}
],
[
{
"expected": "number",
"code": "invalid_type",
"path": [],
"message": "Invalid input: expected number, received string"
}
]
],
"path": [
"start"
],
"message": "Invalid input"
}
]
}{
"error": "Not authorized for this request. Please include the basic auth headers."
}{
"metadata": "Account could not be found"
}{
"error": "An internal error occurred"
}Get the share distribution of a KVault
Get the holders of a Kamino Earn Vault ordered by position size, largest first. Shares held in the wallet and shares staked in the vault farm are reported separately and as a total. Read from the most recent vault state snapshot, whose timestamp and total shares issued are returned alongside the holders so each position can be expressed as a share of the vault. Private (authorized) API access only, please add a basic auth header to your request.
curl --request GET \
--url https://api.kamino.finance/kvaults/vaults/{pubkey}/holdersconst options = {method: 'GET'};
fetch('https://api.kamino.finance/kvaults/vaults/{pubkey}/holders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.kamino.finance/kvaults/vaults/{pubkey}/holders"
response = requests.get(url)
print(response.text)false{
"snapshotTakenAt": "2025-03-01T12:00:00.000Z",
"totalSharesIssued": "1234.56789",
"holderCount": 123,
"result": [
{
"wallet": "VEG1EMtttdHunMbSza8uoms1R18VXmYSph2bBpHcSJd",
"sharesHeld": "1234.56789",
"sharesInFarm": "1234.56789",
"totalShares": "1234.56789",
"pctOfSharesIssued": "1234.56789",
"usdAmount": "1234.56789"
}
],
"paginationToken": "eyJsYXN0SWQiOjgxfQ=="
}{
"error": "Invalid query request",
"details": [
{
"code": "invalid_union",
"errors": [
[
{
"code": "custom",
"path": [],
"message": "Invalid date string"
}
],
[
{
"expected": "number",
"code": "invalid_type",
"path": [],
"message": "Invalid input: expected number, received string"
}
]
],
"path": [
"start"
],
"message": "Invalid input"
}
]
}{
"error": "Not authorized for this request. Please include the basic auth headers."
}{
"metadata": "Account could not be found"
}{
"error": "An internal error occurred"
}Path Parameters
Valid base58-encoded address
"VEG1EMtttdHunMbSza8uoms1R18VXmYSph2bBpHcSJd"
Query Parameters
Maximum number of holders to return (1-1000)
1 <= x <= 10001000
Optional pagination token
"eyJsYXN0SWQiOjgxfQ=="
Response
OK
Timestamp of the vault state snapshot the holders are read from
"2025-03-01T12:00:00.000Z"
Total shares issued by the vault in the same snapshot
"1234.56789"
Number of holders recorded in the same snapshot
Holders ordered by total shares, largest first
Show child attributes
Show child attributes
Optional pagination token
"eyJsYXN0SWQiOjgxfQ=="