Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Configure and manage blockchain node endpoints through GetBlock, offering easy creation of shared nodes
Set up and manage blockchain node endpoints with GetBlock. This section covers creating shared node endpoints, generating access tokens, and configuring dedicated nodes with customizable settings.
GetBlock offers scalable plans tailored to developers and businesses, providing flexible solutions for both small projects and high-traffic platforms.
GetBlock offers flexible plans and features to support developers and businesses at any stage, from small projects to high-traffic platforms. This section covers available plans, scaling features, and managing subscriptions and payments.
This section provides simple examples to help you test your connection to the blockchain, using Ethereum API as a reference.
GetBlock uses a secure authentication method based on access tokens to ensure that only authorized users can interact with blockchain nodes.
Every endpoint you create is assigned a unique access token:
https://go.getblock.io/<ACCESS_TOKEN>/The <ACCESS_TOKEN> authenticates requests directly through the endpoint URL.
To make a request, include your full endpoint URL with the access token in the path.
For example, hereās how to fetch the latest Ethereum block number:
Response:
Always store your access tokens securely. Avoid exposing them in publicly accessible code repositories or logs.
If a token is compromised, you can quickly roll or delete it without disrupting other endpoints:
Go to your GetBlock Dashboard.
Locate the endpoint associated with the token.
Click the three-dot icon () next to the endpoint.
Select the option to either roll (regenerate) or delete the token.
This authentication method ensures that all your interactions with GetBlockās services remain secure, reliable, and easy to manage.
Configure dedicated nodes in your GetBlock Dashboard. This guide covers customizing your node settings and completing the setup process.
To create a endpoint, switch over to the āDedicated Nodesā tab in the Dashboard.
Select a blockchain protocol you wish to deploy and the network type. Click Get to begin the setup process.
In the setup window:
Review and confirm your selected protocol and network.
To start using GetBlock's services, you need to register an account. Youāll be ready to go in just a few clicks!
Go to GetBlock
Visit the and click on the 'Dashboard' button in the upper-right corner, or use .
Choose the sign-up method
Welcome to GetBlock! We make it easy for developers and businesses to connect to 100+ blockchain networks.
With our tools and services, you can focus on building your Web3 project without worrying about the technical details of setting up and managing blockchain nodes.
From DeFi apps and NFT platforms to analytics tools, AppChains, and more, GetBlock provides the infrastructure to help you build, test, and scale your blockchain-powered solutions.
curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": "getblock.io"
}'{"jsonrpc":"2.0","id":"getblock.io","result":"0x1449641"}Fees: VAT is applied to Paddle payments and varies depending on your region
If the card balance is insufficient: GetBlock will retry the payment after three days. If the retry fails, the plan will be frozen until the payment is resolved.
Please, account for VAT when planning your payments.
To update your payment information while you have an active subscription:
Go to Pricing ā Manage Plans.
Click āEdit Payment Methodā.
Enter your updated payment details and save the changes.
Users can top up their accounts with cryptocurrency through NOWPayments.
How it works:
Payments are processed as one-time transactions: add funds as needed.
Supported cryptocurrencies: any token on any network available through NOWPayments at the time of payment.
Fees: blockchain network fees apply.
If the network fees are insufficient or the transaction fails, the payment will not be processed and the subscription plan will not be activated. Please, include enough gas fees to ensure the transaction processes successfully.
Region of deployment: Germany (Frankfurt), USA (New York), Singapore.
Select a subscription plan (available discounts are applied automatically)
Node type: Choose between Full Node or Archive Node.
Node client: Specify your preferred node implementation.
Performance : Choose between High (premium specs, max throughput) and Standard (enterprise specs, optimized pricing for moderate-high loads).
API interface: Select API options and add-ons if applicable.
Verify all selected configurations in the summary section and proceed to checkout.
Pay for your dedicated nodes via your GetBlock account. If additional support is required during setup, you can contact the GetBlock support team directly.
You can add more dedicated nodes following these steps. Once deployed, add as many access tokens for each dedicated node as you need.

Register with Email
Enter your name and email address, then verify your email to activate the account.
Sign in via Google
Google will share your name, email, language preferences, and profile picture with GetBlock.
Connect with MetaMask
Use a MetaMask wallet browser extension to sign up ā no email or password required. If you donāt have a wallet extension installed, youāll be prompted to add one.
Sign up with GitHub
Use your GitHub credentials to set up an account.
Review and accept policies
During registration, you will be asked to accept our Terms of Service and Privacy Policy.
Once you've created an account and signed in, you'll be directed to the GetBlock Dashboard. Here, you can create endpoints, monitor your usage plan, and access statistics.
Find your GetBlock user ID located in the āSettingsā section or simply click your account icon to view and copy it. Please use it when contacting GetBlockās team so we can identify your account and help you faster.
Our ready-to-use blockchain nodes and APIs help you get started immediately.
99.9% uptime Reliable 24/7 connection to multiple blockchain networks.
Multi-chain support
Connect to Bitcoin, Ethereum, BNB Chain, Polygon, Solana, TON, and 100+ other networks. (And we support new protocols before anyone else!)
Flexible plans
From free access to enterprise-grade solutions, weāve got options for every stage of your project.
Custom solutions
Need something unique? We can build tailored solutions for your specific blockchain needs.
24/7 Expert support
Our team is here to help with integrations, troubleshooting, and scaling.
Get started with our most in-demand blockchain networks.
GetBlock users can top up their CU balance or upgrade to higher limits directly from their Dashboard, with a few click.
The current CU balance for Shared Node users is displayed on the Dashboard. This shows how many Compute Units (CUs) are left before running out.
With the "Top Up" feature, users can add more Compute Units to their account or upgrade to higher monthly limits.
Starter, Pro & Enterprise users can refill their CU balance or switch to another plan for increased limits:
Click the "Top Up" button on the Dashboard.
Select the number of CUs youād like to add or choose the recommended plan (if prompted) based on your usage needs.
Confirm and finalize your purchase.
Your account balance will be updated immediately upon successful payment.
Free plan users cannot top up their Compute Units directly. Instead, you have the option to upgrade to one of our monthly paid plans, providing significantly higher limits and extra features.
If you're on the Enterprise plan (our customizable Shared Node plan), you can additionally request higher RPS and Access Token limits. Hereās how:
Click "Change" on the Dashboard next to the Rate Limit section.
Fill out and submit a request form, choosing your desired RPS limit, CU amount, and number of Access Tokens.
Our team will review your request and reach out to you with next steps shortly.
This feature is perfect for users who need higher transaction throughput without changing their plan. For more demanding needs, consider .
Download the Postman GetBlockās collection to test our service. It includes all the accessible endpoints of our nodes and ready-to-go examples.
Import the collection into your Postman workspace: .
Once the page loads, you'll find a 'Run in Postman' button in the top-right corner. Click this button to open the collection directly in your Postman application.
Select the desired network from the drop-down list on the sidebar.
Paste the access token copied from your account instead of {YOUR_ACCESS_TOKEN}

Learn how to interact with blockchain networks through GetBlockās node infrastructure using popular web3 libraries.
Here you'll find step-by-step instructions on how to integrate popular developer libraries like Web3.js, Ethers.js, and others with GetBlock API.
These libraries allow developers to interact with Ethereum and other EVM-compatible blockchains to read data, send transactions, and deploy smart contracts.
The guide covers setting up your connection to GetBlock and performing basic operations.
curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/'
--header 'Content-Type: application/json'
--data-raw '{"jsonrpc": "2.0", "method": "db_getHex", "params": [null, null], "id": "getblock.io"}'{
"result": "null",
"id": "getblock.io",
"status_code": 405,
"message": "Method not allowed"
}This token will grant you the necessary permissions to explore our node functionalities.
Getting Started
Create your account, explore plans & features, and make your first API call
Guides
Set up endpoints, manage access tokens, and integrate GetBlock APIs step-by-step
API Reference
View supported networks, available endpoints, and full API specifications
Explorer API
Track transactions and monitor network activity with real-time blockchain data





Enable Archive Mode on your GetBlock Shared Node API to access the full blockchain history and run historical queries
GetBlock provides direct access to blockchain historical states through both the Dedicated Nodes service and archive-enabled Shared RPC endpoints.
This page covers Archive Mode ā a setting that turns on archive-node access within GetBlockās Shared Nodes subscription.
Common RPC use cases enabled by Archive Mode:
Read contract/account state at any past block, not just latest , using methods like eth_getBalance(address, blockNumber), eth_getStorageAt(contract, slot, blockNumber), eth_getCode(address, blockNumber), etc.
Call view functions against historical state: e.g. (..., blockNumber).
Run historical queries and debugging that rely on old state: forensics, audits, explorers, indexing, and retroactive analytics.
Support tracing and higher-fidelity debugging that may require historical state.
This feature removes the need to run a dedicated archive infrastructure for some use cases, letting developers perform on-demand historical queries via GetBlock RPC API.
Archive functionality is included with all Shared Node subscriptions, excluding the Free plan. No additional fee required.
Archive support is provided for a set of popular protocol mainnets, including Ethereum, BSC, Polygon, Base, Arbitrum, TRON, Sui, Cardano, etc.
Look for the small history icon ( ) when picking a protocol during the . It indicates that Archive mode is available for that blockchain.
If you need an archive data for a chain not covered by shared Archive mode, request a . Dedicated Nodes can be deployed in archive mode for any supported blockchain and come with additional benefits like:
Full blockchain history at the highest throughput
Unlimited query capacity
Sign in to your GetBlock dashboard and make sure youāre on the Shared Node tab.
Click Get endpoint and choose a required blockchain protocol.
Find the Mode toggle and switch the Archive mode on.
Finish configuring endpoint details by choosing the API interface and server location as usual.
After clicking Get, the new Archive endpoint appears in your Endpoints list. The endpoint URLs will follow the existing GetBlock format but point to archive nodes.
Archive endpoints usage remains subject to your planās .
However, serving requests from archive infrastructure involves heavier storage and compute power compared to regular full nodes.
Therefore, enabling the Archive mode affects how CU usage is calculated:
GetBlock applies a 2Ć Compute Unit (CU) multiplier to all requests made through the Archive endpoint.
The multiplier is applied to all requests made to an archive endpoint, even if the invoked RPC call does not require a historical state.
You can review the per-chain CU values for each method on our page.
Example:
If
eth_getBalancecosts 20 CU on a standard shared endpoint for a given chain, the same call to an Archive-enabled shared endpoint will cost 40 CU.
Plan accordingly and consider using standard Full mode endpoints for non-archive traffic to avoid unnecessary CU consumption.
Use archive endpoints only for workloads that require a historical state. For transactions or current state queries, use a standard Full mode to save CU.
Monitor CU consumption on the dashboard and set alerts for spikes or when usage nears your plan limit.
If you run sustained, high-volume archive queries, consider using a Dedicated Node.
what youāre building ā our team can guide you to the most efficient archive node setup.
GetBlockās configuration file provides a more organized and flexible way to interact with blockchain nodes and networks without exposing sensitive API keys or credentials in the code.
Using GetBlockās JSON configuration file with curl is particularly helpful when you need to access various node endpoints without hardcoding API keys in the code:
Download the getblock.config.json file from your GetBlock account;
Make sure you have installed. jq is a versatile command-line tool that enables extracting values from JSON files;
Navigate to your workspace or directory where you have imported the getblock.config.json file and open a terminal;
Now, you can make a GET request to a selected node endpoint using the curl command:
Connect to Ethereum nodes and other EVM-compatible networks using web3.js and GetBlockās JS configuration file.
Make sure the web3.js library is added to your project. In order to do that, use one of the following methods:
Npm: npm install web3
Yarn: yarn add web3
Pure js link: dist/web3.min.js
Download the getblock.config.js file from your GetBlock account. Add this file to your project directory.
Import the getblock module to a .js file that configures a new Web3 instance:
Connect to an Ethereum node and start sending API calls using web3.js over HTTP or WebSocket in the format below:
Use go() method to access an entire endpoint or token() to fetch the token.
Set up GetBlockās JS config file in Hardhat following the steps below:
Ensure you have Hardhat installed as a dependency in your Node.js project or run the following command to do so:
Navigate to your GetBlock account and install the getblock.config.js file. Copy and paste it into your working directory;
Open the hardhat.config.js file from your project directory and import the getblock module:
To set up GetBlock as a provider, modify the Hardhat configuration file with the credentials as shown below. Use go() method to access an entire endpoint or token() to fetch the token only.
Compare GetBlock's subscription options to find the one that fits your project.
GetBlock offers three main service optionsāShared Nodes, Dedicated Nodes, and Enterprise Solutions. This page provides a high-level overview of these services.
You can explore detailed pricing and plans from your dashboard in the āPricingā section or via https://getblock.io/pricing/.
Shared nodes operate on a resource-sharing model, where multiple clients access the same underlying node infrastructure maintained by GetBlock.
Our Shared Nodes deliver the perfect balance between affordability and performance:
Cost efficiency: Benefit from our pricing model based on , so you only pay for the resources needed for your current workload.
Flexible pricing: Options range from a free to high-volume plans ā accessible for individual developers and smaller teams while supporting the scaling needs of growing dApps.
Consistent performance: Each plan enforces a Requests Per Second (RPS) limit, preventing individual spikes from impacting overall quality.
This option is ideal for developers and teams looking for reliable connectivity to various blockchain networks without the higher costs of dedicated server resources.
A Dedicated Node is a private RPC server deployed solely for your use case. That means consistent throughput, no API rate throttling due to other users, and better uptime guarantees.
If your project demands the fastest, most reliable blockchain infrastructure, a Dedicated Node from GetBlock is a perfect choice.
This option is ideal for users that require high performance, full control over node configuration, and a flawless connection to the blockchain without any limitations:
Mission-critical reliability: Maximized uptime and robust failover mechanisms for even more reliable service.
Unlimited usage: No per-second request caps or CU tracking.
Low latency: With servers available in Europe, Asia, and the USA, choose the optimal server location to minimize latency and enhance performance for your users.
This option is designed to meet the needs of organizations operating at scale or applications that require extra resources, features, and dedicated support.
Whatās included:
99.9% uptime guarantee
Customizable node configurations and integrations
Performance optimization via load balancers
Advanced analytics and alert systems
Visit the to learn more about how we tailor services to fit complex, high-demand environments.
GetBlockās Dedicated Nodes are available in two performance tiers ā High and Standard. Choose the right balance of performance and cost for your private infrastructure
Dedicated Nodes are fully private blockchain nodes deployed and managed for your team. With two distinct performance presets, you can balance throughput, SLA, and budget to fit your workload.
Available tiers:
High Performance Tier: Designed to provide maximum available resources, throughput, and reliability. It is intended for applications where performance and availability are critical. The focus is on delivering the highest service levels and supporting the most demanding production workloads.
Standard Performance Tier: Designed to offer enterprise-grade performance sufficient for the majority of professional and business use cases, but at a more cost-efficient level. It targets demanding business applications and sustained usage, but without the additional (and sometimes excessive) headroom reserved for High Performance tier.
By providing these options, GetBlock helps you to deploy Dedicated Nodes that are tailored to your applicationās technical, operational, and budget requirements.
When deploying a Dedicated Node, you can choose between High and Standard setups to align with your applicationās resource needs and expected workload.
Select High if your workload is latency-sensitive, demands very high concurrent throughput, or is critical to business continuity.
Select Standard for typical production apps, where workload is within supported performance bounds.
Configuring tiers is available for all supported protocols unless there are specific infrastructure limitations for a given network. In this case, a chain will only support a single tier.
Always check available configurations in your dashboard
Dedicated Nodes are billed at a set monthly rate determined by configured settings:
Performance tier: Total cost scales with the performance tier selected ā High tier is priced at a premium relative to the Standard tier.
Blockchain network: Each protocol has different hardware requirements, which impact both High and Standard tier pricing.
Node mode: Full or Archive.
Client parameters.
Refer to your Dashboard for up-to-date pricing details and protocol-specific options.
Monthly costs are always shown during configuration in the Dashboard for each supported network and region.
To select a tier during node setup, open the Dedicated Node dashboard:
Select protocol, network, deployment region, node mode, and a preferred client.
As a final step, choose the Performance Tier (High or Standard) and required API interfaces.
Review updated performance and pricing details.
Your dedicated node will be ready for use upon activation. To switch between tiers after deploying, reach out to support.
For advanced workloads or unique requirements, our engineering team can help craft a custom private node solution beyond the High/Standard presets. for tailored deployments.
Follow the steps below to set up an endpoint and generate access tokens for your project.
This short guide shows you how to create an RPC endpoint (an RPC URL) for any supported protocol in your GetBlock Shared Node dashboard to connect it to your app, script, or wallet.
In GetBlock, an endpoint URL includes your unique Access Token ā the credential that authenticates RPC requests. GetBlockās UI sometimes labels the whole endpoint provisioning flow āGet Access Tokenā because a new RPC URL is created together with the token.
Related:
The steps below cover how to generate a new endpoint URL with an Access Token:
Log in to your GetBlock account and navigate to the Dashboard
Find the Endpoints section on the Dashboard
Click Get endpoint to open the endpoint setup menu
Generate and add as many access tokens as required for this protocol. Each token is a unique endpoint for you and your application to interact with the blockchain.
When creating an endpoint in your GetBlock Dashboard, for select protocols, you can choose between two node access modes ā Full and Archive. This selection determines how much historical blockchain data your endpoint can access.
Full mode: Standard full (pruned) node behavior ā current state lookups, sending transactions, reading blocks, etc.
Archive mode: Enables access to the historical chain state. Useful for querying balances, contract storage, UTXO sets, executing historical calls, simulating transactions at a past block, or reconstructing chain state for analytics and audits.
The created URL is shown on the endpoints list so you can copy it and start calling the node. Use the right-side menu () to roll (regenerate) or delete the endpoint from the list.
Because the Access Token is embedded, the URL is the credential. Keep it secret and store securely. If the URL is exposed, regenerate or revoke it from your GetBlock account.
Set up GetBlock as a provider using Ethers.js library to interact with the blockchain and streamline your dApp development process.
Ethers.js is a lightweight JavaScript library for interacting with Ethereum and other EVM-compatible blockchains. It is commonly used by developers to build decentralized applications (dApps) and manage Ethereum-based operations like deploying smart contracts, interacting with them, and managing user wallets.
Add Ethers.js to your project using your preferred package manager:
npm
yarn
For further details and advanced usage, explore the .
This guide explains how GetBlock users can connect to blockchain nodes to create accounts and send transactions.
In blockchains, āaccountā should be referred to as a pair of private and public keys. Blockchains ārecognizeā their users and balances by these keypairs.
Unlike login/password pairs in traditional computational solutions, in modern blockchains, every account can be restored with a private key only.
So, to broadcast transactions to a decentralized network, we need first to create (or restore) our account. The whole set of interactions is organized via Web3.js library.
First, initialize the Web3.js library and set up the connection to a blockchain node:
const Web3 = require('web3');
//Set up the provider (replace ACCESS-TOKEN with your actual token)
const web3 = new Web3('https://go.getblock.io/<ACCESS-TOKEN>/');Next, we can create an account on the testnet:
We can also restore an account from an existing private key:
You may ask what does āethā mean when weāre interacting with BNB Chain? No mistake, it reflects the fact that BNB Smart Chain is fully compatible with Ethereum Virtual Machine.
In blockchains, transactions should be signed (authorized) to be āincludedā into blockchains (confirmed by its consensus of miners or validators).
Hereās how our transactions are created. 0.01 ETH is used for demo.
Thatās how the transaction looks before being included in the blockchain. Once signed, it can be sent to the network of nodes.
Thatās it: your account is good to go and its transaction is submitted successfully!
In this guide, we will show you how to get started with TronWeb to connect to GetBlock.
TronWeb is a JavaScript library of TRON full nodeās API functions that is used to deploy smart contracts, query blockchain and contract information, trade on the decentralized exchanges and change the blockchain state.
Firstly, you will need to add the TronWeb library to your project.
Npm:
npm install tronwebYarn:
yarn add tronwebIn your javascript file, define TronWeb:
When you instantiate TronWeb you can define:
fullNode
solidityNode
eventServer
privateKey
you can also set a
fullHost
Which works as a jolly. If you do so, though, the more precise specification has priority. Supposing you are using a server which provides everything, like TronGrid, you can instantiate TronWeb as:
For retro-compatibility, though, you can continue to use the old approach, where any parameter is passed separately (using the GetBlock node as an example here):
After this you can call any TronWeb method:
All API references can be found in the project documentation at
Example code for the eth_coinbase JSON RPC method. Дomplete guide on how to use eth_coinbase JSON RPC in GetBlock.io Web3 documentation.
Track and manage your usage and node service subscriptions with GetBlock.
Learn how to use Web3.js, a widely-used JavaScript library for connecting to GetBlock nodes.
Web3.js is a JavaScript library built for interacting with the Ethereum blockchain and other EVM-compatible chains. It is used to send JSON-RPC calls to the Ethereum node via HTTP, IPC, or WebSocket connection to read data from the blockchain, make transactions, or deploy smart contracts.
Use your preferred package manager:
const TronWeb = require('tronweb');Double-check that <ACCESS_TOKEN> is correctly replaced with your actual token. Ensure there are no trailing spaces.
404
Could not resolve host
Verify that the URL https://go.getblock.io/<ACCESS_TOKEN>/ is correct.
429
Too many requests
Check your GetBlock account for usage limits. Upgrade your plan if necessary.
32601
The method does not exist/is not available
Verify the method name (eth_blockNumber, eth_getBalance, etc.) against the blockchain's JSON-RPC specifications.
32602
Invalid argument
Ensure the parameters in the params array match the expected format for the method.
32700
Parse error
Double-check your JSON syntax. Ensure your request is properly formatted.
Regional endpoints: Connect to the nearest datacenter ā Frankfurt (EU), New York (US), Singapore (APAC) ā to minimize network latency.
Archive data access: Run full historical blockchain queries.
Tiered support levels: Support options adapt to your requirements, from basic help to priority support when you need it most.
Predictable pricing:
Full Node: from $1,000/month;
Archive Node: from $1,500/ month.
Expert support: 24/7 coverage and immediate issue resolution.
Custom node builds & tooling
Resource allocation
Maximum hardware and bandwidth
Balanced hardware profile
Throughput
Highest supported
High
SLA
99.9% uptime
99.5% uptime
Recommended for
Applications with high transaction volumes & large user bases, mission-critical systems, and any workflow where latency and throughput are the top priority
Most production dApps, wallets, and enterprise tools or projects that need guaranteed resources but do not require the maximum performance tier
npm install ethersyarn add ethers// Generate new address and private key
const accountTo = web3.eth.accounts.create();
console.log('Generated account:', accountTo);// Restore account from private key
const privateKey = process.env['privateKey'];
const accountFrom = web3.eth.accounts.privateKeyToAccount(privateKey);curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/'
--header 'Content-Type: application/json'
--data-raw '{"jsonrpc": "2.0", "method": "db_putString", "params": [null, null, null], "id": "getblock.io"}'{
"result": "null",
"id": "getblock.io",
"status_code": 405,
"message": "Method not allowed"
}curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/'
--header 'Content-Type: application/json'
--data-raw '{"jsonrpc": "2.0", "method": "db_getString", "params": [null, null], "id": "getblock.io"}'{
"result": "null",
"id": "getblock.io",
"status_code": 405,
"message": "Method not allowed"
}{
"result": "null",
"id": "getblock.io",
"status_code": 405,
"message": "Method not allowed"
}curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/'
--header 'Content-Type: application/json'
--data-raw '{"jsonrpc": "2.0", "method": "db_putHex", "params": [null, null, null], "id": "getblock.io"}'{
"result": "null",
"id": "getblock.io",
"status_code": 405,
"message": "Method not allowed"
}For additional methods and options, refer to the official Web3.js documentation.
npm install web3yarn add web3dist/web3.min.jscurl --location --request POST 'https://go.getblock.io/YOUR-ACCESS-TOKEN' \
--header 'Content-Type: application/json' \
--data-raw '{"jsonrpc": "2.0", "method": "eth_hashrate", "params": [], "id": "getblock.io"}'{
"result": "null",
"id": "getblock.io",
"status_code": 405,
"message": "Method not allowed"
}curl -X GET https://go.getblock.io/"$(jq -r '.shared.btc.mainnet.rest[0]' getblock.config.json)"/rest/chaininfo.jsonconst { getblock } = require('./getblock.config.js');const { getblock } = require('./getblock.config.js');
var Web3 = require('web3');
// Create the JSON-RPC provider
var web3Rpc = new Web3(new Web3.providers.HttpProvider(
getblock.shared.eth.mainnet.rpc[0].go()
));
// Create the WebSocket provider
var web3Ws = new Web3.providers.WebsocketProvider(
`wss://go.getblock.io/${getblock.shared.eth.mainnet.ws[0].token()}`
));npm install --save-dev hardhatconst { getblock } = require('./getblock.config.js');const { getblock } = require('./getblock.config.js');
module.exports = {
defaultNetwork: "sepolia",
networks: {
hardhat: {
},
sepolia: {
url: getblock.shared.eth.sepolia.rpc[0].go() // https://go.getblock.io/<ACCESS-TOKEN>/
},
goerli: {
url: `https://go.getblock.io/${getblock.shared.eth.goerli.rpc[0].token()}` // <ACCESS-TOKEN>
},
},
solidity: {
version: "0.8.19",
settings: {
optimizer: {
enabled: true,
runs: 200
}
}
},
paths: {
sources: "./contracts",
tests: "./test",
cache: "./cache",
artifacts: "./artifacts"
},
mocha: {
timeout: 40000
}
}// Import the Ethers library
const { ethers } = require('ethers');
// Set up the provider (replace ACCESS_TOKEN with your actual token)
const provider = new ethers.JsonRpcProvider('https://go.getblock.io/ACCESS_TOKEN');
//Call a method using the provider
const main = async () => {
const blockNumber = await provider.getBlockNumber();
console.log("Latest Block Number:", blockNumber);
};
// Call the main function
main();const createSignedTx = async (rawTx) => {
rawTx.gas = await web3.eth.estimateGas(rawTx);
return await accountFrom.signTransaction(rawTx);
}
const sendSignedTx = async (signedTx) => {
// You can use signedTx.rawTransaction as params for
// calling eth_sendRawTransaction JSON-RPC method
web3.eth.sendSignedTransaction(signedTx.rawTransaction).then(
console.log
);
}
const amountTo = "0.01" // etherconst rawTx = {
to: accountTo.address,
value: web3.utils.toWei(amountTo, 'ether'),
chainId: chainId
};
createSignedTx(rawTx).then(sendSignedTx)// Import the Web3 library
const Web3 = require('web3');
// Set GetBlock as the provider (replace ACCESS_TOKEN with your actual token)
var web3 = new Web3('https://go.getblock.io/ACCESS_TOKEN');
// Initialize web3 method
web3.eth.getBlockNumber().then(console.log);In the modal that opens, select:
The desired blockchain protocol (Ethereum, BNB Chain, Polygon, etc.)
The network you want to interact with: mainnet or testnet
Node mode: full (default) or archive
The API interface that you need (JSON-RPC, WebSockets, GraphQL, etc.)
One of the available server locations (Frankfurt, New York, or Singapore)
Click 'Get' and have the endpoint URL with an access token generated.
Remaining CU balance
Rate limit based on your plan
Total requests made in the last 24 hours
For more detailed analysis, visit the Statistics tab in the āEndpointsā section.
Select the time period, protocol name, networks (mainnet/testnet), region, and API interfaces to analyze the data by parameters.
All data is displayed through infographics, including:
Number of requests and CUs
Response statuses
Method call distribution
Rate limit rejections
GetBlock provides a notification system to help you monitor your usage and subscription status.
Alert types:
Run out of CU: Notifies you when your CU balance reaches zero.
CU balance alerts: Warns when remaining CUs drop below specified limits.
Subscription expiration alerts: Help you renew your dedicated node plans on time.
Set up email, Telegram, or Webhook alerts to monitor your usage and subscription status from Settings ā Notification Settings.
const tronWeb = new TronWeb({
fullHost: "https://go.getblock.io/<ACCESS-TOKEN>/"
})Set up your team account on GetBlock, invite and onboard team members with this step-by-step guide.
A team account is a shared workspace where multiple users can collaborate. This setup is ideal for companies and teams using GetBlock services.
Key benefits:
Organized collaboration: Work together on company resources.
Enhanced security: Role-based access limits each member to only the features they need.
Efficient management: Easily switch between personal and team accounts.
A team account user is a regular GetBlock user. When invited to a team, they can work on company resources, manage service plans or team settings, provided the corresponding permissions are granted.
This part covers a step-by-step guide to setting up your team workspace.
Sign in to your GetBlock account. If you donāt have a user account yet, create one following .
Click on the profile icon in the bottom-left corner of the sidebar. Select "Create new team" from the dropdown menu.
A popup window will appear. Assign a team name and click the "Create team" button.
Once the space is created, navigate to Account Settings > Team to manage team settings or add teammates.
The creator of the team account controls who gets invited and manages user roles.
Limits on GetBlock team accounts:
Each user can create up to 3 teams.
A user can be invited to an unlimited number of teams.
You can invite team members to join your team account using either their email address or GetBlock User ID.
If the teammate has a GetBlock account: You can invite them using their ID. Since they are already registered, they just need to accept the invitation.
If the teammate is not registered on GetBlock: Invite them via email so they can first create an account before joining the team.
Go to Account Settings > Team.
Click "Add team member" in the top-right corner.
Request the User ID from the teammate (they can find it under Account Settings > General).
A team member is marked as when they have successfully accepted the invitation and joined the team.
If the invitation has been sent but not yet accepted, their status remains .
Once the user has joined, the team owner or an admin can update their permissions:
Go to My Team in Account Settings.
Click the three-dot menu (ā®) next to a team member.
Select "Edit access level".
Assign permissions:
If a Member has no permissions assigned, they will have View-Only access by default.
This table provides a breakdown of actions team account users can perform based on their role.
If you need someone to help manage other team members, be sure to give them Admin status.
To remove a user from your team account:
Navigate to Team in the Account Settings.
Click the three-dot menu (ā®) next to the team member name.
Select "Remove" from the dropdown menu.
When removed from a team, users lose access to that team workspace but keep their personal account.
If youāve been invited to a team on GetBlock, follow these steps to accept the invitation and join the team.
When you have a pending team invitation, a notification badge appears on your account icon .
Click your account icon to view an invitation.
Click "Accept" if you're ready to join.
After accepting the invitation, you are given access to your teamās workspace. Your will be
A team user does not lose access to their personal account. They can still use and manage their own endpoints and subscriptions.
To switch between your personal account and any team accounts you are part of:
Click the account icon in the left panel.
A dropdown will show all teams & personal accounts.
Switch between them as needed.
The teams list is sorted by recent activity, with the most recently accessed accounts at the top.
Regularly review and audit permissions. Revoke access for users who are no longer active.
Grant admin privileges only to trusted team members.
Give Members only the necessary permissions (e.g., endpoints access or subscriptions management).
Never share login credentialsāuse team accounts instead.
If you run into any issues or have questions, please check out our or visit our . You can also use the Help button within your GetBlock dashboard to access support or submit a request.
These examples provide a starting point for testing your connection and querying blockchain data using cURL commands.
Before you start:
Create a JSON-RPC endpoint for the Ethereum blockchain from your GetBlock account.
Replace <ACCESS_TOKEN> in the examples below with your actual Access Token.
Run the following command to retrieve the latest block number:
If successful, the response will include the current block number in hexadecimal value:
Identify the blockchain network with the eth_chainId method:
Response example:
In this example, 0x1 indicates the Ethereum Mainnet. The chain ID helps confirm which blockchain network you are interacting with.
Retrieve the balance of an Ethereum address using eth_getBalance. Replace <ACCOUNT_ADDRESS> with the target wallet address:
Example response:
The result field shows the account balance in wei (1 ether = 10¹⸠wei).
An infrastructure that combines other GetBlock and external infrastructures, specifically designed for high-frequency traders (HFT) on Solana.
TradeFirst is an infrastructure that combines other GetBlock and external infrastructures, specifically designed for high-frequency traders (HFT) on Solana. It combines multiple performance optimizations:
fast data streaming (StreamFirst)
intelligent transaction routing (LandFirst)
into a single, integrated solution for professional trading operations.
Interested in building on Solana with TradeFirst? Reach us for more information.
TradeFirst provides two-sided latency optimization for Solana trading:
Signal Detection Side: Faster awareness of on-chain events via StreamFirst (data streaming).
Execution Side: Faster transaction delivery and inclusion via Blazar, SubSlot, and LandFirst routing
By optimizing both sides, TradeFirst enables traders to see opportunities earlier and execute trades faster than competitors using standard infrastructure.
StreamFirst (Data Streaming)
Accelerated Yellowstone gRPC implementation
Optimized shred-stream network access
Fastest on-chain data delivery for signal detection
Future Addition:
Shred Stream Access (coming soon): Direct raw shred delivery for even earlier data access
Complete Trading Cycle:
Signal Detection: StreamFirst delivers on-chain updates 17ms faster than standard methods
Strategy Execution: Your trading logic analyzes data and generates orders
Transaction Submission: Blazar optimizes transaction structure and routing
Timing Control: SubSlot precisely times submission within the slot window
This is highly recommended for High-frequency trading (HFT) traders, which is specifically designed for:
1. High-Frequency Trading Firms
These are professional trading teams running large volumes of rapid-fire transactions on Solana, including cross-DEX arbitrage, statistical arbitrage across correlated token pairs, tight-spread market making, and fast liquidity rebalancing. For them, execution speed and reliability directly impact profitability, making this solution an essential part of their trading infrastructure.
2. MEV Searchers
MEV searchers rely on precise timing and high-priority execution for strategies like sandwich attacks, liquidation sniping, protocol arbitrage, or fast NFT flips. Since these opportunities exist for only secondsāand often compete with other searchersāhaving stronger execution reliability gives them a significant edge.
3. Algorithmic Trading Operations
Algorithmic trading systems continuously react to on-chain data, whether they're following momentum signals, trading based on oracle movements, optimizing yield across protocols, or executing automated rebalancing strategies. These systems need a consistent, low-latency execution layer to ensure their models perform as expected without disruptions.
4. Proprietary Trading Desks
Small teams and professional traders running their own capital depend on solid infrastructure without wanting to build it in-house. They benefit from flexible setups that support diverse strategies, predictable pricing so they know their cost structure, and reliable support for performance tuning or issue resolution.
5. Institutional Crypto Traders
Institutions executing high-volume Solana strategies require enterprise-level stability, compliance-friendly monitoring, volume-based pricing, and service-level guarantees. This solution gives them the dependable infrastructure and dedicated support needed to operate at scale while maintaining regulatory and operational standards.
For consultation on optimal deployment architecture for your specific use case, contact
Example code for the eth_mining JSON RPC method. Дomplete guide on how to use eth_mining JSON RPC in GetBlock Web3 documentation.
GetBlock provides access to over 100 blockchains. CU and rate limits depend on the selected plan.
This guide explains how limits work across all available plans, helping you understand whatās included and how to choose the option that best fits your current workload and future growth.
Shared Nodes operate on a system of limits defined by Compute Units (CUs) and Requests Per Second (RPS). Each plan also determines how many access tokens you can generate.
Track and extend your dedicated node subscriptions on GetBlock.
Solana indexed archive data that allows users to efficiently query any historical information.
Solana Indexed Archive is a software development kit(SDK) that provides an indexed data layer, enabling instant access to the complete Solana blockchain history and real-time data through a single, high-performance API. Built on SQD Network infrastructure, it eliminates the need to work with raw Solana data, run archive nodes, or maintain complex indexing logic.
Interested in building on Solana with Indexed Archive? for more information.
EU (Frankfurt): https://go.getblock.io/<ACCESS_TOKEN>/
US (New York): https://go.getblock.us/<ACCESS_TOKEN>/
Asia (Singapore): https://go.getblock.asia/<ACCESS_TOKEN>/const fullNode = new TronWeb.providers.HttpProvider("https://go.getblock.io/<ACCESS-TOKEN>/")
const solidityNode = new TronWeb.providers.HttpProvider("https://go.getblock.io/<ACCESS-TOKEN>/")
const eventServer = new TronWeb.providers.HttpProvider("https://go.getblock.io/<ACCESS-TOKEN>/")
const tronWeb = new TronWeb(fullNode, solidityNode, eventServer)tronWeb.trx.getBlock('latest').then(result => {console.log(result)});LandFirst (Multi-Path Routing)
SWQoS priority connections
Jito integration
Geo routing
Stake density topology
Leadership scheduling
Path Selection: LandFirst routes via optimal path (SWQoS or Jito)
Block Inclusion: Transaction lands in the current or next slot with high probability

{
"result": "null",
"id": "getblock.io",
"status_code": 405,
"message": "Method not allowed"
}curl --location --request POST 'https://go.getblock.io/<ACCESS_TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": "getblock.io"
}'{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x1449641"
}curl --location --request POST 'https://go.getblock.io/<ACCESS_TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_chainId",
"params": [],
"id": "getblock.io"
}'{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x1"
}curl --location --request POST 'https://go.getblock.io/<ACCESS_TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["<ACCOUNT_ADDRESS>", "latest"],
"id": "getblock.io"
}'{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x5a70dac3910910"
}One team can have a maximum of 30 users.
The user gets a notification and can accept the invite.
Go to Account Settings > My Team.
Click "Add team member" in the top-right corner.
Enter the teammate's name and email address.
Send the invite.
The invite link is valid for 30 minutes. If it expires, please resend an invitation.
The user will receive an invitation email with a link to sign up and join the team.
Endpoints: Create and manage node endpoints, access tokens, and view statistics.
Subscriptions & payments: Handle payments and plans.
Admin: Includes all the above permissions, plus the access to manage team settings and member roles.
Save changes.
Edit access levels
ā
ā
ā
Promote to Admin
ā
ā
ā
When someone who is not yet registered on GetBlock receives a team invitation, they must first sign up for an account:
Check your inbox for an email invitation from GetBlock.
Clicking the invitation link redirects you to the sign-up page.
Create a secure password for your new account.
Check the boxes to agree to the Terms of Service and Privacy Policy and complete the registration.
The invite link is valid for 30 minutes. If it expires, ask the team owner or admin to send a new invitation.
Once registered, youāll have your personal GetBlock account. Additionally, you gain access to the teamās dashboard and resources based on given by the team owner or admin.
Create & manage access tokens
ā
ā
š
Manage subscriptions & payments
ā
ā
š
Add & remove team members
ā
ā
ā
With Dedicated Nodes, youāre not limited by CUs or RPS.
GetBlockās shared node service is subject to several usage limits. These are the key limits that directly affect costs and performance:
CU (Compute Units): Measures the computational effort required to process requests. Different shared node plans include a varying number of CUs that you can use in a month.
RPS (Requests Per Second): Each plan enforces a maximum number of requests you can send every second. While youāre not billed per request, staying within this limit is critical to maintaining optimal service quality.
Access Tokens: Access tokens are unique identifiers used to authenticate your connection to GetBlockās node infrastructure, generated when you create an endpoint. The limitation on your plan determines how many of these access tokens (and therefore endpoints) you can create.
Price/month
$0
$49
$199
$499
from $999
CU Allocation
50k/day
50M/month
To see the full comparison table, navigate to https://getblock.io/pricing/.
The plan is ideal if youāre just starting out and do not have complex calls or large request volumes.
CU: 50,000/day
Throughput: 20 requests per second (RPS)
Access Tokens: 2
Compute Units are renewed daily, but unused CUs cannot be transferred to the next day.
Clients who want to increase their usage limits can choose between the higher-tier options.
This is a monthly subscription designed for use cases that are growing beyond the free tier. It offers a significant increase in CU compared to the Free plan.
CU: 50M per month (~1.6M/day)
Throughput: 100 requests per second (RPS)
Access Tokens: 10
The Advanced Plan is a mid-to-upper tier, production-ready plan, suitable for moderate-to-high traffic applications.
CU: 220M per month (~7.2M/day)
Throughput: 300 requests per second (RPS)
Access Tokens: 25
The Pro Plan is built for applications that need significantly higher throughput and increased resource availability compared to lower tier plans.
CU: 600M per month (~20M/day)
Throughput: 500 requests per second (RPS)
Access Tokens: 50
The Enterprise plan is fully customizable with tailored CU allocations, rate limits, and access tokens to meet exceptionally high call volumes and performance requirements.
CU: Custom monthly allocation based on your demands
Throughput: Custom
Access Tokens: Custom
If you donāt use all your allocated CUs within a month, the unused amount will carry over to the next month as long as your subscription is active and renewed. If your subscription expires or is not renewed on time, the remaining CUs will be lost.
If your demand exceeds the included limits, you can purchase extra CU packages. This means that even within a given plan, thereās room for scaling without an immediate need to move to a higher tier.
Our Dedicated Node service is perfect for teams and projects that demand absolute freedom from rate limits and CU monitoring.
CU: Unlimited
Rate: Unlimited
If youāre unsure which plan best fits your needs, our team is ready to help! Contact our support team or visit our Choosing your plan page for more information.\
Instead of charging a fixed fee for every call, GetBlock calculates the ācostā of processing a request based on the actual computational work involved ā such as CPU & memory usage, and disk I/O.
Here's how it works:
Different shared node plans include different allocations of Compute Units (CUs).
Each API call deducts an amount based on the resources it consumes.
Users can track their remaining CUs in real time on the dashboard.
This model ensures costs are aligned with actual infrastructure usage.
Every API call "spends" a number of Compute Units. The total value is determined by two main factors:
A base CU cost (chain multiplier) reflecting the network's resource intensity.
A method-specific multiplier which varies by API method.
The total Compute Units for an API call are calculated using the following formula:
Not all blockchains are built or operate the same way. GetBlock accounts for inherent differences between networks by assigning chain multipliers based on factors such as:
Node infrastructure costs;
Protocol complexity and the size of the blockchain data;
Operational overhead.
Hereās how blockchains are grouped based on their average resource intensity:
Algorand, Bitcoin, Bitcoin Cash, Dash, Dogecoin, Ethereum Classic, Kusama, Litecoin, Near, OKB, Polkadot, Rootstock, Scroll, Shiba Inu, Sonic, Syscoin, Telos, Zcash, others
10
These chains typically have low write/read complexity and use fewer resources per request
Aptos, Arbitrum, Avalanche, BNB Smart Chain, Base, Blast, Cardano, Cosmos, Cronos, Ethereum, Filecoin, Flow, Gnosis, Harmony, Kaia, Linea, Moonbeam, OKT, Optimism, Polygon, Polygon zkEVM, StarkNet, Tezos, Tron, XRP, opBNB, Cronos zkEVM, ZKsync
20
Requests on these blockchains are more resource-intensive
Solana, Sui, TON
50
These chains require significantly more computational resources per request
Different API methods put different loads on backend nodes. For example:
eth_blockNumber is lightweight since it just returns the latest block number.
trace_replayBlockTransactions executes a full replay of all txs in a block and can be extremely heavy.
Therefore, individual blockchain methods have their own multipliers, depending on how computationally demanding each particular operation is.
The example table below shows some Ethereum blockchain methods with their associated multipliers and total CU calculated.
eth_blockNumber
1
20
20
eth_getTransactionByHash
1
20
20
debug_traceTransaction
2
Calculation example for
debug_traceTransaction:
For full details on all methodsāincluding exact multipliers and total CU values for each protocolāplease refer to our Compute Units page.
Tracking and pricing requests based on how āheavyā they are:
Discourages abuse (like hammering archive calls) and protects node performance & uptime.
Makes it easier for GetBlock to scale and optimize resources behind the scenes.
A simple per-request pricing model would charge the same for all methods, which isnāt scalable or logical. The CU model fixes this imbalance.
Because each API call has a clear CU cost, you can spot inefficiencies quickly (e.g. which parts of your dApp consume the most), making it easier to fine-tune performance.
The widget on your dashboard alerts you when your subscription is about to expire or is in a grace period. Click the widget to open a pop-up that lists all nodes that require renewal.
The Manage Plans section can be found by navigating to the āPricingā option in the left-side menu. You'll see three tabs: click on āManage Plansā to view all your subscriptions in one place.
Each endpoint in āMy endpointsā list shows its current subscription status.
Active
(Recurring Payment)
Active
(One-Time Payment)
Expiring Soon
(One-Time Payment)
In Grace Period
(Recurring /One-Time)
You can modify your subscription period at any time if youāre on a one-time payment plan paid with:
Cryptocurrency;
Credit card.
Note on Recurring Payments
Users cannot manually extend a plan when using recurring payments. These subscriptions renew automatically at the end of a billing cycle.
However, if a payment fails (e.g., due to an expired card or insufficient funds), your subscription will enter a 3-day grace period. During this time, your node remains active, allowing you to update your payment details and retry the renewal before the service is interrupted.
You can extend your subscription to one of the following periods:
1 month
6 months
12 months
There are three ways to extend your subscription.
Go to Dedicated Nodes tab from your dashboard. Look for the subscription alert widget.
Click the widget to see a list of nodes needing renewal and choose one. A pop-up will show extension options (1, 6, or 12 months).
Choose a new period and review details. Proceed to checkout.
Complete the payment by following the instructions provided.
Check the "Payment History" under the Pricing tab to track the progress.
For fiat (credit card) payments:
Payments are processed via Paddle.
VAT may apply depending on the user's location.
The extension is applied instantly once the payment is completed.
For crypto payments:
Payments are processed via NOWPayments.
Make sure to account for network fees to avoid payment issues.
The extension is applied after blockchain confirmation, which may take a few minutes.
Navigate to your main dashboard and switch to the Dedicated Nodes tab.
Choose a node to extend. Expand the nodeās details and click "Extend" to begin the process.
Follow the pop-up instructions to select the new subscription period and finalize the process.
Navigate to Pricing > Manage Plans.
Review all subscriptions. Subscriptions nearing expiration are listed at the top.
Follow the same steps: Select your node, choose a new period, and confirm your payment.
If you face any issues with renewal or extensions, feel free to reach out to GetBlock supportāweāre happy to assist.
Unified access layer: Single endpoint for both historical queries and live subscriptions
Developer-friendly SDK: Typed queries, easy integration, no low-level Solana structures Zero operational overhead: GetBlock operates all infrastructure
Instant availability: Full Solana history accessible immediately, no setup or backfilling
Using the SDK, you can easily build ETL pipelines that extract and transform on-chain data without handling raw Solana events, decoding account structures, or maintaining complex indexing logic. All blockchain data has already been extracted, indexed, and is immediately ready to use. Your only task is to define the query and specify the required filter.
SQD Network continuously processes Solana's blockstream in a decentralized manner:
Block processing: Every Solana block parsed immediately upon production
Data extraction: Transactions, instructions, logs, account updates extracted
Normalization: Raw data decoded and structured following standard schemas
Enrichment: Relationships between transactions, accounts, and programs established
Distributed storage: Indexed data stored across decentralized SQD infrastructure
GetBlock deploys and maintains a global network of Portal instancesāhigh-performance gateways that:
Provide unified interface: Single API endpoint for historical data and real-time subscriptions
Ensure low latency: Geographically distributed clusters for fast global access
Guarantee high availability: Redundant instances with automatic failover
Handle scale: Optimized for large workloads and deep historical scans
Abstract complexity: Clean API hides underlying distributed storage complexity
Blocks
Block hash, slot number, parent slot
Block time (Unix timestamp)
Leader (validator) identity
Transaction count
Total compute units consumed
Transactions
Signature (unique identifier)
Fee payer address
Success/failure status
Instructions
Program ID (which program was called)
Instruction index (order within transaction)
Instruction data (decoded where possible)
Logs
Program log messages
Associated transaction signature
Log level and content
Account Updates
Account public key
Pre-transaction balance (lamports)
Post-transaction balance (lamports)
Deep historical analysis and backtesting
Real-time liquidity and TVL monitoring
Pattern recognition and signal generation
Full transaction and asset history for any user
Instant UI updates based on on-chain events
Aggregation of data across DeFi and NFT protocols
Reliable data backbone for internal analytics
Foundation for B2B data services
No need to maintain validators or archive RPC setups
For consultation on optimal deployment architecture for your specific use case, contact GetBlock support team.
Learn how to set up custom RPC URL on MetaMask for faster, more reliable, and secure blockchain interactions.
MetaMask is a blockchain wallet available as a mobile application and a browser extension. It allows you to interact with Ethereum-based decentralized applications (dApps) directly from your browser.
Using GetBlock nodes with MetaMask makes your blockchain experience faster and more reliable than using default RPCs:
Connect directly to trusted nodes for secure transactions.
Enjoy quicker transactions and smoother dApp interactions.
Experience less downtime, even during busy network periods
This step-by-step tutorial will guide you through connecting GetBlockās powerful nodes to your MetaMask wallet.
If you donāt already have MetaMask, download and install it from the official website: .
MetaMask extension is officially supported on Chrome, Brave, Firefox, Microsoft Edge, and Opera browsers.
Generate a JSON-RPC URL for the selected network from your GetBlock and copy it.
If the network is already in your list but uses a default RPC provider, you can switch to GetBlock by following these steps:
Click on the current network name in MetaMask to open the dropdown of networks.
Find the network you want to edit and click the settings menunext to it. Select 'Edit'.
Open the āDefault RPC URLā dropdown and select 'Add RPC URL'.
Paste the JSON-RPC endpoint URL from your GetBlock account (https://go.getblock.io/<ACCESS_TOKEN>/).
Name the new RPC URL for easier identification.
Click 'Add URL', then 'Save' to confirm.
You can now switch between RPC URLs for that network as needed.
If the network isnāt in your list, you can add it as a custom network. For this example, we will add the Polygon zkEVM to MetaMask.
Click on the current network name.
Select 'Add a custom network'.
Fill in the required fields:
Click 'Save', and the custom network will be added and selected as default.
An infrastructure for fast transaction delivery in Solana through its own intelligent routing mechanism.
LandFirst is GetBlock's intelligent transaction-routing technology for processing faster transactions on Solana. It works by routing your transactions through multiple optimized delivery paths, including GetBlockās Stake-Weighted Quality of Service (SWQoS) connections and the Jito auction mechanism.
Interested in building on Solana with LandFirst? Reach us for more information.
LandFirst automatically routes transactions through three complementary delivery mechanisms:
GetBlock's Own SWQoS Connections
Direct partnerships with high-stakes Solana validators
Guaranteed priority capacity through stake-weighted allocation
GetBlock-operated infrastructure with validator peering
Leased SWQoS Connections
Higher priority than unstaked RPC traffic, ensuring transactions cut ahead during congestion
Reserve priority bandwidth specifically for LandFirst traffic
Jito Block Engine Integration
MEV-aware auction mechanism for guaranteed inclusion
Bundle support for atomic multi-transaction operations
Priority placement through competitive tipping
By combining all three paths, LandFirst provides the highest probability of fast transaction inclusion on Solana.
LandFirst maximizes transaction inclusion by combining SWQoS priority routing, low-latency leader targeting, and parallel Jito submission. When a user sends a transaction, LandFirst checks the current leader schedule and picks the fastest path through our and our partnersā staked SWQoS validators, using private, low-hop connections to deliver the transaction directly to the upcoming leader with priority TPU capacity. At the same time, the transaction is also sent to Jito, where it enters the tip auction for guaranteed execution if the bundle wins. Whichever path lands first becomes the confirmed transaction, ensuring the highest possible probability of fast, next-block inclusion even under heavy network congestion.
LandFirst analyzes each transaction and selects the optimal delivery path based on:
Leader Schedule: Which validator is currently/soon producing blocks
Network Conditions: Current congestion and validator responsiveness
Transaction Priority: Priority fee amount and urgency
Geographic Location: network topology that defines the lowest-path latency to the current leader.
HFT & Arbitrage
Fast, reliable execution for high-frequency trading, arbitrage, market-making, and position rebalancing ā especially when every millisecond counts.
MEV & Keeper / Liquidation Bots
Ensures deterministic transaction landing for backruns, front-runs, liquidation races, and other MEV or keeper-bot strategies.
NFT Sniping & High-Demand Mints
Gives an edge for time-sensitive NFT events such as limited-supply mints, snipes, and competitive auctions.
Critical Time-Sensitive Transactions
For urgent or large-value moves ā e.g. multi-sig operations, time-bound transfers, or high-stakes governance ā where failure or delay is too costly.
Standard RPC nodes submit transactions via single, unstaked TPU connections. During congestion, these transactions are deprioritized or dropped entirely.
LandFirst is available on:
ā Shared Node Plans - All shared RPC users benefit automatically ā Dedicated Node Plans - Enhanced monitoring and configuration available ā No Additional Fee - Included in standard RPC access (tips are optional)
For consultation on optimal deployment architecture for your specific use case, contact
Explore how to add custom GetBlock RPC endpoints to Brave Wallet for greater security, transaction speed, and reliability
Brave Wallet supports many networks and offers extensive customization options. However, each of its chains uses a public RPC API endpoint, which is very bad for privacy and efficiency.
GetBlockās private RPC nodes can solve this problem. After downloading the Brave browser and setting up the wallet, visit https://account.getblock.io/ and get one of the 100+ available chain endpoints.
Using custom GetBlock nodes improves the Web3 experience in many ways:
Secure connections without privacy breaches
Lower latency and higher transaction speed
No overloads even during high chain activities
Every walletās network can be modified this way, and this step-by-step guide shows how to do that.
You need to set up the Brave wallet and prepare the GetBlock API endpoints.
Brave Wallet is inseparable from the Brave browser. So, download and install the browser from the . Itās available for desktop, Android, and iOS.
After opening the browser, look at the wallet icon in the upper right corner. Click on it to open the Brave Wallet. Import the account using a seed phrase or create a new one.
Now, itās time to prepare the working part: the GetBlock node.
Proceed to the GetBlock dashboard and create an account or log in.
Click on the Get button to add a new RPC endpoint, and select the Ethereum mainnet.
Pick the endpoint location. Currently, Frankfurt, Singapore, and New York endpoints are available for a free node. Selecting the physically closest one is usually the best option.
Click Get, and the endpoint is ready.
Itās now available via the access token URL and can be used to perform transactions, deploy smart contracts, and much more.
Free node endpoints offer a generous 50,000 free Compute Units per day with a 20 RPS limit. Itās more than enough for single-person activities.
Brave Wallet supports a wide range of EVM and non-EVM networks. Letās modify an Ethereum account.
Go to Brave Wallet settings
In the upper right corner of the wallet interface, click on the three-dot options () button and select Settings. Here, a list of supported networks can be found.
Locate the network in the list
If the network of interest is already present, such as with Ethereum, click on the three-dot options () button right of Ethereum and then select Edit to open the account settings.
Go to the wallet, and try to perform some actions with the Ethereum account:
Check the balance
Connect to dApps
Execute smart contracts
Make a transaction
In the GetBlock dashboard, track the remaining balance.
If a network of interest isnāt included in the network list, it can be added manually. Letās add the Polygon zkEVM network, a zero-knowledge L2.
Brave Wallet is very convenient for managing blockchain networks, with hundreds of EVM protocols available. GetBlock almost certainly has a node endpoint for active and popular ones.
If you genuinely believe that a network is unfairly missing, you may and suggest it.
Search the network ID in Brave settings
Return to the Wallet Networks menu. Instead of selecting existing networks, click on the Add button. Start typing āpolygon zkevmā to locate the network quickly.
After clicking on it, Brave fills all required fields automatically.
Get a networkās RPC URL at GetBlock
Return to the GetBlock dashboard, click Get again, and select Polygon zkEVM mainnet this time. Currently, only the Frankfurt region is available for zkEVM nodes.
Itās recommended to assign a custom account name, such as āPolygon zkEVM GetBlock,ā to distinguish the dedicated account.
Then, return to the wallet and locate a new Polygon zkEVM account with the ETH native token and a custom name.
As with GetBlockās Ethereum node, track the compute units usage at the GetBlock dashboard.
Power your Solana dApps and backends with the fastest, most reliable streaming data available. Yellowstone gRPC add-on is for apps that need every live event as fast as the network can deliver.
Yellowstone gRPC is a high-performance Solana Geyser plugin that provides real-time streaming access to on-chain data. Built by Triton One, it delivers blocks, transactions, and account updates with millisecond-level latency directly from Solana validators.
GetBlock offers managed Yellowstone gRPC endpoints as an add-on to Dedicated Solana Node subscriptions, eliminating the need for infrastructure setup and maintenance.
Near-zero latency: Streams data directly from validators, often hundreds of milliseconds faster than standard RPC/WebSocket APIs
High throughput: Handles millions of events per minute under load
Comprehensive streaming: Monitor accounts, transactions, blocks, slots, and program interactions in real-time
Rich filtering: Subscribe only to relevant updates using account keys, owner programs, or commitment levels
Yellowstone gRPC supports streaming the full range of Solana events:
Yellowstone gRPC is ideal for time-sensitive applications that need to react instantly to on-chain state changes:
High-frequency trading and MEV bots
On-chain indexers and data archives
Real-time analytics dashboards
DEX monitors and price feeds
To use Yellowstone gRPC on GetBlock:
A GetBlock account (sign up at )
A subscription
Yellowstone gRPC add-on enabled (included at no extra cost with Dedicated Nodes)
Here's a minimal TypeScript example to start streaming account updates:
Our support team is available 24/7 to assist with:
Add-on activation and endpoint setup
Integration guidance and troubleshooting
Performance optimization
Custom solutions for enterprise needs
Contact us through the or visit our .
Yellowstone gRPC is a Solana Geyser plugin developed by Triton One that feeds your application a continuous, low-latency stream of on-chain data
Solana applications often need live, high-throughput access to on-chain events. Solana gRPC plugin solves this core problem of real-time blockchain data access.
Yellowstone gRPC is the name given to the Dragonās Mouth Geyser pluginās gRPC interface in Triton Oneās āYellowstoneā suite for Solana. It allows opening streams and subscribing to native Solana on-chain events, receiving every new update in real time, with millisecond-level latency.
By plugging directly into validators, it pushes new blocks, transactions, and account updates to your backend the moment they occur.
The Geyser Plugin hooks into validator callbacks for ledger events and publishes those events to its own internal queues. A gRPC server then streams the queued events over the network to subscribed clients.
Geyser gRPC supports streaming the full range of common Solana events:
Account updates (writes): Every time an accountās data changes, a notification is emitted.
Transactions: Each transaction processed by the leader generates a stream event with all associated account changes.
Ledger entries: Lowālevel entry/shred events (raw blocks of ledger data) can also be streamed.
Block notifications: Clients can subscribe to be notified when a new block is completed.
Every update stream can include full transaction metadata, instruction details, and parsed logs ā essentially everything youād see in a or call, but pushed in real time.
In addition to streaming methods, Dragonās Mouth also exposes several unary RPCs via the same gRPC interface for quick queries about:
The Slot;
Block height;
Latest blockhash;
Valid blockhash.
Together, this provides a way to both fetch state on demand and receive updates in real time.
Near-zero latency: By streaming directly from leaders, Dragonās Mouth delivers updates often hundreds of milliseconds faster than standard RPC/WebSocket APIs.
High throughput: The plugin can handle millions of events per minute under load, built for Solanaās high transaction volume. Optional compression can be applied for even more efficiency.
Built-in support for bi-directional streaming: Keep-alives, ping/pong frames help maintain long-lived connections.
Overall, applications can keep pace with Solanaās peak TPS without data loss, receive only relevant updates, save bandwidth, and react faster.
Solana gRPC streaming capabilities are crucial for time-sensitive applications, apps that need to react the moment on-chain state changes without manual refreshes.
gRPC API ideal use cases include:
High-frequency trading or arbitrage systems (e.g. MEV bots);
On-chain indexers & archives;
Live analytics;
Real-time monitors for DEXes, NFTs, wallets, etc.;
Using Yellowstone gRPC for your Solana data means you get a high-throughput, low-latency, bidirectional streaming channel.
Instead of polling REST endpoints every few seconds or using Solanaās WebSocket API (which typically only updates after a block finalizes), the gRPC interface allows tracking every new event down the wire as it happens.
Overall, it removes much of the boilerplate: your backend code subscribes once, then simply reacts to incoming messages
Aptos Network API Reference for seamless interaction with APT nodes, enabling fast, secure, and scalable transactions on a next-generation Layer 1 blockchain.
Aptos is a Layer 1 blockchain built with the Move programming language, designed to deliver a fast, secure, scalable, and upgradeable ecosystem. With its modular architecture, Aptos enables frequent upgrades, rapid adoption of new technologies, and strong support for emerging use cases. The Aptos API provides developers with the ability to interact with the blockchain seamlessly and possibly. You can do the following with the Aptos API:
Query real-time blockchain data
Manage and monitor accounts and balances
Interact with smart contracts
Submit and track transactions
Monitor network activity in real-time
Each method will provide you with the following:
Clear description of functionality and use cases
Required input parameters
Sample requests and responses
Supported network
Note: This API is compatible only with Aptos Mainnet.
In this section, you will learn how to make your first call with either:
Axios
Python
Before you begin, you must have already installed npm or yarn on your local machine. If not, check out or .
Set up your project using this command:
For npm:
Or yarn:
This creates a project directory named aptos-api-quickstart and initialises a Node.js project within it.
Install Axios using this command: Using npm:
Using yarn:
Create a new file and name it index.js. This is where you will make your first call.
Set ES module "type": "module" in your package.json.
Before you begin, you must have installed Python and Pip on your local machine.
Set up your project using this command:
Set up a virtual environment to isolate dependencies:
Install the requests library:
Create a new file called and insert the following code:
Replace
Blockchain Information
/v1
Account-Related
/v1/accounts/{account_hash}
Example code for the /v1 JSON-RPC method. Дomplete guide on how to use /v1 json-rpc in GetBlock.io Web3 documentation.
This endpoint retrieves the latest information from the Aptos blockchain ledger, such as current chain ID, node role, latest and oldest ledger versions, epoch, block height, and more. In short, it provides an overview of Aptos and its health status.
Mainnet
None
URL (endpoint)
Example (cURL)
The /v1/info endpoint is useful for checking if a node is online and responding.
For example:
Developers can verify the latest block or ledger version to ensure the node is up-to-date.
Applications can notify users about the health of the blockchain, such as showing a modal alerting them to the current state when they log in to a dApp.
Replace
<ACCESS_TOKEN>with your actual access token from GetBlock.
When using this endpoint, you may encounter:
404 ā Incorrect or incomplete access token.
500 ā Network issues.
How to fix:
Use a stable and strong network connection.
Check or re-copy your access token.
Verify the URL to ensure it is correct and complete.
It is recommended to use this endpoint first to check the current status of the blockchain before integrating other endpoints into your application.
Example code for the /v1/accounts/{account_hash} json-rpc method. Дomplete guide on how to use /v1/accounts/{account_hash} json-rpc in GetBlock.io Web3 documentation.
This endpoint retrieves account details, such as the number of transactions submitted by an account and its authentication key.
Mainnet
URL
Example
This method can be used for:
Wallets to fetch sequence numbers before sending transactions (to prevent replay attacks).
Creating an account overview page or profile in a dApp.
Validating if an account exists on-chain to avoid sending assets to the wrong account.
Replace
<ACCESS_TOKEN>with your actual access token from GetBlock.
You may encounter responses like:
This means the account hash is incorrect or the account does not exist on-chain at the current ledger state.
403 ā Access token is missing.
By integrating /v1/accounts/{account_hash}, developers can:
Fetch sequence numbers for transaction signing.
Validate account existence and state (useful for onboarding users).
Support wallet and dApp account management.
Enable reliable transaction pipelines.
Example code for the /v1/estimate_gas_price json-rpc method. Дomplete guide on how to use /v1/estimate_gas_price json-rpc in GetBlock.io Web3 documentation.
This endpoint gets the estimated gas price for executing a transaction in the Aptos blockchain network.
Mainnet
None
Base URL
Example(cURL)*
This method can be used for:
Wallets can auto-suggest gas fees based on the user's urgency.
dApps can provide a āfast/normal/slowā fee slider to users.
Developers can programmatically ensure transactions wonāt fail due to low gas.
Cost optimisation for batch transactions.
Node(axios)
Python(Request)
By integrating /v1/estimate_gas_price into dApp, developers can:
Provide real-time fee estimation inside wallets and dApps.
Improve transaction confirmation rates by suggesting optimal gas.
Enhance user experience with clear trade-offs (fast vs cheap).
Avoid failed transactions due to underpriced gas.
An infrastructure for delivering the fastest on-chain updates by combining software-level acceleration (Fast Yellowstone) with optimized network traffic and routing (via shred-stream).
StreamFirst is GetBlock's infrastructure solution for delivering faster (ultra-low latency) on-chain state updates from the Solana blockchain.
By combining software-level acceleration with network-level optimization, StreamFirst enables developers to receive blockchain data faster than traditional RPC methods. This reduces the consistent polling updates, which either lead to timeouts or rate-limiting issues.
Interested in building on Solana with StreamFirst? for more information.
StreamFirst consists of two core optimization layers:
Fee paid (lamports)
Compute units used
List of program invocations
Nested/inner instructions
Data changes (what was modified)
Rent epoch information
Slot notifications: New slot boundaries (leaders or votes) can trigger slot events.
Protobuf/binary encoding: Each message arrives parsed and typed, not raw base64. Clients get structured fields (account diffs, token balance changes, parsed logs, etc.) instead of raw blobs.
Rich filtering: You can apply filters (by account key, owner program, data patterns, commitment level, etc.) so only matching updates are streamed.
DeFi strategy engines;
..and any app that needs pushāstyle updates.
Plans & Limits ā Understanding plans and payments.
Additional CU packages can be purchased as needed.
Add extra compute units (CU) to your account balance when needed without switching plans
Purchase additional CU packages when required
Additional CU packages can be purchased on demand
220M/month
600M/month
Custom
RPS Limit
20 RPS
100 RPS
300 RPS
500 RPS
Custom
Access Tokens
2
10
25
50
Custom
Extra CU Purchase
ā
ā
ā
ā
ā
20
40
debug_traceBlock
2
20
40
trace_call
2
20
40
trace_transaction
2
20
40
txpool_status
2
20
40
trace_replayTransaction
4
20
80
Block explorer URL
Optional field
https://zkevm.polygonscan.com/
RPC URL
The network's JSON-RPC URL from your GetBlock account
https://go.getblock.io/<ACCESS_TOKEN>/
Chain ID
The ID of the network
1101
Network name
Fetched automatically based on Chain ID
Polygon zkEVM
Currency symbol
Suggested automatically based on Chain ID
ETH
Protobuf encoding: Receive parsed, typed messages instead of raw base64 data
Bidirectional streaming: Maintain long-lived connections with built-in keep-alives
Alerting and notification systems
NFT marketplace trackers
Wallet activity monitors
Accounts
Real-time account updates including lamports, owner, and data
Transactions
Full transaction data with metadata and instruction details
Blocks
Block metadata including slot, parent slot, and timestamp
Slots
Slot notifications as they're processed by the leader
Block Meta
Block metadata with transaction counts and execution status
Integration
Add the following code to the file (index.js):
Replace
<ACCESS_TOKEN>with your actual access token from GetBlock.
Run the script:
The sequence number and authentication key log in your console like this:
<ACCESS_TOKEN>Run the script:
/v1/accounts/{account_hash}/resources
/v1/accounts/{account_hash}/resource/{resource_type}
/v1/accounts/{account_hash}/modules
/v1/accounts/{account_hash}/module/{module_name}
/v1/accounts/{account_hash}/transactions
Events
/v1/accounts/{account_hash}/events/{creation_number}
/v1/accounts/{account_hash}/events/{event_handle}/{field_name}
Blocks
/v1/blocks/by_height/{block_height}
/v1/blocks/by_version/{version}
Transactions
/v1/transactions
/v1/transactions/by_hash/{transaction_hash}
/v1/transactions/by_version/{version}
Additional Utility
/v1/estimate_gas_price
ledger_timestamp
string
Timestamp of the latest ledger version in microseconds
node_role
string
Role of this node in the network
oldest_block_height
string
Lowest block height available
block_height
string
Current block height
git_hash
string
Git hash of the node build
chain_id
integer
ID of the blockchain
epoch
string
Current epoch number
ledger_version
string
The latest version of the ledger
oldest_ledger_version
string
The earliest version of the ledger
account_hash
string
Aptos account address
Yes
Path
sequence_number
string
The number of transactions that have been submitted and committed from the account.
authentication_key
string
The authentication key associated with the account, in hex-encoded format.
Field
Type
Description
deprioritized_gas_estimate
String
Lower gas price estimate ā slower inclusion, suitable for non-urgent txns.
gas_estimate
String
Standard recommended gas price (balanced option).
prioritized_gas_estimate
String
Higher gas price estimate ā ensures faster transaction processing.
Status Code
Error Message
Cause
403
Forbidden
Missing or invalid <ACCESS_TOKEN>.
500
Internal server error
Node or network failure when estimating gas.
curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_chainId",
"params": [],
"id": "getblock.io"
}'import Client, {
SubscribeRequest,
CommitmentLevel
} from "@triton-one/yellowstone-grpc";
const client = new Client("https://go.getblock.io/", "YOUR_ACCESS_TOKEN");
const stream = await client.subscribe();
stream.write({
accounts: ["YourWalletPubkeyHere"],
commitment: CommitmentLevel.PROCESSED,
} as SubscribeRequest);
stream.on("data", (msg) => {
if (msg.accountChange) {
console.log(`Account updated: ${msg.accountChange.pubkey}`);
}
});import axios from 'axios'
let account = {
method: 'get',
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f',
};
axios.request(account)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});node index.js{
"Sequence_number": "219241",
"Authentication_key": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f"
}python main.pymkdir aptos-api-quickstart
cd aptos-api-quickstart
npm init --yesmkdir aptos-api-quickstart
cd aptos-api-quickstart
yarn init --yesnpm install axiosyarn add axiosmkdir aptos-api-quickstart
cd aptos-api-quickstartpython -m venv venv
source venv/bin/activate
# On Windows, use venv\Scripts\activatepip install requestsimport requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f"
response = requests.get(url)
print(response.text)https://go.getblock.io/curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/info'{
"block_height": "58851650",
"chain_id": 1,
"epoch": "2796",
"git_hash": "6568c5ee6a58b4f96c0780d4f66d7e573e61c418",
"ledger_timestamp": "1685696086534090",
"ledger_version": "152087593",
"node_role": "full_node",
"oldest_block_height": "1101178",
"oldest_ledger_version": "2287593"
}import axios from 'axios'
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/info',
headers: {}
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});https://go.getblock.io/<ACCESS-TOKEN>/curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f'{
"sequence_number": "234541",
"authentication_key": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f"
}import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f"
response = requests.get(url)
print(response.text)import axios from 'axios';
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f',
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});{
"sequence_number": "0",
"authentication_key": "0x00000000000000000000000bf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f"
}https://go.getblock.io/<ACCESS_TOKEN>curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/estimate_gas_price'{
"deprioritized_gas_estimate": 100,
"gas_estimate": 100,
"prioritized_gas_estimate": 150
}
const axios = require('axios');
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/estimate_gas_price',
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/estimate_gas_price"
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)No
Yes (via Jito)
Landing probability
60-90% (varies)
95%+ (measured)
Aspect
Standard RPC
LandFirst
Routing paths
Single path
Three paths (SWQoS + Jito)
Validator priority
None (unstaked)
High (stake-weighted)
Congestion handling
Fails or delays
Adaptive routing
Bundle support
No
Yes (via Jito)
MEV protection
Look at the RPC URLs settings fro Ethereum: usually, a default Brave Wallet endpoint is present here. As every wallet user connects to it by default, itās overloaded and insecure. Thatās why a custom RPC URL is essential for Web3 activities.
Add a custom API URL to the network
Go to the GetBlock dashboard and copy the newly obtained Ethereum RPC access token. Add it under RPC URLs as shown below.
Voilaāthe free and highly secure Polygon zkEVM node endpoint is ready.
Add a custom API URL to the new network
Copy the access token and go to the Brave settings. Add the new RPC URLs field and paste the access token.
Software-level acceleration: Accelerated Yellowstone gRPC implementation
Network-level acceleration: Optimized shred-stream delivery via direct validator connections.
StreamFirst optimizes the entire pipeline from validator broadcast to application delivery:
The network layer ensures the earliest possible data reception
Software layer ensures minimal processing latency
Result: Fastest end-to-end delivery of on-chain state updates
Yellowstone is a high-performance Geyser plugin that streams real-time blockchain data via gRPC interfaces. As a result of our partnership with the core Yellowstone team members, GetBlock's Accelerated Yellowstone implementation includes:
Optimized data serialization: Optimized the original version of the low-level logic to improve the speed of state updates compared to the original Yellowstone implementation, and reduced overhead in encoding and transmitting blockchain state.
Enhanced filtering mechanisms: More efficient subscription management for accounts, transactions, slots, and blocks
Improved connection handling: Better resource management for sustained high-throughput streams
Solana validators propagate blocks by breaking them into small fragments called "shreds" and distributing them via the Turbine protocol. StreamFirst taps into this raw data stream:
Direct shred reception: Receives block fragments (shreds) via UDP as validators broadcast them.
Early state reconstruction: Rebuilds block data before it's fully confirmed and distributed via standard RPC
GetBlock operates as a top-tier Solana node provider in Frankfurt, a zone with the highest density of Solana validator stake. This strategic positioning provides:
Proximity to major validators: Direct access to high-stake validators concentrated in the region
Ultra-low network latency: 6ms latency within Europe
Optimal shred reception: Positioned to receive validator broadcasts with minimal delay
The combination means you get blockchain state updates as validators are producing blocks, not after they've been fully processed and distributed.
Data Flow:
Block Production: Solana validators produce blocks and fragment them into "shreds."
State Reconstruction: Shreds are decoded and reassembled into transactions and account updates
Accelerated Processing: Optimized Yellowstone plugin processes data with reduced overhead
Client Delivery: Structured blockchain data streams to your application via standard gRPC
Traditional RPC methods introduce latency at multiple stages:
Waiting for block confirmation
HTTP request/response overhead
JSON parsing and serialization
StreamFirst bypasses these bottlenecks by:
Receiving data at the validator propagation speed
Using binary gRPC protocol (faster than JSON)
Streaming continuously without polling
Typical latency improvements: 25-30ms faster than standard Yellowstone gRPC
StreamFirst is ideal for applications where milliseconds matter:
High-frequency trading bots: React to price changes before slower competitors
MEV searchers: Identify arbitrage opportunities in real-time
DeFi protocols: Monitor liquidation events and oracle updates instantly
NFT sniping tools: Detect new listings and mints before they propagate widely
Analytics platforms: Collect comprehensive on-chain data with minimal delay
Wallet applications: Show users' balance and transaction updates in real-time
StreamFirst supports all standard Yellowstone gRPC subscription types:
Account updates: Monitor balance changes, data modifications, and ownership transfers
Transaction streams: Receive all transactions or filter by program/account
Slot updates: Track block production and commitment levels
Block data: Full block information, including all transactions and metadata
Program logs: Subscribe to specific program execution logs
StreamFirst is available as an add-on for GetBlock's dedicated Solana nodes. It's configured as a plugin in the node configurator and requires:
Dedicated node subscription
Geographic proximity to GetBlock's validator network for optimal performance
Additional fee based on data throughput requirements
StreamFirst gives developers a competitive edge by delivering Solana blockchain data at near-validator speed. The combination of accelerated Yellowstone software and optimized shard-stream networking, optimized shred-stream networking, and strategic Frankfurt positioning ensures low latency between your customer and dedicated node. This ensures your dApp has the earliest possible view of on-chain activityācritical for time-sensitive operations in DeFi, trading, and real-time analytics.
For consultation on optimal deployment architecture for your specific use case, contact GetBlock support team
GetBlock API docs: RPC endpoints, SDK guides, and developer tools. Everything you need to connect and build on 100+ blockchain networks
To get started, follow these steps:
Sign up: Create an account to access your Access Token.
Generate access token: Navigate to the dashboard, and generate your first access token for API authentication.
Choose the blockchain name and type: Select the blockchain network you want to interact with, set up testnet/mainnet, and choose the interface youāre going to use.
Send your first request:
GetBlock is offering one of the most comprehensive APIs toolkits in the segment supporting hundreds of dApps with fast and reliable connection to blockchain nodes.
Seamless connection to full and archive nodes
Shared and dedicated nodes: Tailored for your dAppās needs.
Programmable and non-programmable blockchains
L1 and L2 protocols
See full list: All mainstream RPC interfaces
WebSockets
JSON RPC
GraphQL
REST API
Add them in Lego-like manner:
DAS API
Firehose
Blockbook
Yellowstone Geyser
Need more? Donāt hesitate to contact sales:
Most *nix-based systems come with cURL pre-installed. cURL is a command-line tool and library for transferring data with URLs. To check if cURL is installed, run the following command:
Example of requesting the latest block number using the GetBlock API and cURL:
To run Python examples, ensure Python is installed along with the requests package. You can install the package using the following command:
Example:
For JavaScript examples, you'll need Node.js version 18 or later. Follow the official documentation to install the latest stable version globally. Verify your installation by running:
To execute Ruby examples, install Ruby on your machine. Refer to the official installation guide for details. Confirm installation by running:
We provide APIs for a wide range of networks, including:
Example code for the /v1/accounts/{account_hash}/resources JSON-RPC method. Дomplete guide on how to use /v1/accounts/{account_hash}/resources json-rpc in GetBlock.io Web3 documentation.
This endpoint retrieves all resources linked to a specific account at the latest ledger version. These resources include on-chain data such as the authentication key, sequence number, GUIDs, smart contract states, and tokens.
Mainnet
URL
Example
This method can be used for:
Checking on-chain state of tokens or smart contracts.
Tracking smart contract event counters for deposits/withdrawals.
Powering portfolio trackers or explorers that display account assets.
Supporting conditional logic in dApps (e.g., only allow staking if a required resource exists).
Replace
<ACCESS_TOKEN>with your actual access token from GetBlock.
Missing or invalid account hash ā Empty or malformed response.
403 ā Access token is missing or invalid.
By integrating /v1/accounts/{account_hash}/resources, developers can:
Read smart contract resources tied to an account (for DeFi, staking, etc.).
Power explorers or portfolio trackers to show account assets.
Support reliable transaction pipelines and conditional dApp logic.
Example code for the /v1/accounts/{account_hash}/events/{event_handle}/{field_name} JSON-RPC method. Дomplete guide on how to use /v1/accounts/{account_hash}/events/{event_handle}/{field_name} json-rp
This endpoint retrieves events for a given account using an event handle struct and a field name within that struct. It allows more precise event queries compared to using only the creation number.
Base URL
Example (cURL)
This endpoint can be used to:
Query specific event handles such as deposit_events or withdraw_events.
Display transaction logs tied to particular smart contracts or account resources.
Track contract-specific activity within dApps for analytics or notifications.
Replace
<ACCESS_TOKEN>with your actual GetBlock API token.
By integrating /v1/accounts/{account_hash}/events/{event_handle}/{field_name}, developers can:
Track token-specific events like deposits, withdrawals, mints, or burns.
Enable in-wallet notifications (e.g., āYou received 250 APTā).
Monitor DeFi or NFT protocol activity by subscribing to contract events.
Enhance analytics dashboards by focusing on targeted on-chain event streams.
Example code for the eth_accounts JSON RPC method. Дomplete guide on how to use eth_accounts JSON RPC in GetBlock Web3 documentation.
This method gets a list of addresses owned by the client.
None
This method is generally used to:
Retrieve the list of locally unlocked accounts on a full node.
Identify which account a node can use for signing transactions.
PreāWeb3 wallet integrations where the node itself managed keys.
The eth_accounts can help developers to:
Identify available signing accounts
Auto-select a default wallet in development
Validate that a local signer exists
Simplify onboarding in testing environments
Example code for the /v1/accounts/{account_hash}/events/{creation_number} JSON-RPC method. Дomplete guide on how to use /v1/accounts/{account_hash}/events/{creation_number} json-rpc in GetBlock.io Web
Example code for the /v1/accounts/{account_hash}/module/{module_name} JSON-RPC method. Дomplete guide on how to use /v1/accounts/{account_hash}/module/{module_name}json-rpc in GetBlock.io Web3 documen
Example code for the /v1/blocks/by_height/{block_height} json-rpc method. Дomplete guide on how to use /v1/blocks/by_height/{block_height} json-rpc in GetBlock.io Web3 documentation.
Example code for the eth_getBalance JSON RPC method. Дomplete guide on how to use eth_getBalance JSON RPC in GetBlock Web3 documentation.
Example code for the eth_gasPrice JSON RPC method. Дomplete guide on how to use eth_gasPrice JSON RPC in GetBlock Web3 documentation.
Example code for the eth_getBlockTransactionCountByHash JSON RPC method. Дomplete guide on how to use eth_getBlockTransactionCountByHash JSON RPC in GetBlock Web3 documentation.
- Mainnet

string
The starting point for retrieving resources
No
Query
limit
integer
The maximum number of resources per request
No
Query
counter
string
The counter value associated with a particular operation.
guid
object
Unique identifier (GUID) of the resource.
id
object
The resource identifier.
addr
string
The address associated with the resource.
creation_num
string
The creation number of the resource.
sequence_number
string
Tracks the order of transactions initiated by the account.
account_hash
string
Aptos account address
Yes
Path
ledger_version
string
The ledger version to get the account state
No
Query
type
string
The type format of the account resource.
data
object
The additional data or information related to the account resource.
authentication_key
string
The authentication key used to verify the identity of the account owner.
coin_register_events
object
Events associated with coin registration for the account.
start
string
Field name within the struct that holds the event handle.
Yes
Path
start
string
Starting point or offset for retrieving events. Defaults to latest if not provided.
No
Query
limit
integer
Maximum number of events to retrieve per request. Defaults to standard page size if unspecified.
No
Query
account_hash
string
Aptos account address
Yes
Path
event_handle
string
Struct type name that contains the event handle.
Yes
Path
guid.creation_number
string
Unique identifier for this event stream under the given account.
guid.account_address
string
Account address that owns this event handle.
sequence_number
string
Number of transactions submitted and committed on-chain by the account.
type
string
Type of event emitted.
403
Forbidden
Missing or invalid ACCESS_TOKEN.
404
Resource not found
Invalid event_handle or field_name.
500
Internal server error
Node or network issue ā retry the request later.
field_name
result
string
An array of addresses owned by the client.
If the accounts doesn't have any address, it returns empty array.
403
Missing or invalid ACCESS_TOKEN.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_accounts",
"params": [],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
jsonrpc: "2.0",
method: "eth_accounts",
params: [],
id: "getblock.io",
});
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
import requests
url = "https://go.getblock.io/<ACCESS-TOKEN>/"
headers = { "Content-Type": "application/json" }
payload = { "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": "getblock.io" }
response = requests.post(url, headers=headers, json=payload)
print(response.json())curl -hcurl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": "getblock.io"
}'python -m pip install requestsimport requests
url = "https://go.getblock.io/<ACCESS-TOKEN>/"
headers = { "Content-Type": "application/json" }
payload = { "jsonrpc": "2.0", "method": "eth_blockNumber", "params": [], "id": "getblock.io" }
response = requests.post(url, headers=headers, json=payload)
print(response.json())node -vruby -vhttps://go.getblock.io//
curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/resources?ledger_version=3357308041&limit=10'[
{
"type": "0x1::account::Account",
"data": {
"authentication_key": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f",
"coin_register_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f",
"creation_num": "0"
}
}
},
"guid_creation_num": "2",
"key_rotation_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f",
"creation_num": "1"
}
}
},
"rotation_capability_offer": {
"for": { "vec": [] }
},
"sequence_number": "234285",
"signer_capability_offer": {
"for": { "vec": [] }
}
}
}
]import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/resources?ledger_version=3357308041&limit=10"
response = requests.get(url)
print(response.text)import axios from 'axios';
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/resources?ledger_version=3357308041&limit=10',
headers: {}
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});https://go.getblock.io/<ACCESS\_TOKEN>/curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/events/0x1::account::Account/coin_register_events' [
{
"version": "2304959",
"guid": {
"creation_number": "0",
"account_address": "0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12"
},
"sequence_number": "0",
"type": "0x1::account::CoinRegisterEvent",
"data": {
"type_info": {
"account_address": "0x1",
"module_name": "0x6170746f735f636f696e",
"struct_name": "0x4170746f73436f696e"
}
}
},
{
"version": "2665347733",
"guid": {
"creation_number": "0",
"account_address": "0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12"
},
"sequence_number": "1",
"type": "0x1::account::CoinRegisterEvent",
"data": {
"type_info": {
"account_address": "0xec42a352cc65eca17a9fa85d0fc602295897ed6b8b8af6a6c79ef490eb8f9eba",
"module_name": "0x616d6d5f73776170",
"struct_name": "0x506f6f6c4c6971756964697479436f696e3c3078313a3a6170746f735f636f696e3a3a4170746f73436f696e2c203078663232626564653233376130376531323162353664393161343931656237626364666431663539303739323661396535383333386639363461303162313766613a3a61737365743a3a555344543e"
}
}
}
] import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/events/0x1::account::Account/coin_register_events"
response = requests.get(url)
print(response.text) import axios from 'axios';
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/events/0x1::account::Account/coin_register_events'
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_accounts",
"params": [],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_accounts",
"params": [],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "1",
"result": [
"0xd1f5279be4b4dd94133a23dee1b23f5bfe436tf3r"
]
}RBAC: access deniedconst { ethers } = require('ethers');
// Initialize Ethers provider with GetBlock
const provider = new ethers.JsonRpcProvider(
'https://go.getblock.us/<ACCESS-TOKEN>/'
);
// Using the method through Ethers
async function useEthersMethod() {
try {
// Method-specific Ethers implementation
const result = await provider.send('eth_accounts', []);
console.log('Result:', result);
return result;
} catch (error) {
console.error('Ethers Error:', error);
throw error;
}
}account_hash
string
Aptos account address.
Yes
Path
creation_number
integer
The creation number of the event handle to be retrieved.
Yes
Path
Base URL
Request Example (cURL)
version
string
Ledger version number at which the event was recorded.
guid
object
Globally unique identifier (GUID) for the event.
guid.creation_number
string
Creation number assigned to this event stream within the account.
guid.account_address
string
Address of the account that owns this event handle.
This method can be used for:
Tracking account-level activity logs such as deposits, withdrawals, and transfers.
Building blockchain explorers that display historical event data.
Monitoring DeFi or NFT protocols that emit custom contract events.
Triggering real-time alerts when specific on-chain events occur.
Replace
<ACCESS_TOKEN>with your actual GetBlock access token.
400
Invalid account address
The provided account_hash is invalid.
401
Unauthorized
Missing or invalid <ACCESS_TOKEN>.
404
Event stream not found
No event stream exists for the given creation_number.
422
Invalid creation number
By integrating /v1/accounts/{account_hash}/events/{creation_number}, developers can:
Optimise event tracking for NFT, DeFi, and gaming applications.
Build real-time activity feeds from on-chain actions.
Map blockchain transactions into user-friendly notifications.
Support advanced analytics for blockchain event visualisation.
account_hash
string
Aptos account address.
Yes
Path
module_name
string
The name of the smart contract module.
Yes
Path
Base URL
Example (cURL)
bytecode
string
Hex-encoded bytecode of the deployed module.
abi
object
ABI (Application Binary Interface) containing metadata for module interaction.
abi.address
string
Account address where the module is deployed.
abi.name
string
Name of the module.
This endpoint can be used to:
Retrieve module ABIs for building smart contract interaction interfaces.
Fetch module bytecode for on-chain security analysis and verification.
Display contract details in analytics dashboards or blockchain explorers.
Enable dApps to validate if a specific module exists before user interaction.
Python (requests)
Node(Axios)
403
Forbidden
Missing or invalid <ACCESS_TOKEN>.
404
Resource not found
The specified module does not exist.
500
Internal server error
Node or network issue. Retry the request later.
By integrating /v1/accounts/{account_hash}/module/{module_name}, developers can:
Retrieve module ABIs to construct transactions for smart contracts dynamically.
Validate wallet or dApp interactions by confirming module existence.
Fetch module bytecode for security inspection or automated audits.
Allow services or other contracts to interpret available structs and functions dynamically.
Parameter
Type
In
Required
Description
block_height
Integer
Path
Yes
Height (number) of the block to fetch.
with_transactions
Boolean
Query
No
If true, returns full transactions inside the block. Default: false.
Base URL
Example(cURL)
Field
Description
block_height
The height of the block
block_hash
The hash of the block at the specified height
block_timestamp
The time at which the block was created/added to the chain
first_version
The version number of the first transaction in the block
last_version
The version number of the last transaction in the block
transactions
An array containing the details of the transactions included in the block
This method can be used for:
Get a specific block by its height.
Explore transactions inside a given block.
Build block explorers or monitoring dashboards.
Python(Request)
Node(Axios)
Status Code
Error Message
Cause
403
Forbidden
Invalid or missing ACCESS_TOKEN.
410
Block has been pruned
No block exists for the specified height or pruned.
500
Internal server error
Node or network issue; retry later.
By integrating /v1/blocks/by_height/{block_height}, developers can:
Synchronise chain data by fetching blocks sequentially.
Monitor on-chain activity at the block level.
Enable dApps to verify inclusion of transactions at a given height.
address
string
yes
The account address to query (0x-prefixed).
block
string
yes
Block number or tag. Can be: "latest", "earliest", "pending" or a hex-encoded block number.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"id": "getblock.io",
"params": [
"0xb8b2522480f850eb198ada5c3f31ac528538d2f5",
"latest"
]
import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getBalance",
"id": "getblock.io",
result
string (hex)
Account balance in wei
eth_getBalance is used to:
Display a user's wallet balance in dApps and wallets
Check on-chain balances for dashboards or explorers
Validate whether an account can pay gas fees
Automated scripts can monitor whale wallets or treasury wallets
DeFi apps check collateral levels or borrowing capacity
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Wallet address isn't accurate or incomplete
The eth_getBalance can help developers:
Fetch balances dynamically without requiring a transaction
Power trustless dashboards and explorers
Validate user accounts before executing transactions
Track portfolio values in real time
Access historical balances using specific block numbers
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_gasPrice",
"id": "getblock.io",
"params": [],
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_gasPrice",
"id": "getblock.io",
result
string (hex)
Current average gas price in wei
eth_gasPrice is used to:
Determines the baseline cost for sending transactions
Allows wallets to calculate estimated fees
Helps dApps display up-to-date network fees
Useful for automated bots adjusting to network congestion
Let's developers optimize cost-sensitive interactions such as bridging, swapping, or minting
403
Forbidden
Missing or invalid ACCESS_TOKEN.
The eth_gasPrice can help developers:
Display real-time gas prices in interfaces
Adjust transaction fees automatically
Improve user experience during times of congestion
Support trustless fee estimation without relying on third-party APIs
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
jsonrpc: "2.0",
method: "eth_blockNumber",
params: [],
id: "getblock.io"
result
string
The block number of the most recently mined block as a hexadecimal string.
eth_blockNumber is used to:
Track the latest block height
Monitor chain progress or finality
Trigger event-based updates when the block number increases
403
Forbidden
Missing or invalid ACCESS_TOKEN.
The eth_blockNumber can help developers to:
Polling the chain every few seconds
Syncing contract state
Updating dashboards (TVL, gas metrics, transactions)
block_hash
string
yes
Hash of the block whose transaction count is being requested. Must be a valid 32-byte hex string with 0x prefix.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
result
string (hex)
Transaction count of the block. Returns null if the block is not found.
The eth_getBlockTransactionCountByHash is used to:
Counting total transactions in a given block
Building block explorers or analytics dashboards
Monitoring throughput or spikes in chain activity
Identifying empty or low-activity blocks
Pre-processing blocks before downloading the full transaction list
Reducing bandwidth when only counts are needed instead of full block data
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
The block hash isn't accurate or incomplete
The eth_getBlockTransactionCountByHash can help developers:
Power block explorers that show transaction counts without loading full blocks
Measure chain activity for dashboards and metrics
Build fast monitoring tools that track throughput
Reduce bandwidth usage by avoiding heavy block queries
Support systems that decide whether to fetch full block data based on count
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_newBlockFilter",
"params": [],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_newBlockFilter",
"params": [],
result
A hexadecimal string representing the ID of the created filter.
String
The eth_newBlockFilter method helps developers to:
Listen for newly created blocks without constant RPC polling
Build live dashboards and monitoring systems
Support lightweight clients and browser-based dApps
Track chain activity for indexers, explorers, or analytics tools
Implement auto-refresh on UIs when new blocks are published
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Invalid block number
Example code for the /v1/accounts/{account_hash}/resource/{resource_type} JSON-RPC method. Дomplete guide on how to use /v1/accounts/{account_hash}/resource/{resource_type} json-rpc in GetBlock.io Web
This endpoint gets an individual resource from a given account and at a specific ledger version. This is more specific than /resources since it targets one resource type directly.
Mainnet
Base URL
Example(cURL)
This method can be used to:
Fetch a specific token balance without retrieving all account resources.
Query a single resource type (like a staking pool or NFT ownership).
Used in wallets and DeFi apps where targeted resource data is required.
Python (Requests)
Node(Axios)
The possible error you may experience includes the following:
By integrating /v1/accounts/{account_hash}/resource/{resource_type, developers can:
Query a single CoinStore to show token balances in wallets.
Validate a userās participation in staking, liquidity pools, or governance.
Reduce bandwidth by fetching only the resource you need, instead of all resources.
Pull targeted NFT or token data for user profiles or marketplaces.
Example code for the /v1/transactions json-rpc method. Дomplete guide on how to use /v1/transactions json-rpc in GetBlock.io Web3 documentation.
This endpoint gets the list of recent transactions from the Aptos blockchain.
Mainnet
Base URL
Example(cURL)
This method is used for:
Display a feed of recent blockchain activity.
Monitor all user-submitted transactions in real time.
Build analytics dashboards for transaction patterns.
Node(Axios)
Python(Request)
By integrating /v1/transactions, developers can:
Stream blockchain activity into wallets and dApps.
Enable dashboards showing the latest transfers, mints, or contract calls.
Support DeFi/NFT protocols by tracking relevant transactions.
Provide analytics & insights on transaction frequency, volume, and patterns.
Example code for the /v1/transactions/by_version/{version} json-rpc method. Дomplete guide on how to use /v1/transactions/by_version/{version} json-rpc in GetBlock.io Web3 documentation.
This endpoint gets a transaction by its ledger version number from Aptos blockchain.
Mainnet
Base URL
Example(cURL)
This method is used for:
Retrieve details of a specific transaction by its version.
Debug failed transactions by checking vm_status.
Build explorers that let users search transactions by version.
Track system-level transactions like block epilogues.
Node(axios)
Python(Request)
By integrating /v1/transactions/by_version/{version}, developers can:
Trace exact transactions for auditing or compliance.
Debug dApps by fetching execution results and state changes.
Enable explorers to link transactions with block details. Monitor validators/system txns like block prologues and epilogues.
Example code for the eth_call JSON RPC method. Дomplete guide on how to use eth_call JSON RPC in GetBlock Web3 documentation.
This method executes a read-only smart contract call on the Arbitrum blockchain without creating a transaction.
This method does not modify the blockchain state. It only simulates the call and returns the output.
eth_call is used to:
Track the latest block height
Monitor chain progress or finality
Trigger event-based updates when the block number increases
The eth_call can help developers to:
Enables trustless frontends
Reads live contract state without gas
Supports dashboards, DeFi analytics, wallets, NFT explorers
Let's developers simulate transactions before execution
Example code for the eth_getBlockTransactionCountByNumber JSON RPC method. Дomplete guide on how to use eth_getBlockTransactionCountByNumber JSON RPC in GetBlock Web3 documentation.
This method returns the number of transactions in a block identified by its block number.
The eth_getBlockTransactionCountByNumber is used to:
Calculating chain throughput by measuring transactions per block
Building analytics dashboards that monitor block activity in real time
Lightweight block scanning without fetching full block data
Detecting unusually busy or empty blocks
The eth_getBlockTransactionCountByNumber can help developers:
Track live activity on the chain
Build explorers and dashboards without fetching heavy block objects
Detect transaction spikes for alerts and monitoring
Estimate network load to optimize dapp behavior
Example code for the eth_getUncleCountByBlockHash JSON RPC method. Дomplete guide on how to use eth_getUncleCountByBlockHash JSON RPC in GetBlock Web3 documentation.
This method returns the number of uncles in a block identified by its hash.
Arbitrum does not produce uncle blocks, so this method always returns "0x0", but it is provided for Ethereum compatibility.
Even though uncle blocks do not exist on Arbitrum, this method helps developers to:
Maintain compatibility with Ethereum tools and SDKs
Avoid breaking multi-chain indexers or dashboards
Normalise RPC responses when building explorers
Support Ethereum-style APIs for analytics and monitoring
Arbitrum Network API Reference for efficient interaction with ARB nodes, enabling fast, low-cost Layer 2 scaling solutions for Ethereum with high throughput and secure smart contracts.
Arbitrum is a suite of Ethereum Layer 2 scaling technologies built on the Arbitrum Nitro tech stack that includes Arbitrum One (a live implementation of the Arbitrum Rollup Protocol) and Arbitrum Nova (a live implementation of the Arbitrum AnyTrust Protocol).
Arbitrum chains are EVM-compatible blockchains that use an underlying EVM chain (e.g., Ethereum) for settlement and succinct fraud proofs (as needed). You can use Arbitrum chains to do everything you do on Ethereumāuse Web3 apps, deploy smart contracts, etc., but your transactions will be cheaper and faster.
Example code for the eth_getTransactionCount JSON RPC method. Дomplete guide on how to use eth_getTransactionCount JSON RPC in GetBlock Web3 documentation.
Example code for the eth_sendRawTransaction JSON RPC method. Дomplete guide on how to use eth_sendRawTransaction JSON RPC in GetBlock Web3 documentation.
Example code for the eth_getUncleCountByBlockNumber JSON RPC method. Дomplete guide on how to use eth_getUncleCountByBlockNumber JSON RPC in GetBlock Web3 documentation.
Example code for the eth_sign JSON RPC method. Дomplete guide on how to use eth_sign JSON RPC in GetBlock Web3 documentation.
https://go.getblock.io/
<ACCESS_TOKEN>curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/events/0'[
{
"version": "2665347733",
"guid": {
"creation_number": "0",
"account_address": "0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12"
},
"sequence_number": "1",
"type": "0x1::account::CoinRegisterEvent",
"data": {
"type_info": {
"account_address": "0xec42a352cc65eca17a9fa85d0fc602295897ed6b8b8af6a6c79ef490eb8f9eba",
"module_name": "0x616d6d5f73776170",
"struct_name": "0x506f6f6c4c6971756964697479436f696e3c3078313a3a6170746f735f636f696e3a3a4170746f73436f696e2c203078663232626564653233376130376531323162353664393161343931656237626364666431663539303739323661396535383333386639363461303162313766613a3a61737365743a3a555344543e"
}
}
}
]
import axios from 'axios';
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xc32f662cd9718f02d8a8e5628f8f642fa27cd9b5f457b406ed734901a4939e34/events/0?limit=1&start=1'
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xc32f662cd9718f02d8a8e5628f8f642fa27cd9b5f457b406ed734901a4939e34/events/0?limit=1&start=1"
response = requests.get(url)
print(response.text)https://go.getblock.io/<ACCESS_TOKEN>/curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12/module/curves'{
"bytecode": "0xa11ceb0b050000000b01000402040c03101e042e0c053a0f07497e08c701400687020a109102300ac1020a0ccb023e00000101000200000003000001090700000400000100000500010100000600010100000700010100010a000301000302040204040405020201020001010109000108020108000108010663757276657309747970655f696e666f06537461626c650c556e636f7272656c61746564126173736572745f76616c69645f63757276650969735f737461626c650f69735f756e636f7272656c617465640e69735f76616c69645f63757276650b64756d6d795f6669656c640854797065496e666f07747970655f6f66190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12000000000000000000000000000000000000000000000000000000000000000103081127000000000000126170746f733a3a6d657461646174615f76301c011127000000000000114552525f494e56414c49445f43555256450000020108010102010801000100000005380003040700270201010000000438013802210202010000000438013803210203010000010a380403030506080c00050838050c000b000200",
"abi": {
"address": "0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12",
"name": "curves",
"friends": [],
"exposed_functions": [
{
"name": "assert_valid_curve",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [{ "constraints": [] }],
"params": [],
"return": []
},
{
"name": "is_stable",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [{ "constraints": [] }],
"params": [],
"return": ["bool"]
},
{
"name": "is_uncorrelated",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [{ "constraints": [] }],
"params": [],
"return": ["bool"]
},
{
"name": "is_valid_curve",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [{ "constraints": [] }],
"params": [],
"return": ["bool"]
}
],
"structs": [
{
"name": "Stable",
"is_native": false,
"is_event": false,
"abilities": [],
"generic_type_params": [],
"fields": [{ "name": "dummy_field", "type": "bool" }]
},
{
"name": "Uncorrelated",
"is_native": false,
"is_event": false,
"abilities": [],
"generic_type_params": [],
"fields": [{ "name": "dummy_field", "type": "bool" }]
}
]
}
}import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12/module/curves"
response = requests.get(url)
print(response.text)import axios from 'axios';
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12/module/curves'
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});https://go.getblock.io/<ACCESS_TOKEN>curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/blocks/by_height/425737645?with_transactions=false'
{
"block_height": "445814139",
"block_hash": "0x0ac6b36f89b6a3fc9b7c2cabcb1f29cc624e609ed0978dd2a757b048196cb3bc",
"block_timestamp": "1759349325550593",
"first_version": "3492983944",
"last_version": "3492983948",
"transactions": null
}import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/blocks/by_height/425737645?with_transactions=false"
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)import axios from āaxiosā
let config = {
method: 'get',
maxBodyLength: Infinity,
url: "https://go.getblock.io/<ACCESS_TOKEN>/v1/blocks/by_height/425737645?with_transactions=false"
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getBalance",
"id": "getblock.io",
"params": [
"0xb8b2522480f850eb198ada5c3f31ac528538d2f5",
"latest"
],
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"id": "getblock.io",
"params": [
"0xb8b2522480f850eb198ada5c3f31ac528538d2f5",
"latest"
],
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getBalance", ["0xb8b2522480f850eb198ada5c3f31ac528538d2f5", "latest"]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: 'eth_getBalance',
params: ["0xb8b2522480f850eb198ada5c3f31ac528538d2f5", "latest"],
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x20a2c3a842980"
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_gasPrice",
"id": "getblock.io",
"params": [],
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_gasPrice",
"id": "getblock.io",
"params": [],
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_gasPrice", []);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: 'eth_gasPrice',
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x989680"
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function fetchBlockNumberFromProvider() {
try {
// Call the method ā this will resolve to a number (promise resolves to number)
const result = await provider.send("eth_blockNumber", []);
console.log("Block number result:", result);
return result;
} catch (error) {
console.error("Ethers Error fetching block number:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http("https://go.getblock.us/<ACCESS_TOKEN>"),
});
// Using the method through Viem
async function fetchAccountViem() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: 'eth_blockNumber',
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x183037af"
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getBlockTransactionCountByHash",
["0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getBlockTransactionCountByHash",
params: ["0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"]
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x5"
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_newBlockFilter",
"params": [],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_newBlockFilter",
"params": [],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send( "eth_newBlockFilter",
[]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_newBlockFilter",
params: [],
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0xd1073f126a0d0447987ff93c772d204c"
}start
string
Starting point or offset for retrieving events. Defaults to showing the latest transactions if omitted.
No
Query
limit
integer
Maximum number of events to retrieve per request. Defaults to the standard page size if not provided.
No
Query
sequence_number
string
Sequential index of this event in the event stream.
type
string
Fully qualified event type (e.g., 0x1::account::WithdrawEvent).
data
object
Additional data payload associated with the event (depends on event type).
Malformed or unsupported creation number format.
500
Internal server error
Node or network failure while retrieving events.
ledger_version
string
The ledger version to retrieve the module state. Optional parameter.
No
Query
abi.exposed_functions
array
List of public functions, including parameters, return types, and visibility.
abi.structs
array
Struct definitions with fields and type information.
type (transaction)
The type of the change
hash
The hash of the transaction
sender
The account from which the transaction was sent
sequence_number
The sequence of a transaction sent by the specific sender
max_gas_amount
The maximum amount of gas allocated for the execution of a transaction
gas_unit_price
The cost per unit of gas (determines the transaction fee)
expiration_timestamp_secs
The timestamp until which the transaction can be included in a block
payload
The data carried by a transaction
type (payload)
The type of payload indicates the purpose of the data contained
function
The function associated with the payload
type_arguments
An array specifying the types of arguments provided to the function
arguments
An array containing the actual arguments passed to the function
signature
An array with signature details
type (signature)
The type of signature used to verify authenticity
public_key
The public key of the account that generated the signature
signature (value)
The actual signature generated with the private key
The ledger version to get the account state
No
query
counter
string
The counter value associated with a particular operation
guid
object
the unique identifier (GUID) of the resource
id
objecct
The resource identifier
addr
string
The address associated with the resource
creation_num
string
The creation number of the resource
sequence_number
string
The sequence number tracks the order of transactions initiated by the account
Parameter
Data type
Description
Required
In
account_hash
string
Aptos account address
Yes
Path
resource_type
string
The type format of the account address to retrieve
Yes
path
ledger_version
type
string
The type format of the account address
data
object
The additional data or information related to the account resource
authentication_key
string
The authentication key associated with the account to verify the identity of account owner
coin_register_events
object
The events associated with coin registration for the specified response
Status Code
Error Message
Cause
403
Forbidden
Missing or invalid ACCESS_TOKEN.
404
Resource not found
The given resource type does not exist for this account.
500
Internal server error
Node or network issue. Retry later.
string
String
Hash of the state checkpoint for this transaction.
gas_used
String
Amount of gas consumed (0 here, since itās a system txn).
success
Boolean
Whether the transaction executed successfully.
vm_status
String
VM execution result.
accumulator_root_hash
String
Ledgerās global accumulator root after applying this transaction.
changes
Array
State changes caused (empty here).
timestamp
String
Unix timestamp in microseconds.
block_end_info
Object
Metadata about block execution limits.
block_end_info.block_gas_limit_reached
Boolean
Whether the blockās gas limit was hit.
block_end_info.block_output_limit_reached
Boolean
Whether block output size was exceeded.
block_end_info.block_effective_block_gas_units
Interger
Total effective gas used in the block.
block_end_info.block_approx_output_size
Integer
Approximate output size of the block in bytes.
type
String
Transaction type ā here itās block_epilogue_transaction (special system txn marking block end).
Parameter
Type
In
Required
Description
start
Integer
Query
No
Starting transaction version for pagination.
limit
Integer
Query
No
Number of transactions to return. Default: 25. Maximum: 100.
Field
Type
Description
version
String
Global transaction version (unique ID in Aptos ledger).
hash
String
Transaction hash.
state_change_hash
String
Hash of all state changes caused by this transaction.
event_root_hash
String
Merkle root hash of all events emitted.
Status Code
Error Message
Cause
403
Forbidden
Missing or invalid ACCESS_TOKEN.
500
Internal server error
Node or network issue; retry later.
state_checkpoint_hash
String
Hash of the state checkpoint.
gas_used
String
Amount of gas consumed.
success
Boolean
Whether transaction executed successfully.
vm_status
String
Result status from Aptos VM.
accumulator_root_hash
String
Global accumulator root hash.
changes
Array
State changes applied (empty for system txns).
timestamp
String
Unix timestamp in microseconds.
block_end_info
Object
Metadata about block execution.
block_end_info.block_gas_limit_reached
Booleab
Blockās gas limit was reached.
block_end_info.block_output_limit_reached
Boolean
Blockās output size limit was hit.
block_end_info.block_effective_block_gas_units
Integer
Effective gas used in this block.
block_end_info.block_approx_output_size
Interger
Approximate output size of block in bytes.
type
String
Transaction type (e.g., user_transaction, block_epilogue_transaction).
Parameter
Data type
Description
Required
In
version
integer
The ledger version
Yes
Path
Field
Type
Description
version
String
Global transaction version number.
hash
String
Hash of the transaction.
state_change_hash
String
Hash of all state changes from this txn.
event_root_hash
String
Merkle root hash of all events.
Status Code
Error Message
Cause
403
forbidden
Missing or invalid <ACCESS_TOKEN>.
410
Ledger version has been pruned
Incorrect version number or being pruned
500
Internal server error
Node or network issue; retry later.
state_checkpoint_hash
gas
string (hex)
optional
Gas limit for the simulated call
gasPrice
string (hex)
optional
Ignored for simulations but allowed for compatibility
value
string (hex)
optional
Amount of ETH to send with the call (usually zero)
data
string
yes
Encoded function selector plus parameters
block tag
string or hex
optional
Block context for the simulation. Default is latest
transaction
object
yes
Main transaction object containing the call data
from
string
optional
Caller address used for the simulation. Included inside the transaction object
to
string
yes
result
string
The return value of the executed contract function, encoded as a hexadecimal string.
403
Forbidden
Missing or invalid ACCESS_TOKEN.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_call",
"id": "getblock.io",
"params": [
{
"to": "0x1F98431c8aD98523631AE4a59f267346ea31F984",
"data": "0x8da5cb5b"
},
"latest"
]
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_call",
"id": "getblock.io",
"params": [
{
"to": "0x1F98431c8aD98523631AE4a59f267346ea31F984",
"data": "0x8da5cb5b"
},
"latest"
]
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
Smart contract address to call
Supporting explorers and monitoring tools that show activity patterns
Streamline backend indexing by filtering blocks based on transaction count
block_number
string
yes
Block number in hex format, or a keyword such as latest, earliest, or pending.
result
string (hex)
Number of transactions in the specified block. Returns null if the block does not exist.
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
The block hash isn't accurate or incomplete or keyword missing
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByNumber ",
"params": [
"latest"
],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByNumber",
"params": [
"latest"
],
"id": "getblock.io"
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
block_hash
string
yes
The hash of the block whose uncle count is requested. Must be a 32-byte hex string starting with 0x.
result
The number of uncle blocks as a hexadecimal string.
String
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Invalid block hash
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
],
"id": "getblock.io"
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
https://go.getblock.io/<ACCESS-TOKEN>/curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/resource/0x1::account::Account'{
"type": "0x1::account::Account",
"data": {
"authentication_key": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f",
"coin_register_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f",
"creation_num": "0"
}
}
},
"guid_creation_num": "2",
"key_rotation_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f",
"creation_num": "1"
}
}
},
"rotation_capability_offer": {
"for": {
"vec": []
}
},
"sequence_number": "250163",
"signer_capability_offer": {
"for": {
"vec": []
}
}
}
}
import requests
url = "https://go.getblock.io/b293629b1b3a4e188efb3c4e94d133b6/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/resource/0x1::account::Account"
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
import axios from 'axios'
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/b293629b1b3a4e188efb3c4e94d133b6/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f/resource/0x1::account::Account',
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
https://go.getblock.io/<ACCESS_TOKEN>curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions?limit=1'[
{
"version": "3556744764",
"hash": "0x1cd28f386d48edfaf30c822117bd0b971e349c59f5fdd08f284558b33ac1715f",
"state_change_hash": "0xafb6e14fe47d850fd0a7395bcfb997ffacf4715e0f895cc162c218e4a7564bc6",
"event_root_hash": "0x414343554d554c41544f525f504c414345484f4c4445525f4841534800000000",
"state_checkpoint_hash": "0xe8daf9e9f3986dc69e0247b5638af4f55a6e5912da8a2c71e1fa537009a59964",
"gas_used": "0",
"success": true,
"vm_status": "Executed successfully",
"accumulator_root_hash": "0x6a006a1a2d4d22b7fdf4ca27a31aac610c3911429d8e5f925e31016738b225e2",
"changes": [],
"timestamp": "1760341338522220",
"block_end_info": {
"block_gas_limit_reached": false,
"block_output_limit_reached": false,
"block_effective_block_gas_units": 71,
"block_approx_output_size": 7846
},
"type": "block_epilogue_transaction"
}
]
const axios = require('axios');
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions?limit=1',
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions?limit=1"
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
https://go.getblock.io/<ACCESS_TOKEN>curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions/by_version/3363904007'{
"version": "3363904007",
"hash": "0xd797b944ed8657406a1b09a5928048093399fc0a2f576d3e57c0f9cedbf95c4a",
"state_change_hash": "0xafb6e14fe47d850fd0a7395bcfb997ffacf4715e0f895cc162c218e4a7564bc6",
"event_root_hash": "0x414343554d554c41544f525f504c414345484f4c4445525f4841534800000000",
"state_checkpoint_hash": "0xbf257d934f991d1e7d74079cc9060d3ac005aaa208d93a1fd4928dfc224bba53",
"gas_used": "0",
"success": true,
"vm_status": "Executed successfully",
"accumulator_root_hash": "0xc985314d5c118899c649b772c237178c63f328e7d286aceea01a30373d491d95",
"changes": [],
"timestamp": "1757261767411156",
"block_end_info": {
"block_gas_limit_reached": false,
"block_output_limit_reached": false,
"block_effective_block_gas_units": 500,
"block_approx_output_size": 21541
},
"type": "block_epilogue_transaction"
}
const axios = require('axios');
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions/by_version/3541136893',
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions/by_version/3541136893"
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_call",
"id": "getblock.io",
"params": [
{
"to": "0x1F98431c8aD98523631AE4a59f267346ea31F984",
"data": "0x8da5cb5b"
},
"latest"
]
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{{
"jsonrpc": "2.0",
"method": "eth_call",
"id": "getblock.io",
"params": [
{
"to": "0x1F98431c8aD98523631AE4a59f267346ea31F984",
"data": "0x8da5cb5b"
},
"latest"
]
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x0000000000000000000000002bad8182c09f50c8318d769245bea52c32be46cd"
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/24915a36b17143a891d3b10447615258";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
// Call the method ā this will resolve to a number (promise resolves to number)
const result = await provider.send("eth_call", [
{
to: "0x1F98431c8aD98523631AE4a59f267346ea31F984",
data: "0x8da5cb5b",
},
"latest",
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("Ethers Error fetching block number:", error);
throw error;
}
}
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByNumber",
"params": [
"latest"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getBlockTransactionCountByNumber",
"params": [
"latest"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x8"
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getBlockTransactionCountByNumber",
["latest"]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getBlockTransactionCountByNumber",
params: ["latest"]
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x0"
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send( "eth_getUncleCountByBlockHash",
[
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getUncleCountByBlockHash",
params: [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
],
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
High Throughput & Low Fees: Arbitrum offers faster transaction speeds and significantly lower fees than the Ethereum mainnet, while maintaining EVM support, making it ideal for high-volume applications like DeFi or gaming.
EVM Compatibility: Arbitrum chains are Ethereum-compatible and allow you to deploy Solidity smart contracts, as well as Vyper and other languages that compile to EVM bytecode.
Extended Language Support (Stylus): The latest version of the Arbitrum tech stack, called Stylus, maintains Nitro's Ethereum compatibility while enabling the development of highly performant smart contracts in programming languages such as Rust, C++, and C.
Fraud-Proof Security: The Arbitrum Rollup Protocol is a trustless, permissionless protocol that uses its underlying base layer for data availability and inherits its security.
Cross-Chain Interactions: Every Arbitrum chain includes a bridge to/from its parent chain. Arbitrum enables easy cross-chain interactions, asset transfers, and data exchange with Ethereum and other EVM-compatible networks, fostering a connected ecosystem for multi-chain dApps.
In this section, you will learn how to make your first call with either:
Axios
Python
Before you begin, you must have already installed npm or yarn on your local machine. If not, check out npm or yarn.
Set up your project using this command:
For npm:
Or yarn:
This creates a project directory named aptos-api-quickstart and initialises a Node.js project within it.
Install Axios using this command: Using npm:
Using yarn:
Create a new file and name it index.js. This is where you will make your first call.
Set the ES module "type": "module" in your package.json.
Add the following code to the file (index.js):
Replace
<ACCESS_TOKEN>with your actual access token from GetBlock.
Run the script:
The sequence number and authentication key log in your console like this:
Before you begin, you must have installed Python and Pip on your local machine.
Set up your project using this command:
Set up a virtual environment to isolate dependencies:
Install the requests library:
Create a new file called main.py and insert the following code:
Replace
<ACCESS_TOKEN>with your actual access token from GetBlock.
Run the script:
Mainnet
Sepolia
address
string
yes
The address for which to retrieve the transaction count. Must be a hex string with 0x prefix.
block
string
yes
Block context for the query. Accepted values include latest, earliest, pending, or a block number in hex.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getTransactionCount",
"params": [
"0xb8b2522480f850eb198ada5c3f31ac528538d2f5",
"latest"
],
"id": "getblock.io"
import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getTransactionCount",
"params": [
"0xb8b2522480f850eb198ada5c3f31ac528538d2f5"
result
string (hex)
Number of transactions sent from this address. Equivalent to the account nonce.
The eth_getTransactionCount :
Determining the correct nonce before sending a new transaction
Replaying transaction history for analytics or dashboards
Monitoring the activity of accounts in explorers
Validating whether a wallet has pending transactions
Preventing double-spending by ensuring nonces are sequential
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Invalid address
Block parameter not recognized
The eth_getTransactionCount method helps developers to:
Manage nonces automatically when sending transactions
Prevent duplicate transactions by checking the latest nonce
Build reliable wallet transaction pipelines
Track account activity in explorers and dashboards
Detect pending transactions by comparing pending vs latest values
Support batch transaction systems that depend on precise nonce control
string
Hex encoded raw signed transaction. Must include nonce, gas, gasPrice or maxFee fields, to, value, data, and signature fields.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
method": "eth_sendRawTransaction",
"params": [
"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"
],
"id": "getblock.io"
import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_sendRawTransaction",
"params": [
"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"
result
The hash of the submitted transaction, as a hexadecimal string.
String
The eth_sendRawTransaction method helps developers to:
Submit fully signed transactions generated offline or by hardware wallets
Broadcast transactions without exposing private keys
Support automated transaction pipelines such as claim bots and arbitrage bots
Enable backend servers to send prebuilt transactions securely
Integrate custom signing flows for multi-chain smart contracts
Allow transaction submission even in environments without built in wallets
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-3200
max fee per gas less than block base fee
Invalid transaction
Insufficient funds
Using eth_sendRawTransaction with web3.js enables developers to:
Build backend services that prepare and sign transactions in a secure environment
Trigger automated onchain actions from server scripts
Support multisig configurations where the final signed output is broadcast via RPC
Allow dapps to submit transactions after signing via external wallets
Integrate custom key management systems or HSM based signing
signedTransactionData
block_number
string
yes
The block number in hex (for example "0x1a"), or predefined tags like "latest", "earliest", or "pending".
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockNumber",
"params": [
"latest"
],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockNumber",
"params": [
"latest"
result
The number of uncle blocks as a hexadecimal string.
String
Although Arbitrum never returns a nonzero value, this method helps developers to:
Maintain multi-chain compatibility with Ethereum RPC methods
Prevent breaking explorers or indexers that expect the method
Use the same codebase across EVM chains without conditionals
Ensure analytics tools can safely query block structure
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Invalid block number
address
string
The account address that signs the message. Must be unlocked or handled by a wallet.
message
string
The raw message to sign (hex encoded or UTF-8 encoded).
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_sign",
"params": [
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"0x48656c6c6f20576f726c64"
],
"id": "getblock.io"
import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_sign",
"params": [
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
result
The hash of the submitted transaction, as a hexadecimal string.
String
The eth_sign method helps developers to:
Verify a user identity without sending a transaction
Implement login flows for dApps (Sign-in with Ethereum style)
Generate signatures for permit, authentication, and meta transactions
Build trustless systems where only message signatures (not transactions) are needed
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-3200
Unknown account
Invalid account address
user rejected request
message must be hex or string
The eth_sign method enables developers to:
Implement secure message signing with intuitive UX
Build login or authorization flows for any dApp
Create contract interactions that rely on signed messages
Validate signed payloads on servers or smart contracts
Use MetaMask or WalletConnect to sign and broadcast actions securely
Example code for the /v1/blocks/by_version/{version} JSON-RPC method. Дomplete guide on how to use /v1/blocks/by_version/{version} json-rpc in GetBlock.io Web3 documentation.
This endpoint gets a transaction by its ledger version number from Aptos blockchain.
Mainnet
Base URL
Example(cURL)
This method is used for:
Retrieve details of a specific transaction by its version.
Debug failed transactions by checking vm_status.
Build explorers that let users search transactions by version.
Track system-level transactions like block epilogues.
Node(Axios)
Python(Request)
By integrating /v1/transactions/by_version/{version}, developers can:
Trace exact transactions for auditing or compliance.
Debug dApps by fetching execution results and state changes.
Enable explorers to link transactions with block details. Monitor validators/system txns like block prologues and epilogues.
Example code for the eth_getStorageAt JSON RPC method. Дomplete guide on how to use eth_getStorageAt JSON RPC in GetBlock Web3 documentation.
This method returns the value stored at a specific storage slot of a contract. Every smart contract stores its data in 32-byte slots, and this method provides direct low-level access to them.
The eth_getStorageAt is used to:
Reading contract variables without calling a function
Inspecting mappings, arrays, and structs by computing their storage slots
Powering dashboards and analytics tools that pull historical state data
Helping wallets validate allowance, balances, or approvals stored on-chain
The eth_getStorageAt method helps developers to:
Build trustless analytics dashboards
Inspect contract internals without a function call
Recover lost data values during debugging
Read live smart contract state with zero gas
Example code for the eth_getCode JSON RPC method. Дomplete guide on how to use eth_getCode JSON RPC in GetBlock Web3 documentation.
This method returns the bytecode stored at a specific address. If the address has no smart contract deployed, the result will be 0x.
The eth_getCode is used to:
Checking if an address is a contract or an externally owned account
Verifying onchain deployments for security audits
Allowing frontends to detect contract upgrades by comparing bytecode
Supporting explorers that display contract metadata
The eth_getCode method helps developers to:
Detect whether a user is interacting with a contract or a wallet
Validate deployed bytecode for audit and debugging purposes
Build tools that identify proxies, multicall contracts, routers, and libraries
Support trustless dapps that rely on on-chain introspection
Example code for the eth_subscribe JSON RPC method. Дomplete guide on how to use eth_subscribe JSON RPC in GetBlock Web3 documentation.
This method allows developers to receive real-time notifications regarding new block headers on the Arbitrum blockchain; it sends notifications whenever a new block is added.
Note that subscriptions require a WebSocket connection and for you to use this method in the console.Install WebSocket cat with:npm install -g wscat
The eth_subscribe method helps developers to:
Build real-time dashboards that stream block and transaction activity.
Monitor contract events instantly without polling.
Detect pending transactions for mempool analytics, wallets, and trading bots.
Track node sync progress for DevOps use cases.
The eth_subscribe method helps developers to:
Build real-time dashboards that stream block and transaction activity.
Monitor contract events instantly without polling.
Detect pending transactions for mempool analytics, wallets, and trading bots.
Track node sync progress for DevOps use cases.
Example code for the eth_newFilter JSON RPC method. Дomplete guide on how to use eth_newFilter JSON RPC in GetBlock Web3 documentation.
This method creates a filter that notifies the client when matching logs are generated
Object
The eth_newFilter method helps developers to:
Subscribe to smart contract events
Build dashboards or indexers that react to chain activity
Monitor ERC20 transfer logs
Track DeFi protocol events like swaps or deposits
Using eth_newFilter allows developers to:
Build interfaces that listen for contract events without needing WebSocket support
Implement background polling workers for analytics dashboards
Detect state changes in dapps and update UI instantly
Create automated bots such as liquidation bots or claim bots
Example code for the eth_sendTransaction JSON RPC method. Дomplete guide on how to use eth_sendTransaction JSON RPC in GetBlock Web3 documentation.
Example code for the eth_getUncleByBlockHashAndIndex JSON RPC method. Дomplete guide on how to use eth_getUncleByBlockHashAndIndex JSON RPC in GetBlock Web3 documentation.
Example code for the eth_getUncleByBlockNumberAndIndex JSON RPC method. Дomplete guide on how to use eth_getUncleByBlockNumberAndIndex JSON RPC in GetBlock Web3 documentation.
mkdir arbitrum-api-quickstart
cd arbitrum-api-quickstart
npm init --yesnpm install axiosyarn add axiosmkdir arbitrum-api-quickstart
cd arbitrum-api-quickstartpython -m venv venv
source venv/bin/activate
# On Windows, use venv\Scripts\activatepip install requestsimport requests
import json
url = "https://go.getblock.us/<ACCESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
https://go.getblock.us/https://go.getblock.iomkdir arbitrum-api-quickstart
cd arbitrum-api-quickstart
yarn init --yesimport requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getTransactionCount",
"params": [
"0xb8b2522480f850eb198ada5c3f31ac528538d2f5",
"latest"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getTransactionCount",
"params": [
"0xb8b2522480f850eb198ada5c3f31ac528538d2f5",
"latest"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getTransactionByHash",
[
"0xfd11ef35c7179439723e026cb7857ea5a2e48a19257bec00b0ed26672f632181"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getTransactionCount",
params: ["0xb8b2522480f850eb198ada5c3f31ac528538d2f5", "latest"]});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x50"
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_sendRawTransaction",
"params": [
"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
method": "eth_sendRawTransaction",
"params": [
"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_sendRawTransaction",
[
"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_sendRawTransaction",
params: [
"0xf869018203e882520894f17f52151ebef6c7334fad080c5704d77216b732881bc16d674ec80000801ba02da1c48b670996dcb1f447ef9ef00b33033c48a4fe938f420bec3e56bfd24071a062e0aa78a81bf0290afbc3a9d8e9a068e6d74caa66c5e0fa8a46deaae96b0833"
]
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0xe670ec64341771606e55d6b4ca35a1a6b75ee3d5145a99d05921026d1527331"
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockNumber",
"params": [
"latest"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getUncleCountByBlockNumber",
"params": [
"latest"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getUncleCountByBlockNumber",
[
"latest"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getUncleCountByBlockNumber",
params: ["latest"],
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x0"
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_sign",
"params": [
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"0x48656c6c6f20576f726c64"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_sign",
"params": [
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"0x48656c6c6f20576f726c64"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_sign",
[
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"0x48656c6c6f20576f726c64"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0xbdfdd41c9ad20871e3ec6e9e...c73f338fd1b1c7784cf9c"
}last_version
string
Last transaction version included in this block.
transactions
objects
List of transactions contained in this block.
transactions.type
string
Type of the transaction (e.g., user_transaction, block_metadata_transaction).
transactions.hash
string
Unique hash identifying the transaction.
transactions.sender
string
Account address that initiated the transaction.
transactions.sequence_number
string
The senderās sequence number for this transaction.
transactions.max_gas_amount
string
Maximum gas units the sender is willing to spend.
transactions.gas_unit_price
string
Gas price per unit.
transactions.expiration_timestamp_secs
string
Expiration timestamp (in seconds) after which the transaction becomes invalid.
transactions.payload
object
Payload object describing the action being executed.
transactions.payload.type
string
Type of payload (e.g., entry_function_payload).
transactions.payload.function
string
Function name being called (e.g., 0x1::coin::transfer).
transactions.payload.type_arguments
array
Type arguments for the function (e.g., token types).
transactions.payload.arguments
array
Arguments passed to the function (e.g., recipient address, amount).
transactions.signature
object
Signature object verifying the transaction.
transactions.signature.type
string
Type of cryptographic signature (e.g., ed25519_signature).
transactions.signature.public_key
string
Public key of the sender.
transactions.signature.signature
string
Cryptographic signature validating the transaction.
Parameter
Data type
Description
Required
In
version
integer
The ledger version
Yes
Path
with_transactions
boolean
To contain transactions' details or not
no
Query
block_height
string
Height of the block in the blockchain.
block_hash
string
Unique hash identifying the block.
block_timestamp
string
Timestamp (in microseconds) when the block was created.
first_version
string
First transaction version included in this block.
Status Code
Error Message
Cause
403
forbidden
Missing or invalid <ACCESS_TOKEN>.
410
Ledger version has been pruned
Incorrect version number or being pruned
500
Internal server error
Node or network issue; retry later.
Supporting audits by letting developers inspect raw contract storage
Validate approvals or configurations stored in private mappings
address
string
yes
The target contract address. Must be a valid Ethereum-style address.
position
string (hex)
yes
The storage slot index. Must be a 32-byte hex value (e.g. "0x0", "0x1", "0xabc...").
block_number
string
yes
Block identifier such as "latest", "earliest", "pending", or a hex-encoded block number.
result
string (hex)
32-byte hex value stored at the given slot. Empty slots return "0x000...000".
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
The Address not 20 bytes or missing prefix
Slot value not valid hex
Block number incorrect or out of range
keyword missing
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getStorageAt",
"params": [
"0x80d40e32FAD8bE8da5C6A42B8aF1E181984D137c",
"0x0",
"latest"
],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getStorageAt",
"params": [
"0x80d40e32FAD8bE8da5C6A42B8aF1E181984D137c",
"0x0",
"latest"
],
"id": "getblock.io"
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
Identifying proxy contracts by checking for minimal bytecode patterns
Ensure safe interactions by verifying contract code before sending transactions
address
string
yes
The target address to inspect. Must be a valid 20 byte Ethereum-style address.
block_number
string
yes
The block number or state override reference such as latest, earliest, or pending.
result
string (hex)
Contract bytecode at the given address. Returns 0x if the address is not a contract.
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
The Address not 20 bytes or missing prefix
block hash isn't accurate or incomplete
keyword missing
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getCode",
"params": [
"0x9b956e3d318625be2686ae7268d81777c462d41f",
"latest"
],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getCode",
"params": [
"0x9b956e3d318625be2686ae7268d81777c462d41f",
"latest"
],
"id": "getblock.io"
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
object.parenthash
string
Hash of the previous block used to generate the current block. Also known as the 'parent block'
object.nonce
string or null
The hash used to demonstrate proof-of-work. null if the block is pending. Returns 0x0000000000000000 when the consensus is proof-of-stake
object.sha3uncles
string
The hash of the list of uncles included in the block. Used to identify the block uniquely and to verify the integrity of the block's data
object.logsbloom
string or null
The bloom filter for the logs of the block, a data structure that allows for efficient membership testing of elements in a set (the logs included in the block). null if pending
object.transactionsroot
string
The root of the transaction trie of the block. Allows Arbitrum nodes to verify the integrity of the transactions in a block
object.stateroot
string
The root of the final state trie of the block. Included in the block header and used to verify the integrity of the state at the time the block was processed
object.receiptsroot
string
The root of the receipts trie of the block. A 32-byte hash of the root node of the receipts trie of all transactions in the block. Used to verify the integrity of the receipts data for all transactions
object.miner
string
The address of the miner receiving the reward
object.difficulty
string
A measure of how hard it is to find a valid block for the Arbitrum blockchain. A number that increases as more miners join the network and more blocks are added to the chain, encoded as hexadecimal
object.totaldifficulty
string
The cumulative sum of the difficulty of all blocks that have been mined in the Arbitrum network since the inception of the network. Measures the overall security and integrity of the Arbitrum network
object.extradata
string
Extra data included in a block by the miner who mined it. Often includes messages or other information related to the block
object.size
string
The size of this block in bytes as an integer value, encoded as hexadecimal
object.gaslimit
string
The maximum gas allowed in this block, encoded as hexadecimal
object.gasused
string
The total used gas by all transactions in this block, encoded as hexadecimal
object.timestamp
string
The Unix timestamp for when the block was collated
object.transactions
array
An array of transaction objects. See eth_getTransactionByHash for the exact shape
object.uncles
array
An array of uncle hashes
Receive event-based updates for DeFi protocols, NFT marketplaces, or governance systems
Receive event-based updates for DeFi protocols, NFT marketplaces, or governance systems.
subscription name
string
Yes
The type of event to subscribe to (e.g., newHeads, logs, newPendingTransactions, syncing).
subscription
string
The subscription ID
object
object
A block object containing the following fields:
object.number
string or null
The block number of the requested block, encoded as hexadecimal. null if the block is pending
object.hash
string or null
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32601
notification not supported
$ wscat -c wss://go.getblock.us/<ACCESS_TOKEN>
# Wait for the connection to be established
Connected (press CTRL+C to quit)
> {"id":1,"jsonrpc":"2.0","method":"eth_subscribe","params":["newHeads"]}import WebSocket from ('ws');
const webSocket = new WebSocket('wss://go.getblock.us/<ACCESS_TOKEN>');
async function subscribeToNewBlocks() {
const request = {
id: 1,
jsonrpc: '2.0',
method: 'eth_subscribe',
params: ['newHeads'],
};
const onOpen = (event) => {
webSocket.send(JSON.stringify(request));
};
const onMessage = (event) => {
const response = JSON.parse(event.data);
console.log(response);
};
try {
webSocket.addEventListener('open', onOpen);
webSocket.addEventListener('message', onMessage);
} catch (error) {
console.error(error);
}
}
subscribeToNewBlocks();The block hash of the requested block. null if the block is pending
Build real-time analytics with low RPC load
Watch ERC20, ERC721, and custom events in a trustless way
fromBlock
string
Block height to start searching from. Accepts hex or tags.
toBlock
string
Block height to stop searching at. Accepts hex or tags.
address
string or array
Address or list of addresses to filter log events from.
topics
array
Topics used to match specific log signatures or indexed parameters.
result
A hexadecimal string representing the ID of the created filter.
String
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Invalid filter parameters
Rate limit
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_newFilter",
"params": [
{
"fromBlock": "earliest",
"toBlock": "latest",
"topics": []
}]
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_newFilter",
"params": [
{
"fromBlock": "earliest",
"toBlock": "latest",
"topics": []
}]
"id": "getblock.io"
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
import axios from 'axios'
let data = JSON.stringify({
jsonrpc: "2.0",
method: "eth_blockNumber",
params: [],
id: "getblock.io",
});
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
node index.js{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x183037af"
}python main.pyhttps://go.getblock.io/<ACCESS_TOKEN>curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions/by_version/3556737308?with_transactions=false'{
"block_height": "456015808",
"block_hash": "0xdbe2cbd48ec3b897fa5f6b1ff51bd8eef280e300e12b6ff153b3959a7440a268",
"block_timestamp": "1760341227055115",
"first_version": "3556737303",
"last_version": "3556737309",
"transactions": null
}
const axios = require('axios');
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions/by_version/3363904007',
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});import requests
url = 'https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions/by_version/3363904007'
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getStorageAt",
"params": [
"0x80d40e32FAD8bE8da5C6A42B8aF1E181984D137c",
"0x0",
"latest"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getStorageAt",
"params": [
"0x80d40e32FAD8bE8da5C6A42B8aF1E181984D137c",
"0x0",
"latest"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x000000000000000000000000aadc76c6e4abeeb52d764443357f6e75db28f0e1"
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getStorageAt",
[
"0x80d40e32FAD8bE8da5C6A42B8aF1E181984D137c",
"0x0",
"latest"
],);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getStorageAt",
params: [
"0x80d40e32FAD8bE8da5C6A42B8aF1E181984D137c",
"0x0",
"latest"
]
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getCode",
"params": [
"0x9b956e3d318625be2686ae7268d81777c462d41f",
"latest"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getCode",
"params": [
"0x9b956e3d318625be2686ae7268d81777c462d41f",
"latest"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x"
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getCode",
[
"0x9b956e3d318625be2686ae7268d81777c462d41f",
"latest"
],);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
"method": "eth_getCode",
"params": [
"0x9b956e3d318625be2686ae7268d81777c462d41f",
"latest"
]
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "1",
"result": "0x9c7c3f3c3c63b1b89ac0c1e0b0d3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8090a1b"
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_newFilter",
"params": [
{
"fromBlock": "earliest",
"toBlock": "latest",
"topics": []
}]
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_newFilter",
"params": [
{
"fromBlock": "earliest",
"toBlock": "latest",
"topics": []
}]
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0xc44f6d615fb0692b014b68ae15428371"
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send( "eth_newFilter",
[
{
fromBlock: "earliest",
toBlock: "latest",
topics: [],
},
],);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_newFilter",
params: [
{
fromBlock: "earliest",
toBlock: "latest",
topics: [],
},
],
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}from
string
Address sending the transaction. Must be unlocked on the node or wallet.
to
string or null
Address receiving the transaction. Null if deploying a contract.
gas
string
Gas limit for execution. Optional.
gasPrice
string
Gas price for the transaction. Optional.
maxPriorityFeePerGas
string
EIP-1559 priority fee. Optional.
maxFeePerGas
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_sendTransaction",
"params": [
{
"from": "0xD1AF2dAc4e0a9d1F58B99E2f42Bc0320Ed74a7cd",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_sendTransaction",
"params": [
{
result
The hash of the submitted transaction, as a hexadecimal string.
String
The eth_sendTransaction method helps developers to:
Initiate transactions directly from wallets without manual signing
Deploy contracts when using browser wallets like MetaMask
Allow frontends to request transactions from users without exposing private keys
Create a trustless UI where signing occurs locally on the user's device
Simplify interactions for beginners by handling nonce, gas, and signing automatically
Build dApps that request on-chain operations with minimal backend logic
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-3200
Unknown account
Invalid wallet address
Insufficient funds
gas too low
gas price too low
The eth_sendTransaction method enables developers to:
Trigger wallet popups for signing transactions in dApps
Build trustless browser interfaces where key management stays entirely client side
Avoid handling private keys on servers
Create user friendly transaction flows for DeFi, NFTs, gaming, and marketplaces
Use MetaMask or WalletConnect to sign and broadcast actions securely
block_hash
string
yes
The hash of the block containing the uncle. Must be a 32 byte hex string starting with 0x.
uncle_index
string
yes
The index position of the uncle block. Must be a hex number, for example "0x0".
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockHashAndIndex",
"params": [
"0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35",
"0x0"
],
"id": "getblock.io"
import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockHashAndIndex",
"params": [
"0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35"
number
Block number of the uncle
hash
Hash of the uncle block
parentHash
Hash of parent block
miner
Address of miner who produced the uncle
difficulty
Difficulty of the uncle block
gasLimit
Gas limit
Even though Arbitrum does not generate uncle blocks, developers may still call this method because it helps to:
Maintain compatibility with Ethereum-based tools, explorers, and SDKs
Avoid breaking code paths where multiple RPCs are used generically
Simplify integration with indexing libraries that expect uncle queries
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Invalid block hash
Invalid index
The eth_getUncleByBlockHashAndIndex method helps developers to:
Maintain uniform code paths when interacting with multiple EVM networks
Ensure compatibility with Ethereum-based frameworks
Safely account for uncle data even when none exist
Support explorers, analytics platforms, and monitoring tools needing consistent RPC coverage
block_hash
string
yes
The hash of the block whose uncle is being requested. Must be a 32 byte hex string prefixed with 0x.
uncle_index
string
yes
The index of the uncle in the block. Must be a hex number like "0x0".
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockHashAndIndex",
"params": [
"0x4cc1439cb36e8e984ed8c3562b222db19fac331ab79d9e90dc351325289621ea",
"0x0"
],
"id": "getblock.io"
import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockHashAndIndex",
"params": [
"0x4cc1439cb36e8e984ed8c3562b222db19fac331ab79d9e90dc351325289621ea"
number
Block number of the uncle
hash
Hash of the uncle block
parentHash
Parent block hash
miner
Miner address
difficulty
Difficulty of uncle block
gasLimit
Gas limit
Even though Arbitrum does not have uncle blocks, the method helps developers by:
Maintaining compatibility with Ethereum RPC tooling
Supporting indexers that expect standard EVM methods
Allowing multi-chain dashboards to run a single RPC workflow
Preventing errors in systems that automatically query all uncle endpoints
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Invalid block hash
Invalid index
The eth_getUncleByBlockHashAndIndex method helps developers to:
Build tools compatible with Ethereum and Arbitrum
Implement universal RPC logic across multiple chains
Handle uncle queries gracefully even when none exist
Prevent backend crashes due to missing RPC behavior
Example code for the /v1/accounts/{account_hash}/transactions json-rpc method. Дomplete guide on how to use /v1/accounts/{account_hash}/transactions json-rpc in GetBlock.io Web3 documentation.
This endpoint gets the on-chain committed transactions associated with a specific account. This includes submitted, executed, or pending transactions where the account is the sender.
Mainnet
Base URL
Example(cURl)
This method can be used for:
Get an accountās transaction history.
Build wallet activity feeds (incoming/outgoing transfers).
Build block explorers that show user-specific transactions.
Track failed vs successful transactions.
Python Request
Node(axios)
By integrating /v1/accounts/{account_hash}/transactions into developers can:
Build transaction history dashboards to show a userās past on-chain actions.
Track when a userās transaction is confirmed or fails.
dApps can fetch all transactions from an account for financial or legal reporting.
analyse user behaviour, token transfers, and contract interactions for dApps.
Example code for the eth_getTransactionByBlockNumberAndIndex JSON RPC method. Дomplete guide on how to use eth_getTransactionByBlockNumberAndIndex JSON RPC in GetBlock Web3 documentation.
This method retrieves a transaction from a block, using the block number and the transaction index within it. This method is essential for inspecting the precise ordering of transactions and analyzing how blocks are structured.
The eth_getTransactionByBlockNumberAndIndex :
Show block transaction lists sorted by index
Helps indexers and analytics platforms reconstruct transaction sequencing
Useful for debugging or tracking transaction ordering effects like MEV
Wallets can verify whether a transaction was placed at the expected block position
The eth_getTransactionByBlockNumberAndIndex method helps developers:
Build trustless UIs that load transaction lists directly from RPC
Power dashboards analyzing block activity and congestion
Support exchanges, wallets, and bridges that track transaction placement
Generate block-level historical analytics
Example code for the eth_getTransactionByBlockHashAndIndex JSON RPC method. Дomplete guide on how to use eth_getTransactionByBlockHashAndIndex JSON RPC in GetBlock Web3 documentation.
This method returns information about a transaction at a given index within a block, identified by its block hash. This method helps developers inspect specific transactions without having to scan the entire block.
The eth_getTransactionByBlockHashAndIndex is used to:
Fetch transactions in the exact order they appear in a block
Supports debugging by locating problematic transactions in a specific block
Helps indexers reconstruct historical transaction sequences
Used by wallets to verify whether their transaction was included and at what position
The eth_getTransactionByBlockHashAndIndex method helps developers to:
Build richer block explorers that display ordered transaction lists
Generate analytics around transaction distribution inside blocks
Debug transactions by locating their exact place in the block
Power DeFi dashboards and monitoring tools that react to specific activity
Example code for the eth_estimateGas JSON RPC method. Дomplete guide on how to use eth_estimateGas JSON RPC in GetBlock Web3 documentation.
This method estimates the gas required to execute a transaction on Arbitrum without broadcasting it. This simulates execution and returns the minimal gas needed.
eth_estimateGas is used to:
Estimating gas before sending an on-chain transaction
Setting safe gas limits for dApps and wallets
Contract deployments
Approvals, swaps, mints, transfers
The eth_estimateGas can help developers:
Allows dApps to simulate actions safely
Helps builders understand live contract state without spending gas
Useful for DeFi dashboards, explorers, and analytics tools
Enables wallets to preview costs before sending a transaction
Example code for the eth_getBlockByHash JSON RPC method. Дomplete guide on how to use eth_getBlockByHash JSON RPC in GetBlock Web3 documentation.
Example code for the eth_getBlockByNumber JSON RPC method. Дomplete guide on how to use eth_getBlockByNumber JSON RPC in GetBlock Web3 documentation.
Example code for the eth_getTransactionByHash JSON RPC method. Дomplete guide on how to use eth_getTransactionByHash JSON RPC in GetBlock Web3 documentation.
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_sendTransaction",
"params": [
{
"from": "0xD1AF2dAc4e0a9d1F58B99E2f42Bc0320Ed74a7cd",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_sendTransaction",
"params": [
{
"from": "0xD1AF2dAc4e0a9d1F58B99E2f42Bc0320Ed74a7cd",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_sendTransaction",
[
{
"from": "0xD1AF2dAc4e0a9d1F58B99E2f42Bc0320Ed74a7cd",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}
],);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x4f7d1c3f6def3e6b1b98c3044818f60e5fa588f1d6bb64df776c6fcf51244b91"
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockHashAndIndex",
"params": [
"0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35",
"0x0"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockHashAndIndex",
"params": [
"0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35",
"0x0"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getUncleByBlockHashAndIndex", [
"0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35",
"0x0"
],);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getUncleByBlockHashAndIndex",
params: [
"0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35",
"0x0"
]});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": null
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockHashAndIndex",
"params": [
"0x4cc1439cb36e8e984ed8c3562b222db19fac331ab79d9e90dc351325289621ea",
"0x0"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getUncleByBlockHashAndIndex",
"params": [
"0x4cc1439cb36e8e984ed8c3562b222db19fac331ab79d9e90dc351325289621ea",
"0x0"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getUncleByBlockHashAndIndex",
[
"0x4cc1439cb36e8e984ed8c3562b222db19fac331ab79d9e90dc351325289621ea",
"0x0"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getUncleByBlockHashAndIndex",
params: [
"0x4cc1439cb36e8e984ed8c3562b222db19fac331ab79d9e90dc351325289621ea",
"0x0"
]});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": null
}nonce too low
invalid sender
string
EIP-1559 max total fee. Optional.
value
string
Amount of ETH to transfer, in wei.
data
string
Hex encoded data payload for contract interaction. Optional.
nonce
string
Nonce for the transaction. If omitted, the node assigns automatically.
gasUsed
Gas used
timestamp
Timestamp of the uncle block
uncles
Always empty for uncles
gasUsed
Gas used
timestamp
Timestamp
uncles
Always empty
The maximum number of resources to retrieve per request. If not provided, defaults to default page size
No
query
String
Amount of gas consumed by the transaction.
success
Boolean
Whether the transaction executed successfully.
vm_status
String
Execution status from the Aptos VM.
accumulator_root_hash
String
Root hash of the transaction accumulator after applying this txn.
changes
Array
List of state changes caused by the transaction.
changes.address
String
Address whose resource was modified.
changes.state_key_hash
String
State key hash for the modified resource.
changes.type
String
Type of state change (e.g., write_resource).
changes.data
Object
Modified resource data.
changes.data.type
String
Type of resource (e.g., CoinStore<AptosCoin>).
changes.data.data
Object
Full contents of the updated resource (balance, events, frozen state, etc).
Parameter
Data type
Description
Required
In
account_hash
string
Aptos account address
Yes
Path
start
string
The starting point or offset for retrieving resources. If not provided, defaults to showing the latest transactions
No
query
limit
Field
Type
Description
version
String
The transaction version (ledger sequence number).
hash
String
Unique hash of the transaction.
state_change_hash
String
Hash of all state changes caused by this transaction.
event_root_hash
String
Merkle root of events emitted in this transaction.
Status Code
Error Message
Cause
403
Forbidden
Missing or invalid ACCESS_TOKEN.
404
Resource not found
The given resource type does not exist for this account.
500
Internal server error
Node or network issue. Retry later.
integer
gas_used
to
string or null
Receiver address or null for contract creation
value
string (hex)
Value transferred in wei
nonce
string (hex)
Number of transactions previously sent by the sender
gas
string (hex)
Gas limit
gasPrice
string (hex)
Gas price in wei
input
string (hex)
Transaction calldata
transactionIndex
string (hex)
Index of the transaction inside the block
v, r, s
string
ECDSA signature values
Helps monitoring systems detect anomalies such as missing or reordered transactions
Verify transaction ordering for MEV, priority fees, and gas bidding strategies
block_number
string
yes
The block number encoded as a hex string. Special values: "latest", "earliest", "pending".
index
string (hex)
yes
The position of the transaction in the block, encoded as a hex integer (for example "0x0" or "0x5").
hash
string
Hash of the transaction
blockHash
string
Hash of the block this transaction belongs to
blockNumber
string (hex)
Block number
from
string
Sender address
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
The block number does not exist or is beyond the chain height
Index is not a valid hex integer
Block does have transaction at that index
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getTransactionByBlockNumberAndIndex",
"params": ["latest", "0x0"],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getTransactionByBlockNumberAndIndex",
"params": ["latest", "0x0"],
"id": "getblock.io"
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
to
string or null
Recipient address or null for contract creation
value
string (hex)
Amount transferred in wei
nonce
string (hex)
Number of transactions sent by the sender
gas
string (hex)
Gas limit
gasPrice
string (hex)
Gas price in wei
input
string (hex)
Transaction calldata
transactionIndex
string (hex)
Index of this transaction in the block
v, r, s
string
Signature fields
Supports analytics tools that measure block activity density
Build trustless frontends that fetch live block data without running a node
block_hash
string
yes
The block hash used to locate the block containing the transaction.
index
string (hex)
yes
The transaction index position within the block, encoded as a hex integer (e.g. "0x0", "0x2").
hash
string
Transaction hash
blockHash
string
Hash of the block this transaction belongs to
blockNumber
string (hex)
Block number
from
string
Address that initiated the transaction
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
The block hash does not exist
Index is not a proper hex integer
Block does have transaction at that index
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getTransactionByBlockHashAndIndex",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
"0x0"
],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getTransactionByBlockHashAndIndex",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
"0x0"
],
"id": "getblock.io"
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
Preventing out-of-gas failures
Supports trustless frontends because the estimation is done by the blockchain directly
Test interactions like swaps, mints, or transfers without actual execution
transaction
object
yes
Main transaction object used for estimation
from
string
optional
Sender address. Required for some contract calls
to
string
optional
Recipient or contract address. Omit when deploying a contract
gas
string (hex)
optional
Gas limit upper bound; node adjusts actual estimation
gasPrice
string (hex)
optional
Optional gas price included for compatibility
value
string (hex)
optional
Amount of ETH sent with the transaction
data
string
optional
Encoded function call or contract bytecode
block tag
string or hex
optional
Block context for the estimation, default is latest
result
string (hex)
Estimated gas required for the transaction
403
Forbidden
Missing or invalid ACCESS_TOKEN.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_estimateGas",
"id": "getblock.io",
"params": [
{
"from": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"to": "0x44aa93095d6749a706051658b970b941c72c1d53",
"value": "0x1"
}
],
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_estimateGas",
"id": "getblock.io",
"params": [
{
"from": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"to": "0x44aa93095d6749a706051658b970b941c72c1d53",
"value": "0x1"
}
],
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
https://go.getblock.io/<ACCESS_TOKEN>curl -X GET "https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f
/transactions?limit=5"[
{
"version": "3574927316",
"hash": "0x01ef3543f79823b3a9fbc8acac9fba4bb25c7c1abb65f533caff2d9bcc0678f6",
"state_change_hash": "0x5cfb448ecb226172f3f5279d02658a645afdacf88a1ce308bf5b0717eca0c99e",
"event_root_hash": "0x63937d2f2e996f5c9e6cd669e518fdf7e474af4902a11501ec15dbb8d53e5ce9",
"state_checkpoint_hash": null,
"gas_used": "82",
"success": true,
"vm_status": "Executed successfully",
"accumulator_root_hash": "0x3d25cf24e802a777497da7f76fdeb05a472b30586f2171b82fbb72e1e3504609",
"changes": [
{
"address": "0xa",
"state_key_hash": "0x1db5441d8fa4229c5844f73fd66da4ad8176cb8793d8b3a7f6ca858722030043",
"data": {
"type": "0x1::coin::PairedCoinType",
"data": {
"type": {
"account_address": "0x1",
"module_name": "0x6170746f735f636f696e",
"struct_name": "0x4170746f73436f696e"
}
}
},
"type": "write_resource"
}
],
"sender": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f",
"sequence_number": "871700",
"max_gas_amount": "200000",
"gas_unit_price": "100",
"expiration_timestamp_secs": "1760643271",
"payload": {
"function": "0x487e905f899ccb6d46fdaec56ba1e0c4cf119862a16c409904b8c78fab1f5e8a::router::swap",
"type_arguments": [],
"arguments": [
"0x82e0b52f95ae57b35220726a32c3415919389aa5b8baa33a058d7125797535cc01000000000000000000000000000000683e030100000000000000000000000000000000000000000000000000000000d093f60000000000000000000000000000000000000000000000000000000000"
],
"type": "entry_function_payload"
},
"signature": {
"public_key": "0x7df17b23676ef29e040847e64ae2a8351819d4bfaf64f3bfe2124d92156c1c02",
"signature": "0x8001b27ddb488c1ad5f4f6ed7fe4886b42528b0646a05685469b524b67cc6298192fa42d9af5ff2df1791c88f2f16dfdc22c8c1d5060795c68161a25ef335d01",
"type": "ed25519_signature"
},
"replay_protection_nonce": null,
"events": [
{
"guid": {
"creation_number": "0",
"account_address": "0x0"
},
"sequence_number": "0",
"type": "0xa611a8ba7261ed1f4d3afe4ac2166fc9f3180103e3296772d593a1e2720c7405::stable::IncentiveSynced",
"data": {
"accumulated_rewards_per_share": "33902212381193",
"campaign_idx": "15",
"last_accumulation_time": "1760643255",
"last_total_shares": "4992836695498717952869616",
"pool_addr": "0x82e0b52f95ae57b35220726a32c3415919389aa5b8baa33a058d7125797535cc",
"total_distributed": "25151305402",
"ts": "1760643255618178"
}
},
{
"guid": {
"creation_number": "0",
"account_address": "0x0"
},
"sequence_number": "0",
"type": "0xa611a8ba7261ed1f4d3afe4ac2166fc9f3180103e3296772d593a1e2720c7405::stable::Swapped",
"data": {
"bought_id": "0",
"buyer": "0xbf9239be9eb7e7a3d8e4c1f36083464fd47e6bd1f82a43b7c0f7ee958705a52f",
"pool_addr": "0x82e0b52f95ae57b35220726a32c3415919389aa5b8baa33a058d7125797535cc",
"sold_id": "1",
"stored_balances": [
"1990058935750",
"3042379974793"
],
"tokens_bought": "16980317",
"tokens_sold": "16989240",
"ts": "1760643255618178"
}
},
"timestamp": "1760643255618178",
"type": "user_transaction"
}
]import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xc20ea5a196c81d8d7aff814aa37f8a5823acffbc4193efd3b2aafc9ef2803255/transactions"
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
import axios from 'axios';
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0xc20ea5a196c81d8d7aff814aa37f8a5823acffbc4193efd3b2aafc9ef2803255/transactions',
headers: { }
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getTransactionByBlockNumberAndIndex",
"params": ["latest", "0x0"],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getTransactionByBlockNumberAndIndex",
"params": ["latest", "0x0"],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": {
"blockHash": "0xbb465c64e929a4700a6c5cfc3355e651e0f558134e09e06b4c65657f24499cec",
"blockNumber": "0x185f29e6",
"from": "0x00000000000000000000000000000000000a4b05",
"gas": "0x0",
"gasPrice": "0x0",
"hash": "0x61d48ab94f7fccf48f4baa3903781053f932feb466474c037736e910d7ca2afe",
"input": "0x6bf6a42d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016ddb2700000000000000000000000000000000000000000000000000000000185f29e60000000000000000000000000000000000000000000000000000000000000000",
"nonce": "0x0",
"to": "0x00000000000000000000000000000000000a4b05",
"transactionIndex": "0x0",
"value": "0x0",
"type": "0x6a",
"chainId": "0xa4b1",
"v": "0x0",
"r": "0x0",
"s": "0x0"
}
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send( "eth_getTransactionByBlockNumberAndIndex",
["latest", "0x0"]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getTransactionByBlockNumberAndIndex",
params: ["latest", "0x0"]
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getTransactionByBlockHashAndIndex",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
"0x0"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getTransactionByBlockHashAndIndex",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
"0x0"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": {
"blockHash": "0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
"blockNumber": "0x5206d53",
"from": "0x00000000000000000000000000000000000a4b05",
"gas": "0x0",
"gasPrice": "0x0",
"hash": "0xaf256a9ce8839489dcaa4f9a2740bcd5865b3db34a15434cce29e6bdcf043bc7",
"input": "0x6bf6a42d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105e0460000000000000000000000000000000000000000000000000000000005206d530000000000000000000000000000000000000000000000000000000000000000",
"nonce": "0x0",
"to": "0x00000000000000000000000000000000000a4b05",
"transactionIndex": "0x0",
"value": "0x0",
"type": "0x6a",
"chainId": "0xa4b1",
"v": "0x0",
"r": "0x0",
"s": "0x0"
}
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getTransactionByBlockHashAndIndex",
[
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
"0x0"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getTransactionByBlockHashAndIndex",
params: [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
"0x0"
]
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_estimateGas",
"id": "getblock.io",
"params": [
{
"from": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"to": "0x44aa93095d6749a706051658b970b941c72c1d53",
"value": "0x1"
}
],
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_estimateGas",
"id": "getblock.io",
"params": [
{
"from": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
"to": "0x44aa93095d6749a706051658b970b941c72c1d53",
"value": "0x1"
}
],
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x5208"
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_estimateGas", [
{
from: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
to: "0x44aa93095d6749a706051658b970b941c72c1d53",
value: "0x1",
},
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http("https://go.getblock.us/<ACCESS_TOKEN>");
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_estimateGas",
params: [
{
from: "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
to: "0x44aa93095d6749a706051658b970b941c72c1d53",
value: "0x1",
},
]
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}block_hash
string
yes
The 32-byte block hash to query (0x-prefixed).
full_transactions
boolean
yes
If true, returns full transaction objects. If false, returns only transaction hashes.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getBlockByHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
false
],
"id": "getblock.io"
import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getBlockByHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a"
number
string (hex)
Block number
hash
string
Block hash
parentHash
string
Previous block hash
nonce
string
64-bit hash used for PoW (Arbitrum always 0)
The eth_getBlockHash is used to:
Fetching block details for explorers and dashboards
Tracking new blocks in real time
Verifying a transactionās block inclusion
Monitoring gas usage per block
Analyzing contract activity in a specific block
Auditing validator performance through block metadata
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
The block hash isn't accurate or incomplete or full_transaction boolean is missing
The eth_getBlockByHash can help developers:
Observing full historical block data
Powering explorers with detailed transaction info
Displaying block metadata in analytics dashboards
Reconstructing block timelines for auditing and security tools
Connecting validator/rollup behavior to specific blocks
block_number
string
yes
Block number as a hex string (for example "0x10fb78") or special tags: "latest", "earliest", "pending".
full_transactions
boolean
yes
If true, returns full transaction objects. If false, returns only transaction hashes.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getBlockByNumber",
"params": [
"latest",
false
],
"id": "getblock.io"
import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getBlockByNumber",
"params": [
"latest"
number
string (hex)
Block number
hash
string
Block hash
parentHash
string
Previous block hash
nonce
string
Always 0 on Arbitrum
The eth_getBlockByNumber is used to:
Real-time monitoring of blockchain activity
Fetching the latest block information for dashboards
Analyzing block-level gas usage and activity patterns
Validating the inclusion of transactions within a specific block
Supporting DeFi applications that depend on accurate state timing
Powering NFT explorers and block visualizers
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
The block hash isn't accurate or incomplete or full_transaction boolean is missing
The eth_getBlockByNumber can help developers:
Stream blocks in real time for analytics
Power live dashboards with block updates
Confirm block finality before executing contracts
Inspect transaction activity between specific blocks
Support trustless frontends that monitor chain state
tx_hash
string
yes
The hash of the transaction to retrieve. Must be a 32-byte hex encoded string prefixed with 0x.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getTransactionByHash",
"params": [
"0xfd11ef35c7179439723e026cb7857ea5a2e48a19257bec00b0ed26672f632181"
],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getTransactionByHash",
"params": [
"0xfd11ef35c7179439723e026cb7857ea5a2e48a19257bec00b0ed26672f632181"
hash
string
Hash of the transaction
blockHash
string or null
Hash of the block that contains this transaction. Null if pending
blockNumber
string or null
Block number in hex. Null if pending
transactionIndex
string or null
Index of this transaction in the block
The eth_getTransactionByHash :
Track a transaction using only its hash
Build user dashboards showing live transaction updates
Debug smart contract interactions using transaction input data
Power explorers that index and display transaction details
Determine whether a transaction has been mined or is still pending
Analyze gas usage patterns and sender behavior
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Transaction hash is invalid
The eth_getTransactionByHash method helps developers to:
Build trustless frontends that check transaction status directly
Track pending, failed, or confirmed transactions in real time
Support dashboards, DeFi interfaces, wallets, and explorers
Read transaction calldata for analytics and debugging
Improve UX by notifying users instantly when their transaction is included
Verify transaction ordering for MEV, priority fees, and gas bidding strategies
Example code for the /v1/accounts/{account_hash}/modules JSON-RPC method. Дomplete guide on how to use /v1/accounts/{account_hash}/modules json-rpc in GetBlock.io Web3 documentation.
This endpoint gets all modules(known as smart contracts)ā bytecode deployed under a specific account at a specific ledger version. These modules define smart contract logic and can include structs, resources, and functions.
Mainnet
Base URL
Example(cURL)
This endpoint can be used to:
Verify what functions and structs are exposed to dApps.
Assist in smart contract audits by fetching bytecode and ABIs.
Identify available functions, structs, and bytecode before interacting with a contract.
Python (Requests)
Node(Axios)
Some of the errors you may face are:
403, which means your access token is incorrect or does not exist. To resolve this, you need to get a new access token or recheck your access token.
500, which means a Node or network issue. Retry later
404, which means the resources were not found. To resolve this, use the right account_hash, or it is not a smart contract address.
By integrating /v1/accounts/{account_hash}/modules, developers can:
Build contract explorers that Show deployed modules, their functions, and structs on user-friendly dashboards.
Enable smart contract interactions
Integrate module inspection for debugging, auditing, and testing workflows.
dApps can query other on-chain modules to understand what functions are available for reuse.
Example code for the eth_signTransaction JSON RPC method. Дomplete guide on how to use eth_signTransaction JSON RPC in GetBlock Web3 documentation.
This method signs a transaction using the private key of the given account without broadcasting. This method requires the signing account to be unlocked or controlled by a wallet provider.
The eth_signTransaction method helps developers to:
Prepare transactions before broadcasting them
Build cold wallet or multisig-style signing workflows
Use relayers or batch processors that require signed payloads
Enable advanced transaction flows where signing and sending occur separately
The eth_sign method enables developers to:
Sign transactions without broadcasting them
Deliver signed raw transactions to relayers
Follow these steps to activate the Solana Yellowstone gRPC add-on on GetBlock
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getBlockByHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
false
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getBlockByHash",
"params": [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
false
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getBlockByHash", [
"0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
false,
]); console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: 'eth_getBlockByHash',
params: [ "0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
false],
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": {
"baseFeePerGas": "0x5f5e100",
"difficulty": "0x1",
"extraData": "0xe31298ca6df96cb00d355ca9554878c19d39292b6a26eb9fc54b5df482851ef7",
"gasLimit": "0x4000000000000",
"gasUsed": "0x229dd8",
"hash": "0xf5524f0cf99ac6bc5905e95294ebed9007e2d978155f3457118eb7a26d97503a",
"l1BlockNumber": "0x105e046",
"logsBloom": "0x00000100000000020000100000000000080000000000000000000000001000001000000000000000000000000101000000000000000000000001010000000000000010000000000000001008000120000100000000001000800100008000000000000000000000000000000000000000021000200000400000000010000000001000000000000000000000000008000000000001000000000008000000000010000000000000000000000000000000000000000000000000000000000000000000008002000048000000000000000000200800000000000010000000000000000000000040000000000000008000000010000000004010400000000000000040",
"miner": "0xa4b000000000000000000073657175656e636572",
"mixHash": "0x0000000000012069000000000105e046000000000000000a0000000000000000",
"nonce": "0x00000000000c7662",
"number": "0x5206d53",
"parentHash": "0xb458d44871af788992e51a89661eb28a6539cf9f33c0e9a30d0aab5f2e50e974",
"receiptsRoot": "0x184ea05480454e4c4fcf6406106a4cb13477af97d45752a126ee84de88695c7c",
"sendCount": "0x12069",
"sendRoot": "0xe31298ca6df96cb00d355ca9554878c19d39292b6a26eb9fc54b5df482851ef7",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0x579",
"stateRoot": "0xea41be04084dc613cfbf8d1fef75d9a097fad2b222373669e42e2aa173175649",
"timestamp": "0x644f0242",
"transactions": [
"0xaf256a9ce8839489dcaa4f9a2740bcd5865b3db34a15434cce29e6bdcf043bc7",
"0xfd7e27e19777598be2536bc6e4a5e89cc8a386eca46374333b1fba22641ed255",
"0x98b2f04b2eb747e685c7db6f97ef2aaca236e146afb310ed039d56ab8599eb0e",
"0x23c566cf1c2f208a74ef2e585b5bfe7fcffab6445027f06b4207ec43968cf71e",
"0x9febdfb50d48f1891b6660379dcea3d0060808538a102d589e7ea3b7aa6d787d"
],
"transactionsRoot": "0x22ef4159c9394a555af55a3ae5719bf15c1ff296838dd920f1566eeecb15aa1f",
"uncles": []
}
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getBlockByNumber",
"params": [
"latest",
false
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getBlockByNumber",
"params": [
"latest",
false
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getBlockByNumber", ["latest", false],); console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: 'eth_getBlockByNumber',
params: ["latest", false],
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": {
"baseFeePerGas": "0x7cf30f8",
"difficulty": "0x1",
"extraData": "0x539464419cc7e1235fba3837a56b348ecb8ae3a3ed2f1c8839012038bbb59e32",
"gasLimit": "0x4000000000000",
"gasUsed": "0x1560d7",
"hash": "0x1d77c0b85c1d0a75c19c94dc05868c936dc6d6b537c1846613e97110c90b3f48",
"l1BlockNumber": "0x16dd9f1",
"logsBloom": "0x000100c2000c0008800000044000200000000000000000180000010401000800000408020108000800800000000000000100400108082210006000000028000000000001000200080014040800002004000000040280000008004020000020412000000c0002040000001824000000000000040000000000004000100008000a0020800080004010000001000000000800000000000001000080000000000000020000200001000000000020800000000000080000000000000000080000001000402002000000200000000000010008040082001000882042200200008000080210040000200000000020000000200000000000080040000000000000400400",
"miner": "0xa4b000000000000000000073657175656e636572",
"mixHash": "0x0000000000025f6000000000016dd9f100000000000000280000000000000000",
"nonce": "0x0000000000221739",
"number": "0x185eef3d",
"parentHash": "0x9c39e9f3fbc4b716cc974f5bec6766c95d23caf0dd89c97da33bc39656643437",
"receiptsRoot": "0xb51b31ab3fccbb7423ae394c8d5e2039b55476d9df233e8031bf1c7d5620e489",
"sendCount": "0x25f60",
"sendRoot": "0x539464419cc7e1235fba3837a56b348ecb8ae3a3ed2f1c8839012038bbb59e32",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0xed9",
"stateRoot": "0x764448b4dcde129e0630c8f010e8a7c6ebcc446ec4cb2c2bea87d8f3ff8d86d8",
"timestamp": "0x69384f78",
"transactions": [
"0xd31a43fdc91c3aaa6b00537d8788b06b28833ea14d237488ac35d5993ed8634c",
"0xdf1df3a844340e0ae82485f78754818d8d628ac7236b6bcdbe3946c219301a45",
"0x4c02aa4e537ff54dbfda1b3ef528bd611cfe88225d071fda4fa57a12801a2c88",
"0x5c4f37fdf581342bb1e0eed9522feb69e988b5270945ce6128d55914b0a76c8f",
"0x795fdc0ab98a9ec4f651779dfc055677f7a35596dda5292ab966b4c35c935231",
"0x93e9d4fd77c2a9f34f80b328cbbe0613d943d376277a3758c0023c9e349becaf",
"0xe05ee8bbc3a0db68529271b76ddcca2e5ac3c52263d57268293c09606d1bcaa6",
"0x5f9fe747df5850d935f769be1a3e91102cd5ab73750b14b82f7e0afbba7cb30f",
"0x7ee97b9dfa06eeec0bfac8bdcfb320888092a735174b5b7b15f0d066b6b85ecf",
"0x8357a5f4721cec2e7d27caa0c0ae909e4db26f0e001888651f6213430e3489fe",
"0xbc740ac9a94989b232c9445e475eb1cc94c3ed858a869ce0c43029cb9ed9d836",
"0x89203f417d97ae57eaa1f73f1e08a11a9ffd73936744233555152d37d38cdb6e"
],
"transactionsRoot": "0xacd0886f4df73a6d36dcbe36a854a162d25d2e2b81d6362b174d01582aeae562",
"uncles": []
}
}import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getTransactionByHash",
"params": [
"0xfd11ef35c7179439723e026cb7857ea5a2e48a19257bec00b0ed26672f632181"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getTransactionByHash",
"params": [
"0xfd11ef35c7179439723e026cb7857ea5a2e48a19257bec00b0ed26672f632181"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_getTransactionByHash",
[
"0xfd11ef35c7179439723e026cb7857ea5a2e48a19257bec00b0ed26672f632181"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getTransactionByHash",
params: [
"0xfd11ef35c7179439723e026cb7857ea5a2e48a19257bec00b0ed26672f632181"
],
});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": {
"blockHash": "0xd8fe755134d44967f0c919084d3e0ec9b875c476c924f37bff17e5ef37d10d47",
"blockNumber": "0x5911313",
"from": "0xe911f7f98ac57cf0c1cc71519d3ba720089381c4",
"gas": "0x1a02b0",
"gasPrice": "0x1dcd6500",
"hash": "0xfd11ef35c7179439723e026cb7857ea5a2e48a19257bec00b0ed26672f632181",
"input": "0x1801fbe5d5843b1d8c7345812c7ba7257e927b0c5e000000a6ca46b71aa1cdb6545660ad000000004f62e6aa5433274e333035ca261c12397df9febee0782f42749b8e0b",
"nonce": "0x3c",
"to": "0xae56c981f9bb8b07e380b209fcd1498c5876fd4c",
"transactionIndex": "0x1",
"value": "0x0",
"type": "0x0",
"chainId": "0xa4b1",
"v": "0x14986",
"r": "0x87ac24f33be39a0bd27fe84a8934aa957610872606e5dbc46d296843a57930df",
"s": "0x6ad9aba71382c20a528f3310c369b095e15991b352aea3261e2683c2b1288964"
}
}sha3Uncles
string
Keccak hash of uncles
logsBloom
string
Bloom filter for logs
transactionsRoot
string
Root of transaction trie
stateRoot
string
Root of state trie
miner
string
Validator / proposer address
difficulty
string (hex)
Arbitrum always zero
totalDifficulty
string (hex)
Always zero
size
string (hex)
Size of the block in bytes
gasLimit
string (hex)
Gas limit for the block
gasUsed
string (hex)
Gas consumed
timestamp
string (hex)
Unix timestamp
transactions
array
Either full objects or transaction hashes
uncles
array
Always empty for Arbitrum
sha3Uncles
string
Keccak hash of uncles
logsBloom
string
Bloom filter for logs
transactionsRoot
string
Root of transactions trie
stateRoot
string
Root of state trie
miner
string
Address that proposed the block
difficulty
string
Always zero on Arbitrum
totalDifficulty
string
Always zero
size
string
Block size in bytes
gasLimit
string
Block gas limit
gasUsed
string
Total gas consumed
timestamp
string
Unix timestamp
transactions
array
List of transaction hashes or objects
uncles
array
Always empty
from
string
Sender address
to
string or null
Receiver address. Null for contract creation
value
string (hex)
Amount sent in wei
nonce
string (hex)
Counter of transactions sent by the sender
gas
string (hex)
Gas limit for the transaction
gasPrice
string (hex)
Gas price in wei
input
string (hex)
Calldata or contract code
v, r, s
string
Transaction signature components
string
The starting point for getting the resources
No
Query
name (function)
The function name
visibility
The visibility of the function (public, private, or friend)
is_entry
Indicates if the function is an entry function
is_view
Indicates if the function is a view function
generic_type_params
The generic type parameters associated with the Move function
constraints
Any constraints associated with the function
params
The parameters associated with the Move function
return
The return type of the function
structs
The list of structs defined within the module
name (struct)
The struct name
is_native
Indicates if the module is native (implemented outside Move)
abilities
The list of abilities or capabilities provided by the module
fields
The list of fields defined within the struct
type
The field type
account_hash
string
Aptos account address
Yes
Path
ledger_version
string
The ledger version to get the account state
No
Query
bytecode
The bytecode representation of the module
abi
The Application Binary Interface (ABI) of the Move module
address
The address of the Aptos account
name
The name of the smart contract
friends
The module friends
exposed_functions
The public functions of the module
start
gasPrice
string
no
Gas price in wei.
maxPriorityFeePerGas
string
no
EIP 1559 priority fee.
maxFeePerGas
string
Yes
EIP 1559 max total fee.
value
string
Yes
Amount of ETH sent, in wei. .
data
string
Yes
Hex encoded input data for contract interaction. .
nonce
string
Yes
Nonce number for the transaction. .
tx.gas
string
Gas limit.
tx.gasPrice
string
Gas price in wei for legacy transactions.
tx.maxPriorityFeePerGas
string
Priority fee (EIP 1559).
tx.maxFeePerGas
string
Maximum total fee (EIP 1559).
tx.value
string
Amount of ETH sent in wei.
tx.data
string
Encoded call data or contract bytecode.
tx.chainId
string
Chain identifier for replay protection.
tx.v
string
Recovery ID used to verify the signature.
tx.r
string
First half of the signature.
tx.s
string
Second half of the signature.
Allow hardware wallets or custodial services to authorize a transaction before submission
Support meta transaction systems and gas-sponsored flows
from
string
Yes
The address signing the transaction. Must be unlocked or controlled by a wallet.
to
string
Yes
Receiver address. Null if deploying a smart contract.
gas
string
no
raw
string
Signed raw transaction in hex. Can be broadcast using eth_sendRawTransaction.
tx.from
string
Address that signed the transaction.
tx.to
string or null
Recipient address or null for contract deployment.
tx.nonce
string
Nonce used for the transaction.
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-3200
Unknown account
Invalid account address
user rejected request
message must be hex or string
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_signTransaction",
"params": [
{
"from": "0xd1af2dac4e0a9d1f58b99e2f42bc0320ed74a7cd",
"to": "0xd26ea0f03100358b2ebd4c9638f042aada9a1bcf",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"nonce": "0x3c",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_signTransaction",
"params": [
{
"from": "0xd1af2dac4e0a9d1f58b99e2f42bc0320ed74a7cd",
"to": "0xd26ea0f03100358b2ebd4c9638f042aada9a1bcf",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"nonce": "0x3c",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}],
"id": "getblock.io"
};
let config = {
method: "post",
maxBodyLength: Infinity,
url: "https://go.getblock.us/<ACCESS_TOKEN>",
headers: {
"Content-Type": "application/json",
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
Gas limit for execution.
https://go.getblock.io/<ACCESS-TOKEN>/curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12/modules?ledger_version=3362752463&limit=2'[
{
"bytecode": "0xa11ceb0b050000000801000203022305251d0742470889012006a9012e10d7014f0ca602c703000000010001000002020100000303010000040004000005050400000606010000070401000203030103030303030304040401040204040102000202030403030404046d617468076d696e5f753634076d756c5f6469760c6d756c5f6469765f753132380b6d756c5f746f5f753132380c6f766572666c6f775f61646406706f775f31300473717274190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e120308d0070000000000000410ffffffffffffffffffffffffffffffff0410ffffffffffffffff0000000000000000126170746f733a3a6d657461646174615f76303b01d007000000000000124552525f4449564944455f42595f5a45524f1e5768656e20747279696e6720746f20646976696465206279207a65726f2e00010000010c0a000a0123030505080b000c02050a0b010c020b02020101000004120a020600000000000000002203060700270b00350b0135180b02351a0c030b03340202010000040f0a0232000000000000000000000000000000002203060700270b000b01180b021a0c030b0334020301000007060b00350b0135180204010000042207010a01170c020a020a00230309050f0b000b02173201000000000000000000000000000000170207010a00170c020a020a01230318051e0b010b0217320100000000000000000000000000000017020b000b0116020501000008150601000000000000000c0231000c01280a010a0023030a05130b02060a00000000000000180c020b013101160c0105040b020206010000092f0a00320400000000000000000000000000000023030505120b00320000000000000000000000000000000021030a050d0600000000000000000c01050f0601000000000000000c010b010c02052d0a000c040a0032020000000000000000000000000000001a3201000000000000000000000000000000160c030a030a0423031f052a0a030c040a000a031a0b031632020000000000000000000000000000001a0c03051a0b04340c020b020200",
"abi": {
"address": "0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12",
"name": "math",
"friends": [],
"exposed_functions": [
{
"name": "min_u64",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [],
"params": [
"u64",
"u64"
],
"return": [
"u64"
]
},
{
"name": "mul_div",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [],
"params": [
"u64",
"u64",
"u64"
],
"return": [
"u64"
]
},
{
"name": "mul_div_u128",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [],
"params": [
"u128",
"u128",
"u128"
],
"return": [
"u64"
]
},
{
"name": "mul_to_u128",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [],
"params": [
"u64",
"u64"
],
"return": [
"u128"
]
},
{
"name": "overflow_add",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [],
"params": [
"u128",
"u128"
],
"return": [
"u128"
]
},
{
"name": "pow_10",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [],
"params": [
"u8"
],
"return": [
"u64"
]
},
{
"name": "sqrt",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [],
"params": [
"u128"
],
"return": [
"u64"
]
}
],
"structs": []
}
},
{
"bytecode": "0xa11ceb0b050000000b01000402040c03101e042e0c053a0f07497e08c701400687020a109102300ac1020a0ccb023e00000101000200000003000001090700000400000100000500010100000600010100000700010100010a000301000302040204040405020201020001010109000108020108000108010663757276657309747970655f696e666f06537461626c650c556e636f7272656c61746564126173736572745f76616c69645f63757276650969735f737461626c650f69735f756e636f7272656c617465640e69735f76616c69645f63757276650b64756d6d795f6669656c640854797065496e666f07747970655f6f66190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12000000000000000000000000000000000000000000000000000000000000000103081127000000000000126170746f733a3a6d657461646174615f76301c011127000000000000114552525f494e56414c49445f43555256450000020108010102010801000100000005380003040700270201010000000438013802210202010000000438013803210203010000010a380403030506080c00050838050c000b000200",
"abi": {
"address": "0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12",
"name": "curves",
"friends": [],
"exposed_functions": [
{
"name": "assert_valid_curve",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [
{
"constraints": []
}
],
"params": [],
"return": []
},
{
"name": "is_stable",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [
{
"constraints": []
}
],
"params": [],
"return": [
"bool"
]
},
{
"name": "is_uncorrelated",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [
{
"constraints": []
}
],
"params": [],
"return": [
"bool"
]
},
{
"name": "is_valid_curve",
"visibility": "public",
"is_entry": false,
"is_view": false,
"generic_type_params": [
{
"constraints": []
}
],
"params": [],
"return": [
"bool"
]
}
],
"structs": [
{
"name": "Stable",
"is_native": false,
"is_event": false,
"abilities": [],
"generic_type_params": [],
"fields": [
{
"name": "dummy_field",
"type": "bool"
}
]
},
{
"name": "Uncorrelated",
"is_native": false,
"is_event": false,
"abilities": [],
"generic_type_params": [],
"fields": [
{
"name": "dummy_field",
"type": "bool"
}
]
}
]
}
}
]import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12/modules?ledger_version=3362752463&limit=2"
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)import axios from āaxiosā;
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/accounts/0x190d44266241744264b964a37b8f09863167a12d3e70cda39376cfb4e3561e12/modules?ledger_version=3362752463&limit=2',
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_signTransaction",
"params": [
{
"from": "0xd1af2dac4e0a9d1f58b99e2f42bc0320ed74a7cd",
"to": "0xd26ea0f03100358b2ebd4c9638f042aada9a1bcf",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"nonce": "0x3c",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_sign",
"method": "eth_signTransaction",
"params": [
{
"from": "0xd1af2dac4e0a9d1f58b99e2f42bc0320ed74a7cd",
"to": "0xd26ea0f03100358b2ebd4c9638f042aada9a1bcf",
"gas": "0x76c0",
"gasPrice": "0x9184e72a000",
"nonce": "0x3c",
"value": "0x9184e72a",
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
}],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}{
"jsonrpc": "2.0",
"id": 1,
"result": {
"raw": "0xf86c808...",
"tx": {
"nonce": "0x0",
"gas": "0x5208",
"value": "0x0",
"to": "0xE592427A0AEce92De3Edee1F18E0157C05861564",
"from": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}
}
}
import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send("eth_sign",
[
"0x742d35Cc6634C0532925a3b844Bc454e4438f44e",
"0x48656c6c6f20576f726c64"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}Your gRPC endpoint URL with access token (found in GetBlock dashboard)
The Yellowstone gRPC add-on to Solana currently requires a Dedicated Node subscription on GetBlock. Hereās how to set it up with gRPC API:
Sign up / log in: Create an account at GetBlock.io or log in to your existing account.
Deploy a dedicated Solana node:
Go to your user dashboard, switch the tab to āDedicated nodesā, and scroll down to āMy endpointsā
Choose Solana under āProtocolā, set the network to mainnet.
Click on Get.
Enable the gRPC add-on: In StepāÆ3 (Select API and Addāons) of your node setup, check Yellowstone gRPC under Addāons.
All DedicatedāÆNode plan subscribers receive the YellowstoneāÆgRPC API at no extra cost together with their Solana node.
Once your node is live, youāll be able to create gRPC endpoints to begin using the add-on.
Return to My endpoints in your Dedicated node dashboard and generate a gRPC Access Token.
The dashboard will generate your new HTTPSāstyle gRPC endpoint URL.
The endpoint URL will be used by your gRPC client to authenticate and interact with the Solana network. Regional domain determines which data center youāre talking to (Europe, US, or Asia).
Example endpoint URLs:
When establishing your gRPC channel, the authentication is handled via an access token:
Dragonās Mouth uses gRPC over HTTP/2 for all communication. Its message schemas are defined in Protocol Buffer (.proto) files, included in the Yellowstone repository, which specify all the RPC methods and data types.
The power of Yellowstone is realātime streaming: open a single biādirectional stream, send a SubscribeRequest with your filters, and get back a sequence of SubscribeUpdate messages.
Here are the main subscription targets:
slots
slots: SlotsFilter
Slot numbers as theyāre processed by leader
blocks
blocks: BlocksFilter
Block metadata (slot, parent slot, timestamp)
blocksMeta
blocksMeta: BlocksFilter
Block metadata + transaction counts + status
accounts
accounts: AccountsFilter
Developers can integrate Yellowstone streams using standard gRPC client libraries. Tritonās Yellowstone repository includes example clients in Rust, Python, Go, and TypeScript.
The part below will show common ways to initialize your connection to the GetBlock gRPC endpoint and open a bidirectional subscription stream (Subscribe) with filters.
A generic tool like grpcurl is perfect to just poke at the API and explore method calls:
The triton-one/yellowstone-grpc repository is the official client toolkit for Solanaās Yellowstone (Geyser) gRPC API.
It wraps the raw gRPC calls in friendly methods, handles reconnects, backāpressure, and includes TypeScript types out of the box ā easiest to get started with minimal boilerplate.
Install the SDK:
Connect to the gRPC endpoint and subscribe to the stream:
Below are minimal examples using Triton's Yellowstone helper libraries to stream real-time data from Solana via gRPC.
Setup & run:
Make sure the following dependencies are installed:
Go Example (go-client/main.go):
Make sure you clone the Yellowstone repo (for the examples.grpc module):
Python Example (python-client/stream.py):
Setup:
Ensure your Cargo.toml includes:
Rust Example (rust-client/src/main.rs):
In addition to streaming subscriptions, the same gRPC interface also provides unary RPCs for quick, one-off queries:
getSlot: Returns the current slot number.
getBlockHeight: Retrieves the current block height.
getLatestBlockhash: Fetches the most recent blockhash.
isBlockhashValid: Checks whether a given blockhash is still valid.
getVersion: Returns version info for both the gRPC plugin and the connected Solana node
You can call these methods directly on the gRPC client without opening a streaming connection.
Before you start streaming data with the Yellowstone Geyser plugin, consider these recommendations:
Filtering is crucial: Always narrow your subscription to only the accounts or programs you need. Excessive or empty filters can overwhelm clients and hit rate limits.
Combine with JSONāRPC: Use gRPC for realātime streaming. Continue to use GetBlockās JSONāRPC Solana endpoints for onādemand calls like getBlock, sendTransaction, or historical queries.
Keeping your stream alive: gRPC streams may time out if idle. The Yellowstone plugin can handle keep-alive pings. In your SubscribeRequest, you can set ping: true to respond to server pings (or send a minimal ping message periodically) to keep the stream alive.
Selecting the right commitment levels: Choose processed, confirmed, or finalized in your SubscribeRequest to balance between lowest latency (processed) and highest certainty (finalized). For most realātime use cases (dashboards, bots), use processed to see intraāslot updates.
In Solanaās commitment hierarchy, you have processed, confirmed, and finalized:
Finalized: After full consensus & finalized in the ledger.
Confirmed: Once a supermajority of validators have voted.
Processed: Means the validator has received and executed the transaction, but it may not yet have enough votes to be considered confirmed/finalized ā (āintra-slotā).
Streaming at āprocessedā gives you every transaction and account write the moment the leader executes it, well before it appears in a confirmed block.
With these examples and notes, you should be able to jump right into using GetBlockās Yellowstone gRPC API in the language of your choice.
Check out the Yellowstone gRPC docs or reach out via GetBlock support.
Example code for the eth_getTransactionReceipt JSON RPC method. Дomplete guide on how to use eth_getTransactionReceipt JSON RPC in GetBlock Web3 documentation.
cd go-client
go mod tidy
go run main.gogo get github.com/rpcpool/yellowstone-grpc/examples/golang@latest
go get google.golang.org/grpc@latestimport (
"context"
"fmt"
"log"
"time"
ygrpc "github.com/rpcpool/yellowstone-grpc/examples/golang/pkg/grpc"
pb "github.com/rpcpool/yellowstone-grpc/examples/golang/pkg/proto"
"google.golang.org/grpc/metadata"
)
func main() {
endpoint := "go.getblock.io:443"
token := "YOUR_GETBLOCK_TOKEN"
client, err := ygrpc.NewGrpcConnection(context.Background(), endpoint)
if err != nil {
log.Fatalf("Connection error: %v", err)
}
defer client.Close()
ctx := metadata.AppendToOutgoingContext(context.Background(), "x-token", token)
stream, err := client.Subscribe(ctx)
if err != nil {
log.Fatalf("Subscription error: %v", err)
}
req := &pb.SubscribeRequest{
Accounts: map[string]*pb.SubscribeRequestFilterAccounts{
"example": {
Account: []string{"YOUR_WATCHED_ACCOUNT"},
},
},
Commitment: pb.CommitmentLevel_CONFIRMED,
}
if err := stream.Send(req); err != nil {
log.Fatalf("Send error: %v", err)
}
fmt.Println("Streaming...")
for {
res, err := stream.Recv()
if err != nil {
log.Printf("Stream error: %v", err)
time.Sleep(time.Second)
continue
}
fmt.Printf("Update at slot %d for %s\n", res.GetSlot(), res.GetAccount().GetAccount().GetPubkey())
}
}git clone https://github.com/rpcpool/yellowstone-grpc
export PYTHONPATH=$PYTHONPATH:$(pwd)/yellowstone-grpc/examples/pythonfrom examples.grpc import new_client
import time
from google.protobuf.json_format import MessageToDict
endpoint = "go.getblock.io:443"
token = "YOUR_GETBLOCK_TOKEN"
channel, client = new_client(endpoint, token)
req = {
"accounts": {
"example": {
"account": ["YOUR_WATCHED_ACCOUNT"]
}
},
"commitment": "CONFIRMED"
}
stream = client.Subscribe(iter([req]))
for update in stream:
print("Update:", MessageToDict(update))
time.sleep(0.5)cd rust-client
cargo build
cargo run// Europe (Frankfurt)
https://go.getblock.io/<YOUR_ACCESS_TOKEN>/
// USA (New York)
https://go.getblock.us/<YOUR_ACCESS_TOKEN>/
// Asia (Singapore)
https://go.getblock.asia/<YOUR_ACCESS_TOKEN>/
ENDPOINT = 'https://go.getblock.io';
TOKEN = 'YOUR_GETBLOCK_ACCESS_TOKEN';# 1) List services and methods
grpcurl \
-insecure \
-authority go.getblock.io \
-H "x-access-token: YOUR_ACCESS_TOKEN" \
go.getblock.io:443 \
list
# 2) Subscribe to slots
grpcurl \
-insecure \
-authority go.getblock.io \
-H "x-access-token: YOUR_ACCESS_TOKEN" \
go.getblock.io:443 \
geyser.Geyser/Subscribe \
-d '{ "slots": { "slots": []{} } }'
npm install @triton-one/yellowstone-grpc
# or
yarn add @triton-one/yellowstone-grpcimport Client, {
SubscribeRequest,
CommitmentLevel,
SubscribeResponse,
} from "@triton-one/yellowstone-grpc";
async function main() {
// Initialize
const ENDPOINT = "https://go.getblock.io/";
const TOKEN = "<YOUR_ACCESS_TOKEN>";
const client = new Client(ENDPOINT, TOKEN);
// Open a bidirectional stream
const stream = await client.subscribe();
// send a request to start all streams
stream.write({
accounts: ["YourWalletPubkeyHere"],
programs: [],
commitment: CommitmentLevel.PROCESSED,
} as SubscribeRequest);
stream.on("data", (msg: SubscribeResponse) => {
if (msg.accountChange) {
console.log(
`ā¶ Account ${msg.accountChange.pubkey} = ${msg.accountChange.lamports}`
);
}
});
// End the stream
stream.end();
await client.close();
}
main().catch(console.error);
Account lamports, owner, executable flag, rent epoch
accountsDataSlice
accountsDataSlice: AccountsDataSliceFilter
Partial account data blobs
transactions
transactions: TransactionsFilter
Full transaction data + meta
[dependencies]
yellowstone-grpc = { git = "https://github.com/rpcpool/yellowstone-grpc", branch = "main" }
tonic = "0.9"
tokio = { version = "1", features = ["full"] }use tonic::metadata::MetadataValue;
use yellowstone_grpc::client::{subscribe_with_token, SubscribeRequest};
#[tokio::main]
async fn main() {
let endpoint = "https://go.getblock.io";
let token = "YOUR_GETBLOCK_TOKEN";
let mut stream = subscribe_with_token(endpoint, token, SubscribeRequest {
accounts: Some({
let mut m = std::collections::HashMap::new();
m.insert("example".to_string(), vec!["YOUR_WATCHED_ACCOUNT".to_string()]);
m
}),
commitment: Some("confirmed".into()),
..Default::default()
}).await.expect("stream failed");
println!("Streaming...");
while let Some(Ok(update)) = stream.message().await {
println!("Update: {:?}", update);
}
}tx_hash
string
yes
The hash of the transaction to fetch the receipt for. Must be a 32-byte hex string prefixed with 0x.
curl --location 'https://go.getblock.us/<ACCESS_TOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"jsonrpc": "2.0",
"method": "eth_getTransactionReceipt",
"params": [
"0x21be7a93a4531a76b1e15d14059582e6b6f9e36cbdc7a85c23667808f4c78b2c"
],
"id": "getblock.io"
}'import axios from 'axios'
let data = JSON.stringify({
"jsonrpc": "2.0",
"method": "eth_getTransactionReceipt",
"params": [
"0x21be7a93a4531a76b1e15d14059582e6b6f9e36cbdc7a85c23667808f4c78b2c"
transactionHash
string
32 bytes (0x + 64 hex chars)
Hash that uniquely identifies the transaction
transactionIndex
string
Hexadecimal
Integer position of the transaction within the block (e.g., "0x66")
blockHash
string
32 bytes (0x + 64 hex chars)
The eth_getTransactionReceipt :
Track the outcome of a transaction (success/failure)
Retrieve events emitted during contract execution
Calculate actual gas consumption for analytics or dashboards
Determine the address of newly created contracts
Power explorers, wallets, and DeFi dashboards with detailed transaction results
403
Forbidden
Missing or invalid ACCESS_TOKEN.
-32602
Invalid argument
Invalid transaction hash
The eth_getTransactionReceipt method helps developers to:
Build real-time transaction status trackers
Power dashboards that display events and gas usage
Validate smart contract interactions without waiting for confirmations elsewhere
Support dApps and DeFi interfaces that rely on logs for updates
Ensure trustless monitoring of transaction results
Example code for the /v1/transactions/by_hash/{transaction_hash} json-rpc method. Дomplete guide on how to use /v1/transactions/by_hash/{transaction_hash} json-rpc in GetBlock.io Web3 documentation.
This endpoint gets a transaction from the Aptos blockchain by its transaction hash. Every transaction has a unique hash that can be used to retrieve full details.
Mainnet
Base URL
Example(cURL)
This method can be used for:
Retrieve any transaction directly by hash (common for explorers and wallets).
Debug and verify contract execution results.
Cross-reference hash ā version ā block for indexing.
Track system and user transactions separately.
Node(axios)
Python(Request)
By integrating /v1/transactions/by_hash/{txn_hash}, developers can:
Fetch transactions directly from wallet or explorer UIs.
Debug dApps by verifying hash results against VM status.
Enable search bars in explorers where users paste transaction hashes.
Support analytics pipelines that track txns by hash across modules.
import requests
import json
url = "https://go.getblock.us/<ACESS_TOKEN>"
payload = json.dumps({
"jsonrpc": "2.0",
"method": "eth_getTransactionReceipt",
"params": [
"0x21be7a93a4531a76b1e15d14059582e6b6f9e36cbdc7a85c23667808f4c78b2c"
],
"id": "getblock.io"
})
headers = {
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = reqwest::Client::builder()
.build()?;
let mut headers = reqwest::header::HeaderMap::new();
headers.insert("Content-Type", "application/json".parse()?);
let data = r#"{
"jsonrpc": "2.0",
"method": "eth_getTransactionReceipt",
"params": [
"0x21be7a93a4531a76b1e15d14059582e6b6f9e36cbdc7a85c23667808f4c78b2c"
],
"id": "getblock.io"
}"#;
let json: serde_json::Value = serde_json::from_str(&data)?;
let request = client.request(reqwest::Method::POST, "https://go.getblock.us/<ACCESS_TOKEN>")
.headers(headers)
.json(&json);
let response = request.send().await?;
let body = response.text().await?;
println!("{}", body);
Ok(())
}import { ethers } from "ethers";
const RPC_URL = "https://go.getblock.us/<ACCESS_TOKEN>";
const provider = new ethers.JsonRpcProvider(RPC_URL);
async function Call() {
try {
const result = await provider.send( "eth_getTransactionReceipt",
[
"0x21be7a93a4531a76b1e15d14059582e6b6f9e36cbdc7a85c23667808f4c78b2c"
]);
console.log("The result:", result);
return result;
} catch (error) {
console.error("The error:", error);
throw error;
}
}import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
// Create Viem client with GetBlock
const client = createPublicClient({
chain: arbitrum,
transport: http('https://go.getblock.us/<ACCESS_TOKEN>'),
});
// Using the method through Viem
async function Call() {
try {
// Method-specific Viem implementation
const result = await client.request({
method: "eth_getTransactionReceipt",
params: ["0x21be7a93a4531a76b1e15d14059582e6b6f9e36cbdc7a85c23667808f4c78b2c"]});
console.log('Result:', result);
return result;
} catch (error) {
console.error('Viem Error:', error);
throw error;
}
}
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": {
"blockHash": "0x2caf14773f5c8854de725d9077918a0ec14bd123163d5f9e479b06f201452320",
"blockNumber": "0x5259c43",
"contractAddress": null,
"cumulativeGasUsed": "0xc69229",
"effectiveGasPrice": "0x5f5e100",
"from": "0xb8b2522480f850eb198ada5c3f31ac528538d2f5",
"gasUsed": "0x1993d7",
"gasUsedForL1": "0x113076",
"l1BlockNumber": "0x105fbf6",
"logs": [
{
"address": "0x09e18590e8f76b6cf471b3cd75fe1a1a9d2b2c2b",
"topics": [
"0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925",
"0x00000000000000000000000009e18590e8f76b6cf471b3cd75fe1a1a9d2b2c2b",
"0x000000000000000000000000c873fecbd354f5a56e00e710b90ef4201db2448d"
],
"data": "0x0000000000000000000000000000000000000000000000000000ad0c364098a8",
"blockNumber": "0x5259c43",
"transactionHash": "0x21be7a93a4531a76b1e15d14059582e6b6f9e36cbdc7a85c23667808f4c78b2c",
"transactionIndex": "0x7",
"blockHash": "0x2caf14773f5c8854de725d9077918a0ec14bd123163d5f9e479b06f201452320",
"logIndex": "0x16",
"removed": false
}
],
"logsBloom": "0x002000020000100000480000800100000000004000000",
"status": "0x1",
"to": "0x5845696f6031bfd57b32e6ce2ddea19a486fa5e5",
"transactionHash": "0x21be7a93a4531a76b1e15d14059582e6b6f9e36cbdc7a85c23667808f4c78b2c",
"transactionIndex": "0x7",
"type": "0x0"
}
}Hash of the block where this transaction was included
blockNumber
string
Hexadecimal
Block number where this transaction was included (e.g., "0xeff35f")
from
string
20 bytes (0x + 40 hex chars)
Address of the sender who initiated the transaction
to
string or null
20 bytes (0x + 40 hex chars)
Address of the receiver. null when the transaction is a contract creation transaction
cumulativeGasUsed
string
Hexadecimal
Total amount of gas used when this transaction was executed in the block (sum of gas used by this and all preceding transactions in the same block)
gasUsed
string
Hexadecimal
Amount of gas used by this specific transaction alone
effectiveGasPrice
string
Hexadecimal
Actual value per gas deducted from sender's account. Before EIP-1559: equals transaction's gas price. After EIP-1559: equals baseFeePerGas + min(maxFeePerGas - baseFeePerGas, maxPriorityFeePerGas)
contractAddress
string or null
20 bytes (0x + 40 hex chars)
Contract address created if the transaction was a contract creation, otherwise null
logs
array of objects
-
Array of log objects generated by this transaction (events emitted by smart contracts)
logs[].address
string
20 bytes (0x + 40 hex chars)
Address of the contract that generated the log
logs[].topics
array of strings
32 bytes each
Array of indexed log topics (first topic is usually the event signature hash)
logs[].data
string
Hexadecimal
Non-indexed log data
logs[].blockNumber
string
Hexadecimal
Block number where this log was created
logs[].transactionHash
string
32 bytes (0x + 64 hex chars)
Hash of the transaction that created this log
logs[].transactionIndex
string
Hexadecimal
Transaction's position in the block
logs[].blockHash
string
32 bytes (0x + 64 hex chars)
Hash of the block containing this log
logs[].logIndex
string
Hexadecimal
Position of this log in the block
logs[].removed
boolean
true/false
true if log was removed due to chain reorganization, false if valid
logsBloom
string
256 bytes (0x + 512 hex chars)
Bloom filter for light clients to quickly retrieve related logs
status
string
"0x0" or "0x1"
Transaction status: "0x1" for success, "0x0" for failure (only for post-Byzantium transactions)
root
string or null
32 bytes
Post-transaction state root (only for pre-Byzantium transactions, otherwise null)
type
string
Hexadecimal
Transaction type: "0x0" (legacy), "0x1" (EIP-2930), "0x2" (EIP-1559), or Arbitrum-specific types (see below)
blobGasUsed
string or null
Hexadecimal
Amount of blob gas used for this transaction (only for EIP-4844 blob transactions)
blobGasPrice
string or null
Hexadecimal
Actual value per gas deducted from sender's account for blob gas (only for EIP-4844 blob transactions)
String
State checkpoint hash for this transaction.
gas_used
String
Amount of gas consumed.
success
Boolean
Whether execution succeeded.
vm_status
String
Aptos VM execution result.
accumulator_root_hash
String
Ledger accumulator root hash.
changes
Array
State changes caused (may be empty).
timestamp
String
Unix timestamp in microseconds.
block_end_info
Object
Block execution metadata.
type
String
Transaction type (e.g., user_transaction, block_epilogue_transaction).
Parameter
Type
In
Required
Description
transaction_hash
String
Path
Yes
Hash of the transaction
Field
Type
Description
version
String
Global transaction version number.
hash
String
Transaction hash used for lookup.
state_change_hash
String
Hash of all state changes from this transaction.
event_root_hash
String
Merkle root hash of emitted events.
Status Code
Error Message
Cause
400
Invalid transaction hash
Hash format is invalid (not hex or malformed).
403
Forbidden
Missing or invalid <ACCESS_TOKEN>.
500
Internal server error
Node or network issue; retry later.
state_checkpoint_hash
https://go.getblock.io/<ACCESS_TOKEN>curl --location 'https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions/by_hash/0xd797b944ed8657406a1b09a5928048093399fc0a2f576d3e57c0f9cedbf95c4a'{
"version": "3556737308",
"hash": "0x4c3248d4c2f3a5ca1617e43e69332c66586478871ee44634cdb4554fe537dff6",
"state_change_hash": "0x50148eff819eeb093efbe1cb56936ba02b3169db3343f5df0cb47aba016ea227",
"event_root_hash": "0x1c432ce28a587287ef8abf14f025b78f5e288e886f16f217919cd2e35274f5f3",
"state_checkpoint_hash": null,
"gas_used": "195",
"success": false,
"vm_status": "Move abort in 0x31deb490728ae8e1a89675ee4c1877af8e5849c526d2c9a64238c49d8ece08a0::fa: E_NO_PROFIT(0x385): ",
"accumulator_root_hash": "0xdc354eb8f4a96e9267bab2727240965becd154e35a21fede212af96f56333955",
"changes": [
{
"address": "0xa",
"state_key_hash": "0x1db5441d8fa4229c5844f73fd66da4ad8176cb8793d8b3a7f6ca858722030043",
"data": {
"type": "0x1::coin::PairedCoinType",
"data": {
"type": {
"account_address": "0x1",
"module_name": "0x6170746f735f636f696e",
"struct_name": "0x4170746f73436f696e"
}
}
},
"type": "write_resource"
},
{
"address": "0xa",
"state_key_hash": "0x1db5441d8fa4229c5844f73fd66da4ad8176cb8793d8b3a7f6ca858722030043",
"data": {
"type": "0x1::coin::PairedFungibleAssetRefs",
"data": {
"burn_ref_opt": {
"vec": [
{
"metadata": {
"inner": "0xa"
}
}
]
},
"mint_ref_opt": {
"vec": [
{
"metadata": {
"inner": "0xa"
}
}
]
},
"transfer_ref_opt": {
"vec": [
{
"metadata": {
"inner": "0xa"
}
}
]
}
}
},
"type": "write_resource"
},
{
"address": "0xa",
"state_key_hash": "0x1db5441d8fa4229c5844f73fd66da4ad8176cb8793d8b3a7f6ca858722030043",
"data": {
"type": "0x1::fungible_asset::ConcurrentSupply",
"data": {
"current": {
"max_value": "340282366920938463463374607431768211455",
"value": "25726501655234340"
}
}
},
"type": "write_resource"
},
{
"address": "0xa",
"state_key_hash": "0x1db5441d8fa4229c5844f73fd66da4ad8176cb8793d8b3a7f6ca858722030043",
"data": {
"type": "0x1::fungible_asset::Metadata",
"data": {
"decimals": 8,
"icon_uri": "",
"name": "Aptos Coin",
"project_uri": "",
"symbol": "APT"
}
},
"type": "write_resource"
},
{
"address": "0xa",
"state_key_hash": "0x1db5441d8fa4229c5844f73fd66da4ad8176cb8793d8b3a7f6ca858722030043",
"data": {
"type": "0x1::object::ObjectCore",
"data": {
"allow_ungated_transfer": true,
"guid_creation_num": "1125899906842625",
"owner": "0x1",
"transfer_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0xa",
"creation_num": "1125899906842624"
}
}
}
}
},
"type": "write_resource"
},
{
"address": "0xa",
"state_key_hash": "0x1db5441d8fa4229c5844f73fd66da4ad8176cb8793d8b3a7f6ca858722030043",
"data": {
"type": "0x1::primary_fungible_store::DeriveRefPod",
"data": {
"metadata_derive_ref": {
"self": "0xa"
}
}
},
"type": "write_resource"
},
{
"address": "0x60d8ef2e962b1d1b4f602c72e23eed6fbba86eefb41853a7688073fc918d912",
"state_key_hash": "0x222b15ff81f90d75937ef6012807f0de0e0d488ccb5a229e55a954bc7870c75d",
"data": {
"type": "0x1::fungible_asset::FungibleStore",
"data": {
"balance": "566263899",
"frozen": false,
"metadata": {
"inner": "0xa"
}
}
},
"type": "write_resource"
},
{
"address": "0x60d8ef2e962b1d1b4f602c72e23eed6fbba86eefb41853a7688073fc918d912",
"state_key_hash": "0x222b15ff81f90d75937ef6012807f0de0e0d488ccb5a229e55a954bc7870c75d",
"data": {
"type": "0x1::object::ObjectCore",
"data": {
"allow_ungated_transfer": false,
"guid_creation_num": "1125899906842625",
"owner": "0x31deb490728ae8e1a89675ee4c1877af8e5849c526d2c9a64238c49d8ece08a0",
"transfer_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0x60d8ef2e962b1d1b4f602c72e23eed6fbba86eefb41853a7688073fc918d912",
"creation_num": "1125899906842624"
}
}
}
}
},
"type": "write_resource"
},
{
"address": "0x95a0fd88b11286d4790c253b39c6678b798c54b54b63bfd2bfe042411ee2e3e8",
"state_key_hash": "0xf389cd5138744eb2c2c40a6b708ff717cb7a04bec7c9c1b9b8847857eaf617cd",
"data": {
"type": "0x1::account::Account",
"data": {
"authentication_key": "0x95a0fd88b11286d4790c253b39c6678b798c54b54b63bfd2bfe042411ee2e3e8",
"coin_register_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0x95a0fd88b11286d4790c253b39c6678b798c54b54b63bfd2bfe042411ee2e3e8",
"creation_num": "0"
}
}
},
"guid_creation_num": "2",
"key_rotation_events": {
"counter": "0",
"guid": {
"id": {
"addr": "0x95a0fd88b11286d4790c253b39c6678b798c54b54b63bfd2bfe042411ee2e3e8",
"creation_num": "1"
}
}
},
"rotation_capability_offer": {
"for": {
"vec": []
}
},
"sequence_number": "1680",
"signer_capability_offer": {
"for": {
"vec": []
}
}
}
},
"type": "write_resource"
}
],
"sender": "0x95a0fd88b11286d4790c253b39c6678b798c54b54b63bfd2bfe042411ee2e3e8",
"sequence_number": "1679",
"max_gas_amount": "5000",
"gas_unit_price": "100",
"expiration_timestamp_secs": "1760341246",
"payload": {
"function": "0x31deb490728ae8e1a89675ee4c1877af8e5849c526d2c9a64238c49d8ece08a0::lesserafim_3::crazy",
"type_arguments": [
"0x1::aptos_coin::AptosCoin",
"0x111ae3e5bc816a5e63c2da97d0aa3886519e0cd5e4b046659fa35796bd11542a::stapt_token::StakedApt",
"0xf22bede237a07e121b56d91a491eb7bcdfd1f5907926a9e58338f964a01b17fa::asset::USDC",
"0x159df6b7689437016108a019fd5bef736bac692b6d4a1f10c941f6fbb9a74ca6::oft::CakeOFT",
"0x8d87a65ba30e09357fa2edea2c80dbac296e5dec2b18287113500b902942929d::celer_coin_manager::UsdcCoin",
"0x1::aptos_coin::AptosCoin",
"u64",
"u64",
"u64",
"u64",
"u64"
],
"arguments": [
"0x010f0a0101",
"0x01010101010000",
[
"25",
"10",
"30",
"25",
"25"
],
[
{
"inner": "0xa"
},
{
"inner": "0xa"
},
{
"inner": "0xa"
},
{
"inner": "0xa"
},
{
"inner": "0xa"
},
{
"inner": "0xa"
}
],
[
"0x1",
"0x5669f388059383ab806e0dfce92196304205059874fd845944137d96bbdfc8de",
"0x1",
"0x1",
"0x1"
],
[
false,
true,
false,
true,
false
],
"28452012"
],
"type": "entry_function_payload"
},
"signature": {
"sender": {
"public_key": "0x1e9d94603ebd6b4a1d38e760be2b0523f09fb1f59e1e43c657f0ab3ef6205427",
"signature": "0x05f71501658fdc40b6f42f71d6c298a378434a5825af5bc0efcc15aba2aa38625064612139299f43ae40e710bad18ce0b9935dee00b705285a8f73318f06a301",
"type": "ed25519_signature"
},
"secondary_signer_addresses": [],
"secondary_signers": [],
"fee_payer_address": "0x31deb490728ae8e1a89675ee4c1877af8e5849c526d2c9a64238c49d8ece08a0",
"fee_payer_signer": {
"public_key": "0x17dfb6544cf49621c75af067528755a38061bdd210342f8bdf565bcdf561f056",
"signature": "0x7866a52d642e7442671d0614cf7b201a29bdbd8b709ea59462d32917c368f596d771ab6592d1659952970cb277a35d536d0966a754c2cd610858f8c04eb93e08",
"type": "ed25519_signature"
},
"type": "fee_payer_signature"
},
"replay_protection_nonce": null,
"events": [
{
"guid": {
"creation_number": "0",
"account_address": "0x0"
},
"sequence_number": "0",
"type": "0x1::transaction_fee::FeeStatement",
"data": {
"execution_gas_units": "130",
"io_gas_units": "65",
"storage_fee_octas": "0",
"storage_fee_refund_octas": "0",
"total_charge_gas_units": "195"
}
}
],
"timestamp": "1760341227055115",
"type": "user_transaction"
}
const axios = require('axios');
let config = {
method: 'get',
maxBodyLength: Infinity,
url: 'https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions/by_hash/0xd797b944ed8657406a1b09a5928048093399fc0a2f576d3e57c0f9cedbf95c4a',
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
import requests
url = "https://go.getblock.io/<ACCESS_TOKEN>/v1/transactions/by_hash/0xd797b944ed8657406a1b09a5928048093399fc0a2f576d3e57c0f9cedbf95c4a"
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)A step-by-step guide on how to build MCP with GetBlock API
The Model-Context Protocol (MCP) is an open standard created by Anthropic that provides a universal way for AI assistants to connect to external data sources and tools.
With MCP, AI applications can connect to various data sources (e.g., local files, databases), tools (e.g., search engines, calculators), and workflows (e.g., specialized prompts)āenabling them to access key information and perform tasks effectively.
You can picture MCP as a "USB-C for AI":
Before USB-C: Every device had different charging ports
After USB-C: One universal port works with everything
Similarly, MCP creates a universal "port" for AI assistants to connect to data.
In short, MCP helps AI applications access the right information at the right time, thereby reducing the likelihood of incorrect or misleading responses.
In this guide, you will learn how to:
Get a GetBlock Access Token for Ethereum's API endpoint
A basic MCP server with three core capabilities:
Check ETH balance for any Ethereum address
Get current gas prices
Basic understanding of JavaScript
Must have installed and
A GetBlock
Node.js: JavaScript runtime environment that lets developers create servers, web apps, command line tools and scripts.
This allows applications to provide the context for LLMs in a standardized way.
: TypeScript-first validation library.
: A library for interacting with the Ethereum blockchain and its ecosystem.
Set up your project directory using this command:
Install Dependencies:
@modelcontextprotocol/sdk: Core MCP server functionality that provides McpServer class and transport mechanisms.
ethers: Js library for interacting with Blockchain e.g Ethereum.
zod: a schema that validates user inputs before processing.
Configure Package.json
"type": "module" - Enables ES6 import/export syntax (required for MCP SDK)
"main": "server.js" - Specifies entry point of your application
"bin" - Allows running server as npx mcp-ethereum command
Get GetBlock's API Access Token
Log in to your
On your dashboard, scroll and click on Get Endpoint
Select the Ethereum Mainnet network
Create the following files to have a basic structure for your project:
Your script will be written inside server.js
What this does:
Reads API token from environment variable
Creates Ethers provider pointing to GetBlock endpoint
All blockchain queries route through GetBlock's infrastructure
Configuration:
name - Unique identifier for your server
version - Semantic version for tracking updates
console.error() - Logs to stderr (separate from data output)
Tool 1: Get ETH Balance
This tool fetches the ETH balance for any Ethereum address:
What this does:
Register the tool
Validates Ethereum address format
Queries Ethereum blockchain through GetBlock
Returns balance in Wei (smallest unit)
Tool 2: Get Gas Price
This tool retrieves current Ethereum gas prices:
What it does:
Register the tool
Fetch gas price
Converts the gas price from Wei to Gwei (1 Gwei = 10^9 Wei)
Tool 3: Get Block Number
This tool returns the latest Ethereum block number.
What this does:
Get the latest block
Includes server timestamp for correlation
Create a Server connection with Claude desktop
What this does:
const transport = new StdioServerTransport(): create communication channel between the client(Claude Desktop) and the server(script)
Links MCP server to transport mechanism
Registers all tools with MCP client
Starts listening for incoming requests
Start the server and shut down:
What this does:
SIGINT - Handles Ctrl+C interrupts
When the user runs npm run start , this will start the server.
Open your Claude Desktop
Click on Settings
Scroll down and Click on Developer
Under Local MCP Server, click on Edit Config
Add the following configuration:
Config Location:
Edit Configuration:
Add the following configuration:
Config Location:
Add the following configuration:
Config Location:
Add the following configuration:
Test 1: Check ETH Balance
Permit Claude to query the data
Expected: Claude calls get_eth_balance tool and shows balance e.g
The ETH balance for address 0xd1af2dac4e0a9d1f58b99e2f42bc0320ed74a7cd is 0.000104792219532 ETH (approximately 104,792,219,532,000 wei).
Test 2: Gas Price
Expected: Claude calls get_gas_price tool and shows price in Gwei e.g
The current Ethereum gas price is 0.071638489 Gwei (or about 71.6 million wei).
For EIP-1559 transactions:
Max Fee Per Gas: 0.143276976 Gwei
Max Priority Fee Per Gas: 0.000000002 Gwei
This is relatively low gas pricing, which means it's a good time for transactions on the Ethereum network.
Test 3: Block Number
Expected: Claude calls get_block_number tool and shows block e.g
The latest Ethereum block number is 23,811,857 on the Ethereum Mainnet, as of 2025-11-16 at 12:50:34 UTC.
Test 4: Multiple Queries
Expected: Claude calls both tools and provides analysis e.g
Balance for 0xd1af2dac4e0a9d1f58b99e2f42bc0320ed74a7cd:
0.000104792219532 ETH
Current Gas Price Assessment: The current gas price of 0.063 Gwei is very low. This is excellent for making transactions!
For context:
Low gas: < 20 Gwei
Test 5: Natural Language
Expected: Claude checks gas price and provides a recommendation e.g
Yes, now is an excellent time to send an Ethereum transaction! Here's why:
The current gas price of 0.060 Gwei is extremely low. To put this in perspective, a standard ETH transfer (21,000 gas units) would only cost about:
0.060 Gwei Ć 21,000 = 0.00000126 ETH (roughly $0.004 USD)
This is about as cheap as gas fees get on Ethereum. Gas prices can spike to 30-100+ Gwei during busy periods, which would make the same transaction 500-1600x more expensive.
However, one thing to consider: The address you checked (0xd1af...a7cd) only has 0.0001048 ETH. While the gas is cheap right now, you'd still need to ensure you're leaving enough in the wallet to cover the gas fee for any transaction you want to make.
If you're planning to send transactions from a different address with more funds, or if you're just doing something simple like a basic ETH transfer, this is definitely an opportune moment to take advantage of these low gas prices!
If you experience this error:
This means that:
Your GetBlock token is missing or incorrect
The base URL is not correct.
Each location has a unique URL
In this guide, you've successfully functional MCP server that connects AI assistants to blockchain data using the GetBlock API. Now you know what MCP is, how to set up your project, get your GetBlock Token and get a response directly from your Claude.
Retrieve the latest block number
Claude configuration and deployment
"scripts" - Defines shortcuts like npm start
Under API Interface, select JSON-RPC
Click on Create to get your endpoint
Your endpoint will look like:
f. Save the token in .env file in this format:
Keep your endpoint safe, as it contains an access token
Project Structure
1500000000000000000 ā "1.5"Return MCP content format
JSON stringified with 2-space indentation
Includes raw Wei value for precision
High gas: 50-100 Gwei
Very high gas: > 100 Gwei
At 0.063 Gwei, you're looking at extremely cheap transaction costs right now. This is a great time to interact with the Ethereum network if you're planning any transactions.


A complete guide on how to track Pump.fun token launches on Solana in real-time using GetBlockās Yellowstone gRPC service.
Traditional blockchain monitoring relies on polling RPC endpoints every few seconds, which introduces significant latency (2-5 seconds) and checking for updates that may not exist.
GetBlock's Yellowstone gRPC service solves this by streaming data from Solana validators in real time.
Here is a comparison:
GetBlock provides access to Solana's Yellowstone Geyser gRPC plugin, delivering real-time blockchain data through a high-performance streaming protocol:
Ultra-Low Latency: Direct streaming from validators with ~400ms latency vs 2-5 seconds with traditional RPC polling
Efficient Filtering: Subscribe only to the specific programs and accounts you need, reducing bandwidth and processing overhead
Bidirectional Streaming: Single persistent connection handles both requests and data flow, eliminating polling waste
No Infrastructure Needed: GetBlock manages validators, updates, and monitoring across global data centers (Europe, USA, Asia)
In this guide, you will learn how to:
Connects to GetBlock's Yellowstone gRPC service
Subscribes to all transactions involving Pump.fun's program
Filters for token creation instructions specifically
Parses instruction data to extract token metadata
Before you begin, ensure you have:
and npm installed
Basic knowledge of JavaScript
A
A Dedicated Solana Node subscription on GetBlock - Required for Yellowstone gRPC access
Node.js
- Official Yellowstone gRPC client
- Base58 encoding for Solana addresses
GetBlockās Dedicated Solana Node with Yellowstone add-on
First, you need to deploy a dedicated Solana node on GetBlock with the Yellowstone gRPC add-on enabled.
1. Sign up or log in
Go to
Create an account or log in to your existing account
2. Deploy your dedicated node
Navigate to your user Dashboard
Switch to the "Dedicated nodes" tab
Scroll down to "My endpoints"
Under "Protocol", select Solana
3. Enable the Yellowstone gRPC add-on
In Step 3 of your node setup (Select API and Add-ons)
Check the box for Yellowstone gRPC under Add-ons
Complete payout and finalise the setup
Once your node is live, you'll create an access token to authenticate your gRPC connections.
1. Return to your dashboard
Under your dedicated node dashboard, click on "My endpoints".
Select Yellowstone gRPC
Click on Add to generate an access token
2. Your endpoint URL
You'll receive an HTTPS-style gRPC endpoint URL based on your chosen region:
Ensure you securely store both the base endpoint and the access token. You'll need them in your code to authenticate with GetBlock's Yellowstone service.
Create a directory for your project
Install Dependencies:
What these packages do:
- Official client for connecting to Yellowstone gRPC services (works with GetBlock)
- Encodes binary data to base58 format (Solana's address format). Version 5.0.0 supports vanilla js.
Create the following files to have a basic structure for your project:
Import dependencies into pumpfun-monitor.js :
What this does:
yellowstone gRPC Client for connecting to GetBlock
CommitmentLevel Settings for choosing transaction confirmation speed
bs58 for converting binary data into human-readable Solana addresses.
Add your GetBlock configuration:
What this does:
Stores your GetBlock credentials.
Replace YOUR_ACCESS_TOKEN with the actual token you generated in Step 1.
If you chose a different region, use that endpoint instead (e.g., https://go.getblock.us/<ACCESS_TOKEN> or https://go.getblock.asia/<ACCESS_TOKEN>.
Add Pump.fun constants:
What this does:
PUMPFUN_PROGRAM - The unique program ID for Pump.fun on Solana
CREATE_DISCRIMINATOR - The 8-byte identifier that marks token creation instructions (derived from hashing "global:create")
Add statistics tracker:
This creates an object to track how many tokens you've detected and when the last one appeared.
Now, you'll add a function to decode the binary data from Pump.fun's instruction format.
Add string decoder:
What this does:
Pump.fun stores strings as [4 bytes for length][UTF-8 string data]. This function reads that format and returns both the string value and how many bytes were consumed.
Add Instruction Parser:
What this does:
Reads the token's metadata from Pump.fun's instruction data format. The data is organized like this:
First 8 bytes: Discriminator (identifies this as a "create" instruction)
Token name (e.g., "Super Doge")
Token symbol (e.g., "SDOGE")
The function starts at byte 8 (after the discriminator) and reads each string one by one using the decodeString helper function.
The next step is to create a function that extracts account addresses to identify newly created tokens' mint address, bonding curve pool address and creator's wallet address.
What this does:
Extracts three key addresses from the instruction:
accounts[0] - The newly created token's mint address
accounts[2] - The bonding curve pool address
accounts[7] - The creator's wallet address
These are defined by Pump.fun's program structure.
The next step is to verify the instruction:
What this does:
Verifies two things:
The instruction calling Pump.fun's program
The first 8 bytes which match the create discriminator
Only instructions passing both checks are token creations.
The next step is to add a function that displays the data in a readable format:
What this does:
Formats and displays all token information in a readable format
Updates statistics
Includes Solscan link to the token, transaction hash and creator.
Now you'll create the core function that connects to GetBlock and processes blockchain data.
This section is broken into smaller parts for clarity.
What this does:
Creates a client connection to GetBlock using your credentials and opens a bi-directional streaming connection.
What this does:
Tells GetBlock you only want transactions involving Pump.fun's program, with CONFIRMED commitment level (~2-3 seconds, balanced speed/reliability).
What this does:
Processes each message from GetBlock - responds to keep-alive pings and extracts transaction data.
What this does:
For each instruction, it checks if it's a create, parses metadata, extracts addresses, and displays results.
What this does:
It handles stream errors and connection closures.
What this does:
Sends your subscription request to GetBlock and confirms the connection is active.
This completes the monitorPumpfunMints() function - everything above is part of this one function in your pumpfun-monitor.js file.
Finally, add the code to run your monitor:
What this does:
Runs your monitor and automatically restarts it if it crashes.
What this does:
Handles Ctrl+C to show final statistics before shutdown.
Run the following command in your terminal to start the server:
You'll see:
This means you're connected to GetBlock and monitoring is active.
When a new token appears, it displays like this:
Congratulations š, you've successfully created an application that tracks Pump.fun token minted.
Connection issues:
This means there is a connection glitch:
Verify your ENDPOINT and TOKEN in pumpfun-monitor.js
Check your GetBlock dashboard to confirm if the node is active
Test your internet connection
Tokens not showing:
Be patient - Pump.fun typically has 50-200 tokens per day
Visit to verify tokens are being created
Try CommitmentLevel.PROCESSED for faster updates
Parser Errors:
These warnings are normal. This means some transactions aren't structured.
This is highly recommended to use environment variables instead of hard-coding. Create an .env file and store your token like this:
and reference it in your pumpfun-monitor.js like this:
Remember to add the .env file in your .gitignore file.
In this guide, you learn how to build a tracking application that monitors Pump.fun token minted using GetBlock Yellowstone gRPC. This guide explains the importance of using GetBlock Yellowstone gRPC, how to get your Yellowstone gRPC token, set up the application to get the expected result.
It also explains how to troubleshoot some errors you may encounter and possible ways to enhance the security and maintainability of your applications.
How to Build an App to Track Large Solana Transactions with GetBlock Yellowstone Geyer gRPC
Monitoring high-value SOL transactions is essential for understanding the dynamics of the Solana network. By using tools like Yellowstone Geyser gRPC with GetBlock, developers can gain real-time insights into significant financial movements, enabling them to make informed decisions and capitalize on trends within the Solana ecosystem.
In this tutorial, you'll build a monitoring app that detects high-value SOL transfers the moment they occur on the Solana blockchain.
You'll learn how to:
Connect to GetBlock's Yellowstone gRPC service for ultra-low latency blockchain data streaming
Subscribe to Solana's System Program to capture all native SOL transfers
Parse transfer instruction data to extract amounts, sender addresses, and recipient addresses
Filter transactions based on transfer amount thresholds
Display real-time alerts with formatted output and explorer links
Track statistics, including total volume and largest transfers
Node.js
- Official Yellowstone gRPC client
- Base58 encoding for Solana addresses
GetBlock's Dedicated Solana Node with Yellowstone add-on
Before you begin, ensure you have:
Node.js v18 or higher is installed on your system
Basic JavaScript knowledge
A GetBlock account - Free sign-up available at getblock.io
A Dedicated Solana Node subscription on GetBlock - Required for Yellowstone gRPC access
First, you need to deploy a dedicated Solana node on GetBlock with the Yellowstone gRPC add-on enabled.
1. Sign up or log in
Go to GetBlock
Create an account or log in to your existing account
2. Deploy your dedicated node
Navigate to your user Dashboard
Switch to the "Dedicated nodes" tab
Scroll down to "My endpoints."
Under "Protocol", select Solana
3. Enable the Yellowstone gRPC add-on
In Step 3 of your node setup (Select API and Add-ons)
Check the box for Yellowstone gRPC under Add-ons
Complete payout and finalize the setup
Once your node is live, you'll create an access token to authenticate your gRPC connections.
1. Return to your dashboard
Go to "My endpoints" in your Dedicated node dashboard and generate a gRPC Access Token
2. Your endpoint URL
You'll receive an HTTPS-style gRPC endpoint URL based on your chosen region:
Save both pieces of information:
Base Endpoint: https://go.getblock.io (or your region)
Access Token: The alphanumeric token generated
Open your terminal and create a new directory:
Initialize Node.js Project
Install the required packages:
Create a new file:
Configure package.json:
"type": "module" - Enables ES6 import/export syntax (required for modern JavaScript)
"main": "sol-transfer-monitor.js" - Specifies the entry point of your application
"scripts" - Defines shortcuts like npm start
Create the following files to have a basic structure for your project:
Create a .gitignore file:
What this does:
Client - The main class for establishing a connection to GetBlock's Yellowstone gRPC service
CommitmentLevel- Configuration options that determine how finalized transactions should be before you receive them (PROCESSED = fastest but can be rolled back, CONFIRMED = balanced, FINALIZED = slowest but guaranteed)
bs58 - A library that converts Solana's binary address format into the human-readable base58 strings you see on blockchain explorers (like "9wFFyRfZBsuAha4YcuxcXLKwMxJR...")
What this does: Stores your GetBlock credentials for authenticating your connection.
If you chose a different region during setup, use that base URL instead (e.g., https://go.getblock.us or https://go.getblock.asia).
What this does:
SYSTEM_PROGRAM - This is the unique identifier for Solana's built-in System Program, which is responsible for all native SOL transfers on the network. Every time someone sends SOL from one wallet to another, this program processes it.
MIN_TRANSFER_AMOUNT - Sets the threshold for what qualifies as a "high-value" transfer. Only transfers of 100 SOL or more will trigger an alert. You can adjust this to any amount (e.g., 50 SOL, 1000 SOL, etc.).
What this does:
Creates an object to track key metrics about the transfers you're monitoring. It records:
When the monitor started
How many high-value transfers have been detected
the cumulative volume of all transfers
Now you'll add helper functions to format data and display results.
What this does:
Converts lamports (Solana's smallest unit) to SOL for human-readable display. Solana stores all amounts in lamports, where 1 SOL equals 1 billion lamports (similar to how 1 Bitcoin = 100 million satoshis). This function divides by 1 billion and rounds to 4 decimal places, so 5,500,000,000 lamports becomes "5.5000 SOL".
What this does:
Formats and displays all transfer information clearly. It first updates your running statistics (incrementing the transfer count, adding to total volume, and checking if this is the largest transfer seen).
Then it converts the amount from lamports to SOL and prints out all the details, including sender, recipient, transaction signature, and slot number.
Finally, it includes clickable Solscan explorer links so you can investigate the transaction, sender, and recipient in more detail.
Now you'll create the function that extracts transfer details from instruction data.
What this does:
Extracts the transfer amount and account addresses from a System Program instruction.
If anything goes wrong during parsing (malformed data, missing accounts, etc.), it catches the error and returns null.
Now you'll create the core function that connects to GetBlock and processes blockchain data.
What this does:
Initializes the monitor by displaying startup information and establishing a connection to GetBlock.
Creates a new Client instance using your endpoint and token, then opens a bidirectional streaming connection.
The subscribe() method returns a stream object that handles both sending requests to GetBlock and receiving blockchain data.
What this does:
Builds the subscription request that tells GetBlock exactly what blockchain data you want to receive.
It filters sol_transfers
Send transactions that interact with the system
Only receive transactions that are CONFIRMED
What this does:
Sets up an event handler that processes every message GetBlock sends through the stream.
What this does:
Loops through each instruction in the transaction to find and process SOL transfers.
What this does:
Sets up handlers for stream connection issues.
If the stream encounters an error (network problem, authentication issue, etc.), it logs the error message and rejects the Promise, which will trigger the auto-restart logic in the main() function.
The "end" and "close" events indicate the stream has been terminated gracefully, so it resolves the Promise normally.
What this does:
Send your subscription request to GetBlock to activate the stream.
Once the request is sent successfully, it confirms that monitoring is active.
The callback function checks if there was an error sending the request - if so, it rejects the Promise; otherwise, it displays a success message. This completes the monitorHighValueTransfers() function.
Finally, add the code to run your monitor and handle shutdown.
What this does:
Wraps your monitor in an auto-restart loop. If the monitor crashes for any reason (network disconnection, API error, unexpected data format), it catches the error, displays an error message, waits 5 seconds, and then automatically restarts the monitor. This ensures your monitor keeps running even if temporary issues occur.
What this does:
Handles shutdown when you press Ctrl+C or cmd+C. Instead of abruptly terminating, it displays a summary of your monitoring session, including total transfers detected, cumulative volume, the largest transfer amount with a link to view it, and how long the monitor was running. Then it cleanly exits the process.
What this does:
Run everything. This is the last line of your sol-transfer-monitor.js file and triggers the execution of your monitor.
1. Start the Monitor
Expected Output:
Permission denied:
This means that your access token is missing or incomplete, or you are using the wrong Base URL.
2. No Transfers Showing
High-value transfers (100+ SOL) are less common than you might expect
Try lowering MIN_TRANSFER_AMOUNT to 10 or 50 SOL to see more activity
Use CommitmentLevel.PROCESSED for faster updates (though some may be rolled back)
In this guide, you've learnt how to build a monitor app that tracks high-value SOL transactions on Solana networks. It shows you the steps involved, such as:
Connects to GetBlock's Yellowstone gRPC service
Streams blockchain data with ~400ms latency
Filters for System Program transactions
Parses SOL transfer amounts and addresses
Step-by-step guide for building a Node.js app to track real-time swaps on Solana using GetBlock's Yellowstone gRPC
Monitoring liquidity pools on Solana decentralised exchanges (DEXes) in real-time is crucial for traders and developers who want to stay updated with the latest market conditions and make informed decisions.
GetBlock's Yellowstone gRPC service allows developers to fetch data directly from Solana validators easily with low latency - appropriately ~400ms latency.
In this guide, you'll build a monitor that tracks every swap happening on a specific Solana DEX liquidity pool, regardless of which platform (Jupiter, Raydium, Phantom Wallet, etc.) the user is trading with.
You'll learn how to:
Connect to GetBlock's Yellowstone gRPC service for ultra-low latency blockchain data streaming
# create project folder
mkdir basic-ethereum-mcp
# navigate through the folder
cd basic-ethereum-mcp
# initialise npm
npm init -ynpm install @modelcontextprotocol/sdk zod ethers{
"name": "basic-ethereum-mcp",
"version": "1.0.0",
"type": "module",
"description": "MCP server with GetBlock API integration",
"main": "server.js",
"bin": {
"mcp-ethereum": "./server.js"
},
"scripts": {
"start": "node server.js"
},
"keywords": ["mcp", "blockchain", "ethereum", "getblock"],
"author": "Your Name",
"license": "MIT",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.22.0",
"ethers": "^6.15.0",
"zod": "^3.25.76"
}
}āāā server.js // Main application
āāā .env // Environment variables
āāā .gitignore // Git ignore fileimport { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { ethers } from "ethers";
import { z } from "zod";
// Validate environment
const GETBLOCK_TOKEN = process.env.GETBLOCK_TOKEN;
// Initialise Ethers provider with GetBlock
const provider = new ethers.JsonRpcProvider(
`https://go.getblock.us/${GETBLOCK_TOKEN}/`
);// Create MCP server with modern API
const server = new McpServer({
name: "ethereum-mcp-server",
version: "1.0.0",
});
console.error("ā
Ethereum MCP Server initialized");server.tool(
"get_eth_balance",
{
address: z
.string()
.regex(/^0x[a-fA-F0-9]{40}$/)
.describe("Ethereum address (0x followed by 40 hex characters)"),
},
async ({ address }) => {
try {
// Fetch balance from blockchain
const balanceWei = await provider.getBalance(address);
// Convert Wei to ETH
const balanceEth = ethers.formatEther(balanceWei);
// Return structured response
return {
content: [
{
type: "text",
text: JSON.stringify(
{
address: address,
balance: balanceEth,
unit: "ETH",
balanceWei: balanceWei.toString(),
},
null,
2
),
},
],
};
} catch (error) {
return {
content: [
{
type: "text",
text: JSON.stringify({
error: error.message,
address: address,
}),
},
],
isError: true,
};
}
}
);server.tool("get_gas_price", {}, async () => {
try {
// Fetch current fee data
const feeData = await provider.getFeeData();
// Convert to Gwei
const gasPriceGwei = ethers.formatUnits(feeData.gasPrice, "gwei");
return {
content: [
{
type: "text",
text: JSON.stringify(
{
gasPrice: gasPriceGwei,
unit: "Gwei",
gasPriceWei: feeData.gasPrice.toString(),
maxFeePerGas: feeData.maxFeePerGas
? ethers.formatUnits(feeData.maxFeePerGas, "gwei")
: null,
maxPriorityFeePerGas: feeData.maxPriorityFeePerGas
? ethers.formatUnits(feeData.maxPriorityFeePerGas, "gwei")
: null,
},
null,
2
),
},
],
};
} catch (error) {
return {
content: [
{
type: "text",
text: JSON.stringify({ error: error.message }),
},
],
isError: true,
};
}
});server.tool("get_block_number", {}, async () => {
try {
// Fetch latest block number
const blockNumber = await provider.getBlockNumber();
return {
content: [
{
type: "text",
text: JSON.stringify(
{
blockNumber: blockNumber,
timestamp: new Date().toISOString(),
network: "Ethereum Mainnet",
},
null,
2
),
},
],
};
} catch (error) {
return {
content: [
{
type: "text",
text: JSON.stringify({ error: error.message }),
},
],
isError: true,
};
}
});async function main() {
try {
// Create stdio transport for Claude Desktop
const transport = new StdioServerTransport();
// Connect server to transport
await server.connect(transport);
console.error("š Ethereum MCP Server is running!");
console.error("š” Connected via stdio transport");
console.error("ā³ Waiting for tool calls...");
} catch (error) {
console.error("ā Failed to start server:", error);
process.exit(1);
}
}// Handle graceful shutdown
process.on("SIGINT", () => {
console.error("\nš Shutting down...");
process.exit(0);
});
// Start the server
main().catch((error) => {
console.error("š„ Fatal error:", error);
process.exit(1);
});~/Library/Application Support/Claude/claude_desktop_config.jsoncode ~/Library/Application\ Support/Claude/claude_desktop_config.json{
"mcpServers": {
"ethereum": {
"command": "node",
"args": [
"/Users/YOUR_USERNAME/basic-ethereum-mcp/server.js"
],
"env": {
"GETBLOCK_TOKEN": "your-actual-getblock-token-here"
}
}
}
}%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"ethereum": {
"command": "node",
"args": [
"C:\\Users\\YOUR_USERNAME\\basic-ethereum-mcp/\\server.js"
],
"env": {
"GETBLOCK_TOKEN": "your-actual-getblock-token-here"
}
}
}
}~/.config/Claude/claude_desktop_config.json{
"mcpServers": {
"ethereum": {
"command": "node",
"args": [
"/home/YOUR_USERNAME/basic-ethereum-mcp//server.js"
],
"env": {
"GETBLOCK_TOKEN": "your-actual-getblock-token-here"
}
}
}
}What's the ETH balance of 0xd1af2dac4e0a9d1f58b99e2f42bc0320ed74a7cd?What's the current Ethereum gas price?What's the latest Ethereum block number?Check the balance for 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
and tell me if the current gas price is high or lowIs now a good time to send an Ethereum transaction?https://go.getblock.us/7hys368hus...https://go.getblock.asia/f782e8ec54....https://go.getblock.io/d4067b3cc......https://go.getblock.us/{YOUR-ACCESS-TOKEN}/GETBLOCK_TOKEN=your_tokenSimple Integration: Standard HTTPS endpoint with token authentication, works with existing gRPC client libraries.
Displays formatted output with Solscan explorer links
Tracks statistics and auto-reconnects on errors
Set the network to Mainnet
Click Get
Metadata URI (link to token image and details)
2-5 second delays, constant API requests, high resource usage
1-3 second delays, server pushes updates when available
~400ms latency, bidirectional streaming, direct validator connection



Set the network to Mainnet
Click Get
config: This loads the .env file
information about the largest transfer seen so far.
Displays formatted results with links
Tracks cumulative statistics
Handles errors and auto-reconnects
https://go.getblock.io/YOUR_ACCESS_TOKEN/https://go.getblock.us/YOUR_ACCESS_TOKEN/https://go.getblock.asia/YOUR_ACCESS_TOKEN/mkdir pumpfun-monitor
cd pumpfun-monitor
npm init-ynpm install @triton-one/yellowstone-grpc [email protected]āāā pumpfun-monitor.js // Main apllication
āāā .env // Environment variables
āāā .gitignore // Git ignore fileconst Client = require("@triton-one/yellowstone-grpc").default;
const { CommitmentLevel } = require("@triton-one/yellowstone-grpc");
const bs58 = require("bs58");// GetBlock Configuration
const ENDPOINT = "https://go.getblock.io"; // Your region's endpoint
const TOKEN = "YOUR_ACCESS_TOKEN"; // Your generated token// Pump.fun Program Constants
const PUMPFUN_PROGRAM = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P";
const CREATE_DISCRIMINATOR = Buffer.from([24, 30, 200, 40, 5, 28, 7, 119]);// Statistics Tracking
let stats = {
startTime: Date.now(),
totalMints: 0,
lastMintTime: null
};
What this does: function decodeString(buffer, offset) {
const length = buffer.readUInt32LE(offset);
const str = buffer.slice(offset + 4, offset + 4 + length).toString('utf8');
return { value: str, bytesRead: 4 + length };
}function parseCreateInstruction(data) {
try {
let offset = 8; // Skip the discriminator
const name = decodeString(data, offset);
offset += name.bytesRead;
const symbol = decodeString(data, offset);
offset += symbol.bytesRead;
const uri = decodeString(data, offset);
return {
name: name.value,
symbol: symbol.value,
uri: uri.value
};
} catch (error) {
return null;
}
}
function extractAccounts(transaction, instructionIndex) {
try {
const message = transaction.transaction.message;
const instruction = message.instructions[instructionIndex];
const accountKeys = message.accountKeys;
const accountIndices = Array.from(instruction.accounts);
const accounts = accountIndices.map(idx => {
const accountKey = accountKeys[idx];
return bs58.encode(Buffer.from(accountKey));
});
return {
mint: accounts[0],
bondingCurve: accounts[2],
creator: accounts[7]
};
} catch (error) {
return null;
}
}function isCreateInstruction(instruction, accountKeys) {
const programIdx = instruction.programIdIndex;
const programId = bs58.encode(accountKeys[programIdx]);
if (programId !== PUMPFUN_PROGRAM) return false;
const data = Buffer.from(instruction.data);
return data.slice(0, 8).equals(CREATE_DISCRIMINATOR);
}function displayTokenMint(tokenData, signature, slot) {
stats.totalMints++;
stats.lastMintTime = new Date();
console.log("\n" + "=".repeat(80));
console.log(`š NEW PUMP.FUN TOKEN MINT #${stats.totalMints}`);
console.log("=".repeat(80));
console.log(`\nš NAME: ${tokenData.name}`);
console.log(`š·ļø SYMBOL: $${tokenData.symbol}`);
console.log(`\nšŖ MINT: ${tokenData.mint}`);
console.log(`š¤ CREATOR: ${tokenData.creator}`);
console.log(`š BONDING: ${tokenData.bondingCurve}`);
console.log(`\nš METADATA: ${tokenData.uri}`);
console.log(`š SIGNATURE: ${signature}`);
console.log(`š° SLOT: ${slot}`);
console.log(`\nš EXPLORE:`);
console.log(` Token: https://solscan.io/token/${tokenData.mint}`);
console.log(` TX: https://solscan.io/tx/${signature}`);
console.log(` Creator: https://solscan.io/account/${tokenData.creator}`);
console.log("\n" + "=".repeat(80) + "\n");
}async function monitorPumpfunMints() {
console.log("š Starting Pump.fun Token Mint Monitor");
console.log(`šÆ Watching program: ${PUMPFUN_PROGRAM}\n`);
console.log("Waiting for new token mints...\n");
return new Promise(async (resolve, reject) => {
try {
const client = new Client(ENDPOINT, TOKEN, undefined);
const stream = await client.subscribe(); const request = {
accounts: {},
slots: {},
transactions: {
pumpfun: {
accountInclude: [PUMPFUN_PROGRAM],
accountExclude: [],
accountRequired: []
}
},
transactionsStatus: {},
entry: {},
blocks: {},
blocksMeta: {},
commitment: CommitmentLevel.CONFIRMED,
accountsDataSlice: [],
ping: undefined
};
stream.on("data", (message) => {
try {
if (message.pong) {
stream.write({ ping: { id: message.pong.id } });
return;
}
if (message.transaction && message.filters &&
message.filters.includes('pumpfun')) {
const tx = message.transaction.transaction;
const signature = bs58.encode(tx.signature);
const slot = message.transaction.slot.toString();
const txMessage = tx.transaction.message;
const accountKeys = txMessage.accountKeys;
const instructions = txMessage.instructions;for (let i = 0; i < instructions.length; i++) {
const instruction = instructions[i];
if (isCreateInstruction(instruction, accountKeys)) {
const instructionData = Buffer.from(instruction.data);
const tokenMetadata = parseCreateInstruction(instructionData);
if (!tokenMetadata) continue;
const accounts = extractAccounts(
{ transaction: { message: txMessage } },
i
);
if (!accounts) continue;
displayTokenMint(
{ ...tokenMetadata, ...accounts },
signature,
slot
);
}
}
}
} catch (error) {
console.error(`Error: ${error.message}`);
}
});
stream.on("error", (error) => {
console.error(`Stream error: ${error.message}`);
reject(error);
});
stream.on("end", () => resolve());
stream.on("close", () => resolve());stream.write(request, (err) => {
if (err) {
reject(err);
} else {
console.log("ā
Subscription active - monitoring blockchain...\n");
}
});
} catch (error) {
reject(error);
}
});
}
async function main() {
try {
await monitorPumpfunMints();
} catch (error) {
console.error("Monitor crashed:", error.message);
console.log("Restarting in 5 seconds...");
setTimeout(main, 5000);
}
}process.on('SIGINT', () => {
console.log("\n\nš Shutting down...");
console.log(`\nTotal mints detected: ${stats.totalMints}`);
const uptime = Math.floor((Date.now() - stats.startTime) / 1000);
console.log(`Uptime: ${Math.floor(uptime / 60)}m ${uptime % 60}s\n`);
process.exit(0);
});
main();node pumpfun-monitor.jsš Starting Pump.fun Token Mint Monitor
šÆ Watching program: 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P
Waiting for new token mints...
ā
Subscription active - monitoring blockchain...================================================================================
š NEW PUMP.FUN TOKEN MINT #1
================================================================================
š NAME: Super Doge
š·ļø SYMBOL: $SDOGE
šŖ MINT: 7xKXtG5CJYAuGZ3w8bXRGLynAmj4twABC123def456
š¤ CREATOR: 9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT
š BONDING: HMU77nPMBMZ9Wf9TpvvJtFHkjNLkNeGZ8xzBvakKpump
š METADATA: https://ipfs.io/ipfs/QmYJZ9HGVgYiRGkF...
š SIGNATURE: 5TYqzsc8kGY7vMGDZxEbBFWGnEUPTQQMpk9k...
š° SLOT: 376205017
š EXPLORE:
Token: https://solscan.io/token/7xKXtG5...
TX: https://solscan.io/tx/5TYqzsc8kGY7v...
Creator: https://solscan.io/account/9wFFyRfZ...
================================================================================
Connection refusedFailed to extract accountsGETBLOCK_TOKEN=your_token node pumpfun-monitor.js//use dotenv
const TOKEN = process.env.GETBLOCK_TOKEN;https://go.getblock.asia/YOUR_ACCESS_TOKEN/https://go.getblock.us/YOUR_ACCESS_TOKEN/https://go.getblock.io/YOUR_ACCESS_TOKEN/mkdir sol-transfer-monitor
cd sol-transfer-monitornpm init -ynpm install @triton-one/yellowstone-grpc [email protected] dotenvtouch sol-transfer-monitor.js{
"name": "sol-transfer-monitor",
"version": "1.0.0",
"description": "A Listener that tracks high-value SOL transactions",
"main": "sol-transfer-monitor.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node sol-transfer-monitor.js"
},
"keywords": [
"Solana",
"Liquidity Monitor",
"Onchain transfer"
],
"author": "",
"license": "ISC",
"type": "module",
"dependencies": {
"@triton-one/yellowstone-grpc": "^4.0.2",
"bs58": "^5.0.0",
"dotenv": "^17.2.3"
}
}
pumpfun-migrations-listener/
āāā sol-transfer-monitor.js # Main application logic
āāā .env # Environment variables (add to .gitignore)
āāā .gitignore # Git ignore file
āāā package.json # Project configurationnode_modules/
.env
*.logimport Client from "@triton-one/yellowstone-grpc";
import { CommitmentLevel } from "@triton-one/yellowstone-grpc";
import bs58 from "bs58";
import { config } from "dotenv";
config();
const ENDPOINT = "https://go.getblock.io"; // Your region's endpoint
const TOKEN = process.env.GETBLOCK_TOKEN; // Your generated token// System Program (handles all native SOL transfers)
const SYSTEM_PROGRAM = "11111111111111111111111111111111";
// Minimum transfer amount in SOL to alert on
const MIN_TRANSFER_AMOUNT = 100; // 100 SOL threshold// Statistics Tracking
let stats = {
startTime: Date.now(),
totalTransfers: 0,
totalVolume: 0,
largestTransfer: 0,
largestTransferTx: null
};function formatSOL(lamports) {
return (lamports / 1_000_000_000).toFixed(4);
}function displayTransfer(transferData) {
stats.totalTransfers++;
stats.totalVolume += transferData.amount;
if (transferData.amount > stats.largestTransfer) {
stats.largestTransfer = transferData.amount;
stats.largestTransferTx = transferData.signature;
}
const solAmount = formatSOL(transferData.amount);
console.log("\n" + "=".repeat(80));
console.log(`HIGH VALUE TRANSFER #${stats.totalTransfers}`);
console.log("=".repeat(80));
console.log(`\nAMOUNT: ${solAmount} SOL`);
console.log(`FROM: ${transferData.from}`);
console.log(`TO: ${transferData.to}`);
console.log(`SIGNATURE: ${transferData.signature}`);
console.log(`SLOT: ${transferData.slot}`);
console.log(`\nEXPLORE:`);
console.log(` TX: https://solscan.io/tx/${transferData.signature}`);
console.log(` From: https://solscan.io/account/${transferData.from}`);
console.log(` To: https://solscan.io/account/${transferData.to}`);
console.log("\n" + "=".repeat(80) + "\n");
}function parseTransferInstruction(instruction, accountKeys) {
try {
const data = Buffer.from(instruction.data);
// System program transfer instruction has type 2
// Data format: [4 bytes: instruction type (2)][8 bytes: lamports amount]
if (data.length < 12) return null;
const instructionType = data.readUInt32LE(0);
if (instructionType !== 2) return null; // Not a transfer instruction
const lamports = data.readBigUInt64LE(4);
// Get from and to accounts
const accountIndices = Array.from(instruction.accounts);
if (accountIndices.length < 2) return null;
const fromAccount = bs58.encode(Buffer.from(accountKeys[accountIndices[0]]));
const toAccount = bs58.encode(Buffer.from(accountKeys[accountIndices[1]]));
return {
amount: Number(lamports),
from: fromAccount,
to: toAccount
};
} catch (error) {
return null;
}
}async function monitorHighValueTransfers() {
console.log("Starting High Value SOL Transfer Monitor");
console.log(`Minimum amount: ${MIN_TRANSFER_AMOUNT} SOL`);
console.log(`Watching: Native SOL transfers\n`);
console.log("Waiting for high value transfers...\n");
return new Promise(async (resolve, reject) => {
try {
const client = new Client(ENDPOINT, TOKEN, undefined);
const stream = await client.subscribe(); const request = {
accounts: {},
slots: {},
transactions: {
sol_transfers: {
accountInclude: [SYSTEM_PROGRAM],
accountExclude: [],
accountRequired: []
}
},
transactionsStatus: {},
entry: {},
blocks: {},
blocksMeta: {},
commitment: CommitmentLevel.CONFIRMED,
accountsDataSlice: [],
ping: undefined
};
stream.on("data", (message) => {
try {
if (message.pong) {
stream.write({ ping: { id: message.pong.id } });
return;
}
if (message.transaction && message.filters &&
message.filters.includes('sol_transfers')) {
const tx = message.transaction.transaction;
const signature = bs58.encode(tx.signature);
const slot = message.transaction.slot.toString();
const txMessage = tx.transaction.message;
const accountKeys = txMessage.accountKeys;
const instructions = txMessage.instructions;
// Process each instruction
for (const instruction of instructions) {
const programIdx = instruction.programIdIndex;
const programId = bs58.encode(accountKeys[programIdx]);
// Only process System Program instructions
if (programId !== SYSTEM_PROGRAM) continue;
const transferData = parseTransferInstruction(instruction, accountKeys);
if (!transferData) continue;
// Check if transfer meets minimum threshold
const solAmount = transferData.amount / 1_000_000_000;
if (solAmount >= MIN_TRANSFER_AMOUNT) {
displayTransfer({
...transferData,
signature: signature,
slot: slot
});
}
}
}
} catch (error) {
console.error(`Error processing transaction: ${error.message}`);
}
});
stream.on("error", (error) => {
console.error(`Stream error: ${error.message}`);
reject(error);
});
stream.on("end", () => resolve());
stream.on("close", () => resolve());
stream.write(request, (err) => {
if (err) {
reject(err);
} else {
console.log("Subscription active - monitoring blockchain...\n");
}
});
} catch (error) {
reject(error);
}
});
}
async function main() {
try {
await monitorHighValueTransfers();
} catch (error) {
console.error("Monitor crashed:", error.message);
console.log("Restarting in 5 seconds...");
setTimeout(main, 5000);
}
}process.on('SIGINT', () => {
console.log("\n\nShutting down...");
console.log(`\nTotal high value transfers: ${stats.totalTransfers}`);
console.log(`Total volume: ${formatSOL(stats.totalVolume)} SOL`);
console.log(`Largest transfer: ${formatSOL(stats.largestTransfer)} SOL`);
if (stats.largestTransferTx) {
console.log(`Largest TX: https://solscan.io/tx/${stats.largestTransferTx}`);
}
const uptime = Math.floor((Date.now() - stats.startTime) / 1000);
console.log(`Uptime: ${Math.floor(uptime / 60)}m ${uptime % 60}s\n`);
process.exit(0);
});main();npm start> [email protected] start
> node sol-transfer-monitor.js
[[email protected]] injecting env (1) from .env -- tip: āļø load multiple .env files with { path: ['.env.local', '.env'] }
Starting High Value SOL Transfer Monitor
Minimum amount: 100 SOL
Watching: Native SOL transfers
Waiting for high value transfers...
Subscription active - monitoring blockchain...
================================================================================
HIGH VALUE TRANSFER #1
================================================================================
AMOUNT: 1990.0000 SOL
FROM: 5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9
TO: 53AXjkQHZQEbHZvV55VHtcZtFzBzArLZZG5AF4ufkRhv
SIGNATURE: 4uJgnfRohiq6c9CDWUtk3w94ouYGya5dGkx4LSS5tuFGDRypuXtN7cQLLy3eNj5V1b5PwEWccJqLak1Rnd9kRtTB
SLOT: 382899112
EXPLORE:
TX: https://solscan.io/tx/4uJgnfRohiq6c9CDWUtk3w94ouYGya5dGkx4LSS5tuFGDRypuXtN7cQLLy3eNj5V1b5PwEWccJqLak1Rnd9kRtTB
From: https://solscan.io/account/5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9
To: https://solscan.io/account/53AXjkQHZQEbHZvV55VHtcZtFzBzArLZZG5AF4ufkRhv
================================================================================
^C
Shutting down...
Total high value transfers: 7
Total volume: 5519.0244 SOL
Largest transfer: 2272.0770 SOL
Largest TX: https://solscan.io/tx/3p92tKFb4AGRUJKA87vJD4fYcb3Z9wKi5AuUskA6TAR5SYciZxL3qmSH88ubQP3g7xSJQjC5kEeMSr7Lhhn8Hkc4
Uptime: 1m 50sStream error: 7 PERMISSION_DENIED: RBAC: access denied
Monitor crashed: 7 PERMISSION_DENIED: RBAC: access deniedFilter out failed transactions to show only successful swaps
Identify which DEX or aggregator initiated each swap (Jupiter, Raydium, etc.)
Display real-time swap alerts with formatted output and explorer links
Track comprehensive statistics about trading activity
Before you begin, ensure you have:
Node.js and npm installed
Basic knowledge of JavaScript
A Dedicated Solana Node subscription on GetBlock - Required for Yellowstone gRPC access
Node.js
@triton-one/yellowstone-grpc - Official Yellowstone gRPC client
bs58 - Base58 encoding for Solana addresses
GetBlockās Dedicated Solana Node with Yellowstone gRPC add-on
First, you need to deploy a dedicated Solana node on GetBlock with the Yellowstone gRPC add-on enabled.
1. Sign up or log in
Go to GetBlock
Create an account or log in to your existing account
2. Deploy your dedicated node
Navigate to your user Dashboard
Switch to the "Dedicated nodes" tab
Scroll down to "My endpoints"
Under "Protocol", select Solana
Set the network to Mainnet
Click Get
3. Enable the Yellowstone gRPC add-on
In Step 3 of your node setup (Select API and Add-ons):
Check the box for Yellowstone gRPC under Add-ons
Complete payout and finalize the setup
Once your node is live, you'll create an access token to authenticate your gRPC connections.
1. Return to your dashboard
Under your dedicated node dashboard, click on "My endpoints".
Select Yellowstone gRPC
Click on Add to generate an access token
2. Your endpoint URL
You'll receive an HTTPS-style gRPC endpoint URL based on your chosen region:
Ensure you securely store both the base endpoint and the access token. You'll need them in your code to authenticate with GetBlock's Yellowstone service.
Create a directory for your project
Install Dependencies:
What these packages do:
@triton-one/yellowstone-grpc - Official client for connecting to Yellowstone gRPC services (works with GetBlock)
[email protected] - Encodes binary data to base58 format (Solana's address format). Version 5.0.0 supports vanilla js.
Configure Package.json
"type": "module" - Enables ES6 import/export syntax
"scripts" - Defines shortcuts like npm start
Create the following files to have a basic structure for your project:
You'll build everything in a single file called pool-monitor.js. Let's start creating it piece by piece.
Create a new file pool-monitor.js and add:
What this does:
Client- The main class you'll use to connect to GetBlock's Yellowstone gRPC service and create a streaming connection
CommitmentLevel - Solana has different levels of transaction finality (how "confirmed" a transaction is). You'll use this to choose how finalised you want transactions to be before receiving them
bs58 - A library that converts Solana's binary address data (which is just bytes) into the readable base58 format you see on block explorers (like 8sLbNZ...)
config() - To load the .env variables.
What this does:
Stores your GetBlock credentials that you created in Step 1. Replace YOUR_ACCESS_TOKEN with the actual token you generated. If you chose a different region, use that endpoint instead (e.g., https://go.getblock.us or https://go.getblock.asia).
What this does:
TARGET_POOL - The unique address of the liquidity pool you're monitoring. This is the SOL/USDC Concentrated Liquidity pool on Raydium, one of the most active trading pools on Solana, with over 140,000 transactions per day
POOL_NAME - A human-readable name for display purposes
What this does:
Stores the unique program IDs for major Solana DEX platforms. These are like addresses for the programs (smart contracts) themselves. When someone makes a swap, their transaction calls one of these programs. By checking which program was called, you can identify if the swap came from:
Raydium_AMM - Raydium's standard automated market maker
Raydium_CLMM - Raydium's concentrated liquidity pools (like Uniswap V3)
JUPITER_V6 - Jupiter's DEX aggregator (finds best prices across multiple DEXes)
What this does:
It creates a simple object to track two key pieces of information: when the monitor was started (startTime) and the total number of successful swaps detected (totalSwaps).
This allows you to view cumulative statistics when you stop the program.
Now you'll add a function to identify which platform initiated each swap.
What this does:
This function examines all the instructions in a transaction to figure out where the swap came from.
Understanding how this works:
Every Solana transaction contains one or more "instructions" - think of these as individual commands or steps
Each instruction calls a specific program (smart contract)
The programIdIndex points to which program being called
We look up that program's address using accountKeys[programIdx] and convert it from binary to a readable format using bs58.encode()
Then we check if it matches any of our known DEX programs (Jupiter, Raydium CLMM, or Raydium AMM)
If none match, you label it as "Other" (could be another DEX or aggregator like Orca, Phantom Swap, etc.)
Why this matters:
Users don't always trade directly on Raydium. They might use Jupiter (which finds the best price by checking multiple DEXes) or their wallet's built-in swap feature. This function shows you the actual entry point the user used, which is interesting for understanding trading patterns.
What this does:
Formats and displays each swap in a readable way to your terminal.
Break down:
stats.totalSwaps++ - Increments the counter every time we display a swap
"=".repeat(80) - Creates a visual separator line (80 equal signs)
SOURCE - Shows which platform was used (Jupiter, Raydium, etc.)
TRADER - The Solana wallet address that initiated the swap
SIGNATURE - A unique identifier for this transaction (like a transaction hash)
SLOT - Solana's equivalent of a block number - tells you exactly when this happened on the blockchain
TIME - The local time when you received this swap notification
EXPLORE section - Provides clickable links to:
View the full transaction details on Solscan (a Solana block explorer)
View the pool itself and all its activity
Why formatted output matters:
Raw blockchain data is hard to read. This function turns binary data and hex strings into useful information that helps you understand what's happening.
Now you'll create the core function that connects to GetBlock and processes blockchain data.
This is broken into smaller parts for clarity.
What this does:
Prints a startup message so you know the monitor is launching
Creates a Promise so this function can run asynchronously and handle errors properly
new Client(ENDPOINT, TOKEN, undefined)- Creates a connection client using your GetBlock credentials.
await client.subscribe() - Opens a bidirectional streaming connection to GetBlock's Yellowstone service. This is the "pipe" through which blockchain data will flow to your application
Unlike making individual API requests (like asking "what's new?" every few seconds), this creates a persistent stream. GetBlock will push data to you immediately as it happens on the blockchain.
What this does:
Tells GetBlock exactly what data you want to receive
What this does:
Sets up an event listener that processes each message GetBlock sends you.
What this does:
processes each transaction and:
Checks if the transaction failed - txMeta.err will be present if the transaction failed. We skip these because failed swaps aren't useful to track (they might be due to slippage, insufficient balance, etc.)
Identifies the source - Calls our identifySwapSource() function to determine if it came from Jupiter, Raydium, or elsewhere
Gets the trader - In Solana, the first account in accountKeys is always the signer (the person who initiated the transaction). We convert it from binary to a readable format
Display severything - Calls our displaySwap() function with all the collected information
What this does:
Handles different connection states such as:
error - If something goes wrong with the connection (network issue, GetBlock problem, etc.), we log the error and reject the Promise. This will trigger our auto-reconnect logic later
end - The stream ended gracefully (normal shutdown)
close - The connection closed (either normally or due to an error)
Both end and close resolve the Promise, which allows the program to shut down cleanly or restart if needed.
What this does:
Sends your subscription configuration to GetBlock and confirms the connection is active.
Add the code to run your monitor with automatic restart on errors:
What this does:
Provides resilience by automatically restarting if something goes wrong.
This ensures your monitor keeps running even if there's a temporary problem. In production, you'd want to add limits (don't restart forever if there's a permanent issue), but this is great for getting started.
Finally, add the code to handle Ctrl+C successfully:
Run the Monitor
Expected output:
You'll see:
What you see:
SOURCE- This swap came through Jupiter's aggregator
TRADER - The wallet address that made the swap
SIGNATURE - Unique transaction ID (click the link to see full details on Solscan)
SLOT - Happened at blockchain slot 376,205,017
TIME- Your local time when you received this notification
The SOL/USDC pool typically has 140,000+ swaps per day, so you should see activity within seconds of starting the monitor.
Connection Issues:
Verify your ENDPOINT and TOKEN in pool-monitor.js
Check your GetBlock dashboard, confirm the node is active
Test your internet connection
No Swaps Showing:
If you don't see any swaps after a minute:
The SOL/USDC pool is extremely active, so this is unusual
Try visiting the pool on Solscan to verify it's active
Check that your subscription was successful (you should see "ā Subscription active")
Try CommitmentLevel.PROCESSED for faster updates
Processing Errors:
These are normal. Occasionally, some transactions have non-standard formats
Your monitor will skip these and continue running
Failed transactions are automatically filtered out
In this guide, you've learn how to build a monitor that fetches liquidity pools on Solana DEXes with GetBlock's Yellowstone gRPC. This guide exposes you to the importance of using GetBlock's Yellowstone gRPC and how to set up the project effectively.
https://go.getblock.io/YOUR_ACCESS_TOKEN/https://go.getblock.us/YOUR_ACCESS_TOKEN/https://go.getblock.asia/YOUR_ACCESS_TOKEN/mkdir pool-monitor
cd pool-monitor
npm init-ynpm install @triton-one/yellowstone-grpc [email protected]{
"name": "pool-monitor",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node pool-monitor.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "module",
"dependencies": {
"@triton-one/yellowstone-grpc": "^4.0.2",
"bs58": "^5.0.0",
"dotenv": "^17.2.3"
}
}
āāā pool-monitor.js. // Main application
āāā .env // Environment variables
āāā .gitignore // Git ignore fileimport Client from "@triton-one/yellowstone-grpc";
import { CommitmentLevel } from "@triton-one/yellowstone-grpc";
import bs58 from "bs58";
import { config } from "dotenv";
// Load environment variables from .env
config();// GetBlock Configuration
const ENDPOINT = "https://go.getblock.io"; // Your region's endpoint
const TOKEN = process.env.GETBLOCK_TOKEN; ; // Your generated token// Pool Configuration
const TARGET_POOL = "8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj"; // SOL/USDC CLMM
const POOL_NAME = "SOL/USDC";// Common Solana DEX Program IDs
const RAYDIUM_AMM = "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8";
const RAYDIUM_CLMM = "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK";
const JUPITER_V6 = "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4";// Statistics
let stats = {
startTime: Date.now(),
totalSwaps: 0
};function identifySwapSource(instructions, accountKeys) {
for (const instruction of instructions) {
const programIdx = instruction.programIdIndex;
const programId = bs58.encode(accountKeys[programIdx]);
if (programId === JUPITER_V6) {
return "Jupiter";
} else if (programId === RAYDIUM_CLMM) {
return "Raydium CLMM";
} else if (programId === RAYDIUM_AMM) {
return "Raydium AMM";
}
}
return "Other";
}function displaySwap(swapData) {
stats.totalSwaps++;
console.log("\n" + "=".repeat(80));
console.log(`ā
SWAP #${stats.totalSwaps} on ${POOL_NAME}`);
console.log("=".repeat(80));
console.log(`\nš SOURCE: ${swapData.source}`);
console.log(`š¤ TRADER: ${swapData.trader}`);
console.log(`š SIGNATURE: ${swapData.signature}`);
console.log(`š° SLOT: ${swapData.slot}`);
console.log(`ā° TIME: ${swapData.time}`);
console.log(`\nš EXPLORE:`);
console.log(` TX: https://solscan.io/tx/${swapData.signature}`);
console.log(` Pool: https://solscan.io/account/${TARGET_POOL}`);
console.log("\n" + "=".repeat(80) + "\n");
}async function monitorPoolSwaps() {
console.log("š Starting Liquidity Pool Swap Monitor");
console.log(`šÆ Pool: ${POOL_NAME}`);
console.log(`š Address: ${TARGET_POOL}\n`);
console.log("Waiting for swaps...\n");
return new Promise(async (resolve, reject) => {
try {
const client = new Client(ENDPOINT, TOKEN, undefined);
const stream = await client.subscribe();const request = {
accounts: {},
slots: {},
transactions: {
pool_swaps: {
accountInclude: [TARGET_POOL],
accountExclude: [],
accountRequired: []
}
},
transactionsStatus: {},
entry: {},
blocks: {},
blocksMeta: {},
commitment: CommitmentLevel.CONFIRMED,
accountsDataSlice: [],
ping: undefined
};stream.on("data", (message) => {
try {
if (message.pong) {
stream.write({ ping: { id: message.pong.id } });
return;
}
if (message.transaction && message.filters &&
message.filters.includes('pool_swaps')) {
const tx = message.transaction.transaction;
const signature = bs58.encode(tx.signature);
const slot = message.transaction.slot.toString();
const txMessage = tx.transaction.message;
const accountKeys = txMessage.accountKeys;
const instructions = txMessage.instructions;// Skip failed transactions
const txMeta = message.transaction.meta;
if (txMeta && txMeta.err) return;
// Identify swap source
const source = identifySwapSource(instructions, accountKeys);
// Get trader (signer)
const trader = accountKeys.length > 0
? bs58.encode(Buffer.from(accountKeys[0]))
: "Unknown";
displaySwap({
source: source,
trader: trader,
signature: signature,
slot: slot,
time: new Date().toLocaleTimeString()
});
}
} catch (error) {
console.error(`Error processing transaction: ${error.message}`);
}
});
stream.on("error", (error) => {
console.error(`Stream error: ${error.message}`);
reject(error);
});
stream.on("end", () => resolve());
stream.on("close", () => resolve());stream.write(request, (err) => {
if (err) {
reject(err);
} else {
console.log("ā
Subscription active - monitoring pool swaps...\n");
}
});
} catch (error) {
reject(error);
}
});
}async function main() {
try {
await monitorPoolSwaps();
} catch (error) {
console.error("Monitor crashed:", error.message);
console.log("Restarting in 5 seconds...");
setTimeout(main, 5000);
}
}process.on('SIGINT', () => {
console.log("\n\nš Shutting down...");
console.log(`Total swaps detected: ${stats.totalSwaps}\n`);
process.exit(0);
});
main();node pool-monitor.jsš Starting Liquidity Pool Swap Monitor
šÆ Pool: SOL/USDC
š Address: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
Waiting for swaps...
ā
Subscription active - monitoring pool swaps...
This means you're connected to GetBlock and monitoring is active!
When a Swap Appears
================================================================================
ā
SWAP #1 on SOL/USDC
================================================================================
š SOURCE: Jupiter
š¤ TRADER: 9wFFyRfZBsuAha4YcuxcXLKwMxJR43S7fPfQLusDBzvT
š SIGNATURE: 5TYqzsc8kGY7vMGDZxEbBFWGnEUPTQQMpk9kRvx3H8p2
š° SLOT: 376205017
ā° TIME: 14:32:18
š EXPLORE:
TX: https://solscan.io/tx/5TYqzsc8kGY7vMGDZxEbBFWGnEUPTQQMpk9kRvx3H8p2
Pool: https://solscan.io/account/8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
================================================================================"Connection refused"Error processing transaction warnings


A step-by-step guide on how to build a real-time listener for Pump.fun token migrations to both PumpSwap and Raydium using GetBlock API
Pump.fun is a Solana-based memecoin launchpad that uses a bonding curve mechanism to initiate token distribution. When a token reaches an approximate market cap of $69,000, it graduates from the bonding curve. At this point, $12,000 of liquidity is deposited to either Raydium DEX or PumpSwap (Pump.fun's native DEX). This migration creates immediate trading opportunities for developers and traders who can detect these events in real-time.
Tokens on Pump.fun start trading on a bonding curve mechanism. When the bonding curve reaches completion (approximately $69,000 market cap), the protocol executes a migration.
Bonding Curve Phase: Token trades on Pump.fun using bonding curve pricing
Completion Trigger: Bonding curve reaches ~$69k market cap
Migration Transaction: Pump.fun migration account executes the migration
Liquidity Deployment: $12,000 of liquidity is deposited into either:
In this guide, you will learn how to:
Get a GetBlock Access Token for Solana's API endpoint
Build a WebSocket listener that detects Pump.fun migrations to both PumpSwap and Raydium
Process transaction logs to extract token and pool information
Distinguish between PumpSwap and Raydium migrations
Basic understanding of JavaScript
A GetBlock
Node.js installed (v18 or higher)
Node.js: JavaScript runtime environment for building server applications
Official Solana JavaScript SDK for blockchain interactions
: WebSocket client library for real-time connections
: Environment variable management for secure configuration
Set up your project directory using this command:
Install Dependencies:
Configure package.json:
"type": "module" - Enables ES6 import/export syntax (required for modern JavaScript)
"main": "server.js" - Specifies entry point of your application
"scripts" - Defines shortcuts like npm start
Log in to your
On your dashboard, scroll and click on Get Endpoint
Select the Solana Mainnet network
Under API Interface, select WebSocket (wss://)
Your WebSocket endpoint will look like:
Also get the HTTP endpoint for transaction fetching:
Return to the dashboard
Select JSON-RPC (https://) under API Interface
Click Create
Your HTTP endpoint will look like:
Save both endpoints in a .env file in your project root:
Keep your endpoints safe, as they contain your access token
Create the following files to have a basic structure for your project:
Create a .gitignore file:
Your script will be written inside server.js
What this does:
Imports necessary libraries for Solana interactions and WebSocket connections
Loads API endpoints securely from environment variables
Validates that the required configuration is present
Defines the key addresses we'll monitor for migrations
Breaking down the constructor:
The constructor initializes all the state we need to track. Let me explain each property:
this.ws - Will hold our WebSocket connection to GetBlock
this.connection - HTTP connection for fetching full transaction details
this.subscriptionId - The ID returned when we subscribe to logs
What this does:
The start() method kicks everything off. It checks if the Websocket is connected or not.
The checkRunning() method creates a timer that runs every 60 seconds (60000 milliseconds). This serves two purposes:
It shows the listener is still running
Migration isn't frequent and may not occur within an hour. This is good for debuggingāif no logs appear, it's a sign there's an issue with the subscription. This ensures that monitoring is active.
What this does:
The connect() method creates a new WebSocket connection to GetBlock. Then it sets up four event listeners:
open - Called when the connection is established
message - Called whenever we receive data
What this does:
Uses Solana's logsSubscribe method to monitor transactions
Filters for transactions mentioning the Pump.fun migration account
Uses confirmed commitment for faster notifications (1-2 seconds)
What this does:
Parses incoming WebSocket messages
Handles subscription confirmation and stores subscription ID
Processes log notifications for migration detection
What this does:
Checks transaction logs for migration keywords like:
Skips failed transactions
Fetches full transaction details when migration is detected
What this does:
Waits 1 second for the transaction to propagate
Fetches complete transaction from Solana via HTTP
Extracts and displays migration data
What this does:
Handles both versioned and legacy Solana transactions
Detects Raydium migrations by checking for Raydium program ID
Detects PumpSwap migrations by checking for Pump.fun program ID
Extracts relevant addresses (token, pool, LP mint)
What this does:
Displays Raydium migrations with pool and LP mint info
Displays PumpSwap migrations with bonding curve info
Provides links to Solscan and trading platforms
What this does:
Implements exponential backoff for reconnections (2s, 4s, 8s, etc.)
Caps reconnection delay at 30 seconds
Exits after 10 failed reconnection attempts
What this does:
Handles graceful shutdown on Ctrl+C
Catches uncaught errors
Start your migration listener:
Expected Output:
When a token migrates to PumpSwap:
When a token migrates to Raydium (rare):
Every minute:
1. Missing access token or Connection error
This means that:
You haven't set up your environment variable as follows in this guide
Your Access token is incorrect or incomplete
2. Only seeing PumpSwap migrations or no migration at all
This is expected. Since March 2025, most tokens (95%+) have migrated to PumpSwap instead of Raydium. Also, migration doesn't happen frequently.
Not receiving any logs
Solution:
Verify subscription succeeded (you should see ā
Subscribed with ID)
Check GetBlock dashboard for API usage limits
Verify transactions exist at
In this guide, you've built an app that listens to Pump.fun token migrations to both PumpSwap and Raydium using GetBlock's Solana infrastructure. You learn:
How to connect to GetBlock's WebSocket API for real-time blockchain data
How to subscribe to specific account activities on Solana
How to distinguish between PumpSwap and Raydium migrations
How to extract token addresses and pool information from transactions
PumpSwap (Pump.fun's DEX) - Most common since March 2025
Raydium AMM - Less common, but still happens
Handle reconnections and error scenarios
Display migration data in a user-friendly format
Click on Create to get your endpoint
MIGRATION_ACCOUNT - This is the Pump.fun account that executes all migrations
RAYDIUM_PROGRAM - The Raydium program ID to detect Raydium migrations.
PUMPFUN_PROGRAM - The Pump.fun program ID to detect PumpSwap migrations.
this.isConnected - Boolean flag to track connection statusthis.reconnectAttempts - Counter for reconnection attempts (we limit it to 10)
this.raydiumMigrationCount & this.pumpswapMigrationCount - Separate counters for each migration type
this.migrations - Array to store all detected migrations
this.startTime - Timestamp when listener started (for runtime tracking)
this.totalLogsReceived - Counter for all logs received (helps with debugging)
error - Called if something goes wrong
close - Called when the connection drops
When the connection opens, handleOpen() runs. It sets isConnected to true, resets the reconnection counter (since you've successfully connected), and most importantly, subscribes to the logs you need.
How to handle versioned Solana transactions
How to implement robust reconnection logic
Pump.fun Program
6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P
Pump.fun Migration Account
39azUYFWPz3VHgKCf3VChUwbpURdCHRxjWVowf5jUJjg
Raydium Liquidity Pool V4
675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8
# Create project folder
mkdir pumpfun-migrations-listener
cd pumpfun-migrations-listener
# Initialize npm
npm init -ynpm install @solana/web3.js ws dotenv{
"name": "pumpfun-migrations-listener",
"version": "1.0.0",
"type": "module",
"description": "Real-time listener for Pump.fun migrations to PumpSwap and Raydium",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"keywords": ["pump.fun", "pumpswap", "raydium", "solana", "getblock"],
"author": "GetBlock",
"license": "MIT",
"dependencies": {
"@solana/web3.js": "^1.98.4",
"dotenv": "^17.2.3",
"ws": "^8.18.3"
}
}wss://go.getblock.us/<ACCESS_TOKEN>https://go.getblock.us/<ACCESS_TOKEN>GETBLOCK_WS_ENDPOINT=wss://go.getblock.us/<ACCESS_TOKEN>
GETBLOCK_HTTP_ENDPOINT=https://go.getblock.us/<ACCESS_TOKEN>pumpfun-migrations-listener/
āāā server.js # Main application logic
āāā .env # Environment variables (add to .gitignore)
āāā .gitignore # Git ignore file
āāā package.json # Project configurationnode_modules/
.env
*.logimport { Connection, PublicKey } from '@solana/web3.js';
import WebSocket from 'ws';
import dotenv from 'dotenv';
// Load environment variables
dotenv.config();
// Configuration
const WS_ENDPOINT = process.env.GETBLOCK_WS_ENDPOINT;
const HTTP_ENDPOINT = process.env.GETBLOCK_HTTP_ENDPOINT;
const MIGRATION_ACCOUNT = '39azUYFWPz3VHgKCf3VChUwbpURdCHRxjWVowf5jUJjg';
const RAYDIUM_PROGRAM = '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8';
const PUMPFUN_PROGRAM = '6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P';
// Validate configuration
if (!WS_ENDPOINT || !HTTP_ENDPOINT) {
console.error('ā Missing required environment variables');
console.error('Please set GETBLOCK_WS_ENDPOINT and GETBLOCK_HTTP_ENDPOINT in .env file');
process.exit(1);
}
console.log('ā
Configuration loaded successfully');class PumpFunMigrationListener {
constructor() {
this.ws = null;
this.connection = new Connection(HTTP_ENDPOINT, 'confirmed');
this.subscriptionId = null;
this.isConnected = false;
this.reconnectAttempts = 0;
this.maxReconnectAttempts = 10;
this.raydiumMigrationCount = 0;
this.pumpswapMigrationCount = 0;
this.migrations = [];
this.startTime = Date.now();
this.totalLogsReceived = 0;
} start() {
console.log('š Starting Pump.fun Migration Listener...');
console.log('š” Monitoring account:', MIGRATION_ACCOUNT);
console.log('šÆ Tracking: Raydium + PumpSwap migrations');
console.log('');
this.connect();
this.checkRunning();
}
checkRunning() {
setInterval(() => {
const runtime = Math.floor((Date.now() - this.startTime) / 1000);
const hours = Math.floor(runtime / 3600);
const minutes = Math.floor((runtime % 3600) / 60);
const seconds = runtime % 60;
console.log(`š Alive | Runtime: ${hours}h ${minutes}m ${seconds}s | Logs: ${this.totalLogsReceived} | Raydium: ${this.raydiumMigrationCount} | PumpSwap: ${this.pumpswapMigrationCount}`);
}, 60000);
} connect() {
console.log('š Connecting to GetBlock WebSocket...');
this.ws = new WebSocket(WS_ENDPOINT);
this.ws.on('open', () => this.handleOpen());
this.ws.on('message', (data) => this.handleMessage(data));
this.ws.on('error', (error) => this.handleError(error));
this.ws.on('close', () => this.handleClose());
}
handleOpen() {
console.log('ā
Connected to GetBlock WebSocket');
this.isConnected = true;
this.reconnectAttempts = 0;
this.subscribeToLogs();
} subscribeToLogs() {
const subscribeRequest = {
jsonrpc: '2.0',
id: 1,
method: 'logsSubscribe',
params: [
{
mentions: [MIGRATION_ACCOUNT]
},
{
commitment: 'confirmed'
}
]
};
console.log('š” Subscribing to migration events...');
this.ws.send(JSON.stringify(subscribeRequest));
} async handleMessage(data) {
try {
const message = JSON.parse(data.toString());
if (message.result && !message.params) {
this.subscriptionId = message.result;
console.log(`ā
Subscribed with ID: ${this.subscriptionId}`);
console.log('ā³ Listening for migrations...\n');
return;
}
if (message.params && message.params.result) {
await this.processLog(message.params.result);
}
} catch (error) {
console.error('ā Error handling message:', error.message);
}
} async processLog(result) {
const { value } = result;
this.totalLogsReceived++;
console.log(`šØ Log #${this.totalLogsReceived} - TX: ${value.signature.substring(0, 20)}...`);
if (value.err) {
console.log(' ā³ Skipped (failed transaction)');
return;
}
const hasMigration = value.logs.some(
(log) =>
log.includes("Instruction: Migrate") ||
log.includes("migrate") ||
log.includes("initialize2")
);
if (hasMigration) {
console.log(" ā³ šÆ MIGRATION DETECTED!");
await this.fetchAndProcessTransaction(value.signature);
} else {
console.log(" ā³ Not a migration");
}
} async fetchAndProcessTransaction(signature) {
try {
await new Promise((resolve) => setTimeout(resolve, 1000));
const tx = await this.connection.getTransaction(signature, {
maxSupportedTransactionVersion: 0,
commitment: 'confirmed'
});
if (!tx) {
console.log('ā ļø Transaction not found, skipping...');
return;
}
const migrationData = this.extractMigrationData(tx, signature);
if (migrationData) {
this.migrations.push(migrationData);
if (migrationData.type === 'raydium') {
this.raydiumMigrationCount++;
} else if (migrationData.type === 'pumpswap') {
this.pumpswapMigrationCount++;
}
this.displayMigration(migrationData);
}
} catch (error) {
console.error('ā Error fetching transaction:', error.message);
}
} extractMigrationData(tx, signature) {
try {
let accountKeys, instructions;
if (tx.transaction.message.addressTableLookups) {
accountKeys = tx.transaction.message.staticAccountKeys ||
tx.transaction.message.accountKeys;
instructions = tx.transaction.message.compiledInstructions ||
tx.transaction.message.instructions;
} else {
accountKeys = tx.transaction.message.accountKeys;
instructions = tx.transaction.message.instructions;
}
if (!Array.isArray(instructions)) {
instructions = Object.values(instructions);
}
for (const instruction of instructions) {
let programId;
if (instruction.programIdIndex !== undefined) {
programId = accountKeys[instruction.programIdIndex];
} else if (instruction.programId) {
programId = instruction.programId;
}
// Check for Raydium migration
if (programId && programId.toString() === RAYDIUM_PROGRAM) {
const accounts = instruction.accounts;
if (!accounts || accounts.length < 7) continue;
return {
type: 'raydium',
signature: signature,
slot: tx.slot,
blockTime: tx.blockTime,
poolAddress: accountKeys[accounts[1]].toString(),
tokenAddress: accountKeys[accounts[5]].toString(),
quoteMint: accountKeys[accounts[6]].toString(),
lpMint: accountKeys[accounts[4]].toString(),
};
}
// Check for PumpSwap migration
if (programId && programId.toString() === PUMPFUN_PROGRAM) {
return {
type: 'pumpswap',
signature: signature,
slot: tx.slot,
blockTime: tx.blockTime,
tokenAddress: accountKeys[2] ? accountKeys[2].toString() : 'Unknown',
bondingCurve: accountKeys[1] ? accountKeys[1].toString() : 'Unknown',
destination: 'PumpSwap',
};
}
}
} catch (error) {
console.error('ā Error extracting migration data:', error.message);
}
return null;
} displayMigration(data) {
if (data.type === 'raydium') {
console.log('\nš āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
console.log(' NEW PUMP.FUN ā RAYDIUM MIGRATION DETECTED!');
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
console.log(`Migration #${this.raydiumMigrationCount} (Raydium)\n`);
console.log(`š Token Address: ${data.tokenAddress}`);
console.log(`š Pool Address: ${data.poolAddress}`);
console.log(`š§ LP Mint: ${data.lpMint}`);
console.log(`š° Quote Token: ${data.quoteMint}\n`);
console.log(`š Transaction: ${data.signature}`);
console.log(`š¢ Slot: ${data.slot}`);
if (data.blockTime) {
console.log(`ā° Time: ${new Date(data.blockTime * 1000).toISOString()}`);
}
console.log(`\nš View on Solscan:`);
console.log(` https://solscan.io/tx/${data.signature}\n`);
console.log(`š Trade on Raydium:`);
console.log(` https://raydium.io/swap/?inputMint=sol&outputMint=${data.tokenAddress}\n`);
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
} else if (data.type === 'pumpswap') {
console.log('\nš§ āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
console.log(' NEW PUMP.FUN ā PUMPSWAP MIGRATION DETECTED!');
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
console.log(`Migration #${this.pumpswapMigrationCount} (PumpSwap)\n`);
console.log(`š Token Address: ${data.tokenAddress}`);
console.log(`šÆ Bonding Curve: ${data.bondingCurve}`);
console.log(`šŖ Destination: ${data.destination}\n`);
console.log(`š Transaction: ${data.signature}`);
console.log(`š¢ Slot: ${data.slot}`);
if (data.blockTime) {
console.log(`ā° Time: ${new Date(data.blockTime * 1000).toISOString()}`);
}
console.log(`\nš View on Solscan:`);
console.log(` https://solscan.io/tx/${data.signature}\n`);
console.log(`š View Token:`);
console.log(` https://pump.fun/${data.tokenAddress}\n`);
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
}
} handleError(error) {
console.error('ā WebSocket error:', error.message);
}
handleClose() {
this.isConnected = false;
console.log('š Connection closed');
if (this.reconnectAttempts < this.maxReconnectAttempts) {
this.reconnectAttempts++;
const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), 30000);
console.log(`š Reconnecting in ${delay / 1000}s (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})...`);
setTimeout(() => {
this.connect();
}, delay);
} else {
console.error('ā Max reconnection attempts reached. Exiting...');
process.exit(1);
}
}
stop() {
console.log('š Stopping listener...');
if (this.ws) {
this.ws.close();
}
}
}
const listener = new PumpFunMigrationListener();
listener.start();
process.on('SIGINT', () => {
console.log('\nš Shutting down...');
listener.stop();
process.exit(0);
});
process.on('SIGTERM', () => {
listener.stop();
process.exit(0);
});
process.on('uncaughtException', (error) => {
console.error('š„ Uncaught exception:', error);
listener.stop();
process.exit(1);
});
process.on('unhandledRejection', (error) => {
console.error('š„ Unhandled rejection:', error);
listener.stop();
process.exit(1);
});npm startā
Configuration loaded successfully
š Starting Pump.fun Migration Listener...
š” Monitoring account: 39azUYFWPz3VHgKCf3VChUwbpURdCHRxjWVowf5jUJjg
šÆ Tracking: Raydium + PumpSwap migrations
š Connecting to GetBlock WebSocket...
ā
Connected to GetBlock WebSocket
š” Subscribing to migration events...
ā
Subscribed with ID: 17473
ā³ Listening for migrations...šØ Log #4 - TX: 2QAbbdjj8P5qk3gzoey5...
š Token Address: 3MSQF3mHFL9CuzKtUg6zp3GDdmGgDpPs7tQ1VPoXabTq
šÆ Bonding Curve: 39azUYFWPz3VHgKCf3VChUwbpURdCHRxjWVowf5jUJjg
šŖ Destination: PumpSwap
š Transaction: G6YuhMQtC5vonGFDwGDUsy5Uukb7JvkzQeB91FDfbRCYL8fNzvig4so4ZXVnqWNsNZWjLWf2rs5xf55KDZ7wXTW
š¢ Slot: 382201040
ā° Time: 2025-11-24T12:30:13.000Z
š View on Solscan:
https://solscan.io/tx/G6YuhMQtC5vonGFDwGDUsy5Uukb7JvkzQeB91FDfbRCYL8fNzvig4so4ZXVnqWNsNZWjLWf2rs5xf55KDZ7wXTW
š View Token:
https://pump.fun/3MSQF3mHFL9CuzKtUg6zp3GDdmGgDpPs7tQ1VPoXabTqšØ Log #7 - TX: 5yK8TqPAL2kNXj9bVZmF...
ā³ šÆ MIGRATION DETECTED!
š āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
NEW PUMP.FUN ā RAYDIUM MIGRATION DETECTED!
āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
Migration #1 (Raydium)
š Token Address: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj
...š Alive | Runtime: 0h 15m 30s | Logs: 23 | Raydium: 1 | PumpSwap: 18//Missing api key or environment variable
ā Missing required environment variables
Please set GETBLOCK_WS_ENDPOINT and GETBLOCK_HTTP_ENDPOINT in .env file
//Connection error(403)
š Connecting to GetBlock WebSocket...
ā WebSocket error: Unexpected server response: 403
š Connection closed

A step by step guide on how to build an Hyperliquid Whale Tracker Bot using GetBlock API
Whales are entities, such as DAOs or companies, that hold a large amount of a particular cryptocurrency, sufficient to influence the market price through their transactions. Their trade alone can either deflate or inflate the market price. While some whales engage in large trades that have a natural market effect, others may intentionally try to manipulate the market for profit. The Whale Tracking Bot is a bot that monitors on-chain activities of whales. It reports their transactions to you, thereby providing a clear analysis to inform predictions about potential market movements.
In this guide, you will learn:
Create a Telegram bot using Botfather
Get a GetBlock API access token
Build the Hyperliquid whale tracker bot that:
Tracks all trades on Hyperliquid as they happen
Identifies large trades based on configurable thresholds
Detects whale walls in the orderbook
Tracks and profiles recurring whale addresses
Basic knowledge of JavaScript
Must have installed and
A
A
Bot Token:
Open Telegram and search for @BotFather
Send /newbot and follow instructions
Before you begin, you need to set up your development environment:
Log in to your
On your dashboard, scroll and click on Get Endpoint
Select the HyperEVM Mainnet network
Under API Interface, select WebSocket
Keep your endpoint safe, as it contains an access token
Create the following files to have a basic structure for your project:
Update the .env file in the root of your project and add the following variables:
Import the dependencies and load the environment variables from .env file
Set up configuration settings for your application, including environment variables and other constants.
Why private fields?
# prefix makes fields private (ES2022 feature)
Prevents external code from modifying internal state
Better encapsulation and code organization
Event handlers:
open - Triggered when the connection is established
message - Receives data from the server
error - Handles connection errors
Subscription types:
allMids - Current market prices for all symbols
trades - Real-time trade executions
l2Book - Level 2 orderbook (buy/sell walls)
Message routing:
Parse JSON data from WebSocket
Route to the appropriate handler based on channel type
Graceful error handling with try-catch
Why cache prices?
Used for calculating USD value of trades
Avoids repeated API calls
Provides a fallback when price data is missing
Trade data structure:
coin - Market symbol (BTC, ETH, etc.)
side - 'B' for buy, 'A' for ask/sell
px - Price (as string)
Whale profile includes:
Total trading volume (cumulative)
Number of trades executed
First and last seen timestamps
Set of markets they trade in
Orderbook structure:
levels[0] - Bid side (buy orders)
levels[1] - Ask side (sell orders)
Each level is [price, size] array
Whale walls:
Large limit orders in the orderbook
Can act as support (bids) or resistance (asks)
Indicate where whales are defending price levels
Notification features:
Color-coded emojis (green=buy, red=sell)
Shortened wallet address for readability
Historical stats for known whales
Special highlight for mega trades ($500k+)
Why batch alerts?
Telegram has rate limits (1 message/second)
Batching prevents hitting limits during high activity
Combines multiple alerts into one clean summary
Configurable interval (default: 10 seconds)
Queue system benefits:
Messages are queued and processed sequentially
Respects Telegram's rate limits
Automatic retry on 429 errors
Non-blocking (uses async/await)
Connection test:
Validates bot token on startup
Shows bot username
Sends test message
Provides helpful error messages
Reconnection strategy:
Exponential backoff (delays increase)
Maximum 5 attempts
Caps at 30 seconds between tries
Separate handling for different connections
Statistics include:
Total number of whale trades detected
Number of unique whale addresses
Top 10 whales ranked by volume
Individual whale profiles with activity metrics
Startup sequence:
Display configuration
Test Telegram connection
Connect to Hyperliquid WebSocket
Optionally connect to HyperEVM
Proper shutdown:
Closes WebSocket connections properly
Prevents data loss or hanging connections
Open your terminal and run the following command:
Expected result in console:
Expected result in Telegram:
You may run into a WebSocket 503 Error:
This means that your WebSocket endpoint is incorrect. Check your .env file and ensure it's in this pattern:
Then, restart the server.
In this guide, you have successfully learn and built a Hyperliquid Whale Tracker Bot that monitors and alerts all whale trade activities ā from major buys to large sell-offs ā and even detects whale walls in the order book.
By integrating the GetBlock WebSocket API, you can rest assured of fast, reliable, and real-time data delivery, ensuring you never miss significant market movements.
Sends an instant alert to your phone via Telegram
Utilizes smart batching to avoid Telegram API limits
Provides periodic summaries of whale activity
.env fileChat ID:
Search for @raw_data_bot in Telegram
Send /start
Copy your user ID
Click on Create to get your endpoint
close - Handles disconnectionsz - Size/quantity (as string)user - Wallet address of trader
hash - Transaction hash
tid - Trade ID
mkdir hyperliquid-whale-alert-bot
cd hyperliquid-whale-alert-bot
npm init -y
npm i dotenv ws
npm i -D nodemonāāā index.js // Main apllication
āāā .env // Environment variables
āāā .gitignore // Git ignore file# Telegram Configuration (Get from @BotFather and @userinfobot)
TELEGRAM_BOT_TOKEN=your-telegram-bot-token
TELEGRAM_CHAT_ID=your-ID
# Whale Detection Thresholds
WHALE_THRESHOLD_USD=100000
WHALE_THRESHOLD_SIZE=50
# Telegram Settings
TELEGRAM_BATCH_ALERTS=true
TELEGRAM_BATCH_INTERVAL=10000
# Markets to Track (comma-separated)
TRACKED_SYMBOLS=BTC,ETH,SOL,ARB,AVAX,HYPE
# Optional: HyperEVM WebSocket from GetBlock
HYPEREVM_WSS=wss://go.getblock.io/<ACCESS_TOKEN>// dependencies
import WebSocket from 'ws';
import { config } from 'dotenv';
// Load environment variables from .env file
config();const CONFIG = {
// HyperEVM WebSocket endpoint from GetBlock
HYPEREVM_WSS: process.env.HYPEREVM_WSS,
// Whale thresholds
WHALE_THRESHOLD_USD: Number(process.env.WHALE_THRESHOLD_USD) || 100000,
WHALE_THRESHOLD_SIZE: Number(process.env.WHALE_THRESHOLD_SIZE) || 50,
// Notification settings
TELEGRAM_BOT_TOKEN: process.env.TELEGRAM_BOT_TOKEN || '',
TELEGRAM_CHAT_ID: process.env.TELEGRAM_CHAT_ID || '',
TELEGRAM_BATCH_ALERTS: process.env.TELEGRAM_BATCH_ALERTS !== 'false',
TELEGRAM_BATCH_INTERVAL: Number(process.env.TELEGRAM_BATCH_INTERVAL) || 60 * 10000,
// Tracked markets
TRACKED_SYMBOLS: (process.env.TRACKED_SYMBOLS || 'BTC,ETH,SOL,ARB,AVAX,HYPE').split(','),
};class HyperliquidWhaleTracker {
// Private fields (only accessible within the class)
#ws = null; // Hyperliquid WebSocket connection
#wsHyperEVM = null; // HyperEVM WebSocket connection
#reconnectAttempts = 0; // Track reconnection attempts
#maxReconnectAttempts = 5; // Maximum reconnection tries
#priceCache = new Map(); // Store current prices
#whaleAddresses = new Map(); // Track whale wallet addresses
#tradeCount = 0; // Total whale trades detected
#telegramQueue = []; // Queue for Telegram messages
#isSendingTelegram = false; // Flag for queue processing
#lastTelegramSent = 0; // Timestamp of last message
#TELEGRAM_DELAY = 1500; // Delay between messages (ms)
#pendingAlerts = []; // Batch alerts before sending
#batchTimer = null; // Timer for batching
constructor() {
this.HYPERLIQUID_WS_URL = 'wss://api.hyperliquid.xyz/ws';
}
}async connectHyperliquid() {
console.log('Connecting to Hyperliquid Info WebSocket...');
this.#ws = new WebSocket(this.HYPERLIQUID_WS_URL);
this.#ws.on('open', () => {
console.log('ā
Connected to Hyperliquid Info API');
this.#subscribeToTrades();
this.#subscribeToOrderbook();
});
this.#ws.on('message', (data) => this.#handleHyperliquidMessage(data));
this.#ws.on('error', (error) => console.error('Hyperliquid error:', error.message));
this.#ws.on('close', () => this.#handleReconnect('hyperliquid'));
}#subscribeToTrades() {
// Subscribe to price updates
this.#ws.send(JSON.stringify({
method: 'subscribe',
subscription: { type: 'allMids' }
}));
// Subscribe to trades for each tracked symbol
for (const symbol of CONFIG.TRACKED_SYMBOLS) {
this.#ws.send(JSON.stringify({
method: 'subscribe',
subscription: { type: 'trades', coin: symbol }
}));
}
console.log('š” Subscribed to Hyperliquid trades');
}
#subscribeToOrderbook() {
// Subscribe to orderbook depth for whale wall detection
for (const symbol of CONFIG.TRACKED_SYMBOLS) {
this.#ws.send(JSON.stringify({
method: 'subscribe',
subscription: { type: 'l2Book', coin: symbol }
}));
}
console.log('š Subscribed to orderbook data');
}#handleHyperliquidMessage(data) {
try {
const message = JSON.parse(data.toString());
// Route messages based on channel type
switch (message.channel) {
case 'trades':
message.data?.forEach(trade => this.#analyzeTrade(trade));
break;
case 'allMids':
this.#updatePrices(message.data);
break;
case 'l2Book':
this.#analyzeOrderbook(message.data);
break;
}
} catch (error) {
console.error('Error parsing message:', error.message);
}
}#updatePrices(midsData) {
if (!midsData?.mids) return;
// Store current prices in a Map for quick lookup
for (const [symbol, price] of Object.entries(midsData.mids)) {
this.#priceCache.set(symbol, parseFloat(price));
}
}#analyzeTrade(trade) {
try {
const { coin, side, px, sz, time, user, hash, tid } = trade;
const price = parseFloat(px);
const size = parseFloat(sz);
const value = price * size; // Calculate USD value
// Check if trade meets whale threshold
if (value < CONFIG.WHALE_THRESHOLD_USD && size < CONFIG.WHALE_THRESHOLD_SIZE) {
return; // Not a whale trade, skip
}
// Track the whale's address
if (user) {
this.#trackWhaleAddress(user, value, coin);
}
// Send notification
this.#notifyWhaleTrade({
coin,
side,
price,
size,
value,
time: new Date(time).toLocaleString(),
user: user || 'Unknown',
hash: hash || null,
tradeId: tid || null
});
this.#tradeCount++;
} catch (error) {
console.error('Error analyzing trade:', error.message);
}
}#trackWhaleAddress(address, value, coin) {
const whale = this.#whaleAddresses.get(address);
if (whale) {
// Existing whale - update stats
whale.totalVolume += value;
whale.tradeCount++;
whale.lastSeen = new Date();
whale.coins.add(coin);
} else {
// New whale - create profile
this.#whaleAddresses.set(address, {
address,
totalVolume: value,
tradeCount: 1,
firstSeen: new Date(),
lastSeen: new Date(),
coins: new Set([coin])
});
}
}#analyzeOrderbook(bookData) {
try {
const { coin, levels } = bookData;
if (!Array.isArray(levels)) return;
const largeOrders = [];
// Analyze both bid (buy) and ask (sell) sides
for (const [index, side] of ['BID', 'ASK'].entries()) {
if (!Array.isArray(levels[index])) continue;
for (const level of levels[index]) {
// Handle different data formats
const [price, size] = Array.isArray(level)
? level
: [level.px, level.sz];
if (!price || !size) continue;
const value = parseFloat(price) * parseFloat(size);
// Check if it's a whale-sized order
if (value >= CONFIG.WHALE_THRESHOLD_USD) {
largeOrders.push({
side,
price: parseFloat(price),
size: parseFloat(size),
value
});
}
}
}
if (largeOrders.length > 0) {
this.#notifyWhaleOrder(coin, largeOrders);
}
} catch (error) {
console.error('Error analyzing orderbook:', error.message);
}
}#notifyWhaleTrade(trade) {
const emoji = trade.side === 'B' ? 'š¢' : 'š“';
const sideText = trade.side === 'B' ? 'BUY' : 'SELL';
const shortAddress = trade.user !== 'Unknown'
? `${trade.user.slice(0, 6)}...${trade.user.slice(-4)}`
: 'Unknown';
// Get whale statistics if available
let whaleStats = '';
const whale = this.#whaleAddresses.get(trade.user);
if (whale) {
whaleStats = `\nš Whale Stats: ${whale.tradeCount} trades | $${whale.totalVolume.toLocaleString()} total volume`;
}
const consoleMessage = `
š WHALE TRADE ALERT! š
${emoji} ${sideText} ${trade.coin}
š° Size: ${trade.size.toFixed(2)} contracts
šµ Price: $${trade.price.toFixed(2)}
š Value: $${trade.value.toLocaleString()}
š¤ Trader: ${shortAddress}
${trade.user !== 'Unknown' ? `š Address: ${trade.user}` : ''}${whaleStats}
${trade.hash ? `š TX Hash: ${trade.hash}` : ''}
${trade.tradeId ? `š Trade ID: ${trade.tradeId}` : ''}
š Time: ${trade.time}
${trade.value >= 500000 ? 'šØ MEGA WHALE! šØ' : ''}
`;
console.log(consoleMessage);
// Send to Telegram if configured
if (CONFIG.TELEGRAM_BOT_TOKEN && CONFIG.TELEGRAM_CHAT_ID) {
if (CONFIG.TELEGRAM_BATCH_ALERTS) {
this.#addToBatch({ type: 'trade', emoji, sideText, ...trade });
} else {
this.#sendTelegramMessage(consoleMessage);
}
}
}#addToBatch(alert) {
this.#pendingAlerts.push(alert);
// Start batch timer if not already running
if (!this.#batchTimer) {
this.#batchTimer = setTimeout(() => {
this.#sendBatchedAlerts();
}, CONFIG.TELEGRAM_BATCH_INTERVAL);
}
}
#sendBatchedAlerts() {
console.log(`š¦ Sending batched alerts: ${this.#pendingAlerts.length} trades`);
if (this.#pendingAlerts.length === 0) {
this.#batchTimer = null;
return;
}
const totalValue = this.#pendingAlerts.reduce((sum, alert) => sum + alert.value, 0);
const trades = this.#pendingAlerts.length;
// Build compact batch message
const alertsList = this.#pendingAlerts
.map((alert, index) => {
const shortAddr = alert.user !== 'Unknown'
? `${alert.user.slice(0, 6)}...${alert.user.slice(-4)}`
: 'Unknown';
let line = `${index + 1}. ${alert.emoji} ${alert.sideText} ${alert.coin}\n`;
line += ` š° $${alert.value.toLocaleString()} | š¤ ${shortAddr}\n`;
if (alert.value >= 500000) line += ` šØ MEGA WHALE!\n`;
return line;
})
.join('\n');
const message = `š WHALE ACTIVITY BATCH (${trades} trades, $${totalValue.toLocaleString()} total) š\n\n${alertsList}\nš ${new Date().toLocaleString()}`;
console.log('š¤ Adding batch message to Telegram queue...');
this.#sendTelegramMessage(message);
this.#pendingAlerts = [];
this.#batchTimer = null;
}async #sendTelegramMessage(message) {
if (!CONFIG.TELEGRAM_BOT_TOKEN || !CONFIG.TELEGRAM_CHAT_ID) return;
// Add to queue instead of sending immediately
this.#telegramQueue.push(message);
// Start processing if not already running
if (!this.#isSendingTelegram) {
this.#processTelegramQueue();
}
}
async #processTelegramQueue() {
if (this.#telegramQueue.length === 0) {
this.#isSendingTelegram = false;
return;
}
this.#isSendingTelegram = true;
const message = this.#telegramQueue.shift();
try {
// Respect rate limit (1.5 seconds between messages)
const timeSinceLastSend = Date.now() - this.#lastTelegramSent;
if (timeSinceLastSend < this.#TELEGRAM_DELAY) {
await new Promise(resolve =>
setTimeout(resolve, this.#TELEGRAM_DELAY - timeSinceLastSend)
);
}
// Send to Telegram API
const url = `https://api.telegram.org/bot${CONFIG.TELEGRAM_BOT_TOKEN}/sendMessage`;
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
chat_id: CONFIG.TELEGRAM_CHAT_ID,
text: message,
parse_mode: 'HTML'
})
});
this.#lastTelegramSent = Date.now();
if (!response.ok) {
const errorData = await response.json();
console.error('ā Telegram API error:', response.status, errorData.description || '');
// Handle rate limiting
if (response.status === 429) {
const retryAfter = errorData.parameters?.retry_after || 5;
console.log(`ā³ Rate limited. Waiting ${retryAfter}s...`);
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
this.#telegramQueue.unshift(message); // Re-add to front
}
} else {
console.log('ā
Telegram message sent');
}
} catch (error) {
console.error('ā Telegram error:', error.message);
}
// Process next message in queue
setTimeout(() => this.#processTelegramQueue(), this.#TELEGRAM_DELAY);
}async #testTelegramConnection() {
try {
const url = `https://api.telegram.org/bot${CONFIG.TELEGRAM_BOT_TOKEN}/getMe`;
const response = await fetch(url);
const data = await response.json();
if (data.ok) {
console.log(`ā
Telegram bot connected: @${data.result.username}`);
await this.#sendTelegramMessage('š¤ Whale Tracker Started!\n\nMonitoring Hyperliquid for whale activity...');
console.log('ā
Test message sent\n');
} else {
console.error('ā Telegram error:', data.description);
}
} catch (error) {
console.error('ā Failed to connect to Telegram:', error.message);
console.log('š” Check your TELEGRAM_BOT_TOKEN\n');
}
}#handleReconnect(connection) {
if (this.#reconnectAttempts >= this.#maxReconnectAttempts) {
console.error(`Max reconnection attempts reached for ${connection}`);
return;
}
this.#reconnectAttempts++;
// Exponential backoff: 2s, 4s, 8s, 16s, 30s (max)
const delay = Math.min(1000 * 2 ** this.#reconnectAttempts, 30000);
console.log(`Reconnecting ${connection} in ${delay/1000}s... (Attempt ${this.#reconnectAttempts})`);
setTimeout(() => {
connection === 'hyperevm' ? this.connectHyperEVM() : this.connectHyperliquid();
}, delay);
}#printWhaleStats() {
console.log('\n' + '='.repeat(60));
console.log('š WHALE STATISTICS SUMMARY');
console.log('='.repeat(60));
console.log(`Total Whale Trades: ${this.#tradeCount}`);
console.log(`Unique Whales: ${this.#whaleAddresses.size}\n`);
if (this.#whaleAddresses.size === 0) {
console.log('='.repeat(60) + '\n');
return;
}
console.log('Top 10 Whales by Volume:');
console.log('-'.repeat(60));
// Sort whales by total volume and get top 10
const topWhales = Array.from(this.#whaleAddresses.values())
.sort((a, b) => b.totalVolume - a.totalVolume)
.slice(0, 10);
topWhales.forEach((whale, index) => {
const shortAddr = `${whale.address.slice(0, 8)}...${whale.address.slice(-6)}`;
console.log(`${index + 1}. ${shortAddr}`);
console.log(` Volume: $${whale.totalVolume.toLocaleString()}`);
console.log(` Trades: ${whale.tradeCount}`);
console.log(` Markets: ${Array.from(whale.coins).join(', ')}`);
console.log(` Last Active: ${whale.lastSeen.toLocaleString()}\n`);
});
console.log('='.repeat(60) + '\n');
}async start() {
console.log('š Starting Hyperliquid Whale Tracker...');
console.log(`š Tracking: ${CONFIG.TRACKED_SYMBOLS.join(', ')}`);
console.log(`š° Whale threshold: $${CONFIG.WHALE_THRESHOLD_USD.toLocaleString()}\n`);
// Test Telegram if configured
if (CONFIG.TELEGRAM_BOT_TOKEN && CONFIG.TELEGRAM_CHAT_ID) {
console.log('ā
Telegram notifications: ENABLED');
console.log(`š± Chat ID: ${CONFIG.TELEGRAM_CHAT_ID}`);
console.log(`š¦ Batch mode: ${CONFIG.TELEGRAM_BATCH_ALERTS ? `ON (every ${CONFIG.TELEGRAM_BATCH_INTERVAL/1000}s)` : 'OFF'}\n`);
await this.#testTelegramConnection();
} else {
console.log('ā ļø Telegram notifications: DISABLED\n');
}
// Connect to Hyperliquid
await this.connectHyperliquid();
// Optional: Connect to HyperEVM
if (CONFIG.HYPEREVM_WSS) {
await this.connectHyperEVM();
} else {
console.log('ā¹ļø HyperEVM WebSocket not configured (optional)\n');
}
// Print statistics every 5 minutes
setInterval(() => this.#printWhaleStats(), 5 * 60 * 1000);
}
stop() {
this.#ws?.close();
this.#wsHyperEVM?.close();
console.log('Bot stopped');
}// Create bot instance
const bot = new HyperliquidWhaleTracker();
await bot.start();
// Handle graceful shutdown
process.on('SIGINT', () => {
console.log('\nš Shutting down...');
bot.stop();
process.exit(0);
});node index.jsš WHALE TRADE ALERT! š
š¢ BUY AVAX
š° Size: 56.00 contracts
šµ Price: 17.88
š Value: 1,001.392
š¤ Trader: Unknown
š TX Hash: 0xc806e65080fb77e5c980042f145c7302024000361bfe96b76bcf91a33fff51d0
š Trade ID: 720410117733902
š Time: 11/8/2025, 12:07:11 PM
š WHALE TRADE ALERT! š
š“ SELL HYPE
š° Size: 61.56 contracts
šµ Price: 41.46
š Value: 2,552.154
š¤ Trader: Unknown
š TX Hash: 0x03f399453dfc2d42056d042f145c12020235002ad8ff4c14a7bc4497fcf0072c
š Trade ID: 438223268535475
š Time: 11/8/2025, 12:07:04 PM
š³ WHALE WALL DETECTED! š³
š ETH Orderbook
š¢ BID: $3442.20 Ć 47.29 = $162,787.146
š¢ BID: $3442.10 Ć 182.11 = $626,825.342
š“ ASK: $3444.20 Ć 336.14 = $1,157,739.243
š“ ASK: $3444.30 Ć 64.56 = $222,347.131
š“ ASK: $3444.40 Ć 119.15 = $410,398.538
š 11/8/2025, 12:07:16 PM
^C
š Shutting down ...
Bot stoppedConnecting to GetBlock WebSocket...
WebSocket error: Error: Unexpected server response: 503
WebSocket connection closed
Reconnecting in 16 seconds... (Attempt 4)# correct format
HYPEREVM_WSS=wss://go.getblock.io/<ACCESS_TOKEN>node index.js