Validator API
Network analytics, validator rankings, and stake pool APY metrics
API Endpoints
1. Validators
Purpose: Returns validator state for a given epoch (defaults to latest). The current epoch will always report mev_rewards = 0 because rewards settle at epoch boundary.
Endpoint: /api/v1/validators
Method: GET or POST
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
epoch | number | No | - | Filter by specific epoch |
Response Fields
| Field | Type | Description |
|---|---|---|
vote_account | string | Validator vote account public key |
mev_commission_bps | number | Validator’s MEV commission in basis-points |
mev_rewards | number | Post-commission MEV lamports paid to validator + stakers |
priority_fee_commission_bps | number | Priority-fee commission (bps) |
priority_fee_rewards | number | Post-commission priority-fee lamports |
running_jito | boolean | true if validator is running Jito-Solana |
running_bam | boolean | true if validator is running BAM |
active_stake | number | Lamports actively staked with this validator |
jito_directed_stake_target | boolean | Whether or not this is a jito directed stake target validator |
jito_directed_stake_lamports | number | Total stake amount in lamports for Jito directed stake |
Example Request
curl -X POST \
https://kobe.mainnet.jito.network/api/v1/validators \
-H 'Content-Type: application/json' \
-d '{ "epoch":600 }'
Example Response
{
"validators": [
{
"vote_account": "GdRKUZKdiXMEATjddQW6q4W8bPgXRBYJKayfeqdQcEPa",
"mev_commission_bps": 10000,
"mev_rewards": 4438669326,
"priority_fee_commission_bps": 5000,
"priority_fee_rewards": 31269273876,
"active_stake": 57968373482697,
"running_jito": true,
"running_bam": false,
"jito_directed_stake_target": null,
"jito_directed_stake_lamports": null,
}
// …
]
}
2. JitoSOL Validators
Purpose: Returns JitoSOL stake pool validators for a given epoch (defaults to latest). Only includes validators that are actively part of the JitoSOL validator set.
Endpoint: /api/v1/jitosol_validators
Method: GET | POST
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
epoch | number | No | - | Filter by specific epoch |
Response Fields
| Field | Type | Description |
|---|---|---|
vote_account | string | Validator vote account public key |
mev_commission_bps | number | Validator’s MEV commission in basis-points |
mev_rewards | number | Post-commission MEV lamports paid to validator + stakers |
priority_fee_commission_bps | number | Priority-fee commission (bps) |
priority_fee_rewards | number | Post-commission priority-fee lamports |
running_jito | boolean | true if validator is running Jito-Solana |
running_bam | boolean | true if validator is running BAM |
active_stake | number | Lamports actively staked with this validator |
jito_sol_active_lamports | number | Active stake lamports delegated to this validator from the JitoSOL stake-pool |
Example Request
curl -X POST \
https://kobe.mainnet.jito.network/api/v1/jitosol_validators \
-H 'Content-Type: application/json' \
-d '{ "epoch":600 }'
Example Response
{
"validators": [
{
"vote_account": "CviQXDMPZPVAZ5qgVGN2gSBSD9GqqwRt7VZidoHMpArr",
"mev_commission_bps": 10000,
"mev_rewards": 3204800942,
"priority_fee_commission_bps": null,
"priority_fee_rewards": null,
"running_jito": true,
"running_bam": false,
"active_stake": 47753222427851,
"jito_sol_active_lamports": 3282880
},
// …
]
}
3. Validator Historical Reward
Purpose: Returns historical reward data for a single validator, sorted by epoch (desc).
Endpoint: /api/v1/validators/{vote_account}
Method: GET
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|
Response Fields
| Field | Type | Description |
|---|---|---|
epoch | number | The epoch when these rewards were earned |
mev_commission_bps | number | Validator’s MEV commission in basis-points |
mev_rewards | number | Post-commission MEV lamports paid to validator + stakers |
priority_fee_commission_bps | number | Priority-fee commission (bps) |
priority_fee_rewards | number | Post-commission priority-fee lamports |
Example Request
curl https://kobe.mainnet.jito.network/api/v1/validators/GdRKUZKdiXMEATjddQW6q4W8bPgXRBYJKayfeqdQcEPa
Example Response
[
{
"epoch": 608,
"mev_commission_bps": 10000,
"mev_rewards": 59355050,
"priority_fee_commission_bps": 5000,
"priority_fee_rewards": 43328291
}
// …
]
4. Jito Stake Over Time
Purpose: Returns a map of epoch → percentage of all Solana stake that is delegated to Jito-running validators.
Endpoint: /api/v1/jito_stake_over_time
Method: GET | POST
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|
Response Fields
| Field | Type | Description |
|---|---|---|
stake_ratio_over_time | object | Map of epoch → decimal ratio representing the percentage of total Solana stake delegated to Jito validators (0.0-1.0) |
Example Request
curl https://kobe.mainnet.jito.network/api/v1/jito_stake_over_time
Example Response
{
"stake_ratio_over_time": {
"484": 0.27771625202212147,
"485": 0.27866636980357196
}
}
5. MEV Rewards
Purpose: Network-level statistics for a single epoch.
Endpoint: /api/v1/mev_rewards
Method: GET | POST
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
epoch | number | No | - | Filter by specific epoch |
Response Fields
| Field | Type | Description |
|---|---|---|
epoch | number | The epoch number for which MEV rewards data is provided |
total_network_mev_lamports | number | Total MEV rewards generated across the entire Solana network during this epoch, measured in lamports |
jito_stake_weight_lamports | number | Total amount of stake (in lamports) delegated to validators running Jito software during this epoch |
mev_reward_per_lamport | number | MEV rewards earned per lamport of stake for Jito validators in this epoch (calculated as total_network_mev_lamports / jito_stake_weight_lamports) |
Example Request
curl -X POST https://kobe.mainnet.jito.network/api/v1/mev_rewards -H 'Content-Type: application/json' -d '{ "epoch": 600 }'
Example Response
{
"epoch": 600,
"total_network_mev_lamports": 19630470685094,
"jito_stake_weight_lamports": 273972433518536409,
"mev_reward_per_lamport": 0.0000716512622565213
}
6. Daily MEV Rewards
Purpose: Aggregated MEV tips per calendar day.
Endpoint: /api/v1/daily_mev_rewards
Method: GET
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|
Response Fields
| Field | Type | Description |
|---|---|---|
day | string | The calendar date in UTC format (YYYY-MM-DD HH:MM:SS.sss UTC) for which the MEV rewards data is aggregated |
count_mev_tips | number | Total number of individual MEV tip transactions that occurred on this day |
jito_tips | number | Total amount of MEV tips paid to Jito (in SOL) on this day |
tippers | number | Total number of unique accounts that submitted MEV tips on this day |
validator_tips | number | Total amount of MEV tips distributed to validators (in SOL) on this day |
Example Request
curl https://kobe.mainnet.jito.network/api/v1/daily_mev_rewards
Example Response
[
{
"day": "2025-07-29 00:00:00.000 UTC",
"count_mev_tips": 23899823,
"jito_tips": 385.815098392558,
"tippers": 898619,
"validator_tips": 7330.48686946401
},
{
"day": "2025-07-30 00:00:00.000 UTC",
"count_mev_tips": 16157401,
"jito_tips": 232.975239402936,
"tippers": 581839,
"validator_tips": 4426.5295486581
}
]
7. Stake Pool Stats
Purpose: Stake pool analytics including TVL, APY, validator count, supply metrics, and aggregated MEV rewards over time.
Endpoint: /api/v1/stake_pool_stats
Method: GET or POST
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default. | Description |
|---|---|---|---|---|
bucket_type | string | No | "Daily". | Time bucket aggregation type. Currently only "Daily" is supported |
range_filter | object | No | Last 7 days | Date range filter with start and end DateTime fields |
range_filter.start | string | No | 7 days ago | Start date in ISO 8601 format (e.g., "2025-08-15T22:55:06Z") |
range_filter.end | string | No | Now. | End date in ISO 8601 format (e.g., "2025-08-22T22:55:06Z") |
sort_by | object | No | Default sort | Sort configuration object |
sort_by.field | string | No | "BlockTime" | Sort field. Currently only "BlockTime" is supported |
sort_by.order | string | No. | "Asc" | Sort order: "Asc" or "Desc" |
Response Fields
| Field | Type | Description |
|---|---|---|
aggregated_mev_rewards | number | Total aggregated MEV rewards across all time periods (in lamports) |
mev_rewards | array | Time series data of MEV rewards with integer data points |
tvl | array | Time series data of Total Value Locked in the stake pool (in lamports) |
apy | array | Time series data of Annual Percentage Yield as decimal values |
num_validators | array | Time series data of validator count in the stake pool |
supply | array | Time series data of JitoSOL token supply as decimal values |
Example Request
curl -X POST \
https://kobe.mainnet.jito.network/api/v1/stake_pool_stats \
-H 'Content-Type: application/json' \
-d '{
"bucket_type": "Daily",
"range_filter": {
"start": "2025-08-15T00:00:00Z",
"end": "2025-08-16T00:00:00Z"
},
"sort_by": {
"field": "BlockTime",
"order": "Asc"
}
}'
Example Response
{
"aggregated_mev_rewards": 17917503591959,
"mev_rewards": [
{
"data": 841552703382,
"date": "2025-08-15T22:55:06Z"
},
{
"data": 5244986563088,
"date": "2025-08-16T23:20:47Z"
}
],
"tvl": [
{
"data": 15209213875510266,
"date": "2025-08-15T22:55:06Z"
},
{
"data": 15211604884230567,
"date": "2025-08-16T23:20:47Z"
}
],
"apy": [
{
"data": 0.07184861225308525,
"date": "2025-08-15T22:55:06Z"
},
{
"data": 0.07184861239211937,
"date": "2025-08-16T23:20:47Z"
}
],
"num_validators": [
{
"data": 1040,
"date": "2025-08-15T22:55:06Z"
},
{
"data": 1040,
"date": "2025-08-16T23:20:47Z"
}
],
"supply": [
{
"data": 12420237.336776868,
"date": "2025-08-15T22:55:06Z"
},
{
"data": 12422189.896316852,
"date": "2025-08-16T23:20:47Z"
}
]
}
8. MEV Commission Average Overtime
Purpose: Returns stake-weighted average MEV commission rates by epoch for all Jito-running validators.
Endpoint: /api/v1/mev_commission_average_over_time
Method: GET
Base URL: https://kobe.mainnet.jito.network
Response Fields
| Field | Type | Description |
|---|---|---|
average_mev_commission_over_time | object | Map of epoch numbers to stake-weighted average MEV commission rates |
Calculation Method
The average MEV commission is calculated as a stake-weighted average:
- Filter: Only includes validators running Jito (
running_jito: true) - Weight by Stake: Each validator's commission rate is weighted by their active stake amount
- Aggregate by Epoch: Results are grouped and averaged per epoch
- Formula:
(Sum of [MEV Commission × Active Stake]) / (Sum of Active Stake)
This provides a more accurate representation of the effective commission rate experienced by stakers, as validators with more stake have proportionally more influence on the average.
Example Request
curl https://kobe.mainnet.jito.network/api/v1/mev_commission_average_over_time
Example Response
{
"aggregated_mev_rewards": 841552703382,
"mev_rewards": [
{
"data": 841552703382,
"date": "2025-08-15T22:55:06Z"
}
],
"tvl": [
{
"data": 15209213875510266,
"date": "2025-08-15T22:55:06Z"
}
],
"apy": [
{
"data": 0.07184861225308525,
"date": "2025-08-15T22:55:06Z"
}
],
"num_validators": [
{
"data": 1040,
"date": "2025-08-15T22:55:06Z"
}
],
"supply": [
{
"data": 12420237.336776868,
"date": "2025-08-15T22:55:06Z"
}
]
}
9. JitoSOL/SOL Ratio
Purpose: Retrieve the historical exchange ratio between JitoSOL and SOL over time.
Endpoint: /api/v1/jitosol_sol_ratio
Method: GET or POST
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
range_filter | object | No | Last 7 days | Date range filter with start and end DateTime fields |
range_filter.start | string | No | 7 days ago | Start date in ISO 8601 format (e.g., "2025-08-15T00:00:00Z") |
range_filter.end | string | No | Now | End date in ISO 8601 format (e.g., "2025-08-22T00:00:00Z") |
Response Fields
| Field | Type | Description |
|---|---|---|
ratios | array | Time series data of JitoSOL to SOL exchange ratios |
Example Request
curl -X POST \
https://kobe.mainnet.jito.network/api/v1/jitosol_sol_ratio \
-H 'Content-Type: application/json' \
-d '{
"range_filter": {
"start": "2025-08-15T00:00:00Z",
"end": "2025-08-16T00:00:00Z"
}
}'
Example Response
{
"ratios": [
{
"data": 1.224550985871672,
"date": "2025-08-15T22:55:06Z"
}
]
}
10. Preferred Withdraw Validator List
Purpose: Retrieve a list of validators with lower rank (borderline of delegation) that are optimal candidates for withdrawal operations. These validators have sufficient withdrawable stake while being the least impactful to remove stake from. Withdrawing from these validators minimizes rebalancing needs and helps maintain optimal APY for the stake pool.
Endpoint: /api/v1/preferred_withdraw_validator_list
Method: GET
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
min_stake_threshold | number | No | 10000 | Denominated in SOL. Minimum stake threshold. Only validators with withdrawable stake above this threshold will be included |
limit | number | No | 50 | Number of validators to return in the response |
randomized | boolean | No | false | Whether to randomize the order of validators. Use this when you want to minimize the chance of unstaking from the same validators as other clients. Useful in multisig or durable nonce scenarios where transactions are sitting for extended periods of time |
Important: Query parameters are denominated in SOL for convenience.
Response Fields
| Field | Type | Description |
|---|---|---|
rank | number | The position of the validator in the ranked list (1-indexed) |
vote_account | string | The validator's vote account public key |
withdrawable_lamports | number | Denominated in lamports. Amount of lamports available for withdrawal from this validator (1 SOL = 1,000,000,000 lamports) |
stake_account | string | The validator's stake account address from the stake pool |
Important: Response amounts are denominated in lamports, not SOL.
Example Request
# Get default list (50 lower-ranked validators optimal for withdrawal)
curl "https://kobe.mainnet.jito.network/api/v1/preferred_withdraw_validator_list"
# Get top 20 lower-ranked validators with at least 5,000 SOL withdrawable stake
curl "https://kobe.mainnet.jito.network/api/v1/preferred_withdraw_validator_list?min_stake_threshold=5000&limit=20"
# Get randomized list for multisig scenarios to avoid transaction conflicts
curl "https://kobe.mainnet.jito.network/api/v1/preferred_withdraw_validator_list?limit=30&randomized=true"
Example Response
[
{
"rank": 1,
"vote_account": "J2nUHEAgZFRyuJbFjdqPrAa9gyWDuc7hErtDQHPhsYRp",
"withdrawable_lamports": 95000000000000,
"stake_account": "6USTT5jBUBRgZMGRkG7QX2S5MjQ8wVwSYMRfRRhJMqDj"
},
{
"rank": 2,
"vote_account": "Certusm1sa411sMpV9FPqU5dXAYhmmhygvxJ23S6hJ24",
"withdrawable_lamports": 87500000000000,
"stake_account": "3kxSvADSt7N8LKNRVK5DW7xNVQRszK3VUvkUPMmJPcWo"
},
{
"rank": 3,
"vote_account": "DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh",
"withdrawable_lamports": 73200000000000,
"stake_account": "8ZfVWmhFZHCRvU7uuS9MbVbxDtB1uH7kdUPnnPFKoQRi"
},
{
"rank": 4,
"vote_account": "HxRrsnbc6K8CdEo3LCTrSUkFaDDxv9BdJsTDzBKnUVWH",
"withdrawable_lamports": 65000000000000,
"stake_account": "AyPMvRePEuQuaBQn2JHXWVkGmUGQpCfgKQCBPBxyqbia"
},
{
"rank": 5,
"vote_account": "EARNynHRWg6GfwJBmRAYa9C1zDa6Vq7AWTLS2hZaL9a",
"withdrawable_lamports": 52000000000000,
"stake_account": "FJemUNBmezZ5FFKpQQFvag4g9x4TjBKN7tCnQPJzUXQ7"
}
]
11. BAM Epoch Metrics
Purpose: Returns BAM delegation metrics for a given epoch.
Endpoint: /api/v1/bam_delegation_metrics
Method: GET
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
epoch | number | Yes | - | Filter by specific epoch |
Response Fields
| Field | Type | Description |
|---|---|---|
allocation_bps | number | Allocation tier based on JIP-28 in BPS |
available_bam_delegation_stake | number | Total JitoSOL stake available for BAM delegation in lamports |
bam_stake | number | Total stake amount of BAM eligible validators in lamports |
eligible_bam_validator_count | number | Eligible BAM validator count |
epoch | number | Epoch number |
jitosol_stake | number | Total Jitosol stake amount |
timestamp | number | Timestamp |
total_stake | number | Total stake amount of all validators in lamports |
Example Request
curl -X GET \
https://kobe.mainnet.jito.network/api/v1/bam_epoch_metrics?epoch=895
Example Response
{
"bam_epoch_metrics": {
"allocation_bps": 3000,
"available_bam_delegation_stake": 4206990925405254,
"bam_stake": 14856675235224159,
"eligible_bam_validator_count": 49,
"epoch": 895,
"jitosol_stake": 14023303084684180,
"timestamp": 1765846141,
"total_stake": 417067545601353217
}
}
12. BAM Validators
Purpose: Returns a list of BAM validators for a given epoch, including their eligibility status and stake-related metrics.
Endpoint: /api/v1/bam_validators
Method: GET
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
epoch | number | Yes | - | Filter by specific epoch |
Response Fields
| Field | Type | Description |
|---|---|---|
active_stake | number | Active stake in lamports |
epoch | number | Epoch number |
identity_account | string | Identity account public key |
is_eligible | boolean | Is eligible validator for BAM delegation |
ineligibility_reason | string | The reason of ineligibility |
timestamp | number | Timestamp |
vote_account | string | Vote account public key |
Example Request
curl -X GET \
https://kobe.mainnet.jito.network/api/v1/bam_validators?epoch=895
Example Response
{
"bam_validators": [
{
"active_stake": 550051344710010,
"epoch": 895,
"identity_account": "6XKqyUVUcpe3CNucjF6gk5zonJDqNGvob6kaTy4Ps1U",
"is_eligible": true,
"ineligibility_reason": null,
"timestamp": 1765846137,
"vote_account": "SKRuTecmFDZHjs2DxRTJNEK7m7hunKGTWJiaZ3tMVVA"
},
...
]
}
13. BAM Delegation Blacklist
Purpose: Returns a list of vote accounts that are blacklisted from BAM delegation.
Endpoint: /api/v1/bam_delegation_blacklist
Method: GET
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| N/A | N/A | N/A | N/A | No query parameters. |
Response Fields
| Field | Type | Description |
|---|---|---|
added_epoch | number | Epoch number |
vote_account | string | Vote account public key |
Example Request
curl -X GET \
https://kobe.mainnet.jito.network/api/v1/bam_delegation_blacklist
Example Response
[
{
"vote_account": "12345......",
"added_epoch": 892
}
]
14. BAM Validator Scoring
Purpose: Returns the scoring components of a specific validator
Endpoint: /api/v1/bam_validator_score
Method: GET
Base URL: https://kobe.mainnet.jito.network
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
epoch | number | Yes | - | Filter by specific epoch |
vote_account | string | Yes | - | Filter by specific vote account |
Response Fields
| Field | Type | Description |
|---|---|---|
vote_account | string | Vote account public key |
score | number | Score number |
Example Request
curl -X GET \
https://kobe.mainnet.jito.network/api/v1/bam_validator_score?epoch=902&vote_account=48oxpSHQkM4sdXUY9NQ8KnEtebzZbyk8uUT7JRdVQNuf
Example Response
{
"vote_account": "48oxpSHQkM4sdXUY9NQ8KnEtebzZbyk8uUT7JRdVQNuf",
"score": 1
}
Frontend APY Calculation
The Jito frontend calculates the current APY displayed to users by fetching historical stake pool data and using the most recent available data point.
Jito Frontend Implementation
Here's how the Jito frontend retrieves and processes APY data:
export default async function handler(req, res) {
const apiUrl = 'https://kobe.mainnet.jito.network/api/v1/stake_pool_stats'
// Set up start and end dates
const start = new Date('2022-10-31T00:00:00Z') // Launch date
const end = new Date()
const statsRequest = {
bucket_type: 'Daily',
range_filter: {
start: start.toISOString(),
end: end.toISOString(),
},
sort_by: {
field: 'BlockTime',
order: 'Asc',
},
}
try {
const response = await fetch(apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(statsRequest),
})
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`)
}
const data = await response.json()
if (data) {
const {
aggregated_mev_rewards: aggregatedMevRewards,
apy,
mev_rewards: mevRewards,
num_validators: numValidators,
supply,
tvl,
} = data
const camelCaseData = {
getStakePoolStats: {
aggregatedMevRewards,
apy,
mevRewards,
numValidators,
supply,
tvl,
},
}
res.status(200).json(camelCaseData)
} else {
res.status(200).json(data)
}
} catch (error) {
console.error('Error fetching data:', error)
res.status(500).json({ message: `Error fetching data: ${error.message}` })
}
}
APY Selection Logic
To display the current APY on the frontend:
- Fetch Complete History: The API call retrieves all historical data from JitoSOL's launch date (October 31, 2022) to the present
- Select Most Recent: The frontend uses the most recent data point from the
apyarray - Display Current Rate: This most recent APY value represents the current annualized yield rate shown to users
The apy field in the response contains time-series data where each entry includes:
data: The APY as a decimal value (e.g., 0.07184861225308525 = ~7.18%)date: The timestamp when this APY was calculated
Note that the stake_pool_stats endpoint returns smoothed values when requesting for periods longer than 10 epochs. Hence, the APY data we show on our frontend is smoothed.
Notes & Caveats
- The current epoch always reports
mev_rewards = 0because rewards are finalized at epoch-close. - All lamport values are post-commission – delegators receive their share via separate claim paths documented in the MEV Rewards API page.
- Pagination caps:
limit ≤ 10 000for list endpoints. - All endpoints are cached for at least 60 s; identical requests within this window return cached data.