Introduction
Analytics is an application built upon IoTeX core API which extracts data from IoTeX blockchain and reindexes them for applications to use via a GraphQL web interface. You can use the playground here.
API Token
API token is required to access the API. You can get your API token from ioctl tools. Please refer to ioctl documentation for more details.
ioctl jwt sign --with-arguments '{"exp":"1767024000","sub":"AnalyserAPI","scope":"Read"}' -s user
use generated token to access the API
curl --request POST \
--url https://analyser-api.iotex.io/api.ChainService.Chain \
--header 'Content-Type: application/json' \
--data '{}' \
--header 'Authorization: Bearer <TOKEN>'
Common Attributes
Pagination
| Field | Type | Label | Description |
|---|---|---|---|
| skip | uint64 | starting index of results | |
| first | uint64 | number of records per page |
Scalar Value Types
Chain Service API
Chain
gives the latest epoch number / block height.
curl --request POST \
--url https://analyser-api.iotex.io/api.ChainService.Chain \
--header 'Content-Type: application/json' \
--data '{}'
query{
Chain{
mostRecentEpoch
mostRecentBlockHeight
totalSupply
totalCirculatingSupply
exactCirculatingSupply
totalCirculatingSupplyNoRewardPool
votingResultMeta{
totalCandidates
totalWeightedVotes
votedTokens
}
rewards{
totalBalance
totalAvailable
totalUnclaimed
}
}
}
Example response:
{
"data": {
"Chain": {
"exactCirculatingSupply": "9252829326969999922855499899",
"mostRecentBlockHeight": 18980166,
"mostRecentEpoch": 28884,
"rewards": {
"totalAvailable": "440833151247362249902675121",
"totalBalance": "498742289434892391257888603",
"totalUnclaimed": "57909138187530141355213482"
},
"totalCirculatingSupply": "9457829322133866787170249906",
"totalCirculatingSupplyNoRewardPool": "9016996170886504537267574785",
"totalSupply": "9457829326969999922855499899",
"votingResultMeta": {
"totalCandidates": 75,
"totalWeightedVotes": "3079386720450377171762829252",
"votedTokens": "3743652944403254009755212860"
}
}
}
}
HTTP Request
POST /api.ChainService.Chain
ChainRequest
ChainResponse
| Field | Type | Label | Description |
|---|---|---|---|
| mostRecentEpoch | uint64 | most recent epoch | |
| mostRecentBlockHeight | uint64 | most recent block height | |
| totalSupply | string | total supply | |
| totalCirculatingSupply | string | total circulating supply | |
| totalCirculatingSupplyNoRewardPool | string | total circulating supply no reward pool | |
| votingResultMeta | VotingResultMeta | voting result meta | |
| exactCirculatingSupply | string | exact circulating supply | |
| rewards | ChainResponse.Rewards | rewards |
ChainResponse.Rewards
| Field | Type | Label | Description |
|---|---|---|---|
| totalBalance | string | total balance | |
| totalUnclaimed | string | total unclaimed | |
| totalAvailable | string | total available |
VotingResultMeta
| Field | Type | Label | Description |
|---|---|---|---|
| totalCandidates | uint64 | total candidates | |
| totalWeightedVotes | string | total weighted votes | |
| votedTokens | string | voted tokens |
MostRecentTPS
gives the latest transactions per second
curl --request POST \
--url https://analyser-api.iotex.io/api.ChainService.MostRecentTPS \
--header 'Content-Type: application/json' \
--data '{
"blockWindow": 5
}'
query {
MostRecentTPS(blockWindow: 5) {
mostRecentTPS
}
}
Example response:
{
"data": {
"MostRecentTPS": {
"mostRecentTPS": 0.8421052631578947
}
}
}
HTTP Request
POST /api.ChainService.MostRecentTPS
MostRecentTPSRequest
| Field | Type | Label | Description |
|---|---|---|---|
| blockWindow | uint64 | number of last blocks that are backtracked to compute TPS |
MostRecentTPSResponse
| Field | Type | Label | Description |
|---|---|---|---|
| mostRecentTPS | double | latest transactions per second |
NumberOfActions
gives the number of actions
curl --request POST \
--url https://analyser-api.iotex.io/api.ChainService.NumberOfActions \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 20000,
"epochCount": 5
}'
query {
NumberOfActions(startEpoch: 20000, epochCount: 5) {
exist
count
}
}
Example response:
{
"data": {
"NumberOfActions": {
"count": 12744,
"exist": true
}
}
}
HTTP Request
POST /api.ChainService.NumberOfActions
NumberOfActionsRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count |
NumberOfActionsResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the starting epoch number is less than the most recent epoch number | |
| count | uint64 | number of actions |
TotalTransferredTokens
TotalTransferredTokens gives the amount of tokens transferred within a time frame
curl --request POST \
--url https://analyser-api.iotex.io/api.ChainService.TotalTransferredTokens \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 20000,
"epochCount": 2
}'
query {
TotalTransferredTokens(startEpoch: 20000, epochCount: 2) {
totalTransferredTokens
}
}
Example response:
{
"data": {
"TotalTransferredTokens": {
"totalTransferredTokens": "2689365862730085490074594"
}
}
}
HTTP Request
POST /api.ChainService.TotalTransferredTokens
TotalTransferredTokensRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count |
TotalTransferredTokensResponse
| Field | Type | Label | Description |
|---|---|---|---|
| totalTransferredTokens | string | total tranferred tokens |
BlockSizeByHeightRequest
BlockSizeByHeightRequest gives the block size and server version by block height
curl --request POST \
--url https://analyser-api.iotex.io/api.ChainService.BlockSizeByHeight \
--header 'Content-Type: application/json' \
--data '{
"height": 3233333
}'
query{
BlockSizeByHeight(height:3233333){
serverVersion
blockSize
}
}
Example response:
{
"data": {
"BlockSizeByHeight": {
"blockSize": 1707.578,
"serverVersion": "0.10.0"
}
}
}
HTTP Request
POST /api.ChainService.BlockSizeByHeight
BlockSizeByHeightRequest
| Field | Type | Label | Description |
|---|---|---|---|
| height | uint64 | block height |
BlockSizeByHeightResponse
| Field | Type | Label | Description |
|---|---|---|---|
| blockSize | double | size | |
| serverVersion | string | version |
Delegate Service API
BucketInfo
BucketInfo provides voting bucket detail information for candidates within a range of epochs
curl --request POST \
--url https://analyser-api.iotex.io/api.DelegateService.BucketInfo \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 24738,
"epochCount": 2,
"delegateName": "metanyx",
"pagination": {
"skip": 0,
"first": 5
}
}'
query {
BucketInfo(
startEpoch: 24738
epochCount: 2
delegateName: "metanyx"
pagination: { skip: 0, first: 5 }
) {
bucketInfoList {
epochNumber
count
bucketInfo {
bucketID
voterIotexAddress
votes
weightedVotes
remainingDuration
isNative
startTime
}
}
}
}
Example response:
{
"exist": true,
"count": "2",
"bucketInfoList": [
{
"epochNumber": "24738",
"count": "7136",
"bucketInfo": [
{
"voterEthAddress": "0x2e0491b4925ebc82af97def12b72ead940613293",
"voterIotexAddress": "io19czfrdyjt67g9tuhmmcjkuh2m9qxzv5nqyve9p",
"isNative": true,
"votes": "1283019032866474771223667",
"weightedVotes": "1848668139159798560008586",
"remainingDuration": "8400h0m0s",
"startTime": "2020-06-01 18:14:45 +0000 UTC",
"decay": false,
"bucketID": "39"
},
...
]
},
...
]
}
HTTP Request
POST /api.DelegateService.BucketInfo
BucketInfoRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | Epoch number to start from | |
| epochCount | uint64 | Number of epochs to query | |
| delegateName | string | Name of the delegate | |
| pagination | pagination.Pagination | Pagination info |
BucketInfoResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the delegate has voting bucket information within the specified epoch range | |
| count | uint64 | total number of buckets in the given epoch for the given delegate | |
| bucketInfoList | BucketInfoList | repeated |
BucketInfo
| Field | Type | Label | Description |
|---|---|---|---|
| voterEthAddress | string | voter’s ERC20 address | |
| voterIotexAddress | string | voter's IoTeX address | |
| isNative | bool | whether the bucket is native | |
| votes | string | voter's votes | |
| weightedVotes | string | voter’s weighted votes | |
| remainingDuration | string | bucket remaining duration | |
| startTime | string | bucket start time | |
| decay | bool | whether the vote weight decays | |
| bucketID | uint64 | bucket id |
BucketInfoList
| Field | Type | Label | Description |
|---|---|---|---|
| epochNumber | uint64 | epoch number | |
| count | uint64 | total number of buckets in the given epoch for the given delegate | |
| bucketInfo | BucketInfo | repeated |
BookKeeping
BookKeeping gives delegates an overview of the reward distributions to their voters within a range of epochs
curl --request POST \
--url https://analyser-api.iotex.io/api.DelegateService.BookKeeping \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 23328,
"epochCount": 10,
"delegateName": "iotexlab",
"pagination": {
"skip": 0,
"first": 2
},
"epochRewardPerc": 90,
"blockRewardPerc": 100,
"foundationBonusPerc": 0
}'
query {
BookKeeping(
startEpoch: 23328
epochCount: 10
delegateName: "iotexlab"
epochRewardPerc: 90
foundationBonusPerc: 0
blockRewardPerc: 100
pagination: { skip: 0, first: 2 }
) {
count
rewardDistribution {
voterEthAddress
amount
}
}
}
Example response:
{
"exist": true,
"count": "5567",
"rewardDistribution": [
{
"voterEthAddress": "0x0002d2d9945709b50cfbac675d7e6bdac34575f4",
"voterIotexAddress": "io1qqpd9kv52uym2r8m43n46lntmtp52a05d7s8gj",
"amount": "77071218081884295"
},
...
]
}
HTTP Request
POST /api.DelegateService.BookKeeping
BookKeepingRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | epoch number to start from | |
| epochCount | uint64 | number of epochs to query | |
| delegateName | string | name of the delegate | |
| pagination | pagination.Pagination | Pagination info | |
| epochRewardPerc | uint64 | percentage of the epoch reward to be paid to the delegate | |
| blockRewardPerc | uint64 | percentage of the block reward to be paid to the delegate | |
| foundationBonusPerc | uint64 | percentage of the foundation bonus to be paid to the delegate |
BookKeepingResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the delegate has bookkeeping information within the specified epoch range | |
| count | uint64 | total number of reward distributions | |
| rewardDistribution | DelegateRewardDistribution | repeated |
DelegateRewardDistribution
| Field | Type | Label | Description |
|---|---|---|---|
| voterEthAddress | string | voter’s ERC20 address | |
| voterIotexAddress | string | voter’s IoTeX address | |
| amount | string | amount of reward distribution |
Productivity
Productivity gives block productivity of producers within a range of epochs
curl --request POST \
--url https://analyser-api.iotex.io/api.DelegateService.Productivity \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 25020,
"epochCount": 10,
"delegateName": "iotexlab"
}'
query {
Productivity(
startEpoch: 25020
epochCount: 10
delegateName: "iotexlab"
) {
productivity {
exist
production
expectedProduction
}
}
}
Example response:
{
"productivity": {
"exist": true,
"production": "180",
"expectedProduction": "180"
}
}
HTTP Request
POST /api.DelegateService.Productivity
ProductivityRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count | |
| delegateName | string | producer name |
ProductivityResponse
| Field | Type | Label | Description |
|---|---|---|---|
| productivity | Productivity |
Productivity
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the delegate has productivity information within the specified epoch range | |
| production | uint64 | number of block productions | |
| expectedProduction | uint64 | number of expected block productions |
Reward
Reward provides reward detail information for candidates within a range of epochs
curl --request POST \
--url https://analyser-api.iotex.io/api.DelegateService.Reward \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 23000,
"epochCount": 1,
"delegateName": "iotexlab"
}'
query {
Reward(startEpoch: 23000, epochCount: 1, delegateName: "iotexlab") {
reward {
exist
blockReward
foundationBonus
epochReward
}
}
}
Example response:
{
"reward": {
"blockReward": "240000000000000000000",
"epochReward": "984040630606589747896",
"foundationBonus": "80000000000000000000",
"exist": true
}
}
HTTP Request
POST /api.DelegateService.Reward
RewardRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | Epoch number to start from | |
| epochCount | uint64 | Number of epochs to query | |
| delegateName | string | Name of the delegate |
RewardResponse
| Field | Type | Label | Description |
|---|---|---|---|
| reward | Reward |
Reward
| Field | Type | Label | Description |
|---|---|---|---|
| blockReward | string | amount of block rewards | |
| epochReward | string | amount of epoch rewards | |
| foundationBonus | string | amount of foundation bonus | |
| exist | bool | whether the delegate has reward information within the specified epoch range |
Staking
Staking provides staking information for candidates within a range of epochs
curl --request POST \
--url https://analyser-api.iotex.io/api.DelegateService.Staking \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 20000,
"epochCount": 2,
"delegateName": "metanyx"
}'
query {
Staking(startEpoch: 20000, epochCount: 2, delegateName: "metanyx") {
exist
stakingInfo {
epochNumber
totalStaking
selfStaking
}
}
}
Example response:
{
"data": {
"Staking": {
"exist": true,
"stakingInfo": [
{
"epochNumber": 20000,
"selfStaking": "1266890287625445522068595",
"totalStaking": "219516310335741609989431119"
},
{
"epochNumber": 20001,
"selfStaking": "1266890287625445522068595",
"totalStaking": "219518846815421318945180493"
}
]
}
}
}
HTTP Request
POST /api.DelegateService.Staking
StakingRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count | |
| delegateName | string | candidate name |
StakingResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the delegate has staking information within the specified epoch range | |
| stakingInfo | StakingResponse.StakingInfo | repeated |
StakingResponse.StakingInfo
| Field | Type | Label | Description |
|---|---|---|---|
| epochNumber | uint64 | epoch number | |
| totalStaking | string | total staking amount | |
| selfStaking | string | candidate’s self-staking amount |
ProbationHistoricalRate
ProbationHistoricalRate provides the rate of probation for a given delegate
curl --request POST \
--url https://analyser-api.iotex.io/api.DelegateService.ProbationHistoricalRate \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 27650,
"epochCount": 5,
"delegateName": "chainshield"
}'
query {
ProbationHistoricalRate(
startEpoch: 27650
epochCount: 5
delegateName: "chainshield"
) {
probationHistoricalRate
}
}
Example response:
{
"data": {
"ProbationHistoricalRate": {
"probationHistoricalRate": "0.80"
}
}
}
HTTP Request
POST /api.DelegateService.ProbationHistoricalRate
ProbationHistoricalRateRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count | |
| delegateName | string | candidate name |
ProbationHistoricalRateResponse
| Field | Type | Label | Description |
|---|---|---|---|
| probationHistoricalRate | string | probation historical rate |
Account Service API
IotexBalanceByHeight
IotexBalanceByHeight returns the balance of the given address at the given height.
curl --request POST \
--url https://analyser-api.iotex.io/api.AccountService.IotexBalanceByHeight \
--header 'Content-Type: application/json' \
--data '{
"address": ["io1qnpz47hx5q6r3w876axtrn6yz95d70cjl35r53"],
"height":8927781
}'
query {
IotexBalanceByHeight(
address: ["io1qnpz47hx5q6r3w876axtrn6yz95d70cjl35r53"]
height: 8927781
) {
balance
height
}
}
Example response:
{
"data": {
"IotexBalanceByHeight": {
"balance": [
"957.111886573698936216"
],
"height": 8927781
}
}
}
HTTP Request
POST /api.AccountService.IotexBalanceByHeight
IotexBalanceByHeightRequest
| Field | Type | Label | Description |
|---|---|---|---|
| address | string | repeated | address lists |
| height | uint64 | block height |
IotexBalanceByHeightResponse
| Field | Type | Label | Description |
|---|---|---|---|
| height | uint64 | block height | |
| balance | string | repeated | balance at the given height. |
ActiveAccounts
ActiveAccounts lists most recently active accounts
curl --request POST \
--url https://analyser-api.iotex.io/api.AccountService.ActiveAccounts \
--header 'Content-Type: application/json' \
--data '{
"count": 5
}'
query {
ActiveAccounts(count:5){
activeAccounts
}
}
Example response:
{
"data": {
"ActiveAccounts": {
"activeAccounts": [
"io1aqf30kqz5rqh6zn82c00j684p2h2t5cg30wm8t",
"io1lhukp867ume3qn2g7cxn4e47pj0ugfxeqj7nm8",
"io12mgttmfa2ffn9uqvn0yn37f4nz43d248l2ga85",
"io12p2td5p5tmaqqztdejl0dqdqalmajylw57x3e8",
"io17cmrextyfeu4gddwd89g5qncedsnc553dhz7xa"
]
}
}
}
HTTP Request
POST /api.AccountService.ActiveAccounts
ActiveAccountsRequest
| Field | Type | Label | Description |
|---|---|---|---|
| count | uint64 | number of account addresses to be queried for active accounts |
ActiveAccountsResponse
| Field | Type | Label | Description |
|---|---|---|---|
| activeAccounts | string | repeated | list of account addresses |
OperatorAddress
OperatorAddress finds the delegate's operator address given the delegate's alias name
curl --request POST \
--url https://analyser-api.iotex.io/api.AccountService.OperatorAddress \
--header 'Content-Type: application/json' \
--data '{
"aliasName": "metanyxa"
}'
query {
OperatorAddress(aliasName:"metanyx") {
exist
operatorAddress
}
}
Example response:
{
"data": {
"OperatorAddress": {
"exist": true,
"operatorAddress": "io10reczcaelglh5xmkay65h9vw3e5dp82e8vw0rz"
}
}
}
HTTP Request
POST /api.AccountService.OperatorAddress
OperatorAddressRequest
| Field | Type | Label | Description |
|---|---|---|---|
| aliasName | string | delegate's alias name |
OperatorAddressResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the alias name exists | |
| operatorAddress | string | operator address associated with the given alias name |
Alias
Alias finds the delegate's alias name given the delegate's operator address
curl --request POST \
--url https://analyser-api.iotex.io/api.AccountService.Alias \
--header 'Content-Type: application/json' \
--data '{
"operatorAddress": "io10reczcaelglh5xmkay65h9vw3e5dp82e8vw0rz"
}'
query {
Alias(operatorAddress:"io10reczcaelglh5xmkay65h9vw3e5dp82e8vw0rz") {
exist
aliasName
}
}
Example response:
{
"data": {
"Alias": {
"aliasName": "metanyx",
"exist": true
}
}
}
HTTP Request
POST /api.AccountService.Alias
AliasRequest
| Field | Type | Label | Description |
|---|---|---|---|
| operatorAddress | string | delegate's operator address |
AliasResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the operator address exists | |
| aliasName | string | delegate's alias name |
TotalNumberOfHolders
TotalNumberOfHolders returns total number of IOTX holders so far
curl --request POST \
--url https://analyser-api.iotex.io/api.AccountService.TotalNumberOfHolders \
--header 'Content-Type: application/json' \
--data '{
}'
query {
TotalNumberOfHolders{
totalNumberOfHolders
}
}
Example response:
{
"data": {
"TotalNumberOfHolders": {
"totalNumberOfHolders": 511692
}
}
}
HTTP Request
POST /api.AccountService.TotalNumberOfHolders
TotalNumberOfHoldersRequest
TotalNumberOfHoldersResponse
| Field | Type | Label | Description |
|---|---|---|---|
| totalNumberOfHolders | uint64 | total number of IOTX holders so far |
TotalAccountSupply
TotalAccountSupply returns total amount of tokens held by IoTeX accounts
curl --request POST \
--url https://analyser-api.iotex.io/api.AccountService.TotalAccountSupply \
--header 'Content-Type: application/json' \
--data '{
}'
query {
TotalAccountSupply{
totalAccountSupply
}
}
Example response:
{
"data": {
"TotalAccountSupply": {
"totalAccountSupply": "12496299023824745920503427462"
}
}
}
HTTP Request
POST /api.AccountService.TotalAccountSupply
TotalAccountSupplyRequest
TotalAccountSupplyResponse
| Field | Type | Label | Description |
|---|---|---|---|
| totalAccountSupply | string | total amount of tokens held by IoTeX accounts |
ContractInfo
ContractInfo returns contract info
curl --request POST \
--url https://analyser-api.iotex.io/api.AccountService.ContractInfo \
--header 'Content-Type: application/json' \
--data '{
"contractAddress": ["io1yf0rvr34yxwjcx70t0x5rzz0skzurccy8wgpwe","io1mcy7wn2g3z7yue04385vzw7wnacamax8aaahn6"]
}'
query {
ContractInfo(
contractAddress: [
"io1yf0rvr34yxwjcx70t0x5rzz0skzurccy8wgpwe"
"io1mcy7wn2g3z7yue04385vzw7wnacamax8aaahn6"
]
) {
contracts {
contractAddress
deployer
createTime
exist
callTimes
accumulatedGas
}
}
}
Example response:
{
"data": {
"ContractInfo": {
"contracts": [
{
"accumulatedGas": "",
"callTimes": 0,
"contractAddress": "io1yf0rvr34yxwjcx70t0x5rzz0skzurccy8wgpwe",
"createTime": "",
"deployer": "",
"exist": false
},
{
"accumulatedGas": "0.174381",
"callTimes": 3,
"contractAddress": "io1mcy7wn2g3z7yue04385vzw7wnacamax8aaahn6",
"createTime": "2019-04-25 01:45:20 +0000 UTC",
"deployer": "io10e0525sfrf53yh2aljmm3sn9jq5njk7l6jfauj",
"exist": true
}
]
}
}
}
HTTP Request
POST /api.AccountService.ContractInfo
ContractInfoRequest
| Field | Type | Label | Description |
|---|---|---|---|
| contractAddress | string | repeated | contract address |
ContractInfoResponse
| Field | Type | Label | Description |
|---|---|---|---|
| contracts | ContractInfoResponse.Contract | repeated |
ContractInfoResponse.Contract
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the contract address exists | |
| deployer | string | contract creator | |
| createTime | string | contract create time | |
| callTimes | uint64 | contract call times | |
| accumulatedGas | string | accumulated transaction fee | |
| contractAddress | string | contract address |
Voting Service API
CandidateInfo
CandidateInfo provides candidate information
curl --request POST \
--url https://analyser-api.iotex.io/api.VotingService.CandidateInfo \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 20000,
"epochCount": 2
}'
query {
CandidateInfo(startEpoch: 20000, epochCount: 2) {
candidateInfo {
epochNumber
candidates {
name
address
totalWeightedVotes
selfStakingTokens
operatorAddress
rewardAddress
}
}
}
}
Example response:
{
"data": {
"CandidateInfo": {
"candidateInfo": [
{
"candidates": [
{
"address": "io1x3us2fktfq6tnftjzwtvgxh3ymvcfwy9fts7td",
"name": "binancevote",
"operatorAddress": "io1jzteq7gc5sh8tfp5auz8wwj97kvdapr9y8wzne",
"rewardAddress": "io1x3us2fktfq6tnftjzwtvgxh3ymvcfwy9fts7td",
"selfStakingTokens": "1230047466749539291090944",
"totalWeightedVotes": "431578548518498595882908724"
},
...
],
"epochNumber": 20000
},
{
"candidates": [
{
"address": "io1x3us2fktfq6tnftjzwtvgxh3ymvcfwy9fts7td",
"name": "binancevote",
"operatorAddress": "io1jzteq7gc5sh8tfp5auz8wwj97kvdapr9y8wzne",
"rewardAddress": "io1x3us2fktfq6tnftjzwtvgxh3ymvcfwy9fts7td",
"selfStakingTokens": "1230047466749539291090944",
"totalWeightedVotes": "431556053359847416499574130"
},
...
],
"epochNumber": 20001
}
]
}
}
}
HTTP Request
POST /api.VotingService.CandidateInfo
CandidateInfoRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count |
CandidateInfoResponse
| Field | Type | Label | Description |
|---|---|---|---|
| candidateInfo | CandidateInfoResponse.CandidateInfo | repeated |
CandidateInfoResponse.CandidateInfo
| Field | Type | Label | Description |
|---|---|---|---|
| epochNumber | uint64 | epoch number | |
| candidates | CandidateInfoResponse.Candidates | repeated |
CandidateInfoResponse.Candidates
| Field | Type | Label | Description |
|---|---|---|---|
| name | string | candidate name | |
| address | string | canddiate address | |
| totalWeightedVotes | string | total weighted votes | |
| selfStakingTokens | string | candidate self-staking tokens | |
| operatorAddress | string | candidate operator address | |
| rewardAddress | string | candidate reward address |
RewardSources
RewardSources provides reward sources for voters
curl --request POST \
--url https://analyser-api.iotex.io/api.VotingService.RewardSources \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 20000,
"epochCount": 2,
"voterIotxAddress": "io1rl62pepun2g7sed2tpv4tx7ujynye34fqjv40t"
}'
query {
RewardSources(
startEpoch: 20000
epochCount: 2
voterIotxAddress: "io1rl62pepun2g7sed2tpv4tx7ujynye34fqjv40t"
) {
exist
delegateDistributions {
delegateName
amount
}
}
}
Example response:
{
"data": {
"RewardSources": {
"delegateDistributions": [
{
"amount": "940751518955182",
"delegateName": "a4x"
}
],
"exist": true
}
}
}
HTTP Request
POST /api.VotingService.RewardSources
RewardSourcesRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count | |
| voterIotxAddress | string | voter IoTeX address |
RewardSourcesResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the voter has reward information within the specified epoch range | |
| delegateDistributions | RewardSourcesResponse.DelegateDistributions | repeated |
RewardSourcesResponse.DelegateDistributions
| Field | Type | Label | Description |
|---|---|---|---|
| delegateName | string | delegate name | |
| amount | string | amount of reward distribution |
VotingMeta
VotingMeta provides metadata of voting results
curl --request POST \
--url https://analyser-api.iotex.io/api.VotingService.VotingMeta \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 20000,
"epochCount": 2
}'
query {
VotingMeta(startEpoch: 20000, epochCount: 2) {
exist
candidateMeta {
epochNumber
totalCandidates
consensusDelegates
totalWeightedVotes
votedTokens
}
}
}
Example response:
{
"data": {
"VotingMeta": {
"candidateMeta": [
{
"consensusDelegates": 36,
"epochNumber": 20000,
"totalCandidates": 58,
"totalWeightedVotes": "3497033939381331462899534869",
"votedTokens": "2828696111178324496444652661"
},
{
"consensusDelegates": 36,
"epochNumber": 20001,
"totalCandidates": 58,
"totalWeightedVotes": "3497019706023954289836152135",
"votedTokens": "2828703742673077328930935452"
}
],
"exist": true
}
}
}
HTTP Request
POST /api.VotingService.VotingMeta
VotingMetaRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count |
VotingMetaResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the starting epoch number is less than the most recent epoch number | |
| candidateMeta | VotingMetaResponse.CandidateMeta | repeated |
VotingMetaResponse.CandidateMeta
| Field | Type | Label | Description |
|---|---|---|---|
| epochNumber | uint64 | epoch number | |
| consensusDelegates | uint64 | number of consensus delegates in the epoch | |
| totalCandidates | uint64 | number of total delegates in the epoch | |
| totalWeightedVotes | string | candidate total weighted votes in the epoch | |
| votedTokens | string | total voted tokens in the epoch |
Action Service API
ActionByDates
ActionByDates finds actions by dates
curl --request POST \
--url https://analyser-api.iotex.io/api.ActionService.ActionByDates \
--header 'Content-Type: application/json' \
--data '{
"startDate": 1624503172,
"endDate": 1624503182,
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
ActionByDates(
startDate: 1624503172
endDate: 1624503182
pagination: { skip: 0, first: 1 }
) {
exist
count
actions {
actHash
blkHash
timestamp
actType
sender
recipient
amount
gasFee
blkHeight
}
}
}
Example response:
{
"data": {
"ActionByDates": {
"actions": [
{
"actHash": "55cd01e165839ce6c9047bc5b2997808a6177ee23d7194ebe3c2bad419356a02",
"actType": "grantReward",
"amount": "0",
"blkHash": "6ef7a5d37d15bf71d8a9bb9dac87177d6594214ec18f8ce929327382a8b5a54f",
"blkHeight": 11792456,
"gasFee": "0",
"recipient": "",
"sender": "io1ha87fd54jmgmes5eswsyd52gwm0qjxnnsqlyl0",
"timestamp": 1624503175
}
],
"count": 4,
"exist": true
}
}
}
HTTP Request
POST /api.ActionService.ActionByDates
ActionByDatesRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startDate | uint64 | start date in unix epoch time | |
| endDate | uint64 | end date in unix epoch time | |
| pagination | pagination.Pagination |
ActionByDatesResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether actions exist within the time frame | |
| actions | ActionInfo | repeated | |
| count | uint64 | total number of actions within the time frame |
ActionInfo
| Field | Type | Label | Description |
|---|---|---|---|
| actHash | string | action hash | |
| blkHash | string | block hash | |
| actType | string | action type | |
| sender | string | sender address | |
| recipient | string | recipient address | |
| amount | string | amount transferred | |
| timestamp | uint64 | unix timestamp | |
| gasFee | string | gas fee | |
| blkHeight | uint64 | block height |
ActionByHash
ActionByHash finds actions by hash
curl --request POST \
--url https://analyser-api.iotex.io/api.ActionService.ActionByHash \
--header 'Content-Type: application/json' \
--data '{
"actHash": "160a75d845c5ef35e6b2e697dc752066ee7a0dacf750c8c1a6a187090dd3df9f"
}'
query {
ActionByHash(
actHash: "160a75d845c5ef35e6b2e697dc752066ee7a0dacf750c8c1a6a187090dd3df9f"
) {
actionInfo {
actHash
blkHash
timestamp
actType
sender
recipient
amount
gasFee
blkHeight
}
evmTransfers {
sender
recipient
amount
}
}
}
Example response:
{
"data": {
"ActionByHash": {
"actionInfo": {
"actHash": "160a75d845c5ef35e6b2e697dc752066ee7a0dacf750c8c1a6a187090dd3df9f",
"actType": "depositToStake",
"amount": "173450647808345216",
"blkHash": "c1504d3181b3065a780f196d601358c0017546d659c7c3324931f16c27e3f135",
"blkHeight": 17667450,
"gasFee": "10000000000000000",
"recipient": "",
"sender": "io1unvkgm98ma3r2fnfrhep24arjxf6kc8stx0nuc",
"timestamp": 1653981420
},
"evmTransfers": [
{
"amount": "10000000000000000",
"recipient": "io0000000000000000000000rewardingprotocol",
"sender": "io1unvkgm98ma3r2fnfrhep24arjxf6kc8stx0nuc"
},
{
"amount": "173450647808345216",
"recipient": "io000000000000000000000000stakingprotocol",
"sender": "io1unvkgm98ma3r2fnfrhep24arjxf6kc8stx0nuc"
}
]
}
}
}
HTTP Request
POST /api.ActionService.ActionByHash
ActionByHashRequest
| Field | Type | Label | Description |
|---|---|---|---|
| actHash | string | action hash |
ActionByHashResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether actions exist within the time frame | |
| actionInfo | ActionInfo | ||
| evmTransfers | ActionByHashResponse.EvmTransfers | repeated |
ActionByHashResponse.EvmTransfers
| Field | Type | Label | Description |
|---|---|---|---|
| sender | string | sender address | |
| recipient | string | recipient address | |
| amount | string | amount transferred |
ActionByAddress
ActionByAddress finds actions by address
curl --request POST \
--url https://analyser-api.iotex.io/api.ActionService.ActionByAddress \
--header 'Content-Type: application/json' \
--data '{
"address": "io1x58dug5237g40hrtme7qx4nva9x98ehk4wchz4",
"pagination": {
"skip": 0,
"first": 5
}
}'
query {
ActionByAddress(
address: "io1x58dug5237g40hrtme7qx4nva9x98ehk4wchz4"
pagination:{skip:0, first:1}
) {
count
actions {
actHash
blkHash
timestamp
actType
sender
recipient
amount
gasFee
blkHeight
}
}
}
Example response:
{
"data": {
"ActionByAddress": {
"actions": [
{
"actHash": "a9eb718db8ec8832badc6bc930e6e1f01717fc9ca2126693c7457b10340f3b73",
"actType": "transfer",
"amount": "1000000000000000000000",
"blkHash": "e6d90aac3af1277ebaafc8e56945037c3c9500732a67472651970caf7dc2da14",
"blkHeight": 16306635,
"gasFee": "10000000000000000",
"recipient": "io1x58dug5237g40hrtme7qx4nva9x98ehk4wchz4",
"sender": "io1z0r07tl77tvphmd8rluuh8h2sa2xqdkzpsuvrh",
"timestamp": 1647148170
}
],
"count": 13693
}
}
}
HTTP Request
POST /api.ActionService.ActionByAddress
ActionByAddressRequest
| Field | Type | Label | Description |
|---|---|---|---|
| address | string | sender address or recipient address | |
| pagination | pagination.Pagination |
ActionByAddressResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether actions exist for the given address | |
| actions | ActionInfo | repeated | |
| count | uint64 | total number of actions for the given address |
ActionByType
ActionByType finds actions by action type
curl --request POST \
--url https://analyser-api.iotex.io/api.ActionService.ActionByType \
--header 'Content-Type: application/json' \
--data '{
"type": "transfer",
"pagination": {
"skip": 0,
"first": 5
}
}'
query {
ActionByType(
type: "execution"
pagination:{skip:0, first:1}
) {
count
actions {
actHash
blkHash
timestamp
actType
sender
recipient
amount
gasFee
blkHeight
}
}
}
Example response:
{
"data": {
"ActionByType": {
"actions": [
{
"actHash": "edf65e7ccbfb05e4fbd394db1acc276029c309994879e3a8c07023a753ea8886",
"actType": "execution",
"amount": "0",
"blkHash": "ea06e52306ddcc02404427adcea7628a76a301c4a8f5f08b902a2ac672814292",
"blkHeight": 5008,
"gasFee": "1357294000000000000",
"recipient": "",
"sender": "io17ch0jth3dxqa7w9vu05yu86mqh0n6502d92lmp",
"timestamp": 1555949160
}
],
"count": 15279705
}
}
}
HTTP Request
POST /api.ActionService.ActionByType
ActionByTypeRequest
| Field | Type | Label | Description |
|---|---|---|---|
| type | string | action type | |
| pagination | pagination.Pagination |
ActionByTypeResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether actions exist for the given type | |
| actions | ActionInfo | repeated | |
| count | uint64 | total number of actions for the given type |
EvmTransfersByAddress
EvmTransfersByAddress finds EVM transfers by address
curl --request POST \
--url https://analyser-api.iotex.io/api.ActionService.EvmTransfersByAddress \
--header 'Content-Type: application/json' \
--data '{
"address": "io14yqd25kr6k4zss59u7sq9hme4r862yfpezf9dx",
"pagination": {
"skip": 0,
"first": 5
}
}'
query {
EvmTransfersByAddress(
address: "io14yqd25kr6k4zss59u7sq9hme4r862yfpezf9dx"
pagination: { skip: 0, first: 5 }
) {
exist
count
evmTransfers {
sender
recipient
actHash
blkHash
blkHeight
amount
timestamp
}
}
}
Example response:
{
"data": {
"EvmTransfersByAddress": {
"count": 303,
"evmTransfers": [
{
"actHash": "fdc21e798a151b866de7adf02b9b2d5e479b96a1865af4aeb108cd4caa528e9a",
"amount": "20180406453780587",
"blkHash": "589324fef069e1ad9899989e0587eb1fb0fc6d20311dcec63850ecb41923360a",
"blkHeight": 18183325,
"recipient": "io14yqd25kr6k4zss59u7sq9hme4r862yfpezf9dx",
"sender": "io16y9wk2xnwurvtgmd2mds2gcdfe2lmzad6dcw29",
"timestamp": 1656565175
},
...
],
"exist": true
}
}
}
HTTP Request
POST /api.ActionService.EvmTransfersByAddress
EvmTransfersByAddressRequest
| Field | Type | Label | Description |
|---|---|---|---|
| address | string | sender address or recipient address | |
| pagination | pagination.Pagination |
EvmTransfersByAddressResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether EVM transfers exist for the given address | |
| count | uint64 | total number of EVM transfers for the given address | |
| evmTransfers | EvmTransfersByAddressResponse.EvmTransfer | repeated |
EvmTransfersByAddressResponse.EvmTransfer
| Field | Type | Label | Description |
|---|---|---|---|
| actHash | string | action hash | |
| blkHash | string | block hash | |
| sender | string | sender address | |
| recipient | string | recipient address | |
| amount | string | amount transferred | |
| blkHeight | uint64 | block height | |
| timestamp | uint64 | unix timestamp |
Staking Service API
VoteByHeight
Get the stake amount and voting weight of the voter's specified height
curl --request POST \
--url https://analyser-api.iotex.io/api.StakingService.VoteByHeight \
--header 'Content-Type: application/json' \
--data '{
"address": ["io1k0w5vtlglnm742jacv2xjczg5l3s44gyy6h536","io1p8dwgkkgzcpwz6snwzh5v2nhf658gw8aen47pw"],
"height": 20924943
}'
query {
VoteByHeight(
address: [
"io1k0w5vtlglnm742jacv2xjczg5l3s44gyy6h536"
"io1p8dwgkkgzcpwz6snwzh5v2nhf658gw8aen47pw"
]
height: 20924943
) {
stakeAmount
height
voteWeight
}
}
Example response:
{
"data": {
"VoteByHeight": {
"height": 20924943,
"stakeAmount": [
"495.994311518986506235",
"51127.627429245086002541"
],
"voteWeight": [
"631.859744093707405579",
"60543.734008399268885716"
]
}
}
}
HTTP Request
POST /api.StakingService.VoteByHeight
VoteByHeightRequest
| Field | Type | Label | Description |
|---|---|---|---|
| address | string | repeated | |
| height | uint64 |
VoteByHeightResponse
| Field | Type | Label | Description |
|---|---|---|---|
| height | uint64 | ||
| stakeAmount | string | repeated | |
| voteWeight | string | repeated |
XRC20 Service API
XRC20ByAddress
XRC20ByAddress returns Xrc20 actions given the sender address or recipient address
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC20Service.XRC20ByAddress \
--header 'Content-Type: application/json' \
--data '{
"address": "io1mhvlzj7y2t9y2dtzauyvyzzrvle6l7sekcf245",
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC20ByAddress(
address: "io1mhvlzj7y2t9y2dtzauyvyzzrvle6l7sekcf245"
pagination: { skip: 0, first: 1 }
) {
exist
count
xrc20 {
actHash
contract
sender
amount
recipient
timestamp
}
}
}
Example response:
{
"data": {
"XRC20ByAddress": {
"count": 4027,
"exist": true,
"xrc20": [
{
"actHash": "67b01c199e69164679b3fd5c34eb2e73d0d59840e28479321ad6ff15e4aa5c6d",
"amount": "177600000000000000",
"contract": "io1zl0el07pek4sly8dmscccnm0etd8xr8j02t4y7",
"recipient": "io12w7agqdgwx7slp8fgcv7mnqvy3yf6j4tz0fnms",
"sender": "io1mhvlzj7y2t9y2dtzauyvyzzrvle6l7sekcf245",
"timestamp": 1656639570
}
]
}
}
}
HTTP Request
POST /api.XRC20Service.XRC20ByAddress
XRC20ByAddressRequest
| Field | Type | Label | Description |
|---|---|---|---|
| address | string | sender address or recipient address | |
| pagination | pagination.Pagination |
XRC20ByAddressResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Xrc20 actions exist for the given sender address or recipient address | |
| count | uint64 | total number of Xrc20 actions | |
| xrc20 | Xrc20Action | repeated |
Xrc20Action
| Field | Type | Label | Description |
|---|---|---|---|
| actHash | string | action hash | |
| sender | string | sender address | |
| recipient | string | recipient address | |
| amount | string | amount transferred | |
| timestamp | uint64 | unix timestamp | |
| contract | string | contract address |
XRC20ByContractAddress
XRC20ByContractAddress returns Xrc20 actions given the Xrc20 contract address
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC20Service.XRC20ByContractAddress \
--header 'Content-Type: application/json' \
--data '{
"address": "io1gafy2msqmmmqyhrhk4dg3ghc59cplyhekyyu26",
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC20ByContractAddress(
address: "io1gafy2msqmmmqyhrhk4dg3ghc59cplyhekyyu26"
pagination: { skip: 0, first: 1 }
) {
exist
count
xrc20 {
actHash
contract
sender
amount
recipient
timestamp
}
}
}
Example response:
{
"data": {
"XRC20ByContractAddress": {
"count": 1531013,
"exist": true,
"xrc20": [
{
"actHash": "40336444117c08caa48c9171a566069dfe374512b6d44bd260911a04a8d7424d",
"amount": "312959963682432085397",
"contract": "io1gafy2msqmmmqyhrhk4dg3ghc59cplyhekyyu26",
"recipient": "io1h9kmk9x0e6mzhwmtq5eljqnj80agphyvcheky0",
"sender": "io19kuwwxhtmtfdk9fnsfn0qs8je38svn7dwe93s4",
"timestamp": 1656635825
}
]
}
}
}
HTTP Request
POST /api.XRC20Service.XRC20ByContractAddress
XRC20ByContractAddressRequest
| Field | Type | Label | Description |
|---|---|---|---|
| address | string | contract address | |
| pagination | pagination.Pagination |
XRC20ByContractAddressResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Xrc20 actions exist for the given contract address | |
| count | uint64 | total number of Xrc20 actions | |
| xrc20 | Xrc20Action | repeated |
XRC20ByPage
XRC20ByPage returns Xrc20 actions by pagination
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC20Service.XRC20ByPage \
--header 'Content-Type: application/json' \
--data '{
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC20ByPage(
pagination: { skip: 0, first: 1 }
) {
exist
count
xrc20 {
actHash
contract
sender
amount
recipient
timestamp
}
}
}
Example response:
{
"data": {
"XRC20ByPage": {
"count": 18238044,
"exist": true,
"xrc20": [
{
"actHash": "078895bc0ce32304203ecaa1dc1c7294226b356f9ea79d64c2b75e2817e4dbce",
"amount": "10000000000000000",
"contract": "io1zl0el07pek4sly8dmscccnm0etd8xr8j02t4y7",
"recipient": "io1t7pkdvadx2mrnfukzvhsr0xhc2nsjuq9sren7p",
"sender": "io14xf3pqwydy9vpzxflpqcry75ne5f47654f2rn9",
"timestamp": 1656642185
}
]
}
}
}
HTTP Request
POST /api.XRC20Service.XRC20ByPage
XRC20ByPageRequest
| Field | Type | Label | Description |
|---|---|---|---|
| pagination | pagination.Pagination |
XRC20ByPageResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Xrc20 actions exist for the given contract address | |
| count | uint64 | total number of Xrc20 actions | |
| xrc20 | Xrc20Action | repeated |
XRC20Addresses
Xrc20Addresses returns Xrc20 contract addresses
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC20Service.XRC20Addresses \
--header 'Content-Type: application/json' \
--data '{
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC20Addresses(
pagination: { skip: 0, first: 2 }
) {
exist
count
addresses
}
}
Example response:
{
"data": {
"XRC20Addresses": {
"addresses": [
"io10098dx8ntlqy7sshqkdl67a8xp39vqsyjh08pv",
"io1009dgua7q8x63dpk95wncnp79fx9mz0ak65a6s"
],
"count": 2174,
"exist": true
}
}
}
HTTP Request
POST /api.XRC20Service.XRC20Addresses
XRC20AddressesRequest
| Field | Type | Label | Description |
|---|---|---|---|
| pagination | pagination.Pagination |
XRC20AddressesResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Xrc20 contract addresses exist | |
| count | uint64 | total number of Xrc20 contract addresses | |
| addresses | string | repeated |
XRC20TokenHolderAddresses
XRC20TokenHolderAddresses returns Xrc20 token holder addresses given a Xrc20 contract address
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC20Service.XRC20TokenHolderAddresses \
--header 'Content-Type: application/json' \
--data '{
"tokenAddress": "io1gafy2msqmmmqyhrhk4dg3ghc59cplyhekyyu26",
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC20TokenHolderAddresses(
tokenAddress: "io1gafy2msqmmmqyhrhk4dg3ghc59cplyhekyyu26"
pagination: { skip: 0, first: 5 }
) {
count
addresses
}
}
Example response:
{
"data": {
"XRC20TokenHolderAddresses": {
"addresses": [
"io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqd39ym7",
"io19czfrdyjt67g9tuhmmcjkuh2m9qxzv5nqyve9p",
"io15lchlhad6dya59fncqtcfm44njwxm6m0j29aq9",
"io10mk2dqu0e86x7urmadc34v7m3alqqy5l5t822r",
"io1w4686k0r3fkjqghk694j43csgp8w073ge3s0f0"
],
"count": 11245
}
}
}
HTTP Request
POST /api.XRC20Service.XRC20TokenHolderAddresses
XRC20TokenHolderAddressesRequest
| Field | Type | Label | Description |
|---|---|---|---|
| tokenAddress | string | token contract address | |
| pagination | pagination.Pagination |
XRC20TokenHolderAddressesResponse
| Field | Type | Label | Description |
|---|---|---|---|
| count | uint64 | total number of token holder addresses | |
| addresses | string | repeated |
XRC721 Service API
XRC721ByAddress
XRC721ByAddress returns Xrc721 actions given the sender address or recipient address
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC721Service.XRC721ByAddress \
--header 'Content-Type: application/json' \
--data '{
"address": "io1lutyka7aw7u872kzsujuz8pwn9qsrcjvs6e7jw",
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC721ByAddress(
address: "io1lutyka7aw7u872kzsujuz8pwn9qsrcjvs6e7jw"
pagination: { skip: 0, first: 6 }
) {
exist
count
xrc721 {
actHash
contract
sender
amount
recipient
timestamp
}
}
}
Example response:
{
"data": {
"XRC721ByAddress": {
"count": 7,
"exist": true,
"xrc721": [
{
"actHash": "06de09b214d6f58f0af426388eed400b05e87078ef36b4dd723a6342f16afe61",
"amount": "2273",
"contract": "io1052s604n44atw5klykwff29tnrtsplqqkdajxf",
"recipient": "io1lutyka7aw7u872kzsujuz8pwn9qsrcjvs6e7jw",
"sender": "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqd39ym7",
"timestamp": 1656631180
}
]
}
}
}
HTTP Request
POST /api.XRC721Service.XRC721ByAddress
XRC721ByAddressRequest
| Field | Type | Label | Description |
|---|---|---|---|
| address | string | sender address or recipient address | |
| pagination | pagination.Pagination |
XRC721ByAddressResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Xrc721 actions exist for the given sender address or recipient address | |
| count | uint64 | total number of Xrc721 actions | |
| xrc721 | Xrc721Action | repeated |
Xrc721Action
| Field | Type | Label | Description |
|---|---|---|---|
| actHash | string | action hash | |
| sender | string | sender address | |
| recipient | string | recipient address | |
| amount | string | amount transferred | |
| timestamp | uint64 | unix timestamp | |
| contract | string | contract address |
XRC721ByContractAddress
XRC721ByContractAddress returns Xrc721 actions given the Xrc721 contract address
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC721Service.XRC721ByContractAddress \
--header 'Content-Type: application/json' \
--data '{
"address": "io1052s604n44atw5klykwff29tnrtsplqqkdajxf",
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC721ByContractAddress(
address: "io1052s604n44atw5klykwff29tnrtsplqqkdajxf"
pagination: { skip: 0, first: 1 }
) {
exist
count
xrc721 {
actHash
contract
sender
amount
recipient
timestamp
}
}
}
Example response:
{
"data": {
"XRC721ByContractAddress": {
"count": 2279,
"exist": true,
"xrc721": [
{
"actHash": "06de09b214d6f58f0af426388eed400b05e87078ef36b4dd723a6342f16afe61",
"amount": "2273",
"contract": "io1052s604n44atw5klykwff29tnrtsplqqkdajxf",
"recipient": "io1lutyka7aw7u872kzsujuz8pwn9qsrcjvs6e7jw",
"sender": "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqd39ym7",
"timestamp": 1656631180
}
]
}
}
}
HTTP Request
POST /api.XRC721Service.XRC721ByContractAddress
XRC721ByContractAddressRequest
| Field | Type | Label | Description |
|---|---|---|---|
| address | string | contract address | |
| pagination | pagination.Pagination |
XRC721ByContractAddressResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Xrc721 actions exist for the given contract address | |
| count | uint64 | total number of Xrc721 actions | |
| xrc721 | Xrc721Action | repeated |
XRC721ByPage
XRC721ByPage returns Xrc721 actions by pagination
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC721Service.XRC721ByPage \
--header 'Content-Type: application/json' \
--data '{
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC721ByPage(
pagination: { skip: 0, first: 1 }
) {
exist
count
xrc721 {
actHash
contract
sender
amount
recipient
timestamp
}
}
}
Example response:
{
"data": {
"XRC721ByPage": {
"count": 7251522,
"exist": true,
"xrc721": [
{
"actHash": "57353c167e2a3fda74b16949f02e8b339f573a0039af1d5164ff6bb6819ea5fe",
"amount": "2063879",
"contract": "io1asxdtswkr9p6r9du57ecrhrql865tf2qxue6hw",
"recipient": "io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqd39ym7",
"sender": "io1vygjfdnvv2jrg5szw82fusf9ea4nzz2s4fpy6e",
"timestamp": 1656660620
}
]
}
}
}
HTTP Request
POST /api.XRC721Service.XRC721ByPage
XRC721ByPageRequest
| Field | Type | Label | Description |
|---|---|---|---|
| pagination | pagination.Pagination |
XRC721ByPageResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Xrc721 actions exist for the given contract address | |
| count | uint64 | total number of Xrc721 actions | |
| xrc721 | Xrc721Action | repeated |
XRC721Addresses
Xrc20Addresses returns Xrc721 contract addresses
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC721Service.XRC721Addresses \
--header 'Content-Type: application/json' \
--data '{
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC721Addresses(
pagination: { skip: 0, first: 2 }
) {
exist
count
addresses
}
}
Example response:
{
"data": {
"XRC721Addresses": {
"addresses": [
"io104z744srvrvxdtk0kzp7hkquqyxkvyt9uqz6u7",
"io1052s604n44atw5klykwff29tnrtsplqqkdajxf"
],
"count": 253,
"exist": true
}
}
}
HTTP Request
POST /api.XRC721Service.XRC721Addresses
XRC721AddressesRequest
| Field | Type | Label | Description |
|---|---|---|---|
| pagination | pagination.Pagination |
XRC721AddressesResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Xrc721 contract addresses exist | |
| count | uint64 | total number of Xrc721 contract addresses | |
| addresses | string | repeated |
XRC721TokenHolderAddresses
XRC721TokenHolderAddresses returns Xrc721 token holder addresses given a Xrc721 contract address
curl --request POST \
--url https://analyser-api.iotex.io/api.XRC721Service.XRC721TokenHolderAddresses \
--header 'Content-Type: application/json' \
--data '{
"tokenAddress": "io1asxdtswkr9p6r9du57ecrhrql865tf2qxue6hw",
"pagination": {
"skip": 0,
"first": 2
}
}'
query {
XRC721TokenHolderAddresses(
tokenAddress: "io1asxdtswkr9p6r9du57ecrhrql865tf2qxue6hw"
pagination: { skip: 0, first: 5 }
) {
count
addresses
}
}
Example response:
{
"data": {
"XRC721TokenHolderAddresses": {
"addresses": [
"io1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqd39ym7",
"io1asxdtswkr9p6r9du57ecrhrql865tf2qxue6hw",
"io19nja6v0jfxyxxt70xgrp248k429y5nkq6cstpq",
"io1mt5u8vzxzuwq7hut99t9tvduhykzgkfclwlsgj",
"io14qqv4xz8jzk3hexhmp9qdtdghdpamvyzuqajrd"
],
"count": 6348
}
}
}
HTTP Request
POST /api.XRC721Service.XRC721TokenHolderAddresses
XRC721TokenHolderAddressesRequest
| Field | Type | Label | Description |
|---|---|---|---|
| tokenAddress | string | token contract address | |
| pagination | pagination.Pagination |
XRC721TokenHolderAddressesResponse
| Field | Type | Label | Description |
|---|---|---|---|
| count | uint64 | total number of token holder addresses | |
| addresses | string | repeated |
Hermes Service API
Hermes
Hermes gives delegates who register the service of automatic reward distribution an overview of the reward distributions to their voters within a range of epochs
curl --request POST \
--url https://analyser-api.iotex.io/api.HermesService.Hermes \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 22420,
"epochCount": 1,
"rewardAddress": "io12mgttmfa2ffn9uqvn0yn37f4nz43d248l2ga85"
}'
query {
Hermes(
startEpoch: 22420
epochCount: 1
rewardAddress: "io12mgttmfa2ffn9uqvn0yn37f4nz43d248l2ga85"
) {
hermesDistribution {
delegateName
rewardDistribution {
voterEthAddress
voterIotexAddress
amount
}
stakingIotexAddress
voterCount
waiveServiceFee
refund
}
}
}
Example response:
{
"hermesDistribution": [
{
"delegateName": "a4x",
"rewardDistribution": [
{
"voterEthAddress": "0x009faf509551ea0784b27f14f00c79d972393302",
"voterIotexAddress": "io1qz0675y4284q0p9j0u20qrrem9erjvczut23g2",
"amount": "810850817586367"
},
...
],
"stakingIotexAddress": "io1c2cacn26mawwg0vpx2ptnegg600q5kpmv75np0",
"voterCount": "260",
"waiveServiceFee": false,
"refund": "5160457356723700049"
},
...
}
HTTP Request
POST /api.HermesService.Hermes
HermesRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | Start epoch number | |
| epochCount | uint64 | Number of epochs to query | |
| rewardAddress | string | Name of reward address |
HermesResponse
| Field | Type | Label | Description |
|---|---|---|---|
| hermesDistribution | HermesDistribution | repeated |
HermesDistribution
| Field | Type | Label | Description |
|---|---|---|---|
| delegateName | string | delegate name | |
| rewardDistribution | RewardDistribution | repeated | |
| stakingIotexAddress | string | delegate IoTeX staking address | |
| voterCount | uint64 | number of voters | |
| waiveServiceFee | bool | whether the delegate is qualified for waiving the service fee | |
| refund | string | amount of refund |
RewardDistribution
| Field | Type | Label | Description |
|---|---|---|---|
| voterEthAddress | string | voter’s ERC20 address | |
| voterIotexAddress | string | voter’s IoTeX address | |
| amount | string | amount of reward distribution |
HermesByVoter
HermesByVoter returns Hermes voters' receiving history
curl --request POST \
--url https://analyser-api.iotex.io/api.HermesService.HermesByVoter \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 13752,
"epochCount": 24,
"voterAddress": "io13hlj049e96gpdxfr0atkhq3d6mhgzxx7mrmg00",
"pagination": {
"skip": 0,
"first": 5
}
}'
query {
HermesByVoter(
startEpoch: 13752
epochCount: 24
voterAddress: "io13hlj049e96gpdxfr0atkhq3d6mhgzxx7mrmg00",
pagination:{skip: 0, first: 5}
){
count
exist
delegates{
delegateName
fromEpoch
toEpoch
amount
actHash
timestamp
}
totalRewardReceived
}
}
Example response:
{
"data": {
"HermesByVoter": {
"count": 5,
"delegates": [
{
"actHash": "4b9977a739c659967bc04729c71f5d10a0eb4368ad9c24d74f76251cbc174a0c",
"amount": "188268667946402699",
"delegateName": "iotexteam",
"fromEpoch": 13728,
"timestamp": 1605696600,
"toEpoch": 13751
},
....
],
"exist": true,
"totalRewardReceived": "946193665895943769"
}
}
}
HTTP Request
POST /api.HermesService.HermesByVoter
HermesByVoterRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | Start epoch number | |
| epochCount | uint64 | Number of epochs to query | |
| voterAddress | string | voter address | |
| pagination | pagination.Pagination |
HermesByVoterResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the voter uses Hermes within the specified epoch range | |
| delegates | HermesByVoterResponse.Delegate | repeated | |
| count | uint64 | total number of reward receivings | |
| totalRewardReceived | string | total reward amount received |
HermesByVoterResponse.Delegate
| Field | Type | Label | Description |
|---|---|---|---|
| delegateName | string | delegate name | |
| fromEpoch | uint64 | starting epoch of bookkeeping | |
| toEpoch | uint64 | ending epoch of bookkeeping | |
| amount | string | receiving amount | |
| actHash | string | action hash | |
| timestamp | uint64 | unix timestamp |
HermesByDelegate
HermesByDelegate returns Hermes delegates' distribution history
curl --request POST \
--url https://analyser-api.iotex.io/api.HermesService.HermesByDelegate \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 20000,
"epochCount": 1,
"delegateName": "a4x"
}'
query {
HermesByDelegate(startEpoch: 20000, epochCount: 24,
delegateName: "a4x", pagination:{skip:0, first: 5}) {
count
exist
distributionRatio{
blockRewardRatio
epochNumber
epochRewardRatio
foundationBonusRatio
}
totalRewardsDistributed
voterInfoList{
actionHash
amount
fromEpoch
toEpoch
timestamp
voterAddress
}
}
}
Example response:
{
"data": {
"HermesByDelegate": {
"count": 13,
"distributionRatio": [
{
"blockRewardRatio": 70,
"epochNumber": 20000,
"epochRewardRatio": 70,
"foundationBonusRatio": 70
},
...
],
"exist": true,
"totalRewardsDistributed": "374486361904633758261",
"voterInfoList": [
{
"actHash": "911dd38de79541b3eb066ee7a03e35121004255323d62040b97f536c9906cdda",
"amount": "105463180053251824",
"fromEpoch": 19992,
"timestamp": 1628538750,
"toEpoch": 20015,
"voterAddress": "io13hlj049e96gpdxfr0atkhq3d6mhgzxx7mrmg00"
}
]
}
}
}
HTTP Request
POST /api.HermesService.HermesByDelegate
HermesByDelegateRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | Epoch number to start from | |
| epochCount | uint64 | Number of epochs to query | |
| delegateName | string | Name of the delegate | |
| pagination | pagination.Pagination | Pagination info |
HermesByDelegateResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether the delegate has hermes information within the specified epoch range | |
| count | uint64 | total number of reward distributions | |
| voterInfoList | HermesByDelegateVoterInfo | repeated | |
| totalRewardsDistributed | string | total reward amount distributed | |
| distributionRatio | HermesByDelegateDistributionRatio | repeated |
HermesByDelegateVoterInfo
| Field | Type | Label | Description |
|---|---|---|---|
| voterAddress | string | voter address | |
| fromEpoch | uint64 | starting epoch | |
| toEpoch | uint64 | ending epoch | |
| amount | string | distributino amount | |
| actionHash | string | action hash | |
| timestamp | string | timestamp |
HermesByDelegateDistributionRatio
| Field | Type | Label | Description |
|---|---|---|---|
| epochNumber | uint64 | epoch number | |
| blockRewardRatio | double | ratio of block reward being distributed | |
| epochRewardRatio | double | ratio of epoch reward being distributed | |
| foundationBonusRatio | double | ratio of foundation bonus being distributed |
HermesMeta
HermesMeta provides Hermes platform metadata
curl --request POST \
--url https://analyser-api.iotex.io/api.HermesService.HermesMeta \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 20000,
"epochCount": 24
}'
query {
HermesMeta(startEpoch: 20000, epochCount: 24) {
exist
numberOfDelegates
numberOfRecipients
totalRewardDistributed
}
}
Example response:
{
"data": {
"HermesMeta": {
"exist": true,
"numberOfDelegates": 41,
"numberOfRecipients": 3871,
"totalRewardDistributed": "342227806235546638245097"
}
}
}
HTTP Request
POST /api.HermesService.HermesMeta
HermesMetaRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count |
HermesMetaResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Hermes has bookkeeping information within the specified epoch range | |
| numberOfDelegates | uint64 | number of Hermes delegates within the epoch range | |
| numberOfRecipients | uint64 | number of voters who vote for Hermes delegates within the epoch range | |
| totalRewardDistributed | string | total reward amount distributed within the epoch range |
HermesAverageStats
HermesAverageStats returns the Hermes average statistics
curl --request POST \
--url https://analyser-api.iotex.io/api.HermesService.HermesAverageStats \
--header 'Content-Type: application/json' \
--data '{
"startEpoch": 20000,
"epochCount": 24,
"rewardAddress": "io12mgttmfa2ffn9uqvn0yn37f4nz43d248l2ga85"
}'
query {
HermesAverageStats(
startEpoch: 20000
epochCount: 24
rewardAddress: "io12mgttmfa2ffn9uqvn0yn37f4nz43d248l2ga85"
) {
exist
averagePerEpoch {
delegateName
rewardDistribution
totalWeightedVotes
}
}
}
Example response:
{
"data": {
"HermesAverageStats": {
"averagePerEpoch": [
{
"delegateName": "a4x",
"rewardDistribution": "10939144171268859553",
"totalWeightedVotes": "2897825174867095605694136"
},
...
],
"exist": true
}
}
}
HTTP Request
POST /api.HermesService.HermesAverageStats
HermesAverageStatsRequest
| Field | Type | Label | Description |
|---|---|---|---|
| startEpoch | uint64 | starting epoch number | |
| epochCount | uint64 | epoch count | |
| rewardAddress | string | Name of reward address |
HermesAverageStatsResponse
| Field | Type | Label | Description |
|---|---|---|---|
| exist | bool | whether Hermes has bookkeeping information within the specified epoch range | |
| averagePerEpoch | HermesAverageStatsResponse.AveragePerEpoch | repeated |
HermesAverageStatsResponse.AveragePerEpoch
| Field | Type | Label | Description |
|---|---|---|---|
| delegateName | string | delegate name | |
| rewardDistribution | string | reward distribution amount on average | |
| totalWeightedVotes | string | total weighted votes on average |