Skip to content

Repository files navigation

Stake DAO API

This repository is meant to be used as API endpoints, with periodical updates through GitHub workflows

Data

Lockers data

Endpoint : /api/lockers

Data type :

{
parsed: {
id: string;
order: number;
symbol: string;
protocol: string;
protocolDescription: string;
website: string;
logoUrl: string;
chainId: number;
rgb: string;
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug?: string;
underlying?: string;
};
distribution?: string;
origin?: string;
};
sdToken?: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
underlying: string;
coingeckoSlug?: string;
};
};
rewards?: {
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug: string;
};
distribution: string;
origin: string;
};
price: number;
apr: number;
streaming: boolean;
periodFinish: number;
rate: string;
lastUpdate: string;
}[];
modules?: {
depositor: string;
locker: string;
veToken: string;
gauge: string;
accumulator: string;
};
secondaryMarket?: {
label: string;
poolKey: string;
pool: string;
pegBase: number;
};
voteBooster?: {
booster: string;
vSdToken: string;
balance: {
token: string;
sdToken: string;
staked: string;
working: string;
};
boost: number;
};
autoCompounder?: {
aSdToken: string;
};
alternativeYields?: Record<string, {
label: string;
platform: string;
href: string;
}>;
fees?: {
label: {
key: string;
variable?: string;
};
value: number;
key: string;
}[];
extensions?: {
coingeckoBaseSlug?: string;
strategyGauge?: string;
};
tokenLocked?: string;
veBalanceOfLocker?: string;
totalTokenLocked?: string;
veTotalSupply?: string;
lockIncentive?: string;
incentiveAmountInToken?: string;
gaugeWorkingSupply?: string;
totalSupplyStaked?: string;
amountTokenNotLock?: string;
bribeRewards?: {
bribeMinApr: number;
bribeMaxApr: number;
bribeAverageApr: number;
minBoost: string;
maxBoost: string;
token: string;
};
apr: number[];
streaming: boolean;
veTokenRate: string;
tvl: number;
peg: string;
tokenPriceInUsd: number;
sdTokenPriceInUsd: number;
}[];
sdt: {
lockersSdtPerBlock: string;
lockersSdtPerSecond: string;
stratsSdtPerBlock: string;
stratsSdtPerSecond: string;
};
fetched: boolean;
};

Strategies data

Strategies data are available on the endpoints /api/strategies/{protocol}

Available protocols :

The chain id can be selected by adding {chainId}.json at the end of the endpoint. e.g. Curve strategies on Ethereum can be fetched through the endpoint : /api/strategies/curve/1.json

export type Coin = {
name: string
symbol: string
address: string
decimals: number
}
export type AprDetail = {
total: number
details: {
label: string
value: number[]
}[]
}
export type OnlyBoostAprDetail = {
projected: {
baseToken: number
}
}
export type OnlyBoostProtocolData = {
tvl: number
supply: string
boost: number
optimal: {
supply: string
boost: number
share: number
}
claimable?: {
token: string
claimable: string
}[]
}
export type OnlyBoostData = {
active: boolean
implementations: {
key: string
address: string
}[]
totalSupply: string
boost: number
optimalBoost: number
stakeDao: OnlyBoostProtocolData
convex: OnlyBoostProtocolData
}
export type SdGauge = {
address: string
totalSupply: string
relativeWeight: string
weight: string
futureWeight: string
workingSupply: string
}
export type Fees = {
veSdt: number
perf: number
accumulator: number
claimer: number
}
export type VaultFees = {
keeper: number
accumulated: string
}
export type SdtApr = {
sdtUserApr: number
sdtFuturUserApr: number
sdtMinApr: number
sdtFuturMinApr: number
sdtMaxApr: number
sdtFuturMaxApr: number
sdtBoost: number
}
export type RewardsData = {
token: Coin
price: number
apr: number
streaming: boolean
periodFinish: number
rate: string
lastUpdate: string
claimablePendingRewards: string
}
export type Strategy = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
rewards: RewardsData[]
name: string
tradingApy: number
underlyingApy?: number
minApr: number
maxApr: number
lpPriceInUsd: number
convexPool?: {
id: number
token: string
gauge: string
crvRewards: string
stash: string
shutdown: boolean
usdTotal: number
}
tvl: number
apr: {
boost: number
current: AprDetail
projected: AprDetail
onlyboost?: {
convex: OnlyBoostAprDetail
optimal: OnlyBoostAprDetail
}
}
sdtApr?: SdtApr
vaultHoldings: string
totalSupply: string
strategyHoldings: string
workingBalance: string
sdGauge: SdGauge
vaultFees: VaultFees
onlyboost?: OnlyBoostData | { active: boolean }
}
// GLOBAL DATA TYPE
export type CurveGlobalData = {
totalGaugeWeights: string
nextEffectiveTimestamp: string
cvxTotalSupply: string
veCrvTotalSupply: string
stakeDaoVeBoost: string
convexVeBoost: string
fees: Fees
}
export type YearnGlobalData = {
totalGaugeWeights: string
fees: Fees
}
export type Global = CurveGlobalData | YearnGlobalData
export type StrategyData = {
global?: Global
deployed: Strategy[]
notDeployed: any
fetched: boolean
}
export type BuiltStrat = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
sdGauge: string
rewards: Coin[]
underlyingReward?: Coin
}

Pendle Holders data

Base endpoint : /api/strategies/pendle/holders

Available endpoints

EndpointDescription
/api/strategies/pendle/holdersGet all holders data (all gauges)
/api/strategies/pendle/holders/gaugesList all gauge IDs
/api/strategies/pendle/holders/currentGet current holders snapshot
/api/strategies/pendle/holders/historical?gauge=0x...&include_events=trueGet historical data
/api/strategies/pendle/holders/period?start_date=2024-01-01&end_date=2024-12-31&gauge=0x...&min_duration_days=30Period analysis
/api/strategies/pendle/holders/analytics?gauge=0x...Get holder analytics
/api/strategies/pendle/holders/user/:addressGet user history across all gauges
/api/strategies/pendle/holders/:gaugeIdGet single gauge data

Main endpoint data type (/api/strategies/pendle/holders)

{
"metadata": {
"snapshot_date": string, // ISO 8601 timestamp of data snapshot
"pendle_locker": string, // Pendle locker address
"total_gauges": number, // Total number of gauges
"total_current_holders": number, // Total current holders across all gauges
"total_unique_users": number, // Total unique users across all gauges
"average_holding_duration_days": number, // Average holding duration in days
"gauges_summary": [ // Summary of all gauges
{
"gauge": string, // Gauge address
"symbol": string, // PT token symbol
"current_holders": number, // Current number of holders
"total_users": number, // Total unique users (current + past)
"current_supply": string // Current total supply
}
]
},
"gauges": [
{
"gauge_id": string, // Gauge address
"vault_id": string, // Vault address (if available)
"token": {
"address": string, // PT token address
"symbol": string // PT token symbol
},
"stats": {
"total_deposited": string, // Total amount ever deposited
"total_withdrawn": string, // Total amount ever withdrawn
"current_supply": string, // Current total supply
"current_holders": number, // Current number of holders
"total_users": number // Total unique users (current + past)
},
"current_holders": { // Map of current holders (address -> balance)
"[user_address]": string
},
"user_histories": { // Map of all user histories
"[user_address]": {
"first_seen": number, // Unix timestamp when first seen
"last_seen": number, // Unix timestamp when last seen
"entry_timestamp": number, // Unix timestamp of first entry
"exit_timestamp": number, // Unix timestamp of exit (if applicable)
"entry_block": number, // Block number of first entry
"exit_block": number, // Block number of exit (if applicable)
"max_balance": number, // Maximum balance ever held
"holding_periods": [ // Array of holding periods
{
"entry_timestamp": number,
"exit_timestamp": number,
"entry_block": number,
"exit_block": number,
"duration": number, // Duration in seconds
"entry_date": string, // ISO 8601 date
"exit_date": string, // ISO 8601 date
"duration_days": number // Duration in days
}
],
"total_holding_duration": number, // Total duration in seconds
"is_current_holder": boolean, // Whether user currently holds tokens
"events": [ // Array of all deposit/withdraw events
{
"type": string, // "DEPOSIT" or "WITHDRAW"
"amount": string, // Amount deposited/withdrawn
"balance_after": string, // Balance after the event
"block": number, // Block number
"timestamp": number, // Unix timestamp
"datetime": string // ISO 8601 datetime
}
],
"first_seen_date": string, // ISO 8601 date
"last_seen_date": string, // ISO 8601 date
"total_holding_duration_days": number // Total duration in days
}
}
}
]
}

Single gauge endpoint (/api/strategies/pendle/holders/:gaugeId)

Returns the same structure as a single gauge object from the main endpoint - useful for fetching data for a specific gauge without loading all gauges.

User history endpoint (/api/strategies/pendle/holders/user/:address)

{
"address": string,
"total_gauges": number,
"gauges": [
{
"gauge_id": string,
"token": { "address": string, "symbol": string },
"history": { ... } // Same as user_histories object above
}
]
}

This endpoint provides comprehensive data about Pendle gauge holders, including:

  • Metadata with overall statistics and gauge summaries
  • Current holders with their balances
  • Complete user histories with entry/exit tracking
  • Detailed event logs for all deposits and withdrawals
  • Holding period analysis with duration calculations
  • Maximum balances held by each user

About

🧑‍💻 Github based api for Stake DAO data

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - stake-dao/api: 🧑‍💻 Github based api for Stake DAO data · GitHub
Skip to content

Repository files navigation

Stake DAO API

This repository is meant to be used as API endpoints, with periodical updates through GitHub workflows

Data

Lockers data

Endpoint : /api/lockers

Data type :

{
parsed: {
id: string;
order: number;
symbol: string;
protocol: string;
protocolDescription: string;
website: string;
logoUrl: string;
chainId: number;
rgb: string;
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug?: string;
underlying?: string;
};
distribution?: string;
origin?: string;
};
sdToken?: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
underlying: string;
coingeckoSlug?: string;
};
};
rewards?: {
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug: string;
};
distribution: string;
origin: string;
};
price: number;
apr: number;
streaming: boolean;
periodFinish: number;
rate: string;
lastUpdate: string;
}[];
modules?: {
depositor: string;
locker: string;
veToken: string;
gauge: string;
accumulator: string;
};
secondaryMarket?: {
label: string;
poolKey: string;
pool: string;
pegBase: number;
};
voteBooster?: {
booster: string;
vSdToken: string;
balance: {
token: string;
sdToken: string;
staked: string;
working: string;
};
boost: number;
};
autoCompounder?: {
aSdToken: string;
};
alternativeYields?: Record<string, {
label: string;
platform: string;
href: string;
}>;
fees?: {
label: {
key: string;
variable?: string;
};
value: number;
key: string;
}[];
extensions?: {
coingeckoBaseSlug?: string;
strategyGauge?: string;
};
tokenLocked?: string;
veBalanceOfLocker?: string;
totalTokenLocked?: string;
veTotalSupply?: string;
lockIncentive?: string;
incentiveAmountInToken?: string;
gaugeWorkingSupply?: string;
totalSupplyStaked?: string;
amountTokenNotLock?: string;
bribeRewards?: {
bribeMinApr: number;
bribeMaxApr: number;
bribeAverageApr: number;
minBoost: string;
maxBoost: string;
token: string;
};
apr: number[];
streaming: boolean;
veTokenRate: string;
tvl: number;
peg: string;
tokenPriceInUsd: number;
sdTokenPriceInUsd: number;
}[];
sdt: {
lockersSdtPerBlock: string;
lockersSdtPerSecond: string;
stratsSdtPerBlock: string;
stratsSdtPerSecond: string;
};
fetched: boolean;
};

Strategies data

Strategies data are available on the endpoints /api/strategies/{protocol}

Available protocols :

The chain id can be selected by adding {chainId}.json at the end of the endpoint. e.g. Curve strategies on Ethereum can be fetched through the endpoint : /api/strategies/curve/1.json

export type Coin = {
name: string
symbol: string
address: string
decimals: number
}
export type AprDetail = {
total: number
details: {
label: string
value: number[]
}[]
}
export type OnlyBoostAprDetail = {
projected: {
baseToken: number
}
}
export type OnlyBoostProtocolData = {
tvl: number
supply: string
boost: number
optimal: {
supply: string
boost: number
share: number
}
claimable?: {
token: string
claimable: string
}[]
}
export type OnlyBoostData = {
active: boolean
implementations: {
key: string
address: string
}[]
totalSupply: string
boost: number
optimalBoost: number
stakeDao: OnlyBoostProtocolData
convex: OnlyBoostProtocolData
}
export type SdGauge = {
address: string
totalSupply: string
relativeWeight: string
weight: string
futureWeight: string
workingSupply: string
}
export type Fees = {
veSdt: number
perf: number
accumulator: number
claimer: number
}
export type VaultFees = {
keeper: number
accumulated: string
}
export type SdtApr = {
sdtUserApr: number
sdtFuturUserApr: number
sdtMinApr: number
sdtFuturMinApr: number
sdtMaxApr: number
sdtFuturMaxApr: number
sdtBoost: number
}
export type RewardsData = {
token: Coin
price: number
apr: number
streaming: boolean
periodFinish: number
rate: string
lastUpdate: string
claimablePendingRewards: string
}
export type Strategy = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
rewards: RewardsData[]
name: string
tradingApy: number
underlyingApy?: number
minApr: number
maxApr: number
lpPriceInUsd: number
convexPool?: {
id: number
token: string
gauge: string
crvRewards: string
stash: string
shutdown: boolean
usdTotal: number
}
tvl: number
apr: {
boost: number
current: AprDetail
projected: AprDetail
onlyboost?: {
convex: OnlyBoostAprDetail
optimal: OnlyBoostAprDetail
}
}
sdtApr?: SdtApr
vaultHoldings: string
totalSupply: string
strategyHoldings: string
workingBalance: string
sdGauge: SdGauge
vaultFees: VaultFees
onlyboost?: OnlyBoostData | { active: boolean }
}
// GLOBAL DATA TYPE
export type CurveGlobalData = {
totalGaugeWeights: string
nextEffectiveTimestamp: string
cvxTotalSupply: string
veCrvTotalSupply: string
stakeDaoVeBoost: string
convexVeBoost: string
fees: Fees
}
export type YearnGlobalData = {
totalGaugeWeights: string
fees: Fees
}
export type Global = CurveGlobalData | YearnGlobalData
export type StrategyData = {
global?: Global
deployed: Strategy[]
notDeployed: any
fetched: boolean
}
export type BuiltStrat = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
sdGauge: string
rewards: Coin[]
underlyingReward?: Coin
}

Pendle Holders data

Base endpoint : /api/strategies/pendle/holders

Available endpoints

EndpointDescription
/api/strategies/pendle/holdersGet all holders data (all gauges)
/api/strategies/pendle/holders/gaugesList all gauge IDs
/api/strategies/pendle/holders/currentGet current holders snapshot
/api/strategies/pendle/holders/historical?gauge=0x...&include_events=trueGet historical data
/api/strategies/pendle/holders/period?start_date=2024-01-01&end_date=2024-12-31&gauge=0x...&min_duration_days=30Period analysis
/api/strategies/pendle/holders/analytics?gauge=0x...Get holder analytics
/api/strategies/pendle/holders/user/:addressGet user history across all gauges
/api/strategies/pendle/holders/:gaugeIdGet single gauge data

Main endpoint data type (/api/strategies/pendle/holders)

{
"metadata": {
"snapshot_date": string, // ISO 8601 timestamp of data snapshot
"pendle_locker": string, // Pendle locker address
"total_gauges": number, // Total number of gauges
"total_current_holders": number, // Total current holders across all gauges
"total_unique_users": number, // Total unique users across all gauges
"average_holding_duration_days": number, // Average holding duration in days
"gauges_summary": [ // Summary of all gauges
{
"gauge": string, // Gauge address
"symbol": string, // PT token symbol
"current_holders": number, // Current number of holders
"total_users": number, // Total unique users (current + past)
"current_supply": string // Current total supply
}
]
},
"gauges": [
{
"gauge_id": string, // Gauge address
"vault_id": string, // Vault address (if available)
"token": {
"address": string, // PT token address
"symbol": string // PT token symbol
},
"stats": {
"total_deposited": string, // Total amount ever deposited
"total_withdrawn": string, // Total amount ever withdrawn
"current_supply": string, // Current total supply
"current_holders": number, // Current number of holders
"total_users": number // Total unique users (current + past)
},
"current_holders": { // Map of current holders (address -> balance)
"[user_address]": string
},
"user_histories": { // Map of all user histories
"[user_address]": {
"first_seen": number, // Unix timestamp when first seen
"last_seen": number, // Unix timestamp when last seen
"entry_timestamp": number, // Unix timestamp of first entry
"exit_timestamp": number, // Unix timestamp of exit (if applicable)
"entry_block": number, // Block number of first entry
"exit_block": number, // Block number of exit (if applicable)
"max_balance": number, // Maximum balance ever held
"holding_periods": [ // Array of holding periods
{
"entry_timestamp": number,
"exit_timestamp": number,
"entry_block": number,
"exit_block": number,
"duration": number, // Duration in seconds
"entry_date": string, // ISO 8601 date
"exit_date": string, // ISO 8601 date
"duration_days": number // Duration in days
}
],
"total_holding_duration": number, // Total duration in seconds
"is_current_holder": boolean, // Whether user currently holds tokens
"events": [ // Array of all deposit/withdraw events
{
"type": string, // "DEPOSIT" or "WITHDRAW"
"amount": string, // Amount deposited/withdrawn
"balance_after": string, // Balance after the event
"block": number, // Block number
"timestamp": number, // Unix timestamp
"datetime": string // ISO 8601 datetime
}
],
"first_seen_date": string, // ISO 8601 date
"last_seen_date": string, // ISO 8601 date
"total_holding_duration_days": number // Total duration in days
}
}
}
]
}

Single gauge endpoint (/api/strategies/pendle/holders/:gaugeId)

Returns the same structure as a single gauge object from the main endpoint - useful for fetching data for a specific gauge without loading all gauges.

User history endpoint (/api/strategies/pendle/holders/user/:address)

{
"address": string,
"total_gauges": number,
"gauges": [
{
"gauge_id": string,
"token": { "address": string, "symbol": string },
"history": { ... } // Same as user_histories object above
}
]
}

This endpoint provides comprehensive data about Pendle gauge holders, including:

  • Metadata with overall statistics and gauge summaries
  • Current holders with their balances
  • Complete user histories with entry/exit tracking
  • Detailed event logs for all deposits and withdrawals
  • Holding period analysis with duration calculations
  • Maximum balances held by each user

About

🧑‍💻 Github based api for Stake DAO data

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - stake-dao/api: 🧑‍💻 Github based api for Stake DAO data · GitHub
Skip to content

Repository files navigation

Stake DAO API

This repository is meant to be used as API endpoints, with periodical updates through GitHub workflows

Data

Lockers data

Endpoint : /api/lockers

Data type :

{
parsed: {
id: string;
order: number;
symbol: string;
protocol: string;
protocolDescription: string;
website: string;
logoUrl: string;
chainId: number;
rgb: string;
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug?: string;
underlying?: string;
};
distribution?: string;
origin?: string;
};
sdToken?: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
underlying: string;
coingeckoSlug?: string;
};
};
rewards?: {
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug: string;
};
distribution: string;
origin: string;
};
price: number;
apr: number;
streaming: boolean;
periodFinish: number;
rate: string;
lastUpdate: string;
}[];
modules?: {
depositor: string;
locker: string;
veToken: string;
gauge: string;
accumulator: string;
};
secondaryMarket?: {
label: string;
poolKey: string;
pool: string;
pegBase: number;
};
voteBooster?: {
booster: string;
vSdToken: string;
balance: {
token: string;
sdToken: string;
staked: string;
working: string;
};
boost: number;
};
autoCompounder?: {
aSdToken: string;
};
alternativeYields?: Record<string, {
label: string;
platform: string;
href: string;
}>;
fees?: {
label: {
key: string;
variable?: string;
};
value: number;
key: string;
}[];
extensions?: {
coingeckoBaseSlug?: string;
strategyGauge?: string;
};
tokenLocked?: string;
veBalanceOfLocker?: string;
totalTokenLocked?: string;
veTotalSupply?: string;
lockIncentive?: string;
incentiveAmountInToken?: string;
gaugeWorkingSupply?: string;
totalSupplyStaked?: string;
amountTokenNotLock?: string;
bribeRewards?: {
bribeMinApr: number;
bribeMaxApr: number;
bribeAverageApr: number;
minBoost: string;
maxBoost: string;
token: string;
};
apr: number[];
streaming: boolean;
veTokenRate: string;
tvl: number;
peg: string;
tokenPriceInUsd: number;
sdTokenPriceInUsd: number;
}[];
sdt: {
lockersSdtPerBlock: string;
lockersSdtPerSecond: string;
stratsSdtPerBlock: string;
stratsSdtPerSecond: string;
};
fetched: boolean;
};

Strategies data

Strategies data are available on the endpoints /api/strategies/{protocol}

Available protocols :

The chain id can be selected by adding {chainId}.json at the end of the endpoint. e.g. Curve strategies on Ethereum can be fetched through the endpoint : /api/strategies/curve/1.json

export type Coin = {
name: string
symbol: string
address: string
decimals: number
}
export type AprDetail = {
total: number
details: {
label: string
value: number[]
}[]
}
export type OnlyBoostAprDetail = {
projected: {
baseToken: number
}
}
export type OnlyBoostProtocolData = {
tvl: number
supply: string
boost: number
optimal: {
supply: string
boost: number
share: number
}
claimable?: {
token: string
claimable: string
}[]
}
export type OnlyBoostData = {
active: boolean
implementations: {
key: string
address: string
}[]
totalSupply: string
boost: number
optimalBoost: number
stakeDao: OnlyBoostProtocolData
convex: OnlyBoostProtocolData
}
export type SdGauge = {
address: string
totalSupply: string
relativeWeight: string
weight: string
futureWeight: string
workingSupply: string
}
export type Fees = {
veSdt: number
perf: number
accumulator: number
claimer: number
}
export type VaultFees = {
keeper: number
accumulated: string
}
export type SdtApr = {
sdtUserApr: number
sdtFuturUserApr: number
sdtMinApr: number
sdtFuturMinApr: number
sdtMaxApr: number
sdtFuturMaxApr: number
sdtBoost: number
}
export type RewardsData = {
token: Coin
price: number
apr: number
streaming: boolean
periodFinish: number
rate: string
lastUpdate: string
claimablePendingRewards: string
}
export type Strategy = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
rewards: RewardsData[]
name: string
tradingApy: number
underlyingApy?: number
minApr: number
maxApr: number
lpPriceInUsd: number
convexPool?: {
id: number
token: string
gauge: string
crvRewards: string
stash: string
shutdown: boolean
usdTotal: number
}
tvl: number
apr: {
boost: number
current: AprDetail
projected: AprDetail
onlyboost?: {
convex: OnlyBoostAprDetail
optimal: OnlyBoostAprDetail
}
}
sdtApr?: SdtApr
vaultHoldings: string
totalSupply: string
strategyHoldings: string
workingBalance: string
sdGauge: SdGauge
vaultFees: VaultFees
onlyboost?: OnlyBoostData | { active: boolean }
}
// GLOBAL DATA TYPE
export type CurveGlobalData = {
totalGaugeWeights: string
nextEffectiveTimestamp: string
cvxTotalSupply: string
veCrvTotalSupply: string
stakeDaoVeBoost: string
convexVeBoost: string
fees: Fees
}
export type YearnGlobalData = {
totalGaugeWeights: string
fees: Fees
}
export type Global = CurveGlobalData | YearnGlobalData
export type StrategyData = {
global?: Global
deployed: Strategy[]
notDeployed: any
fetched: boolean
}
export type BuiltStrat = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
sdGauge: string
rewards: Coin[]
underlyingReward?: Coin
}

Pendle Holders data

Base endpoint : /api/strategies/pendle/holders

Available endpoints

EndpointDescription
/api/strategies/pendle/holdersGet all holders data (all gauges)
/api/strategies/pendle/holders/gaugesList all gauge IDs
/api/strategies/pendle/holders/currentGet current holders snapshot
/api/strategies/pendle/holders/historical?gauge=0x...&include_events=trueGet historical data
/api/strategies/pendle/holders/period?start_date=2024-01-01&end_date=2024-12-31&gauge=0x...&min_duration_days=30Period analysis
/api/strategies/pendle/holders/analytics?gauge=0x...Get holder analytics
/api/strategies/pendle/holders/user/:addressGet user history across all gauges
/api/strategies/pendle/holders/:gaugeIdGet single gauge data

Main endpoint data type (/api/strategies/pendle/holders)

{
"metadata": {
"snapshot_date": string, // ISO 8601 timestamp of data snapshot
"pendle_locker": string, // Pendle locker address
"total_gauges": number, // Total number of gauges
"total_current_holders": number, // Total current holders across all gauges
"total_unique_users": number, // Total unique users across all gauges
"average_holding_duration_days": number, // Average holding duration in days
"gauges_summary": [ // Summary of all gauges
{
"gauge": string, // Gauge address
"symbol": string, // PT token symbol
"current_holders": number, // Current number of holders
"total_users": number, // Total unique users (current + past)
"current_supply": string // Current total supply
}
]
},
"gauges": [
{
"gauge_id": string, // Gauge address
"vault_id": string, // Vault address (if available)
"token": {
"address": string, // PT token address
"symbol": string // PT token symbol
},
"stats": {
"total_deposited": string, // Total amount ever deposited
"total_withdrawn": string, // Total amount ever withdrawn
"current_supply": string, // Current total supply
"current_holders": number, // Current number of holders
"total_users": number // Total unique users (current + past)
},
"current_holders": { // Map of current holders (address -> balance)
"[user_address]": string
},
"user_histories": { // Map of all user histories
"[user_address]": {
"first_seen": number, // Unix timestamp when first seen
"last_seen": number, // Unix timestamp when last seen
"entry_timestamp": number, // Unix timestamp of first entry
"exit_timestamp": number, // Unix timestamp of exit (if applicable)
"entry_block": number, // Block number of first entry
"exit_block": number, // Block number of exit (if applicable)
"max_balance": number, // Maximum balance ever held
"holding_periods": [ // Array of holding periods
{
"entry_timestamp": number,
"exit_timestamp": number,
"entry_block": number,
"exit_block": number,
"duration": number, // Duration in seconds
"entry_date": string, // ISO 8601 date
"exit_date": string, // ISO 8601 date
"duration_days": number // Duration in days
}
],
"total_holding_duration": number, // Total duration in seconds
"is_current_holder": boolean, // Whether user currently holds tokens
"events": [ // Array of all deposit/withdraw events
{
"type": string, // "DEPOSIT" or "WITHDRAW"
"amount": string, // Amount deposited/withdrawn
"balance_after": string, // Balance after the event
"block": number, // Block number
"timestamp": number, // Unix timestamp
"datetime": string // ISO 8601 datetime
}
],
"first_seen_date": string, // ISO 8601 date
"last_seen_date": string, // ISO 8601 date
"total_holding_duration_days": number // Total duration in days
}
}
}
]
}

Single gauge endpoint (/api/strategies/pendle/holders/:gaugeId)

Returns the same structure as a single gauge object from the main endpoint - useful for fetching data for a specific gauge without loading all gauges.

User history endpoint (/api/strategies/pendle/holders/user/:address)

{
"address": string,
"total_gauges": number,
"gauges": [
{
"gauge_id": string,
"token": { "address": string, "symbol": string },
"history": { ... } // Same as user_histories object above
}
]
}

This endpoint provides comprehensive data about Pendle gauge holders, including:

  • Metadata with overall statistics and gauge summaries
  • Current holders with their balances
  • Complete user histories with entry/exit tracking
  • Detailed event logs for all deposits and withdrawals
  • Holding period analysis with duration calculations
  • Maximum balances held by each user

About

🧑‍💻 Github based api for Stake DAO data

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - stake-dao/api: 🧑‍💻 Github based api for Stake DAO data · GitHub
Skip to content

Repository files navigation

Stake DAO API

This repository is meant to be used as API endpoints, with periodical updates through GitHub workflows

Data

Lockers data

Endpoint : /api/lockers

Data type :

{
parsed: {
id: string;
order: number;
symbol: string;
protocol: string;
protocolDescription: string;
website: string;
logoUrl: string;
chainId: number;
rgb: string;
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug?: string;
underlying?: string;
};
distribution?: string;
origin?: string;
};
sdToken?: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
underlying: string;
coingeckoSlug?: string;
};
};
rewards?: {
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug: string;
};
distribution: string;
origin: string;
};
price: number;
apr: number;
streaming: boolean;
periodFinish: number;
rate: string;
lastUpdate: string;
}[];
modules?: {
depositor: string;
locker: string;
veToken: string;
gauge: string;
accumulator: string;
};
secondaryMarket?: {
label: string;
poolKey: string;
pool: string;
pegBase: number;
};
voteBooster?: {
booster: string;
vSdToken: string;
balance: {
token: string;
sdToken: string;
staked: string;
working: string;
};
boost: number;
};
autoCompounder?: {
aSdToken: string;
};
alternativeYields?: Record<string, {
label: string;
platform: string;
href: string;
}>;
fees?: {
label: {
key: string;
variable?: string;
};
value: number;
key: string;
}[];
extensions?: {
coingeckoBaseSlug?: string;
strategyGauge?: string;
};
tokenLocked?: string;
veBalanceOfLocker?: string;
totalTokenLocked?: string;
veTotalSupply?: string;
lockIncentive?: string;
incentiveAmountInToken?: string;
gaugeWorkingSupply?: string;
totalSupplyStaked?: string;
amountTokenNotLock?: string;
bribeRewards?: {
bribeMinApr: number;
bribeMaxApr: number;
bribeAverageApr: number;
minBoost: string;
maxBoost: string;
token: string;
};
apr: number[];
streaming: boolean;
veTokenRate: string;
tvl: number;
peg: string;
tokenPriceInUsd: number;
sdTokenPriceInUsd: number;
}[];
sdt: {
lockersSdtPerBlock: string;
lockersSdtPerSecond: string;
stratsSdtPerBlock: string;
stratsSdtPerSecond: string;
};
fetched: boolean;
};

Strategies data

Strategies data are available on the endpoints /api/strategies/{protocol}

Available protocols :

The chain id can be selected by adding {chainId}.json at the end of the endpoint. e.g. Curve strategies on Ethereum can be fetched through the endpoint : /api/strategies/curve/1.json

export type Coin = {
name: string
symbol: string
address: string
decimals: number
}
export type AprDetail = {
total: number
details: {
label: string
value: number[]
}[]
}
export type OnlyBoostAprDetail = {
projected: {
baseToken: number
}
}
export type OnlyBoostProtocolData = {
tvl: number
supply: string
boost: number
optimal: {
supply: string
boost: number
share: number
}
claimable?: {
token: string
claimable: string
}[]
}
export type OnlyBoostData = {
active: boolean
implementations: {
key: string
address: string
}[]
totalSupply: string
boost: number
optimalBoost: number
stakeDao: OnlyBoostProtocolData
convex: OnlyBoostProtocolData
}
export type SdGauge = {
address: string
totalSupply: string
relativeWeight: string
weight: string
futureWeight: string
workingSupply: string
}
export type Fees = {
veSdt: number
perf: number
accumulator: number
claimer: number
}
export type VaultFees = {
keeper: number
accumulated: string
}
export type SdtApr = {
sdtUserApr: number
sdtFuturUserApr: number
sdtMinApr: number
sdtFuturMinApr: number
sdtMaxApr: number
sdtFuturMaxApr: number
sdtBoost: number
}
export type RewardsData = {
token: Coin
price: number
apr: number
streaming: boolean
periodFinish: number
rate: string
lastUpdate: string
claimablePendingRewards: string
}
export type Strategy = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
rewards: RewardsData[]
name: string
tradingApy: number
underlyingApy?: number
minApr: number
maxApr: number
lpPriceInUsd: number
convexPool?: {
id: number
token: string
gauge: string
crvRewards: string
stash: string
shutdown: boolean
usdTotal: number
}
tvl: number
apr: {
boost: number
current: AprDetail
projected: AprDetail
onlyboost?: {
convex: OnlyBoostAprDetail
optimal: OnlyBoostAprDetail
}
}
sdtApr?: SdtApr
vaultHoldings: string
totalSupply: string
strategyHoldings: string
workingBalance: string
sdGauge: SdGauge
vaultFees: VaultFees
onlyboost?: OnlyBoostData | { active: boolean }
}
// GLOBAL DATA TYPE
export type CurveGlobalData = {
totalGaugeWeights: string
nextEffectiveTimestamp: string
cvxTotalSupply: string
veCrvTotalSupply: string
stakeDaoVeBoost: string
convexVeBoost: string
fees: Fees
}
export type YearnGlobalData = {
totalGaugeWeights: string
fees: Fees
}
export type Global = CurveGlobalData | YearnGlobalData
export type StrategyData = {
global?: Global
deployed: Strategy[]
notDeployed: any
fetched: boolean
}
export type BuiltStrat = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
sdGauge: string
rewards: Coin[]
underlyingReward?: Coin
}

Pendle Holders data

Base endpoint : /api/strategies/pendle/holders

Available endpoints

EndpointDescription
/api/strategies/pendle/holdersGet all holders data (all gauges)
/api/strategies/pendle/holders/gaugesList all gauge IDs
/api/strategies/pendle/holders/currentGet current holders snapshot
/api/strategies/pendle/holders/historical?gauge=0x...&include_events=trueGet historical data
/api/strategies/pendle/holders/period?start_date=2024-01-01&end_date=2024-12-31&gauge=0x...&min_duration_days=30Period analysis
/api/strategies/pendle/holders/analytics?gauge=0x...Get holder analytics
/api/strategies/pendle/holders/user/:addressGet user history across all gauges
/api/strategies/pendle/holders/:gaugeIdGet single gauge data

Main endpoint data type (/api/strategies/pendle/holders)

{
"metadata": {
"snapshot_date": string, // ISO 8601 timestamp of data snapshot
"pendle_locker": string, // Pendle locker address
"total_gauges": number, // Total number of gauges
"total_current_holders": number, // Total current holders across all gauges
"total_unique_users": number, // Total unique users across all gauges
"average_holding_duration_days": number, // Average holding duration in days
"gauges_summary": [ // Summary of all gauges
{
"gauge": string, // Gauge address
"symbol": string, // PT token symbol
"current_holders": number, // Current number of holders
"total_users": number, // Total unique users (current + past)
"current_supply": string // Current total supply
}
]
},
"gauges": [
{
"gauge_id": string, // Gauge address
"vault_id": string, // Vault address (if available)
"token": {
"address": string, // PT token address
"symbol": string // PT token symbol
},
"stats": {
"total_deposited": string, // Total amount ever deposited
"total_withdrawn": string, // Total amount ever withdrawn
"current_supply": string, // Current total supply
"current_holders": number, // Current number of holders
"total_users": number // Total unique users (current + past)
},
"current_holders": { // Map of current holders (address -> balance)
"[user_address]": string
},
"user_histories": { // Map of all user histories
"[user_address]": {
"first_seen": number, // Unix timestamp when first seen
"last_seen": number, // Unix timestamp when last seen
"entry_timestamp": number, // Unix timestamp of first entry
"exit_timestamp": number, // Unix timestamp of exit (if applicable)
"entry_block": number, // Block number of first entry
"exit_block": number, // Block number of exit (if applicable)
"max_balance": number, // Maximum balance ever held
"holding_periods": [ // Array of holding periods
{
"entry_timestamp": number,
"exit_timestamp": number,
"entry_block": number,
"exit_block": number,
"duration": number, // Duration in seconds
"entry_date": string, // ISO 8601 date
"exit_date": string, // ISO 8601 date
"duration_days": number // Duration in days
}
],
"total_holding_duration": number, // Total duration in seconds
"is_current_holder": boolean, // Whether user currently holds tokens
"events": [ // Array of all deposit/withdraw events
{
"type": string, // "DEPOSIT" or "WITHDRAW"
"amount": string, // Amount deposited/withdrawn
"balance_after": string, // Balance after the event
"block": number, // Block number
"timestamp": number, // Unix timestamp
"datetime": string // ISO 8601 datetime
}
],
"first_seen_date": string, // ISO 8601 date
"last_seen_date": string, // ISO 8601 date
"total_holding_duration_days": number // Total duration in days
}
}
}
]
}

Single gauge endpoint (/api/strategies/pendle/holders/:gaugeId)

Returns the same structure as a single gauge object from the main endpoint - useful for fetching data for a specific gauge without loading all gauges.

User history endpoint (/api/strategies/pendle/holders/user/:address)

{
"address": string,
"total_gauges": number,
"gauges": [
{
"gauge_id": string,
"token": { "address": string, "symbol": string },
"history": { ... } // Same as user_histories object above
}
]
}

This endpoint provides comprehensive data about Pendle gauge holders, including:

  • Metadata with overall statistics and gauge summaries
  • Current holders with their balances
  • Complete user histories with entry/exit tracking
  • Detailed event logs for all deposits and withdrawals
  • Holding period analysis with duration calculations
  • Maximum balances held by each user

About

🧑‍💻 Github based api for Stake DAO data

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - stake-dao/api: 🧑‍💻 Github based api for Stake DAO data · GitHub
Skip to content

Repository files navigation

Stake DAO API

This repository is meant to be used as API endpoints, with periodical updates through GitHub workflows

Data

Lockers data

Endpoint : /api/lockers

Data type :

{
parsed: {
id: string;
order: number;
symbol: string;
protocol: string;
protocolDescription: string;
website: string;
logoUrl: string;
chainId: number;
rgb: string;
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug?: string;
underlying?: string;
};
distribution?: string;
origin?: string;
};
sdToken?: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
underlying: string;
coingeckoSlug?: string;
};
};
rewards?: {
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug: string;
};
distribution: string;
origin: string;
};
price: number;
apr: number;
streaming: boolean;
periodFinish: number;
rate: string;
lastUpdate: string;
}[];
modules?: {
depositor: string;
locker: string;
veToken: string;
gauge: string;
accumulator: string;
};
secondaryMarket?: {
label: string;
poolKey: string;
pool: string;
pegBase: number;
};
voteBooster?: {
booster: string;
vSdToken: string;
balance: {
token: string;
sdToken: string;
staked: string;
working: string;
};
boost: number;
};
autoCompounder?: {
aSdToken: string;
};
alternativeYields?: Record<string, {
label: string;
platform: string;
href: string;
}>;
fees?: {
label: {
key: string;
variable?: string;
};
value: number;
key: string;
}[];
extensions?: {
coingeckoBaseSlug?: string;
strategyGauge?: string;
};
tokenLocked?: string;
veBalanceOfLocker?: string;
totalTokenLocked?: string;
veTotalSupply?: string;
lockIncentive?: string;
incentiveAmountInToken?: string;
gaugeWorkingSupply?: string;
totalSupplyStaked?: string;
amountTokenNotLock?: string;
bribeRewards?: {
bribeMinApr: number;
bribeMaxApr: number;
bribeAverageApr: number;
minBoost: string;
maxBoost: string;
token: string;
};
apr: number[];
streaming: boolean;
veTokenRate: string;
tvl: number;
peg: string;
tokenPriceInUsd: number;
sdTokenPriceInUsd: number;
}[];
sdt: {
lockersSdtPerBlock: string;
lockersSdtPerSecond: string;
stratsSdtPerBlock: string;
stratsSdtPerSecond: string;
};
fetched: boolean;
};

Strategies data

Strategies data are available on the endpoints /api/strategies/{protocol}

Available protocols :

The chain id can be selected by adding {chainId}.json at the end of the endpoint. e.g. Curve strategies on Ethereum can be fetched through the endpoint : /api/strategies/curve/1.json

export type Coin = {
name: string
symbol: string
address: string
decimals: number
}
export type AprDetail = {
total: number
details: {
label: string
value: number[]
}[]
}
export type OnlyBoostAprDetail = {
projected: {
baseToken: number
}
}
export type OnlyBoostProtocolData = {
tvl: number
supply: string
boost: number
optimal: {
supply: string
boost: number
share: number
}
claimable?: {
token: string
claimable: string
}[]
}
export type OnlyBoostData = {
active: boolean
implementations: {
key: string
address: string
}[]
totalSupply: string
boost: number
optimalBoost: number
stakeDao: OnlyBoostProtocolData
convex: OnlyBoostProtocolData
}
export type SdGauge = {
address: string
totalSupply: string
relativeWeight: string
weight: string
futureWeight: string
workingSupply: string
}
export type Fees = {
veSdt: number
perf: number
accumulator: number
claimer: number
}
export type VaultFees = {
keeper: number
accumulated: string
}
export type SdtApr = {
sdtUserApr: number
sdtFuturUserApr: number
sdtMinApr: number
sdtFuturMinApr: number
sdtMaxApr: number
sdtFuturMaxApr: number
sdtBoost: number
}
export type RewardsData = {
token: Coin
price: number
apr: number
streaming: boolean
periodFinish: number
rate: string
lastUpdate: string
claimablePendingRewards: string
}
export type Strategy = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
rewards: RewardsData[]
name: string
tradingApy: number
underlyingApy?: number
minApr: number
maxApr: number
lpPriceInUsd: number
convexPool?: {
id: number
token: string
gauge: string
crvRewards: string
stash: string
shutdown: boolean
usdTotal: number
}
tvl: number
apr: {
boost: number
current: AprDetail
projected: AprDetail
onlyboost?: {
convex: OnlyBoostAprDetail
optimal: OnlyBoostAprDetail
}
}
sdtApr?: SdtApr
vaultHoldings: string
totalSupply: string
strategyHoldings: string
workingBalance: string
sdGauge: SdGauge
vaultFees: VaultFees
onlyboost?: OnlyBoostData | { active: boolean }
}
// GLOBAL DATA TYPE
export type CurveGlobalData = {
totalGaugeWeights: string
nextEffectiveTimestamp: string
cvxTotalSupply: string
veCrvTotalSupply: string
stakeDaoVeBoost: string
convexVeBoost: string
fees: Fees
}
export type YearnGlobalData = {
totalGaugeWeights: string
fees: Fees
}
export type Global = CurveGlobalData | YearnGlobalData
export type StrategyData = {
global?: Global
deployed: Strategy[]
notDeployed: any
fetched: boolean
}
export type BuiltStrat = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
sdGauge: string
rewards: Coin[]
underlyingReward?: Coin
}

Pendle Holders data

Base endpoint : /api/strategies/pendle/holders

Available endpoints

EndpointDescription
/api/strategies/pendle/holdersGet all holders data (all gauges)
/api/strategies/pendle/holders/gaugesList all gauge IDs
/api/strategies/pendle/holders/currentGet current holders snapshot
/api/strategies/pendle/holders/historical?gauge=0x...&include_events=trueGet historical data
/api/strategies/pendle/holders/period?start_date=2024-01-01&end_date=2024-12-31&gauge=0x...&min_duration_days=30Period analysis
/api/strategies/pendle/holders/analytics?gauge=0x...Get holder analytics
/api/strategies/pendle/holders/user/:addressGet user history across all gauges
/api/strategies/pendle/holders/:gaugeIdGet single gauge data

Main endpoint data type (/api/strategies/pendle/holders)

{
"metadata": {
"snapshot_date": string, // ISO 8601 timestamp of data snapshot
"pendle_locker": string, // Pendle locker address
"total_gauges": number, // Total number of gauges
"total_current_holders": number, // Total current holders across all gauges
"total_unique_users": number, // Total unique users across all gauges
"average_holding_duration_days": number, // Average holding duration in days
"gauges_summary": [ // Summary of all gauges
{
"gauge": string, // Gauge address
"symbol": string, // PT token symbol
"current_holders": number, // Current number of holders
"total_users": number, // Total unique users (current + past)
"current_supply": string // Current total supply
}
]
},
"gauges": [
{
"gauge_id": string, // Gauge address
"vault_id": string, // Vault address (if available)
"token": {
"address": string, // PT token address
"symbol": string // PT token symbol
},
"stats": {
"total_deposited": string, // Total amount ever deposited
"total_withdrawn": string, // Total amount ever withdrawn
"current_supply": string, // Current total supply
"current_holders": number, // Current number of holders
"total_users": number // Total unique users (current + past)
},
"current_holders": { // Map of current holders (address -> balance)
"[user_address]": string
},
"user_histories": { // Map of all user histories
"[user_address]": {
"first_seen": number, // Unix timestamp when first seen
"last_seen": number, // Unix timestamp when last seen
"entry_timestamp": number, // Unix timestamp of first entry
"exit_timestamp": number, // Unix timestamp of exit (if applicable)
"entry_block": number, // Block number of first entry
"exit_block": number, // Block number of exit (if applicable)
"max_balance": number, // Maximum balance ever held
"holding_periods": [ // Array of holding periods
{
"entry_timestamp": number,
"exit_timestamp": number,
"entry_block": number,
"exit_block": number,
"duration": number, // Duration in seconds
"entry_date": string, // ISO 8601 date
"exit_date": string, // ISO 8601 date
"duration_days": number // Duration in days
}
],
"total_holding_duration": number, // Total duration in seconds
"is_current_holder": boolean, // Whether user currently holds tokens
"events": [ // Array of all deposit/withdraw events
{
"type": string, // "DEPOSIT" or "WITHDRAW"
"amount": string, // Amount deposited/withdrawn
"balance_after": string, // Balance after the event
"block": number, // Block number
"timestamp": number, // Unix timestamp
"datetime": string // ISO 8601 datetime
}
],
"first_seen_date": string, // ISO 8601 date
"last_seen_date": string, // ISO 8601 date
"total_holding_duration_days": number // Total duration in days
}
}
}
]
}

Single gauge endpoint (/api/strategies/pendle/holders/:gaugeId)

Returns the same structure as a single gauge object from the main endpoint - useful for fetching data for a specific gauge without loading all gauges.

User history endpoint (/api/strategies/pendle/holders/user/:address)

{
"address": string,
"total_gauges": number,
"gauges": [
{
"gauge_id": string,
"token": { "address": string, "symbol": string },
"history": { ... } // Same as user_histories object above
}
]
}

This endpoint provides comprehensive data about Pendle gauge holders, including:

  • Metadata with overall statistics and gauge summaries
  • Current holders with their balances
  • Complete user histories with entry/exit tracking
  • Detailed event logs for all deposits and withdrawals
  • Holding period analysis with duration calculations
  • Maximum balances held by each user

About

🧑‍💻 Github based api for Stake DAO data

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - stake-dao/api: 🧑‍💻 Github based api for Stake DAO data · GitHub
Skip to content

Repository files navigation

Stake DAO API

This repository is meant to be used as API endpoints, with periodical updates through GitHub workflows

Data

Lockers data

Endpoint : /api/lockers

Data type :

{
parsed: {
id: string;
order: number;
symbol: string;
protocol: string;
protocolDescription: string;
website: string;
logoUrl: string;
chainId: number;
rgb: string;
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug?: string;
underlying?: string;
};
distribution?: string;
origin?: string;
};
sdToken?: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
underlying: string;
coingeckoSlug?: string;
};
};
rewards?: {
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug: string;
};
distribution: string;
origin: string;
};
price: number;
apr: number;
streaming: boolean;
periodFinish: number;
rate: string;
lastUpdate: string;
}[];
modules?: {
depositor: string;
locker: string;
veToken: string;
gauge: string;
accumulator: string;
};
secondaryMarket?: {
label: string;
poolKey: string;
pool: string;
pegBase: number;
};
voteBooster?: {
booster: string;
vSdToken: string;
balance: {
token: string;
sdToken: string;
staked: string;
working: string;
};
boost: number;
};
autoCompounder?: {
aSdToken: string;
};
alternativeYields?: Record<string, {
label: string;
platform: string;
href: string;
}>;
fees?: {
label: {
key: string;
variable?: string;
};
value: number;
key: string;
}[];
extensions?: {
coingeckoBaseSlug?: string;
strategyGauge?: string;
};
tokenLocked?: string;
veBalanceOfLocker?: string;
totalTokenLocked?: string;
veTotalSupply?: string;
lockIncentive?: string;
incentiveAmountInToken?: string;
gaugeWorkingSupply?: string;
totalSupplyStaked?: string;
amountTokenNotLock?: string;
bribeRewards?: {
bribeMinApr: number;
bribeMaxApr: number;
bribeAverageApr: number;
minBoost: string;
maxBoost: string;
token: string;
};
apr: number[];
streaming: boolean;
veTokenRate: string;
tvl: number;
peg: string;
tokenPriceInUsd: number;
sdTokenPriceInUsd: number;
}[];
sdt: {
lockersSdtPerBlock: string;
lockersSdtPerSecond: string;
stratsSdtPerBlock: string;
stratsSdtPerSecond: string;
};
fetched: boolean;
};

Strategies data

Strategies data are available on the endpoints /api/strategies/{protocol}

Available protocols :

The chain id can be selected by adding {chainId}.json at the end of the endpoint. e.g. Curve strategies on Ethereum can be fetched through the endpoint : /api/strategies/curve/1.json

export type Coin = {
name: string
symbol: string
address: string
decimals: number
}
export type AprDetail = {
total: number
details: {
label: string
value: number[]
}[]
}
export type OnlyBoostAprDetail = {
projected: {
baseToken: number
}
}
export type OnlyBoostProtocolData = {
tvl: number
supply: string
boost: number
optimal: {
supply: string
boost: number
share: number
}
claimable?: {
token: string
claimable: string
}[]
}
export type OnlyBoostData = {
active: boolean
implementations: {
key: string
address: string
}[]
totalSupply: string
boost: number
optimalBoost: number
stakeDao: OnlyBoostProtocolData
convex: OnlyBoostProtocolData
}
export type SdGauge = {
address: string
totalSupply: string
relativeWeight: string
weight: string
futureWeight: string
workingSupply: string
}
export type Fees = {
veSdt: number
perf: number
accumulator: number
claimer: number
}
export type VaultFees = {
keeper: number
accumulated: string
}
export type SdtApr = {
sdtUserApr: number
sdtFuturUserApr: number
sdtMinApr: number
sdtFuturMinApr: number
sdtMaxApr: number
sdtFuturMaxApr: number
sdtBoost: number
}
export type RewardsData = {
token: Coin
price: number
apr: number
streaming: boolean
periodFinish: number
rate: string
lastUpdate: string
claimablePendingRewards: string
}
export type Strategy = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
rewards: RewardsData[]
name: string
tradingApy: number
underlyingApy?: number
minApr: number
maxApr: number
lpPriceInUsd: number
convexPool?: {
id: number
token: string
gauge: string
crvRewards: string
stash: string
shutdown: boolean
usdTotal: number
}
tvl: number
apr: {
boost: number
current: AprDetail
projected: AprDetail
onlyboost?: {
convex: OnlyBoostAprDetail
optimal: OnlyBoostAprDetail
}
}
sdtApr?: SdtApr
vaultHoldings: string
totalSupply: string
strategyHoldings: string
workingBalance: string
sdGauge: SdGauge
vaultFees: VaultFees
onlyboost?: OnlyBoostData | { active: boolean }
}
// GLOBAL DATA TYPE
export type CurveGlobalData = {
totalGaugeWeights: string
nextEffectiveTimestamp: string
cvxTotalSupply: string
veCrvTotalSupply: string
stakeDaoVeBoost: string
convexVeBoost: string
fees: Fees
}
export type YearnGlobalData = {
totalGaugeWeights: string
fees: Fees
}
export type Global = CurveGlobalData | YearnGlobalData
export type StrategyData = {
global?: Global
deployed: Strategy[]
notDeployed: any
fetched: boolean
}
export type BuiltStrat = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
sdGauge: string
rewards: Coin[]
underlyingReward?: Coin
}

Pendle Holders data

Base endpoint : /api/strategies/pendle/holders

Available endpoints

EndpointDescription
/api/strategies/pendle/holdersGet all holders data (all gauges)
/api/strategies/pendle/holders/gaugesList all gauge IDs
/api/strategies/pendle/holders/currentGet current holders snapshot
/api/strategies/pendle/holders/historical?gauge=0x...&include_events=trueGet historical data
/api/strategies/pendle/holders/period?start_date=2024-01-01&end_date=2024-12-31&gauge=0x...&min_duration_days=30Period analysis
/api/strategies/pendle/holders/analytics?gauge=0x...Get holder analytics
/api/strategies/pendle/holders/user/:addressGet user history across all gauges
/api/strategies/pendle/holders/:gaugeIdGet single gauge data

Main endpoint data type (/api/strategies/pendle/holders)

{
"metadata": {
"snapshot_date": string, // ISO 8601 timestamp of data snapshot
"pendle_locker": string, // Pendle locker address
"total_gauges": number, // Total number of gauges
"total_current_holders": number, // Total current holders across all gauges
"total_unique_users": number, // Total unique users across all gauges
"average_holding_duration_days": number, // Average holding duration in days
"gauges_summary": [ // Summary of all gauges
{
"gauge": string, // Gauge address
"symbol": string, // PT token symbol
"current_holders": number, // Current number of holders
"total_users": number, // Total unique users (current + past)
"current_supply": string // Current total supply
}
]
},
"gauges": [
{
"gauge_id": string, // Gauge address
"vault_id": string, // Vault address (if available)
"token": {
"address": string, // PT token address
"symbol": string // PT token symbol
},
"stats": {
"total_deposited": string, // Total amount ever deposited
"total_withdrawn": string, // Total amount ever withdrawn
"current_supply": string, // Current total supply
"current_holders": number, // Current number of holders
"total_users": number // Total unique users (current + past)
},
"current_holders": { // Map of current holders (address -> balance)
"[user_address]": string
},
"user_histories": { // Map of all user histories
"[user_address]": {
"first_seen": number, // Unix timestamp when first seen
"last_seen": number, // Unix timestamp when last seen
"entry_timestamp": number, // Unix timestamp of first entry
"exit_timestamp": number, // Unix timestamp of exit (if applicable)
"entry_block": number, // Block number of first entry
"exit_block": number, // Block number of exit (if applicable)
"max_balance": number, // Maximum balance ever held
"holding_periods": [ // Array of holding periods
{
"entry_timestamp": number,
"exit_timestamp": number,
"entry_block": number,
"exit_block": number,
"duration": number, // Duration in seconds
"entry_date": string, // ISO 8601 date
"exit_date": string, // ISO 8601 date
"duration_days": number // Duration in days
}
],
"total_holding_duration": number, // Total duration in seconds
"is_current_holder": boolean, // Whether user currently holds tokens
"events": [ // Array of all deposit/withdraw events
{
"type": string, // "DEPOSIT" or "WITHDRAW"
"amount": string, // Amount deposited/withdrawn
"balance_after": string, // Balance after the event
"block": number, // Block number
"timestamp": number, // Unix timestamp
"datetime": string // ISO 8601 datetime
}
],
"first_seen_date": string, // ISO 8601 date
"last_seen_date": string, // ISO 8601 date
"total_holding_duration_days": number // Total duration in days
}
}
}
]
}

Single gauge endpoint (/api/strategies/pendle/holders/:gaugeId)

Returns the same structure as a single gauge object from the main endpoint - useful for fetching data for a specific gauge without loading all gauges.

User history endpoint (/api/strategies/pendle/holders/user/:address)

{
"address": string,
"total_gauges": number,
"gauges": [
{
"gauge_id": string,
"token": { "address": string, "symbol": string },
"history": { ... } // Same as user_histories object above
}
]
}

This endpoint provides comprehensive data about Pendle gauge holders, including:

  • Metadata with overall statistics and gauge summaries
  • Current holders with their balances
  • Complete user histories with entry/exit tracking
  • Detailed event logs for all deposits and withdrawals
  • Holding period analysis with duration calculations
  • Maximum balances held by each user

About

🧑‍💻 Github based api for Stake DAO data

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - stake-dao/api: 🧑‍💻 Github based api for Stake DAO data · GitHub
Skip to content

Repository files navigation

Stake DAO API

This repository is meant to be used as API endpoints, with periodical updates through GitHub workflows

Data

Lockers data

Endpoint : /api/lockers

Data type :

{
parsed: {
id: string;
order: number;
symbol: string;
protocol: string;
protocolDescription: string;
website: string;
logoUrl: string;
chainId: number;
rgb: string;
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug?: string;
underlying?: string;
};
distribution?: string;
origin?: string;
};
sdToken?: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
underlying: string;
coingeckoSlug?: string;
};
};
rewards?: {
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug: string;
};
distribution: string;
origin: string;
};
price: number;
apr: number;
streaming: boolean;
periodFinish: number;
rate: string;
lastUpdate: string;
}[];
modules?: {
depositor: string;
locker: string;
veToken: string;
gauge: string;
accumulator: string;
};
secondaryMarket?: {
label: string;
poolKey: string;
pool: string;
pegBase: number;
};
voteBooster?: {
booster: string;
vSdToken: string;
balance: {
token: string;
sdToken: string;
staked: string;
working: string;
};
boost: number;
};
autoCompounder?: {
aSdToken: string;
};
alternativeYields?: Record<string, {
label: string;
platform: string;
href: string;
}>;
fees?: {
label: {
key: string;
variable?: string;
};
value: number;
key: string;
}[];
extensions?: {
coingeckoBaseSlug?: string;
strategyGauge?: string;
};
tokenLocked?: string;
veBalanceOfLocker?: string;
totalTokenLocked?: string;
veTotalSupply?: string;
lockIncentive?: string;
incentiveAmountInToken?: string;
gaugeWorkingSupply?: string;
totalSupplyStaked?: string;
amountTokenNotLock?: string;
bribeRewards?: {
bribeMinApr: number;
bribeMaxApr: number;
bribeAverageApr: number;
minBoost: string;
maxBoost: string;
token: string;
};
apr: number[];
streaming: boolean;
veTokenRate: string;
tvl: number;
peg: string;
tokenPriceInUsd: number;
sdTokenPriceInUsd: number;
}[];
sdt: {
lockersSdtPerBlock: string;
lockersSdtPerSecond: string;
stratsSdtPerBlock: string;
stratsSdtPerSecond: string;
};
fetched: boolean;
};

Strategies data

Strategies data are available on the endpoints /api/strategies/{protocol}

Available protocols :

The chain id can be selected by adding {chainId}.json at the end of the endpoint. e.g. Curve strategies on Ethereum can be fetched through the endpoint : /api/strategies/curve/1.json

export type Coin = {
name: string
symbol: string
address: string
decimals: number
}
export type AprDetail = {
total: number
details: {
label: string
value: number[]
}[]
}
export type OnlyBoostAprDetail = {
projected: {
baseToken: number
}
}
export type OnlyBoostProtocolData = {
tvl: number
supply: string
boost: number
optimal: {
supply: string
boost: number
share: number
}
claimable?: {
token: string
claimable: string
}[]
}
export type OnlyBoostData = {
active: boolean
implementations: {
key: string
address: string
}[]
totalSupply: string
boost: number
optimalBoost: number
stakeDao: OnlyBoostProtocolData
convex: OnlyBoostProtocolData
}
export type SdGauge = {
address: string
totalSupply: string
relativeWeight: string
weight: string
futureWeight: string
workingSupply: string
}
export type Fees = {
veSdt: number
perf: number
accumulator: number
claimer: number
}
export type VaultFees = {
keeper: number
accumulated: string
}
export type SdtApr = {
sdtUserApr: number
sdtFuturUserApr: number
sdtMinApr: number
sdtFuturMinApr: number
sdtMaxApr: number
sdtFuturMaxApr: number
sdtBoost: number
}
export type RewardsData = {
token: Coin
price: number
apr: number
streaming: boolean
periodFinish: number
rate: string
lastUpdate: string
claimablePendingRewards: string
}
export type Strategy = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
rewards: RewardsData[]
name: string
tradingApy: number
underlyingApy?: number
minApr: number
maxApr: number
lpPriceInUsd: number
convexPool?: {
id: number
token: string
gauge: string
crvRewards: string
stash: string
shutdown: boolean
usdTotal: number
}
tvl: number
apr: {
boost: number
current: AprDetail
projected: AprDetail
onlyboost?: {
convex: OnlyBoostAprDetail
optimal: OnlyBoostAprDetail
}
}
sdtApr?: SdtApr
vaultHoldings: string
totalSupply: string
strategyHoldings: string
workingBalance: string
sdGauge: SdGauge
vaultFees: VaultFees
onlyboost?: OnlyBoostData | { active: boolean }
}
// GLOBAL DATA TYPE
export type CurveGlobalData = {
totalGaugeWeights: string
nextEffectiveTimestamp: string
cvxTotalSupply: string
veCrvTotalSupply: string
stakeDaoVeBoost: string
convexVeBoost: string
fees: Fees
}
export type YearnGlobalData = {
totalGaugeWeights: string
fees: Fees
}
export type Global = CurveGlobalData | YearnGlobalData
export type StrategyData = {
global?: Global
deployed: Strategy[]
notDeployed: any
fetched: boolean
}
export type BuiltStrat = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
sdGauge: string
rewards: Coin[]
underlyingReward?: Coin
}

Pendle Holders data

Base endpoint : /api/strategies/pendle/holders

Available endpoints

EndpointDescription
/api/strategies/pendle/holdersGet all holders data (all gauges)
/api/strategies/pendle/holders/gaugesList all gauge IDs
/api/strategies/pendle/holders/currentGet current holders snapshot
/api/strategies/pendle/holders/historical?gauge=0x...&include_events=trueGet historical data
/api/strategies/pendle/holders/period?start_date=2024-01-01&end_date=2024-12-31&gauge=0x...&min_duration_days=30Period analysis
/api/strategies/pendle/holders/analytics?gauge=0x...Get holder analytics
/api/strategies/pendle/holders/user/:addressGet user history across all gauges
/api/strategies/pendle/holders/:gaugeIdGet single gauge data

Main endpoint data type (/api/strategies/pendle/holders)

{
"metadata": {
"snapshot_date": string, // ISO 8601 timestamp of data snapshot
"pendle_locker": string, // Pendle locker address
"total_gauges": number, // Total number of gauges
"total_current_holders": number, // Total current holders across all gauges
"total_unique_users": number, // Total unique users across all gauges
"average_holding_duration_days": number, // Average holding duration in days
"gauges_summary": [ // Summary of all gauges
{
"gauge": string, // Gauge address
"symbol": string, // PT token symbol
"current_holders": number, // Current number of holders
"total_users": number, // Total unique users (current + past)
"current_supply": string // Current total supply
}
]
},
"gauges": [
{
"gauge_id": string, // Gauge address
"vault_id": string, // Vault address (if available)
"token": {
"address": string, // PT token address
"symbol": string // PT token symbol
},
"stats": {
"total_deposited": string, // Total amount ever deposited
"total_withdrawn": string, // Total amount ever withdrawn
"current_supply": string, // Current total supply
"current_holders": number, // Current number of holders
"total_users": number // Total unique users (current + past)
},
"current_holders": { // Map of current holders (address -> balance)
"[user_address]": string
},
"user_histories": { // Map of all user histories
"[user_address]": {
"first_seen": number, // Unix timestamp when first seen
"last_seen": number, // Unix timestamp when last seen
"entry_timestamp": number, // Unix timestamp of first entry
"exit_timestamp": number, // Unix timestamp of exit (if applicable)
"entry_block": number, // Block number of first entry
"exit_block": number, // Block number of exit (if applicable)
"max_balance": number, // Maximum balance ever held
"holding_periods": [ // Array of holding periods
{
"entry_timestamp": number,
"exit_timestamp": number,
"entry_block": number,
"exit_block": number,
"duration": number, // Duration in seconds
"entry_date": string, // ISO 8601 date
"exit_date": string, // ISO 8601 date
"duration_days": number // Duration in days
}
],
"total_holding_duration": number, // Total duration in seconds
"is_current_holder": boolean, // Whether user currently holds tokens
"events": [ // Array of all deposit/withdraw events
{
"type": string, // "DEPOSIT" or "WITHDRAW"
"amount": string, // Amount deposited/withdrawn
"balance_after": string, // Balance after the event
"block": number, // Block number
"timestamp": number, // Unix timestamp
"datetime": string // ISO 8601 datetime
}
],
"first_seen_date": string, // ISO 8601 date
"last_seen_date": string, // ISO 8601 date
"total_holding_duration_days": number // Total duration in days
}
}
}
]
}

Single gauge endpoint (/api/strategies/pendle/holders/:gaugeId)

Returns the same structure as a single gauge object from the main endpoint - useful for fetching data for a specific gauge without loading all gauges.

User history endpoint (/api/strategies/pendle/holders/user/:address)

{
"address": string,
"total_gauges": number,
"gauges": [
{
"gauge_id": string,
"token": { "address": string, "symbol": string },
"history": { ... } // Same as user_histories object above
}
]
}

This endpoint provides comprehensive data about Pendle gauge holders, including:

  • Metadata with overall statistics and gauge summaries
  • Current holders with their balances
  • Complete user histories with entry/exit tracking
  • Detailed event logs for all deposits and withdrawals
  • Holding period analysis with duration calculations
  • Maximum balances held by each user

About

🧑‍💻 Github based api for Stake DAO data

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - stake-dao/api: 🧑‍💻 Github based api for Stake DAO data · GitHub
Skip to content

Repository files navigation

Stake DAO API

This repository is meant to be used as API endpoints, with periodical updates through GitHub workflows

Data

Lockers data

Endpoint : /api/lockers

Data type :

{
parsed: {
id: string;
order: number;
symbol: string;
protocol: string;
protocolDescription: string;
website: string;
logoUrl: string;
chainId: number;
rgb: string;
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug?: string;
underlying?: string;
};
distribution?: string;
origin?: string;
};
sdToken?: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
underlying: string;
coingeckoSlug?: string;
};
};
rewards?: {
token: {
id: string;
name: string;
address: string;
symbol: string;
decimals: number;
chainId: number;
logoURI: string;
tags: string[];
extensions: {
coingeckoSlug: string;
};
distribution: string;
origin: string;
};
price: number;
apr: number;
streaming: boolean;
periodFinish: number;
rate: string;
lastUpdate: string;
}[];
modules?: {
depositor: string;
locker: string;
veToken: string;
gauge: string;
accumulator: string;
};
secondaryMarket?: {
label: string;
poolKey: string;
pool: string;
pegBase: number;
};
voteBooster?: {
booster: string;
vSdToken: string;
balance: {
token: string;
sdToken: string;
staked: string;
working: string;
};
boost: number;
};
autoCompounder?: {
aSdToken: string;
};
alternativeYields?: Record<string, {
label: string;
platform: string;
href: string;
}>;
fees?: {
label: {
key: string;
variable?: string;
};
value: number;
key: string;
}[];
extensions?: {
coingeckoBaseSlug?: string;
strategyGauge?: string;
};
tokenLocked?: string;
veBalanceOfLocker?: string;
totalTokenLocked?: string;
veTotalSupply?: string;
lockIncentive?: string;
incentiveAmountInToken?: string;
gaugeWorkingSupply?: string;
totalSupplyStaked?: string;
amountTokenNotLock?: string;
bribeRewards?: {
bribeMinApr: number;
bribeMaxApr: number;
bribeAverageApr: number;
minBoost: string;
maxBoost: string;
token: string;
};
apr: number[];
streaming: boolean;
veTokenRate: string;
tvl: number;
peg: string;
tokenPriceInUsd: number;
sdTokenPriceInUsd: number;
}[];
sdt: {
lockersSdtPerBlock: string;
lockersSdtPerSecond: string;
stratsSdtPerBlock: string;
stratsSdtPerSecond: string;
};
fetched: boolean;
};

Strategies data

Strategies data are available on the endpoints /api/strategies/{protocol}

Available protocols :

The chain id can be selected by adding {chainId}.json at the end of the endpoint. e.g. Curve strategies on Ethereum can be fetched through the endpoint : /api/strategies/curve/1.json

export type Coin = {
name: string
symbol: string
address: string
decimals: number
}
export type AprDetail = {
total: number
details: {
label: string
value: number[]
}[]
}
export type OnlyBoostAprDetail = {
projected: {
baseToken: number
}
}
export type OnlyBoostProtocolData = {
tvl: number
supply: string
boost: number
optimal: {
supply: string
boost: number
share: number
}
claimable?: {
token: string
claimable: string
}[]
}
export type OnlyBoostData = {
active: boolean
implementations: {
key: string
address: string
}[]
totalSupply: string
boost: number
optimalBoost: number
stakeDao: OnlyBoostProtocolData
convex: OnlyBoostProtocolData
}
export type SdGauge = {
address: string
totalSupply: string
relativeWeight: string
weight: string
futureWeight: string
workingSupply: string
}
export type Fees = {
veSdt: number
perf: number
accumulator: number
claimer: number
}
export type VaultFees = {
keeper: number
accumulated: string
}
export type SdtApr = {
sdtUserApr: number
sdtFuturUserApr: number
sdtMinApr: number
sdtFuturMinApr: number
sdtMaxApr: number
sdtFuturMaxApr: number
sdtBoost: number
}
export type RewardsData = {
token: Coin
price: number
apr: number
streaming: boolean
periodFinish: number
rate: string
lastUpdate: string
claimablePendingRewards: string
}
export type Strategy = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
rewards: RewardsData[]
name: string
tradingApy: number
underlyingApy?: number
minApr: number
maxApr: number
lpPriceInUsd: number
convexPool?: {
id: number
token: string
gauge: string
crvRewards: string
stash: string
shutdown: boolean
usdTotal: number
}
tvl: number
apr: {
boost: number
current: AprDetail
projected: AprDetail
onlyboost?: {
convex: OnlyBoostAprDetail
optimal: OnlyBoostAprDetail
}
}
sdtApr?: SdtApr
vaultHoldings: string
totalSupply: string
strategyHoldings: string
workingBalance: string
sdGauge: SdGauge
vaultFees: VaultFees
onlyboost?: OnlyBoostData | { active: boolean }
}
// GLOBAL DATA TYPE
export type CurveGlobalData = {
totalGaugeWeights: string
nextEffectiveTimestamp: string
cvxTotalSupply: string
veCrvTotalSupply: string
stakeDaoVeBoost: string
convexVeBoost: string
fees: Fees
}
export type YearnGlobalData = {
totalGaugeWeights: string
fees: Fees
}
export type Global = CurveGlobalData | YearnGlobalData
export type StrategyData = {
global?: Global
deployed: Strategy[]
notDeployed: any
fetched: boolean
}
export type BuiltStrat = {
key: string
type: string
protocol: string
chainId: number
isMetapool?: boolean
isLending?: boolean
vault: string
lpToken: Coin
gaugeAddress: string
gaugeToken?: Coin & { version: number }
coins: Coin[]
underlyingCoins?: Coin[]
sdGauge: string
rewards: Coin[]
underlyingReward?: Coin
}

Pendle Holders data

Base endpoint : /api/strategies/pendle/holders

Available endpoints

EndpointDescription
/api/strategies/pendle/holdersGet all holders data (all gauges)
/api/strategies/pendle/holders/gaugesList all gauge IDs
/api/strategies/pendle/holders/currentGet current holders snapshot
/api/strategies/pendle/holders/historical?gauge=0x...&include_events=trueGet historical data
/api/strategies/pendle/holders/period?start_date=2024-01-01&end_date=2024-12-31&gauge=0x...&min_duration_days=30Period analysis
/api/strategies/pendle/holders/analytics?gauge=0x...Get holder analytics
/api/strategies/pendle/holders/user/:addressGet user history across all gauges
/api/strategies/pendle/holders/:gaugeIdGet single gauge data

Main endpoint data type (/api/strategies/pendle/holders)

{
"metadata": {
"snapshot_date": string, // ISO 8601 timestamp of data snapshot
"pendle_locker": string, // Pendle locker address
"total_gauges": number, // Total number of gauges
"total_current_holders": number, // Total current holders across all gauges
"total_unique_users": number, // Total unique users across all gauges
"average_holding_duration_days": number, // Average holding duration in days
"gauges_summary": [ // Summary of all gauges
{
"gauge": string, // Gauge address
"symbol": string, // PT token symbol
"current_holders": number, // Current number of holders
"total_users": number, // Total unique users (current + past)
"current_supply": string // Current total supply
}
]
},
"gauges": [
{
"gauge_id": string, // Gauge address
"vault_id": string, // Vault address (if available)
"token": {
"address": string, // PT token address
"symbol": string // PT token symbol
},
"stats": {
"total_deposited": string, // Total amount ever deposited
"total_withdrawn": string, // Total amount ever withdrawn
"current_supply": string, // Current total supply
"current_holders": number, // Current number of holders
"total_users": number // Total unique users (current + past)
},
"current_holders": { // Map of current holders (address -> balance)
"[user_address]": string
},
"user_histories": { // Map of all user histories
"[user_address]": {
"first_seen": number, // Unix timestamp when first seen
"last_seen": number, // Unix timestamp when last seen
"entry_timestamp": number, // Unix timestamp of first entry
"exit_timestamp": number, // Unix timestamp of exit (if applicable)
"entry_block": number, // Block number of first entry
"exit_block": number, // Block number of exit (if applicable)
"max_balance": number, // Maximum balance ever held
"holding_periods": [ // Array of holding periods
{
"entry_timestamp": number,
"exit_timestamp": number,
"entry_block": number,
"exit_block": number,
"duration": number, // Duration in seconds
"entry_date": string, // ISO 8601 date
"exit_date": string, // ISO 8601 date
"duration_days": number // Duration in days
}
],
"total_holding_duration": number, // Total duration in seconds
"is_current_holder": boolean, // Whether user currently holds tokens
"events": [ // Array of all deposit/withdraw events
{
"type": string, // "DEPOSIT" or "WITHDRAW"
"amount": string, // Amount deposited/withdrawn
"balance_after": string, // Balance after the event
"block": number, // Block number
"timestamp": number, // Unix timestamp
"datetime": string // ISO 8601 datetime
}
],
"first_seen_date": string, // ISO 8601 date
"last_seen_date": string, // ISO 8601 date
"total_holding_duration_days": number // Total duration in days
}
}
}
]
}

Single gauge endpoint (/api/strategies/pendle/holders/:gaugeId)

Returns the same structure as a single gauge object from the main endpoint - useful for fetching data for a specific gauge without loading all gauges.

User history endpoint (/api/strategies/pendle/holders/user/:address)

{
"address": string,
"total_gauges": number,
"gauges": [
{
"gauge_id": string,
"token": { "address": string, "symbol": string },
"history": { ... } // Same as user_histories object above
}
]
}

This endpoint provides comprehensive data about Pendle gauge holders, including:

  • Metadata with overall statistics and gauge summaries
  • Current holders with their balances
  • Complete user histories with entry/exit tracking
  • Detailed event logs for all deposits and withdrawals
  • Holding period analysis with duration calculations
  • Maximum balances held by each user

About

🧑‍💻 Github based api for Stake DAO data

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages