{"openapi":"3.0.3","info":{"title":"RugAlert Public API","version":"1.0.0","description":"Free, open API for Solana validator commission-rug detection, validator metadata, stake history, uptime, and decentralization metrics, provided by Pumpkinspool. No API key required. Rate limit: 60 requests per minute per IP. Data is refreshed by a snapshot job roughly every 15 minutes. All stake amounts are provided as lamports (string) and SOL (number); timestamps are ISO 8601.","contact":{"url":"https://rugalert.pumpkinspool.com"}},"servers":[{"url":"https://rugalert.pumpkinspool.com"}],"tags":[{"name":"Validators","description":"Validator profiles and per-validator history"},{"name":"Events","description":"Commission change events (rugs, cautions, info)"},{"name":"Stats","description":"Network-wide aggregates"},{"name":"Utility","description":"Epoch info and search"}],"paths":{"/api/v1/validators":{"get":{"tags":["Validators"],"summary":"List validators","description":"Paginated validator leaderboard ranked by active stake (descending).","parameters":[{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"votePubkey":{"type":"string"},"identityPubkey":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"iconUrl":{"type":"string","nullable":true},"website":{"type":"string","nullable":true},"version":{"type":"string","nullable":true},"clientType":{"type":"string","nullable":true},"rank":{"type":"integer"},"commission":{"type":"number","nullable":true},"activeStake":{"type":"object","description":"Stake amount in both lamports (exact, as string) and SOL (number).","properties":{"lamports":{"type":"string","example":"123456789000000"},"sol":{"type":"number","example":123456.789}}},"activatingStake":{"type":"object","description":"Stake amount in both lamports (exact, as string) and SOL (number).","properties":{"lamports":{"type":"string","example":"123456789000000"},"sol":{"type":"number","example":123456.789}}},"deactivatingStake":{"type":"object","description":"Stake amount in both lamports (exact, as string) and SOL (number).","properties":{"lamports":{"type":"string","example":"123456789000000"},"sol":{"type":"number","example":123456.789}}},"stakePercent":{"type":"number"},"stakeAccountCount":{"type":"integer"},"delinquent":{"type":"boolean"},"delinquentSince":{"type":"string","format":"date-time","nullable":true},"jitoEnabled":{"type":"boolean"},"bamEnabled":{"type":"boolean"},"firstSeenEpoch":{"type":"integer","nullable":true},"updatedAt":{"type":"string","format":"date-time","nullable":true}}}},"meta":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"},"networkStake":{"type":"object","description":"Stake amount in both lamports (exact, as string) and SOL (number).","properties":{"lamports":{"type":"string","example":"123456789000000"},"sol":{"type":"number","example":123456.789}}}}}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/validators/{votePubkey}":{"get":{"tags":["Validators"],"summary":"Get validator profile","description":"Full profile: metadata, commission, stake, latest MEV snapshot, latest performance.","parameters":[{"name":"votePubkey","in":"path","required":true,"description":"Base58-encoded vote account public key.","schema":{"type":"string","minLength":32,"maxLength":44}},{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/validators/{votePubkey}/events":{"get":{"tags":["Validators"],"summary":"List a validator’s commission events","description":"All inflation and MEV commission change events, most recent first.","parameters":[{"name":"votePubkey","in":"path","required":true,"description":"Base58-encoded vote account public key.","schema":{"type":"string","minLength":32,"maxLength":44}},{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"votePubkey":{"type":"string"},"validatorName":{"type":"string","nullable":true},"severity":{"type":"string","enum":["RUG","CAUTION","INFO"]},"source":{"type":"string","enum":["COMMISSION","MEV"],"description":"COMMISSION = inflation commission change; MEV = Jito MEV commission change."},"fromCommission":{"type":"number","nullable":true},"toCommission":{"type":"number","nullable":true},"fromDisabled":{"type":"boolean","description":"MEV only: true if MEV was disabled before."},"toDisabled":{"type":"boolean","description":"MEV only: true if MEV is now disabled."},"delta":{"type":"number","nullable":true},"epoch":{"type":"integer"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/validators/{votePubkey}/commission-history":{"get":{"tags":["Validators"],"summary":"Commission timeline","description":"Per-epoch commission series (inflation + MEV, forward-filled) suitable for charting.","parameters":[{"name":"votePubkey","in":"path","required":true,"description":"Base58-encoded vote account public key.","schema":{"type":"string","minLength":32,"maxLength":44}},{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"epoch":{"type":"integer"},"commission":{"type":"number","nullable":true},"mevCommission":{"type":"number","nullable":true}}}}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/validators/{votePubkey}/stake-history":{"get":{"tags":["Validators"],"summary":"Stake history","description":"Per-epoch active stake and network rank.","parameters":[{"name":"votePubkey","in":"path","required":true,"description":"Base58-encoded vote account public key.","schema":{"type":"string","minLength":32,"maxLength":44}},{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"epoch":{"type":"integer"},"activeStake":{"type":"object","description":"Stake amount in both lamports (exact, as string) and SOL (number).","properties":{"lamports":{"type":"string","example":"123456789000000"},"sol":{"type":"number","example":123456.789}}},"rank":{"type":"integer","nullable":true}}}}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/validators/{votePubkey}/uptime":{"get":{"tags":["Validators"],"summary":"Uptime history","description":"Daily uptime records derived from 1-minute delinquency checks, plus overall uptime.","parameters":[{"name":"votePubkey","in":"path","required":true,"description":"Base58-encoded vote account public key.","schema":{"type":"string","minLength":32,"maxLength":44}},{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}},{"name":"days","in":"query","description":"Limit to the most recent N days (default: all).","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"uptimeChecks":{"type":"integer"},"delinquentChecks":{"type":"integer"},"uptimePercent":{"type":"number"}}}}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/validators/{votePubkey}/location":{"get":{"tags":["Validators"],"summary":"Geolocation and location history","description":"Current data center / geo location plus up to 50 recent location changes.","parameters":[{"name":"votePubkey","in":"path","required":true,"description":"Base58-encoded vote account public key.","schema":{"type":"string","minLength":32,"maxLength":44}},{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/events":{"get":{"tags":["Events"],"summary":"Recent events feed","description":"Commission change events (inflation + MEV) across all validators for recent epochs.","parameters":[{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}},{"name":"epochs","in":"query","description":"Number of recent epochs to include.","schema":{"type":"integer","minimum":1,"maximum":50,"default":10}},{"name":"severity","in":"query","description":"Filter by severity.","schema":{"type":"string","enum":["RUG","CAUTION","INFO"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"votePubkey":{"type":"string"},"validatorName":{"type":"string","nullable":true},"severity":{"type":"string","enum":["RUG","CAUTION","INFO"]},"source":{"type":"string","enum":["COMMISSION","MEV"],"description":"COMMISSION = inflation commission change; MEV = Jito MEV commission change."},"fromCommission":{"type":"number","nullable":true},"toCommission":{"type":"number","nullable":true},"fromDisabled":{"type":"boolean","description":"MEV only: true if MEV was disabled before."},"toDisabled":{"type":"boolean","description":"MEV only: true if MEV is now disabled."},"delta":{"type":"number","nullable":true},"epoch":{"type":"integer"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/epochs/{epoch}/events":{"get":{"tags":["Events"],"summary":"Rug events for an epoch","description":"RUG events (commission and MEV) for a specific epoch, deduplicated per validator per source.","parameters":[{"name":"epoch","in":"path","required":true,"schema":{"type":"integer","minimum":0}},{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"votePubkey":{"type":"string"},"validatorName":{"type":"string","nullable":true},"severity":{"type":"string","enum":["RUG","CAUTION","INFO"]},"source":{"type":"string","enum":["COMMISSION","MEV"],"description":"COMMISSION = inflation commission change; MEV = Jito MEV commission change."},"fromCommission":{"type":"number","nullable":true},"toCommission":{"type":"number","nullable":true},"fromDisabled":{"type":"boolean","description":"MEV only: true if MEV was disabled before."},"toDisabled":{"type":"boolean","description":"MEV only: true if MEV is now disabled."},"delta":{"type":"number","nullable":true},"epoch":{"type":"integer"},"createdAt":{"type":"string","format":"date-time","nullable":true}}}}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/stats/rugs-per-epoch":{"get":{"tags":["Stats"],"summary":"Rug counts per epoch","description":"Aggregated rug counts by epoch plus all-time summary statistics.","parameters":[{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}},{"name":"epochs","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":10}},{"name":"offset","in":"query","description":"How many epochs back from the latest to start.","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/stats/stake-concentration":{"get":{"tags":["Stats"],"summary":"Stake concentration","description":"Geographic stake distribution (country, data center, city, ASN) and Nakamoto coefficients.","parameters":[{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object"}}}}}},"404":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/epoch":{"get":{"tags":["Utility"],"summary":"Current epoch","description":"Live epoch progress from RPC. Cached for 30 seconds.","parameters":[{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"epoch":{"type":"integer"},"slotIndex":{"type":"integer"},"slotsInEpoch":{"type":"integer"},"absoluteSlot":{"type":"integer"},"progressPercent":{"type":"number"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}},"/api/v1/search":{"get":{"tags":["Utility"],"summary":"Search validators","description":"Search by validator name or vote pubkey (min 2 characters, max 20 results).","parameters":[{"name":"network","in":"query","required":false,"description":"Solana cluster to query. Defaults to mainnet.","schema":{"type":"string","enum":["mainnet","testnet","alpenglow"],"default":"mainnet"}},{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object"}}}}}}},"400":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}},"429":{"description":"Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"invalid_pubkey"},"message":{"type":"string"}}}}}}}}}}}}}