Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 3595 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

GitHub sync

Loading...

GETTING STARTED

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

BSC Advanced Tooling

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Flashblocks

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Solana Advanced Data Tools

Loading...

Loading...

Loading...

Loading...

Crypto AML

Loading...

Loading...

Loading...

Loading...

Tron Energy

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Crypto Address Audit

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

ADD-ONS

Loading...

Loading...

Loading...

RPC ENDPOINT

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Migration

Loading...

How to set up an account

To start using GetBlock's services, you need to register for an account. You’ll be ready to go in just a few clicks

How to Sign Up

1

Go to GetBlock

Visit the homepage and click on the 'Dashboard' button in the upper-right corner, or use this direct link.

How to create an account on GetBlock
GetBlock's Sign-Up page, where users can register to access blockchain services
2

Choose the sign-up method

  • 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.

  • WalletConnect Sign in with MetaMask Mobile, Trust Wallet, Rabby, Ledger Live, or another WalletConnect-compatible wallet.

  • Sign up with GitHub

    Use your GitHub credentials to set up an account.

3

Review and accept policies

During registration, you will be asked to accept our Terms of Service and Privacy Policy.

Access the dashboard

Once you've created an account and signed in, you'll be directed to the GetBlock Dashboard.

  • You can create endpoints

  • Monitor your usage plan

  • Access statistics.

GetBlock user dashboard for managing blockchain node access
GetBlock user Dashboard

Check your User ID

  1. Click on your profile icon

profile icon
  1. Click on the Copy Icon to copy your User ID

Where to find the GetBlock user ID

Access token management

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:

The <ACCESS_TOKEN> authenticates requests directly through the endpoint URL.


Making an authenticated request

To make a request, include your full endpoint URL with the access token in the path.

Access tokens cannot be sent in headers.

For example, here’s how to fetch the latest Ethereum block number:

Response:


Access Token security

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:

  1. Go to your GetBlock Dashboard.

  2. Locate the endpoint associated with the token.

  3. Click the three-dot icon () next to the endpoint.

  4. Select the option to either roll (regenerate) or delete the token.

How to manage GetBlock access tokens
Regenerate or delete your access token

This authentication method ensures that all your interactions with GetBlock’s services remain secure, reliable, and easy to manage.

Plans and limits

GetBlock offers flexible RPC plans and features to support developers and businesses at any stage, from small projects to high-traffic platforms

Start here to choose a plan, understand usage limits, and manage billing.

Choosing Your Plan

Compare Shared Nodes, Limitless Node, and Dedicated Nodes.

CU and Rate Limits

GetBlock's Compute Unit (CU) and requests-per-second (RPS) limits across plans.

Limitless Node

Explore the Limitless plan without CU and request limits.

What counts as a CU?

Compute Units (CUs) explained.

Top up CUs

Add more CUs to your active plan.

Dedicated Nodes

Manage & extend Dedicated Node subscriptions.

Payment Methods

Set up billing with fiat or crypto.

Top up CUs and boost limits

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.


Add Compute Units: Paid plan users

topping up GetBlock CU balance

Starter, Pro & Enterprise users can refill their CU balance or switch to another plan for increased limits:

  1. Click the "Top Up" button on the Dashboard.

  2. Select the number of CUs you’d like to add or choose the recommended plan (if prompted) based on your usage needs.

  3. Confirm and finalize your purchase.

How to add CU to your GetBlock RPC node package balance

Your account balance will be updated immediately upon successful payment.


Increase CU limits: Free plan users

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.

Switching from free GetBlock free plan to higher limit plans

Boost CU, RPS, and Access Token limits

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:

  1. Click "Change" on the Dashboard next to the Rate Limit section.

Increasing RPC node limits
  1. Fill out and submit a request form, choosing your desired RPS limit, CU amount, and number of Access Tokens.

Customizing GetBlock's Enterprise plan usage limits
  1. 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 Dedicated Nodes.

Payment methods

GetBlock supports both fiat and crypto payments.

Fiat payments

Users can pay for subscriptions using traditional fiat currency via Paddle.

How it works:

  • Recurring payments enabled by default: Payment is automatically deducted on the billing date.

  • 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.

How to pay with fiat on GetBlock
Selecting fiat as a payment method

Please, account for VAT when planning your payments.


Updating your payment details

To update your payment information while you have an active subscription:

  1. Go to Pricing → Manage Plans.

  2. Click ‘Edit Payment Method’.

  3. Enter your updated payment details and save the changes.

changing billing data in GetBlock accounts

Crypto payments

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.

How to pay for RPC nodes with crypto
Crypto payments

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.

Endpoint setup

Configure, 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.

Creating node endpoints
Enabling archive mode
Configuring dedicated nodes
Using GetBlock configuration files

Testing RPC connection

This section provides simple examples to help you test your connection to the blockchain, using Ethereum API as a reference.

Postman Collection

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: https://documenter.getpostman.com/view/28751185/2s9YRDzqcX.

  1. 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.

  2. Select the desired network from the drop-down list on the sidebar.

  3. Paste the access token copied from your account instead of {YOUR_ACCESS_TOKEN}.

Using Postman Collection for Ethereum JSON-RPC request
Using Postman to send a JSON-RPC request to an Ethereum node via GetBlock

This token will grant you the necessary permissions to explore our node functionalities.

Errors and troubleshooting

This page provides a guide to common JSON-RPC and HTTP errors when testing your connection with GetBlock's API.

Connection issues

Code
Error message
Solution

401

Access denied

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.

JSON-RPC errors

Code
Error message
Solution

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.

Overview

GetBlock exposes Flashblocks' data on supported OP Stack networks through the standard JSON-RPC and WebSocket interfaces.

Flashblocks are partial blocks streamed by the sequencer as it builds. The mechanism is powered by Rollup-Boost, a sequencer sidecar built by Flashbots in collaboration with OP Labs. A single OP Stack block is divided into ten Flashblocks streamed at 200ms intervals, each one a delta containing the new transactions and resulting state changes since the previous Flashblock. The preconfirmed state is surfaced through the standard Ethereum JSON-RPC interface using the pending block tag, so existing tooling reads Flashblock state without modification.

How Flashblocks Work

A standard OP Stack block is produced every 2 seconds. Flashblocks subdivide that interval into ten increments:

  • The sequencer publishes a new Flashblock every ~200ms (index 0 through 9 within each parent block).

  • index 0 carries the base block context; subsequent Flashblocks carry only the diff of new transactions and state changes.

  • Reading any supported method against the pending tag returns the accumulated preconfirmed state from the latest Flashblock.

  • The same call against latest returns the most recent fully sealed block.

Preconfirmations are strong signals, not guarantees. A streamed Flashblock can be excluded from the final block (a Flashblock reorg). The reorg rate is below 0.1%, but applications handling critical operations should confirm against finalized block data.

How to Use Flashblocks

There are two access patterns:

  • pending tag (request/response): Pass "pending" as the block parameter to any supported read method to get the latest preconfirmed value over HTTP. This is the recommended approach for most applications, as it provides stable behavior with automatic fallback to standard blocks if Flashblocks become unavailable.

  • WebSocket streaming (subscriptions): Open a WebSocket connection and subscribe to a Flashblocks topic to receive each Flashblock as it is produced — five times per second. This is intended for latency-sensitive consumers such as trading systems. Applications should avoid a hard dependency on the WebSocket stream and treat it as an optimization layer over the RPC interface.

Flashblocks are simply a class of RPC API methods that are now active on GetBlock endpoints for Base and Optimism. If you already run either chain with GetBlock, the new methods are available on your existing endpoint. If you are new, set up a Base or Optimism endpoint from the GetBlock dashboard, and the methods are there.

Supported Networks

Flashblocks are documented per network. Endpoints, method tables, and chain-specific methods are covered on the dedicated pages:

  • Base

  • Optimism

API Reference

This contain all the endpoints, pricing and error codes to access TRON energy

The GetBlock TRON Energy API lets you programmatically delegate Energy and Bandwidth to any TRON address. Automate fee optimization for exchanges, payment services, and dApps.

Base URL

Authentication

All requests require an API key in the header:

Getting your API key Generate API keys under Settings → API. Open Settings, go to the API tab, and create a key for your needs. Copy and save it right away — treat it as a secret: anyone holding your API key can spend the credits you've topped up on the platform. Store it following security best practices (never commit it to code or share it in plain text).

Request example

curl -X POST https://services.getblock.io/v1/tron-energy/delegate-energy \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44" \
  -d '{"target_address": "TUo8...", "volume": 65000, "duration": "1d"}'

All responses return JSON. Successful delegations include:

{
  "data": {
    "status": "success",
    "target_address": "TUo8...",
    "resource_type": "energy",
    "volume": 65000,
    "duration": "1d",
    "price_usd": "0.79",
    "trx_spent": 3,
    "order_id": "1H76d06176b8",
    "txid": "db47c131876a504ceee32f023a46cf3aa23629362e28c8c272c10ced8f1f27a8",
    "message": "Delegation completed successfully."
  }
}

Endpoints

Endpoint
Method
Description

/price-estimate

POST

Get real-time price quote

/delegate-energy

POST

Delegate Energy (30K–5M) for 5 min–7d

/delegate-bandwidth

POST

Puchase and delegate TRON bandwidth

Pricing

You pay in Credits. The price is calculated from two live inputs:

  • the current TRX/USD exchange rate, and

  • real-time energy demand on the network.

You are charged only after the delegation is confirmed — if the order fails, nothing is deducted from your balance.

Energy prices fluctuate over time. Demand follows on-chain activity across the world's major financial clusters — Asia, Europe, and the US — so the price rises and falls as different time zones become active and quiet through the day. The swing can be large: in calmer windows energy can be significantly cheaper — sometimes around half the price of peak hours.

If getting a lower price matters to you, monitor the live price and rent when it fits your budget. There is no fixed "cheap hour" — because activity shifts between regions, the best window varies, so watch the actual numbers rather than relying on a fixed schedule.

price-estimate - TRON energy

Example code for the price-estimate JSON RPC method

This get a real-time price estimate for Energy delegation before placing an order.

Body Parameter

Parameter

Type

Required

Description

resourceType

string

Yes

"energy", "bandwidth"(soon)

volume

integer

Yes

Energy amount: 30,000 - 5,000,000 (depends on duration)

duration

string

Yes

"1h", "1d", "3d", "7d"

Request Sample

Response Sample

https://go.getblock.io/<ACCESS_TOKEN>/
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"}
https://services.getblock.io/v1/tron-energy/
Authorization: Bearer YOUR_API_KEY
curl -X POST https://services.getblock.io/v1/tron-energy/price-estimate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"resourceType": "energy", "volume": 65000, "duration": "1d"}'
{
  "data": {
    "price_sun": "36",
    "trx": "2.3400",
    "price_usd": "0.7900",
    "reserve_usd": "0.9500"
  }
}

Welcome

Welcome to GetBlock! We make it easy for developers and businesses to connect to 130+ blockchain networks.

With our tools and services, you can focus on building your dApp 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.

Core GetBlock Services

Services
Description

Plug-and-Play access

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.

Discover GetBlock

Cover

Getting Started

Create your account, explore plans & features, and make your first API call

Cover

Guides

Set up endpoints, manage access tokens, and integrate GetBlock APIs step-by-step

Cover

API Reference

View supported networks, available endpoints, and full API specifications

Popular chains

Get started with our most in-demand blockchain networks.

Ethereum

Tron

Arbitrum

BNB Smart Chain

Solana

Optimism

Polygon

Avalanche

Team accounts setup

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.

  1. Sign in to your GetBlock account. If you don’t have a user account yet, create one following .

  2. Click on the profile icon in the bottom-left corner of the sidebar. Select "Create new team" from the dropdown menu.

  1. A popup window will appear. Assign a team name and click the "Create team" button.

  1. 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.

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.

  1. Go to Account Settings > Team.

  2. Click "Add team member" in the top-right corner.

  3. 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:

  1. Go to My Team in Account Settings.

  2. Click the three-dot menu (⋮) next to a team member.

  3. Select "Edit access level".

This table provides a breakdown of actions team account users can perform based on their role.

Action
Owner
Admin
Member

To remove a user from your team account:

  1. Navigate to Team in the Account Settings.

  2. Click the three-dot menu (⋮) next to the team member name.

  3. Select "Remove" from the dropdown menu.


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 .

  1. Click your account icon to view an invitation.

  2. Click "Accept" if you're ready to join.


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).


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.

Creating node endpoints

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:

1

Log in to your GetBlock account and navigate to the Dashboard

2

Find the Endpoints section on the Dashboard

3

Click Get endpoint to open the endpoint setup menu

4

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

5

Click 'Get' and have the endpoint URL with an access token generated.

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.

Enabling archive mode

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 (address, blockNumber)

Configuring dedicated nodes

Deploy dedicated nodes from your GetBlock Dashboard. Fully self-service. This guide covers customizing your node settings and completing the setup process.

To deploy a private blockchain server, switch over to the ‘Dedicated Nodes’ tab in the Dashboard.

Select a blockchain protocol from the list or click Create new node to begin the setup process from scratch. A dedicated node setup modal will open.

Step 1: Configure your node

In the setup window:

  1. Select the blockchain protocol and the network type (e.g., mainnet, testnet, devnet, etc)

  2. Customize your dedicated node with the following options:

    1. Node type: Choose between Full Node or Archive Node

    2. Pick a deployment location: Germany (Frankfurt), USA (New York), Singapore

    3. Node client: Choose your preferred node implementation (e.g., Geth)

  3. Under the Performance section, select a :

    1. High: premium specs, max throughput

    2. Standard: enterprise specs, optimized pricing for moderate-high loads

  4. Choose a subscription length — 1, 6, or 12 months — at the top of the summary panel (available discounts are applied automatically)

Verify all selected configurations in the summary section and proceed to the next step.

On the Add-ons screen, you can extend your node with additional capabilities:

  • Included add-ons are available at no extra cost depending on your configuration

  • Advanced add-ons are billed in addition to the base node price

Select any add-ons you need and click Next.

On the final screen:

  1. Review the final pricing and node settings

  2. Billing Contact — Enter your contact information so the GetBlock team can notify you when your node is ready.

  3. Payment method — Choose between Credit Card or Crypto.

Once payment is confirmed, the deployment status will be visible on your Dashboard → Dedicated Nodes tab and Pricing → Manage Plans. Track the payment status from Pricing → Payment History.


Once your node is deployed, it appears in the left-hand sidebar. Each node has its own page — select a node from the sidebar to open it.

Three tabs are available for managing the node:

  1. Endpoints: lists all endpoints associated with your node. To add a new one, click + Get endpoint. You can create multiple endpoints per node with different API interfaces. Endpoints for add-ons can also be created from this tab.

  2. Add-ons: the central place to manage all add-ons. From here you can add a new add-on to an existing node, cancel an active add-on, create an endpoint.

  3. Statistics: provides a detailed breakdown of usage metrics for your node.

Use the Invoices and Subscription buttons in the top-right corner of the node view to manage billing.

Using GetBlock configuration files

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:

  1. Download the getblock.config.json file from your GetBlock account;

  2. Make sure you have installed. jq is a versatile command-line tool that enables extracting values from JSON files;

Using cURL for testing

These examples provide a starting point for testing your connection and querying blockchain data using cURL commands.

Before you start:

  1. Create a JSON-RPC endpoint for the Ethereum blockchain from your GetBlock account.

  2. Replace <ACCESS_TOKEN> in the examples below with your actual Access Token.

Fetch the current block number

Run the following command to retrieve the latest block number:

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"
}'

If successful, the response will include the current block number in hexadecimal value:

{
    "jsonrpc": "2.0",
    "id": "getblock.io",
    "result": "0x1449641"
}

Get the chain ID

Identify the blockchain network with the eth_chainId method:

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"
}'

Response example:

{
  "jsonrpc": "2.0",
  "id": "getblock.io",
  "result": "0x1"
}

In this example, 0x1 indicates the Ethereum Mainnet. The chain ID helps confirm which blockchain network you are interacting with.

Check account balance by address

Retrieve the balance of an Ethereum address using eth_getBalance. Replace <ACCOUNT_ADDRESS> with the target wallet address:

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"
}'

Example response:

{
    "jsonrpc": "2.0",
    "id": "getblock.io",
    "result": "0x5a70dac3910910"
}

The result field shows the account balance in wei (1 ether = 10¹⁸ wei).

For a list of supported RPC methods with examples, navigate to .

Monitoring and analytics

Track and manage your usage and node service subscriptions with GetBlock.

These tools help ensure optimal use of GetBlock’s services and keep you informed of key metrics and events related to your account.

Dashboard

How to track your GetBlock blockchain node usage statistics

The Dashboard provides a quick snapshot of key metrics:

  • Your current plan details

  • Remaining CU balance

  • Rate limit based on your plan

  • Total requests made in the last 24 hours


Detailed statistics

For more detailed analysis, visit the Statistics tab in the dashboard.

Customize the data view by parameters or by access tokens using the dropdown menu.

Select the time period, protocol name, networks (mainnet/testnet), region, and API interfaces to analyze the data by parameters.

The Statistics tab shows more in-depth and customizable data analysis for your endpoints

All data is displayed through infographics, including:

  • Number of requests and CUs

  • Response statuses

  • Method call distribution

  • Rate limit rejections


Notifications and email communication

GetBlock provides automated email updates for key account and subscription events:

  • Account registration

  • Successful order payments (Shared, Dedicated services, and Top-Ups)

  • Start of grace period

  • Subscription expiration

  • Dedicated node deployed and activated

  • Recurring payment cancelled

Email notifications are delivered only to accounts with a verified email address provided during registration.

Users who registered using third-party authentication methods, such as MetaMask login, may not receive email notifications.

Users can also choose whether to receive marketing communications from GetBlock. This preference can be managed in Account Settings → General by enabling or disabling the “I want to receive marketing offers” option.

Connect to GetBlock with MetaMask

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.

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.


BSC Accelerated Dedicated Node

GetBlock's BSC Accelerated Dedicated Node enables users to have direct access to fast, robust, and high-performance network layers.

BSC accelerated node is a high-performance dedicated node deployed on top of high-speed networking layers via the Blockchain Distributed Network (BDN). It observes state changes, mempool activity, and block production events significantly faster than standard peer-to-peer setups, serving traders, validators, dApps, and more with low latency.

Interested in building on BSC using an Accelerated Dedicated Node? for more information.

In a standard setup, your node receives data through the BSC peer-to-peer gossip network:

With BDN Gateway acceleration, your node receives data through two channels simultaneously:

Your dedicated node receives data from both the BDN fast path and the standard P2P layer, ensuring it always has the freshest state available.

Sending Transactions to Private Mempool (Priority Fee)

Learn how to add tips to transaction while sending to private mempool

Priority fees incentivize builders to include your transaction faster and position it more favorably within a block. Adding a tip to your private transaction provides three key benefits:

  • Higher inclusion probability: Builders prioritize transactions with higher fees

  • Better block positioning: Achieve positions 1–2 more reliably

  • Faster confirmation: Reduce waiting time for transaction inclusion

Choosing a Method

They are Two approaches exist for adding priority fees to private transactions:

Method
Best For
Trade-offs

Most use cases

Single nonce, atomic execution, slightly higher gas

Advanced scenarios requiring separate transactions

Two nonces, more complex setup

Different Between Bundles and Transactions

Choose the appropriate method based on your use case:

Method

bsc_privateTx

mev_sendBundle

Transaction count

Single

Multiple

Atomicity

Not applicable

Next Steps

Learn how to submit transactions via Multicall3 or Bundle method to the private mempool.

TradeFirst

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.

Solana Indexed Archive

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.

  • Complete historical index: Every block, transaction, instruction, log, and account update already parsed, normalized, and ready for queries

Overview

GetBlock Crypto AML is a compliance-grade risk-screening service for crypto addresses and transactions

GetBlock Crypto AML is a compliance-grade risk-screening service for crypto addresses and transactions. Paste a wallet or a transaction hash, and get back a structured risk report — a composite score, an exposure breakdown, and FATF-aligned flags — in seconds.

It is built to give small teams, exchanges, OTC desks and individual traders the same FATF-aligned data and scoring that large compliance vendors offer, but without KYB, annual contracts, or lengthy onboarding. The same account and the same credit balance power both the browser UI and the REST API.

The problem it solves

Before you accept, send, or clear crypto funds, you often need to know: has this wallet touched sanctioned entities, darknet markets, mixers, ransomware, or scams? Crypto AML answers that by tracing the address's on-chain history, wallet-to-wallet links, direct counterparty interactions, and public sanctions data — then condensing it into a decision-ready report.

Typical uses:

  • Screen a counterparty before a transfer, while it is still reversible.

  • Accept incoming funds safely so a downstream exchange doesn't flag or lock the deposit.

  • Onboard customers / KYT — screen wallets during onboarding or ongoing monitoring.

Supported networks

Crypto AML currently covers five networks — chosen because they carry the bulk of emerging-market exchange and remittance volume:

Tag
Network

ETH

Ethereum

TRX

TRON

BTC

Bitcoin

More networks are on the roadmap (Solana, Arbitrum, Optimism). The currencyTag used in the API path is the tag from the table above (e.g. ETH, BTC).

Sources of signals

The engine combines on-chain and off-chain data:

  • On-chain — behavioural patterns, wallet clusters, counterparty flow, smart contract exposure etc.

  • Off-chain — sanctions feeds, public attribution data, law-enforcement intelligence.

For the full model, thresholds, and how these combine into a score, see How risk scoring works.

How to use?

Crypto AML exposes the data through two paths:

  • Web — a convenient browser flow: pick a network, paste a wallet or transaction, read the report, export a PDF, and keep an audit-ready history under your account.

  • REST API — three bearer-authenticated endpoints for developers who want to wire screening into their own backend.

Prepaid credits are burned in the UI and via the API draw from the same balance.

Pricing

Choose the model that fits how you work. With Pay-as-you-go, you top up a prepaid balance and we deduct it per check — starting from ~$0.20 / check, with no subscriptions and no minimums. Top up anytime with a card or crypto. Prefer to buy in bulk? Our let you purchase packages of checks upfront and pay a lower per-check rate — the larger the package, the bigger the discount.

Run a check in the dashboard

The web UI is the fastest way to screen a wallet or transaction — no code required.

Getting started takes three things: sign up with an email, top up a small balance, and start screening. No KYB and no annual contract.

Entry point: https://account.getblock.io/products/crypto-aml→ Run a check.

Screening in three steps

The individual flow is a simple, three-step screen:

Step
Action

01

Pick a network — ETH, TRX , BTC, LTC, BCH

02

Paste a wallet or transaction — an address or a transaction hash.

03

Read the report — a risk score, exposure breakdown, and FATF flags in seconds.

Reading the result screen

The report ("Address risk — Detailed view") surfaces:

  • Risk score — the 0–100 composite, with a colour-coded band (Low / Medium / High / Very high) and a short, human-readable message. See risk bands.

  • Exposure breakdown — a composition chart of where the risk comes from (sanctioned entity, darknet, mixer, ransomware, scam, clean counterparties).

  • FATF flags — discrete regulatory indicators (e.g. Sanctions list match, Mixer / tumbler interaction).

  • Token-level breakdown — for multi-token wallets, each asset is scored independently so a clean ETH balance doesn't mask a risky USDT flow.

  • Historical vs current exposure and direct interaction risk (incoming and outgoing flow scored separately).

Every check can be exported as a PDF — address, score, exposure breakdown and flags — ready to attach to a case file. Checks are also stored server-side under your account.

Telegram bot

Individuals can configure screenings and receive reports inside @GetBlockAMLBot — no separate dashboard needed (Coming soon).

UI states to expect

State
What you see

Loading

The check runs server-side;

Result

The report screen described above.

Empty / new address

A wallet with little on-chain history returns a low-signal result.

Reports are generated for informational purposes only. Risk scores are probabilistic and provided "as is" — they must not be the sole basis for regulatory, legal or financial decisions.

Run check via API

GetBlock Crypto AML also vailable via API. It return a JSON with a risk score, exposure breakdown and flags.

The AML API uses bearer auth with a single token per account — the same token that powers UI billing.

Generate a token from the dashboard: API keys →

Base URL:

The v2 (detailed) address endpoint returns:

Overview

Learn about GetBlock Tron Energy, how to rent Tron energy and bandwidth through API or Dashboard UI

GetBlock Tron Energy is a service that lets you rent TRON Energy and Bandwidth via a simple API or dashboard UI. Instead of locking up large amounts of TRX to stake, you pay in USD and receive delegated resources instantly.

Key Benefits

  • Save up to 68% compared to burning TRX for fees

  • Pay in USD: no need to hold or stake TRX

  • Instant delegation: resources are available immediately

  • Flexible durations: 1 hour to 14 days

  • RESTful API for automation: ideal for exchanges and payment services

  • Dashboard UI for manual operations and monitoring

  • Rate limit: 30 requests/min per API key

How It Works

  1. You top up your GetBlock account with USD (using your card)

  2. You request delegation via API or dashboard — specifying target address, Energy amount, and duration

  3. GetBlock delegates Energy from their staked TRX pool to your target address instantly

  4. Your target address transacts using the delegated Energy (no TRX burning)

  5. Energy recovers over 24 hours if partially used

  6. Delegation expires at the end of the rental period — resources return to GetBlock

Available Operations

Operation

Description

Delegate Energy

Delegate 30,000–5,000,000 Energy for 1h–14d to any TRON address

Delegate Bandwidth

Delegate 1,000–200,000 Bandwidth for 1 hour to any TRON address

Activate Address

Activate a new TRON address on the blockchain (required before delegation to unused addresses)

Next Steps

  1. Getting started

  2. Tron Fee Model

  3. Pricing

  4. API Reference

Getting Started

Learn how to access Tron energy, top your balance, delegate resources, check prices and manage API key from your dashboard.

The Dashboard tab gives you a comprehensive overview of your activity:

  • USD Balance: your current balance with a quick Top Up button

  • Usage: bar chart showing delegation activity (filter by 24h, 7 days, month, or all time)

Overview

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

How to Get an Avalanche RPC Endpoint

Step-by-step guide to getting a fast, reliable Avalanche RPC endpoint

Avalanche's C-Chain provides EVM-compatible smart contract execution with sub-second finality. Whether you're building DeFi protocols, NFT platforms, or gaming applications on Avalanche, this guide gets you connected in minutes.

  • C-Chain — full EVM compatibility

  • Archive data access (all plans)

How to Get an Optimism RPC Endpoint

Step-by-step guide to getting a fast, reliable Optimism RPC endpoint

Optimism (OP Mainnet) is a leading Ethereum L2 and the foundation of the Superchain ecosystem. With sub-dollar transaction costs and full EVM compatibility, it hosts major protocols like Velodrome, Synthetix, and Aave. Here's how to get a reliable OP Mainnet RPC endpoint.

  • Archive data access (all plans)

  • Trace & Debug methods (Starter+)

How to Get a TRON RPC Endpoint

Step-by-step guide to getting a fast, reliable TRON RPC endpoint

TRON processes more USDT transfers than any other blockchain. If you're building payment systems, wallets, trading bots, or any application that touches TRC-20 tokens, you need a reliable TRON RPC endpoint. Here's how to set one up with GetBlock.

1

Go to and sign up. You can register with email or via Google/GitHub OAuth.

2

Once logged in:

Error

Invalid address/hash for the selected network, or insufficient balance.

LTC

Litecoin

BCH

Bitcoin Cash

All-or-nothing execution

Use cases

Simple transfers, individual swaps

Arbitrage, multi-step operations

Adding priority fees

Via Multicall3

Separate transaction in bundle

mev_builders format

Array: ["all"]

Object: {"all": ""}

Multicall3
Bundle
API Reference
How to track your blokchain API usage
Managing your blockchain RPC node usage with notifications

Check Price

Get a real-time price estimate for Energy delegation

Check Order Status

Retrieve details of a previously placed order

API interface: Review available interface types

Subscription — Enable the subscription toggle if you want to ensure your node renews automatically each billing cycle.
  • When ready, click Go to Payment.

  • Step 2: Select add-ons

    Step 3: Payment

    You can also create additional dedicated nodes by repeating these steps. If additional support is required during setup, you can contact the GetBlock support team directly from your dashboard.

    Managing your dedicated node

    performance tier
    GetBlock Dedicated RPC node add-ons
    GetBlock private blockchain server ordering
    How to use GetBlock dedicated nodes
    How to set up a private blockchain node with GetBlock
    GetBlock dedicated node configuration tool
    :
    • 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.

    • Slot notifications: New slot boundaries (leaders or votes) can trigger slot events.

    Every update stream can include full transaction metadata, instruction details, and parsed logs – essentially everything you’d see in a getTransaction or getProgramAccounts 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.

    • Comprehensive streaming: Clients can monitor virtually anything: token mints, program interactions, votes, etc.

    • 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.

    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.;

    • Alerting & notification systems;

    • DeFi strategy engines;

    • ..and any app that needs push‑style updates.


    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

    What is Yellowstone gRPC?

    How Yellowstone gRPC Geyser works

    Supported data streams & subscriptions

    Yellowstone gRPC API features

    Solana Geyser gRPC plugin use cases

    Note that gRPC is not supported in browsers, so Yellowstone is intended for backend services.

    Why use Yellowstone gRPC API?

    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.

    1. 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

    1. Download the getblock.config.js file from your GetBlock account. Add this file to your project directory.

    2. Import the getblock module to a .js file that configures a new Web3 instance:

    1. 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:

    1. Ensure you have Hardhat installed as a dependency in your Node.js project or run the following command to do so:

    1. Navigate to your GetBlock account and install the getblock.config.js file. Copy and paste it into your working directory;

    2. Open the hardhat.config.js file from your project directory and import the getblock module:

    1. 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.

    How to make HTTP requests with curl using JSON config file

    jq

    How to use GetBlock’s JavaScript config with Web3.js

    How to use the JS config with Hardhat

    curl -X GET https://go.getblock.io/"$(jq -r '.shared.btc.mainnet.rest[0]' getblock.config.json)"/rest/chaininfo.json
    const { 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 hardhat
    const { 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
      }
    }
    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)

  • GetBlock Deploys Major Security Upgrade: Introducing Access Tokens

  • All GetBlock endpoints follow a predictable format. The visible difference is the hostname reflecting the region selected during the setup.

    Endpoint examples:

    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>/

    The token encodes the protocol, networks, and routing on the server — clients don’t need to specify a chain in the URL.

    Full vs Archive mode

    Selecting the Archive mode for an endpoint changes how requests are billed in Compute Units (CU). Learn more in the Archive mode guide.

    Viewing and managing endpoints

    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.

    Access token management
    GetBlock RPC endpoint setup interface
    Blockchain RPC nodes list within the GetBlock account

    Enter the name, User ID, and send the invite.

    The user gets a notification and can accept the invite.

    1. Go to Account Settings > My Team.

    2. Click "Add team member" in the top-right corner.

    3. Enter the teammate's name and email address.

    4. Send the invite.

    The user will receive an invitation email with a link to sign up and join the team.

    Assign permissions:
    • 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.

  • ✅

    🔓

    Add & remove team members

    ✅

    ✅

    ❌

    Edit access levels

    ✅

    ✅

    ❌

    Promote to Admin

    ✅

    ❌

    ❌

    After accepting the invitation, you are given access to your team’s workspace. Your role and permissions will be determined by the team owner or admin.

    When someone who is not yet registered on GetBlock receives a team invitation, they must first sign up for an account:

    1. Check your inbox for an email invitation from GetBlock.

    2. Clicking the invitation link redirects you to the sign-up page.

    3. Create a secure password for your new account.

    4. Check the boxes to agree to the Terms of Service and Privacy Policy and complete the registration.

    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.

    Never share login credentials—use team accounts instead.

    Create & manage access tokens

    ✅

    ✅

    🔓

    Manage subscriptions & payments

    Creating a team account on GetBlock

    Adding teammates

    Limits on GetBlock team accounts:

    • Each user can create up to 3 teams.

    • A user can be invited to an unlimited number of teams.

    • One team can have a maximum of 30 users.

    Managing roles & permissions

    If a Member has no permissions assigned, they will have View-Only access by default.

    Roles-based permissions

    If you need someone to help manage other team members, be sure to give them Admin status.

    Revoking team access

    When removed from a team, users lose access to that team workspace but keep their personal account.

    How to join a team account

    Switching between personal & team accounts

    A team user does not lose access to their personal account. They can still use and manage their own endpoints and subscriptions.

    Best practices for team security

    Need help?

    this guide
    FAQ
    Contact Center
    How to create a team account on GetBlock
    Creating an enterprise account with RPC node provider GetBlock
    Collaboration feature for GetBlock enterprise users
    Managing team account user permissions and roles
    Instructions to remove a team user from the GetBlock team account
    How to join a team account on GetBlock
    Using GetBlock's personal and team accounts
    Active
    Pending

    ✅

    If the network is already in your list but uses a default RPC provider, you can switch to GetBlock by following these steps:
    1. Click on the current network name in MetaMask to open the dropdown of networks.

    2. Find the network you want to edit and click the settings menunext to it. Select 'Edit'.

    1. Open the ‘Default RPC URL’ dropdown and select 'Add RPC URL'.

    2. Paste the JSON-RPC endpoint URL from your GetBlock account (https://go.getblock.io/<ACCESS_TOKEN>/).

    3. Name the new RPC URL for easier identification.

    1. 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.

    1. Click on the current network name.

    2. Select 'Add a custom network'.

    1. Fill in the required fields:

    Field
    Description
    Example

    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

    1. Click 'Save', and the custom network will be added and selected as default.

    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

    Before you start

    Set up your wallet

    Get a custom RPC URL

    Rename your endpoints to clearly indicate their purpose.

    Add GetBlock RPC to an existing network

    https://metamask.io/download
    account
    How to get a custom RPC URL for MetaMask
    Generate an RPC URL for MetaMask

    Add a new network to MetaMask

    You can get the Chain ID of an EVM-compatible network (e.g. Polygon zkEVM) sending a request to your endpoint with this curl command:

    1. Connection: We connect your dedicated node's P2P interface to the GetBlock Data center.

    2. Data Flow: The node receives transactions and blocks from both the standard P2P layer and the BDN propagation network.

    3. Automatic Selection: Your node automatically uses the first source to deliver data.

    The BDN Gateway improves the delivery speed of:

    Data Type
    Description
    Impact

    New Blocks

    Block headers and transactions

    React to state changes faster

    Mempool Updates

    Pending transactions

    See opportunities earlier

    1. Traders: To buy and sell tokens faster and submit transactions

    2. Developers: To build a lower-latency dApp, access fresher data, and deliver more responsive user experiences

    3. Validators: To receive transactions and block earlier than other validators and improve participation and rewards.

    Node acceleration directly benefits latency-sensitive applications:

    • Trading Bots: React to price movements and arbitrage opportunities faster

    • Liquidation Systems: Monitor positions with fresher state data

    • Analytics Pipelines: Process blocks and transactions with minimal delay

    • MEV Strategies: Observe mempool activity before competitors

    While node acceleration improves data reception passively, you can further improve your dApp or workflow by:

    • Subscribing to real-time streams for direct access to BDN data

    • Submitting transactions to public mempool with accelerated propagation

    • Using private transactions for MEV protection or without MEV Protection

    How It Works

    Reach us

    Architecture Details

    What Accelerated Node Gets:

    Who is this for:

    Benefits for Your Workloads

    No Action Required

    • Automatic: Enabled when you provision an accelerated dedicated node

    • Transparent: Your existing RPC calls work unchanged

    What to do With Accerelated Node

    Interested in building on Solana with TradeFirst? Reach us for more information.

    TradeFirst provides two-sided latency optimization for Solana trading:

    1. Signal Detection Side: Faster awareness of on-chain events via StreamFirst (data streaming).

    2. 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.

    1. StreamFirst (Data Streaming)

      1. Accelerated Yellowstone gRPC implementation

      2. Optimized shred-stream network access

      3. Fastest on-chain data delivery for signal detection

    2. LandFirst (Multi-Path Routing)

      1. SWQoS priority connections

    3. Jito integration

      1. Geo routing

      2. Stake density topology

      3. Leadership scheduling

    Complete Trading Cycle:

    1. Signal Detection: StreamFirst delivers on-chain updates 17ms faster than standard methods

    2. Strategy Execution: Your trading logic analyzes data and generates orders

    3. Transaction Submission: Blazar optimizes transaction structure and routing

    4. Timing Control: SubSlot precisely times submission within the slot window

    5. Path Selection: LandFirst routes via optimal path (SWQoS or Jito)

    6. Block Inclusion: Transaction lands in the current or next slot with high probability

    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 GetBlock support team

    Core Value Proposition

    Core Technology Stack

    Future Addition:

    • Shred Stream Access (coming soon): Direct raw shred delivery for even earlier data access

    Technical Architecture

    How TradeFirst Works

    Use cases

    Field
    Type
    Description

    address

    string

    The screened address (or hash for transactions).

    network

    string

    Network tag, e.g. ETH.

    riskScore

    number

    Composite 0–100 score.

    riskBand

    Authorization: Bearer YOUR_API_TOKEN

    Authentication

    Response schema

    https://account.getblock.io/settings/api-keys
    https://services.getblock.io/
    {
      "address": "0x6e9a...4b1d",
      "network": "ETH",
      "riskScore": 68,
      "riskBand": "high",
      "message": "Notable exposure to risky counterparties. Review details before accepting funds.",
      "exposure": [
        { "category": "sanctioned_entity", "share": 0.34 },
        { "category": "darknet_market",   "share": 0.22 },
        { "category": "mixer",             "share": 0.18 }
      ],
      "fatfFlags": [
        "sanctions_list_match",
        "darknet_market_exposure",
        "mixer_interaction"
      ],
      "attribution": {
        "cluster": "cluster_4f2a",
        "labels": ["sanctioned_entity", "mixer"]
      },
      "checkedAt": "2026-04-24T09:14:22Z"
    }

    Examples

    Sample response

    Risk scores are probabilistic and provided "as is." Use them to inform your own risk decisions — not as the sole basis for regulatory, legal or financial decisions.

    ,
    (contract, slot, blockNumber),
    (address, blockNumber), etc.
  • Call view functions against historical state: e.g. eth_call(..., 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 endpoint setup. It indicates that Archive mode is available for that blockchain.


    1. Sign in to your GetBlock dashboard and make sure you’re on the Shared Node tab.

    2. Click Get endpoint and choose a required blockchain protocol.

    1. Find the Mode toggle and switch the Archive mode on.

    1. 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 CU limits and performance characteristics.

    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 Compute Units page.

    Example:

    If eth_getBalance costs 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.


    Tell us what you’re building — our team can guide you to the most efficient archive node setup.

    eth_getBalance

    Archive mode availability & coverage

    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:

    1. Full blockchain history at the highest throughput

    How to enable the Archive mode

    CU billing for Shared Archive endpoints

    Best practices

    💬 Need help with archive blockchain data?

    eth_getStorageAt
    eth_getCode
    Trace & Debug methods (Starter+)
  • WebSocket support

  • Multi-region (Frankfurt, New York, Singapore)

  • Dedicated Nodes available

  • 1

    Create a GetBlock Account

    Go to GetBlock Dashboard and sign up. You can register with email or via Google/GitHub OAuth.

    2

    Create an Avalanche Endpoint

    Once logged in:

    1. Click "Shared Nodes" in the left sidebar

    2. Click "Create New Endpoint" or the "+" button

    1. Select:

      • Protocol: Avalanche

      • Network: Mainnet or Testnet

    3

    Your endpoint URL looks like this:

    4
    import { JsonRpcProvider } from "
    
    from web3 import Web3
    w3 = Web3(
    
    import { createPublicClient, http } 
    
    • Full Avalanche API Reference

    • Dedicated Nodes

    • Learn about our pricing

    Building on Avalanche? Contact us for custom infrastructure.

    Features

    Step-by-Step: Get Your Avalanche RPC Endpoint

    Code Sample

    What's Next?

    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

    1. Blocks

      1. Block hash, slot number, parent slot

      2. Block time (Unix timestamp)

      3. Leader (validator) identity

      4. Transaction count

      5. Total compute units consumed

    2. Transactions

      1. Signature (unique identifier)

      2. Fee payer address

      3. Success/failure status

    3. Instructions

      1. Program ID (which program was called)

      2. Instruction index (order within transaction)

      3. Instruction data (decoded where possible)

    4. Logs

      1. Program log messages

      2. Associated transaction signature

      3. Log level and content

    5. Account Updates

      1. Account public key

      2. Pre-transaction balance (lamports)

      3. Post-transaction balance (lamports)

    1. Deep historical analysis and backtesting

    2. Real-time liquidity and TVL monitoring

    3. Pattern recognition and signal generation

    1. Full transaction and asset history for any user

    2. Instant UI updates based on on-chain events

    3. Aggregation of data across DeFi and NFT protocols

    1. Reliable data backbone for internal analytics

    2. Foundation for B2B data services

    3. No need to maintain validators or archive RPC setups


    For consultation on optimal deployment architecture for your specific use case, contact GetBlock support team.

    The Indexed Archive Solution

    Reach us

    Technical Architecture

    Layer 1: SQD Network - Decentralized Indexing

    Layer 2: GetBlock Portal - High-Performance Access Layer

    What the Indexed Archive Includes

    Use Cases

    Analytics and Trading

    dApps and Wallets

    Infrastructure Providers and Enterprises

    Deposit History: table of all top-ups with date, method, and amount
  • TRON Energy Activity: full order history with address, type, volume, duration, price, status, and date

  • Export: download order history as XLS or PDF

  • In this guide, you will learn how to easily navigate through the dashboard to get the following:

    1. How to gain access to Tron energy

    2. How to top up your balanace

    3. Delegate Resources

    4. Check Prices

    5. Manage API Keys

    1

    Create an account on GetBlock using Gmail, Metamask, or GitHub

    2

    Under products, click on Tron energy. The system will automatically sync your GetBlock account with the Energy service.

    The dashboard consists of three main tabs:

    1. Dashboard — view your balance, usage charts, deposit history, and order activity

    2. Delegate — delegate Energy or Bandwidth to TRON addresses, manage API keys

    3. API Docs — reference documentation with cURL examples for all endpoints

    Before you can delegate resources, you need to fund your USD balance:

    1

    Click the "Top Up" button in the balance bar at the top of the dashboard

    2

    Select a preset amount ($50, $100, $500) or enter a custom amount (minimum $10)

    3

    Choose your payment method: Card or Crypto

    4

    Complete the payment — your balance updates instantly

    Go to the Delegate tab and select Manual mode.

    1

    Select the Energy sub-tab

    2

    Enter the target TRON address (starts with T, 34 characters)

    3

    Set the Energy amount (30,000–5,000,000)

    4

    Choose the duration: 1h, 3h, 6h, 12h, or 1 day

    5

    Click "Delegate Energy"

    1

    Select the Bandwidth sub-tab

    2

    Enter the target TRON address

    3

    Set the Bandwidth amount (1,000–200,000)

    4

    Duration is fixed at 1 hour for Bandwidth

    5

    Click "Delegate Bandwidth"

    If you need to delegate to a brand-new TRON address that has never been used, you must activate it first:

    1

    Select the Activate sub-tab

    2

    Enter the target TRON address

    3

    Click "Activate Address

    Activation costs a fixed 1.87 TRX, charged in USD at the current TRX/USD rate.

    The Check Price panel is available on the right side of the Delegate form (Manual mode). Use it to get a real-time estimate before placing an order:

    1

    Enter Energy amount (30,000–5,000,000)

    2

    Select duration: 1 hour, 1 day, 3 days, 7 days, or 14 days

    3

    Click "Check Price"

    4

    The result shows: price in SUN per unit, total TRX, and total USD

    To use the API, you need an API key:

    1

    Go to Delegate → API mode

    2

    Click "+ Add Key" (requires a funded balance)

    3

    Copy and securely store the key immediately — it is shown only once

    4

    You can create up to 5 API keys

    5

    To revoke a key, click "Revoke" next to it — the key stops working immediately

    1. Tron Fee Mode

    2. API Reference

    How to Access Dashboard

    How to Top Up Your Balance

    How to Delegate Resources

    1. Delegate Energy

    2. Delegate Bandwidth

    3. Activate Address

    How to Check Price

    How to Manage API Keys

    Next Steps

    Click "Shared Nodes" in the left sidebar

  • Click "Create New Endpoint" or the "+" button

    1. Select:

      • Protocol: TRON

      • Network: Mainnet or Testnet

      • API Interface: gRPC (Fullnode) or JSON-RPC (Fullnode) or REST (Fullnode) or gRPC (Solidity) or JSON-RPC (Solidity)

      • Region: Frankfurt (EU) or New York or Singapore

    2. Click "Create": Your endpoint URL will be generated immediately.

    3

    Copy Your Endpoint URL

    Your endpoint URL looks like this:

    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/

    The long string after go.getblock.io/ is your access token — keep it private.

    4

    Test the Connection

    curl -X POST https://go.getblock.io/4ddcea01626040019722710f54259810/wallet/getaccount \
    
    import TronWeb from "tronweb";
    
    import requests
    
    url = "https://go.getblock.io/<YOUR-ACCESS-TOKEN>/
    

    TRON supports multiple API interfaces. GetBlock offers:

    Interface
    Use Case

    HTTP API

    Native TRON API — broadest method support

    JSON-RPC

    EVM-compatible interface for cross-chain tooling

    Solidity HTTP API

    Read-only confirmed data queries

    Most TRON developers use the HTTP API with TronWeb library.

    • Full TRON API Reference

    • TronWeb Integration Guide

    • Dedicated Nodes

    • Learn more about our pricing

    Processing USDT at scale? Contact us for dedicated TRON infrastructure.

    Step-by-Step: Get Your TRON RPC Endpoint

    Create a GetBlock Account

    Create a TRON Endpoint

    GetBlock Dashboard

    Code Sample

    TRON API Interfaces

    What's Next?

    WebSocket support
  • Multi-region (Frankfurt, New York, Singapore)

  • Dedicated Nodes available

  • 1

    Create a GetBlock Account

    Go to GetBlock Dashboard and sign up. You can register with email or via Google/GitHub OAuth.

    2

    Create an Optimism Endpoint

    Once logged in:

    1. Click "Shared Nodes" in the left sidebar

    2. Click "Create New Endpoint" or the "+" button

    1. Select:

      • Protocol: Optimism

      • Network: Mainnet or Sepolia

    3

    Your endpoint URL looks like this:

    4
    import { JsonRpcProvider } from "
    
    import { createPublicClient, http } 
    
    • Full OP API Reference

    • Dedicated Nodes

    • Learn more about our pricing

    Need Superchain infrastructure? Contact us.

    Features

    Step-by-Step: Get Your Optimism RPC Endpoint

    Code Sample

    What's Next?

    Base

    Limitless Node

    A dedicated RPC endpoint with guaranteed RPS and no request limits, at a flat monthly price. For Ethereum, Solana, Bitcoin and other Tier-1 blockchains.

    Limitless Node is a dedicated RPC endpoint with a guaranteed RPS and no Compute Unit (CU) limits. You pick an RPS tier on a single chain, pay a fixed monthly fee, and send as many requests as your throughput allows. There's no usage-based billing and no overage charges.

    Architecturally, it's a middle layer between Shared RPS and Dedicated Nodes: more throughput and isolation than a shared plan, at a fraction of the cost of a full private node.

    Limitless Node is the right fit for applications that generate a high volume of RPC requests and need predictable monthly costs without provisioning a full Dedicated Node. Common use cases include indexers, bots, wallet backends, AI agents, and analytics platforms.


    What's included

    Every Limitless Node includes:

    • Guaranteed requests-per-second (RPS) throughput with no per-method throttling

    • Unlimited requests within your RPS tier, no CU-based billing

    • No concurrent connection limits for parallel workloads

    • No restrictions on RPC method usage. All standard and heavy RPC methods are supported

    • Full node and archive node configurations available for supported chains

    • Isolated capacity and dedicated routing for a single network

    • Multi-region geo-routing across Europe, the USA, and Asia to minimize latency through geographic proximity

    • One instance can have multiple , each a separate credential that can be regenerated or removed independently of the others

    • 24/7 customer support with a response time under 5 minutes

    • Pricing is fixed and predictable because it is throughput-based rather than usage-based


    Pick the tier that matches your current traffic. Within your RPS cap, requests are unlimited. There is no monthly request quota and no CU metering.

    RPS (requests-per-second) Tier
    Price (monthly)
    Requests
    Best For

    Prices shown are for monthly billing. Annual billing saves 20%. You can move between tiers at any time with no lock-in.


    One Limitless Node subscription corresponds to one blockchain network. The service is currently available on 10 high-demand blockchains:


    For now, our team provisions every Limitless Node individually so your instance is configured to your workload from day one. Self-serve setup from the dashboard is coming soon.

    To get started:

    1. Contact our team through a contact from on our website or your account.

    2. Specify the requirements: blockchain network, desired RPS tier, node mode (full or archive), and preferred hosting region.

    3. We finalize your configuration and provision a dedicated Limitless Node.

    Our team can also recommend the right tier based on your workload.


    Flashblocks API

    Flashblocks API on the Base network: fetch the latest in-progress block, including all preconfirmed transactions. Quickstart examples in JavaScript and Python

    This section contains all the Flashblock methods available on the Base network

    Flashblocks are simply a class of RPC API methods that are now active on GetBlock endpoints for Base and Optimism. If you already run either chain with GetBlock, the new methods are available on your existing endpoint; if you are new, set up a Base or Optimism endpoint from the and the methods are there.

    Quickstart

    In this section, you will learn how to fetch the latest Flashblock — the current in-progress block containing every preconfirmed transaction — using either:

    • Axios (JavaScript / Node.js)

    • Python (Requests library)

    Before you begin, you must have already installed or on your local machine (for the Axios example) or Python and pip (for the Python example).

    1
    2
    3

    Create a new file named index.js. This is where you will make your first call.

    4

    StreamFirst

    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? Reach us for more information.

    Core Stack

    StreamFirst consists of two core optimization layers:

    1. Software-level acceleration: Accelerated Yellowstone gRPC implementation

    2. 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:

    1. Block Production: Solana validators produce blocks and fragment them into "shreds."

    2. State Reconstruction: Shreds are decoded and reassembled into transactions and account updates

    3. Accelerated Processing: Optimized Yellowstone plugin processes data with reduced overhead

    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

    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

    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

    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

    How risk scoring works

    Crypto AML combines advanced analytics, machine-learning models and deterministic rules to evaluate dozens of on-chain and off-chain factors in parallel. The result is a structured breakdown across exposure axes — not a single opaque number.

    The pipeline

    Every check runs through three stages:

    1. Signals — "what we read". The engine reads 30+ criteria per wallet across two families of data.

    2. Scoring engine. A weighted combination of every signal, mapped to a 0–100 range. Conceptually: score = Σ wᵢ·sᵢ over all signals i, blending supervised ML models with heuristic rules. Median latency is < 400 ms.

    3. Output — "what you get". A composite score, a band, an exposure breakdown, FATF flags and attribution.

    • On-chain behavioural patterns

    • Wallet clusters

    • Counterparty flow

    The 0–100 composite riskScore maps to one of four bands (riskBand). These thresholds are exact:

    Alongside the score, each report lists discrete FATF-aligned flags you can cite in a case file. Values seen in the product include:

    • sanctions_list_match — Sanctions list match

    • darknet_market_exposure — Darknet market exposure

    • mixer_interaction — Mixer / tumbler interaction

    The detailed view (API v2 / the UI report) scores risk along several axes so a clean present-day balance can't mask a risky history:

    Axis
    What it measures

    Where identity can be established, the report includes attribution:

    • cluster — a cluster identifier (e.g. cluster_4f2a).

    • labels — entity names where known, inferred tags where not (e.g. ["sanctioned_entity", "mixer"]).

    eth_unsubscribe - Flashblocks

    Example code for the eth_unsubscribe Flashblocks method. Complete guide on how to use eth_unsubscribe Flashblocks in GetBlock Web3 documentation.

    This cancels a subscription created with eth_subscribe. The subscription ID is no longer valid after this call.

    Parameter
    Type
    Required
    Description
    Field
    Type
    Description
    Status Code
    Error Message
    Cause

    LandFirst

    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.

    Core Technology Stack

    LandFirst automatically routes transactions through three complementary delivery mechanisms:

    1. GetBlock's Own SWQoS Connections

      1. Direct partnerships with high-stakes Solana validators

      2. Guaranteed priority capacity through stake-weighted allocation

      3. GetBlock-operated infrastructure with validator peering

    2. Leased SWQoS Connections

      1. Higher priority than unstaked RPC traffic, ensuring transactions cut ahead during congestion

      2. Reserve priority bandwidth specifically for LandFirst traffic

    3. Jito Block Engine Integration

      1. MEV-aware auction mechanism for guaranteed inclusion

      2. Bundle support for atomic multi-transaction operations

      3. 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.

    1. HFT & Arbitrage

    Fast, reliable execution for high-frequency trading, arbitrage, market-making, and position rebalancing — especially when every millisecond counts.

    1. MEV & Keeper / Liquidation Bots

    Ensures deterministic transaction landing for backruns, front-runs, liquidation races, and other MEV or keeper-bot strategies.

    1. NFT Sniping & High-Demand Mints

    Gives an edge for time-sensitive NFT events such as limited-supply mints, snipes, and competitive auctions.

    1. 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

    Connect Brave Wallet to GetBlock

    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

    Every wallet’s network can be modified this way, and this step-by-step guide shows how to do that.


    Before you start

    You need to set up the Brave wallet and prepare the GetBlock API endpoints.

    Download Brave and set up the wallet

    Brave Wallet is inseparable from the Brave browser. So, download and install the browser from the official website. 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.

    1. Proceed to the GetBlock dashboard and create an account or log in.

    2. Click on the Get button to add a new RPC endpoint, and select the Ethereum mainnet.

    3. 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.

    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.

    1

    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.

    2

    Locate the network in the list

    If the network of interest is already present, such as with Ethereum, click on the three-dot options (

    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.

    1

    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.

    2

    Get a network’s RPC URL at GetBlock

    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.

    Yellowstone gRPC API

    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.

    Overview

    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.


    Key Features

    • 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

    • Protobuf encoding: Receive parsed, typed messages instead of raw base64 data

    • Bidirectional streaming: Maintain long-lived connections with built-in keep-alives


    Yellowstone gRPC supports streaming the full range of Solana events:

    Stream Type
    Description

    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 .

    How to Get a Polygon RPC Endpoint

    Step-by-step guide to getting a fast, reliable Polygon RPC endpoint.

    Polygon PoS is one of the most widely used Ethereum scaling solutions, powering DeFi protocols, NFT marketplaces, gaming applications, and enterprise solutions.

    Available Service on GetBlock

    • Archive data: query historical state at any block (all plans)

    • Trace & Debug: debug_traceTransaction, trace_block (Starter+)

    • WebSocket: real-time subscriptions via wss://go.getblock.io/<TOKEN>/

    • Multi-region: Frankfurt, New York, Singapore

    • Dedicated Nodes: unlimited RPS, from $1,000/mo

    This guide shows you how to get a reliable Polygon RPC endpoint — from free development access to production-grade infrastructure.

    1

    Go to and sign up. You can register with email or via Google/GitHub OAuth.

    2

    Once logged in:

    1. Click "Shared Nodes" in the left sidebar

    Use Case
    Plan
    CU
    RPS

    Need enterprise Polygon infrastructure? .

    TRON Fee Model

    Learn how to calculate transaction fees in TRON

    In Bitcoin and Ethereum, transaction fees are paid in the network’s native asset — in its smallest unit (satoshi, wei). TRON works differently; every transaction consumes two types of resources:

    1. Bandwidth

    2. Energy.

    If these resources are insufficient, TRX is burned to cover the costs.

    SUN: The Base Unit of TRX

    SUN is the smallest unit of TRX, analogous to satoshi in Bitcoin or wei in Ethereum.

    The cost of Energy and Bandwidth when burning TRX is expressed in SUN.

    Bandwidth is the network throughput required to transmit transaction data.

    • Consumed by every transaction

    • 1 Bandwidth = 1 byte of transaction data

    • Each account receives a free daily allowance of 600 Bandwidth, which resets automatically

    • If Bandwidth is insufficient → TRX is burned

    TRC-10 token transfers consume only Bandwidth. TRC-20 token transfers (USDT and other smart contract tokens) consume both Bandwidth and Energy.

    Energy is the computational power required to execute smart contracts on the TRON Virtual Machine (TVM).

    • Consumed only when calling a smart contract

    • 1 Energy ≈ 1 microsecond of computation on TVM

    • No free daily allowance

    • If Energy is insufficient → TRX is burned

    A typical USDT transfer calls the function transfer(address to, uint256 value). The TVM executes a balance check, a storage write for the sender (debit), and a storage write for the recipient (credit).

    The amount of Energy depends on whether a storage slot already exists for the recipient:

    Current network parameters (set via governance) can be retrieved with the following request:

    • Energy: 65,000 × 100 SUN = 6,500,000 SUN = 6.5 TRX

    • Bandwidth: 345 × 1,000 SUN = 345,000 SUN = 0.345 TRX

    • Total: ~6.85 TRX

    • Energy: 131,000 × 100 SUN = 13,100,000 SUN = 13.1 TRX

    • Bandwidth: 345 × 1,000 SUN = 345,000 SUN = 0.345 TRX

    • Total: ~13.45 TRX

    TRON has a Stake 2.0 mechanism that allows users to obtain Energy without burning TRX:

    A TRX holder freezes tokens via a system contract and receives Energy proportional to their share of the total network stake. The more TRX is frozen across the network, the less Energy each participant receives per unit of TRX. When unstaking, TRX is locked for a 14-day waiting period before it is returned.

    An owner of staked TRX can delegate their resources (Energy or Bandwidth) to another address via delegateResource. The recipient uses the Energy, while the staker retains their TRX. Delegation can be locked for a minimum of 3 days, after which it can be revoked.

    This mechanism forms the basis of the Energy rental market: providers stake large amounts of TRX and delegate Energy to clients for a fee. The client receives Energy without having to lock up their own capital.

    Rental providers buy Energy in bulk (by staking large amounts of TRX) and sell it at a price below the cost of burning. Current market prices range from 30 to 50 SUN per 1 Energy, depending on the provider and terms.

    Example calculation at a rental price of 32 SUN per 1 Energy:

    For high-volume clients (exchanges, payment services, dApps), renting Energy significantly reduces operational costs.

    After being used, Energy on an account recovers linearly over 24 hours. This means that if an account has staked TRX and its Energy has been spent, the full amount will be available again after 24 hours. This also applies to rented (delegated) Energy — it is recovered on the recipient’s account during the rental period.

    Crypto Address Audit: Risk & Compliance APIs

    Crypto Address Audit is GetBlock's risk and compliance suite for screening blockchain addresses before any interaction.

    Crypto Address Audit is GetBlock's AI-powered risk and compliance suite that screens wallets and smart contracts for fraud risk, AML exposure, and rug pull detection in a single API.

    The service runs on pure on-chain behavioral analysis with no source code review and no off-chain data, across Ethereum, BNB Smart Chain, and Base.

    Choose Your Crypto Audit API:

    1. Wallet Audit

    A complete behavioral profile of a wallet address. Returns a trust score, AML check across 18+ parameters, behavioral risk profile (Risk Willingness, Experience Level, Risk Capability), protocol interaction history, transaction breakdown by category, and predictive intentions.

    Learn more about , check out it , or access its

    1. Wallet Risk

    A faster, lighter check focused on a single binary outcome: is this address safe to interact with? Returns a risk score and the flags that drove it. Use this when latency matters and a full audit is more than the use case needs — payment flows, point-of-sale, real-time wallet connect.

    Learn more about , check out it , or access its

    1. Rug Pull Checker

    A predictive check for smart contract and liquidity pool addresses. Analyzes the on-chain behavior of the contract creator and individual liquidity providers — tracing through intermediate contracts to the source wallet — and returns a rug pull risk score (0–100), risk level (LOW / MEDIUM / HIGH), creator trust score, per-LP trust scores, and behavioral flags. The underlying AI model is trained on 336K smart contracts.

    Learn more about , check out it , or access its

    Two ways to use Crypto Address Audit, depending on the workflow.

    1. Via the : This runs a check on the wallet/contract address through the UI. Paste an address, and run the check. No code required. Best for ad-hoc analysis, manual due diligence, and trying the service before integrating it.

    2. — one POST request per address, JSON response. Best for production integration into a DeFi protocol, wallet, launchpad, or any product that needs to screen addresses programmatically. .

    Crypto Address Audit uses a single subscription that covers all three services with a single API key.

    Each user gets 5 free requests per day. After the free quota is used, each request costs $0.20 USD, deducted from the prepaid balance.

    Parameter
    Value
    1. On your , click on the credit balance as seen below:

    1. Click on Top Up

    1. Select the amount you want to pay or enter the amount:

    1. After that, click on Proceed to checkout

    2. You'll be routed to another page to complete your payment

    1. Once you've completed your payment, go back to your dashboard to see it reflected.

    Optimism Flashblocks.

    Flashblocks-specific RPC methods, WebSocket subscriptions, and the infrastructure stream schema for Optimism pre-confirmations.

    Optimism runs on the OP Stack (chain ID 10), the reference implementation for which Flashblocks' Rollup-Boost sidecar was built. Flashblocks are available on Optimism Mainnet and Optimism Sepolia (chain ID 11155420), served over the standard Optimism RPC interface so existing tooling reads preconfirmed state without modification.

    Transport
    URL

    How to Get an Arbitrum RPC Endpoint

    Step-by-step guide to getting a fast, reliable Arbitrum RPC endpoint

    Arbitrum One is the leading Ethereum L2 by TVL, hosting major DeFi protocols like GMX, Aave, Uniswap, and Camelot. If you're building on Arbitrum, you need a reliable RPC endpoint that can handle the network's high throughput without rate-limiting your application.

    • EVM-compatible — use the same tools as Ethereum (ethers.js, web3.js, Hardhat, Foundry)

    • Archive data — full historical state queries

    Error messages (if failed)

  • Fee paid (lamports)

  • Compute units used

  • List of program invocations

  • Accounts array (all accounts involved)

  • Nested/inner instructions

  • Timestamp

    Owner program (pre and post)

  • Data changes (what was modified)

  • Rent epoch information

  • string

    low | medium | high | very-high.

    message

    string

    Human-readable summary for the band.

    exposure

    array

    { category, share } — where risk comes from; share is 0–1.

    exposure[].category

    string

    sanctioned_entity | darknet_market | mixer | ransomware | scam.

    exposure[].share

    number

    Fraction of total exposure (0–1).

    fatfFlags

    string[]

    e.g. sanctions_list_match, darknet_market_exposure, mixer_interaction.

    attribution

    object

    { cluster, labels[] } — cluster id and entity/tag labels (detailed view).

    checkedAt

    string

    ISO 8601 timestamp of the check.

    Your USD balance is shared across all GetBlock products.

    Wallet Audit Homepage

  • Wallet Risk Homepage

  • Rug Pull Checker Homepage

  • Free daily quota

    5 requests

    Price per request

    $0.20 USD

    Billing method

    Prepaid balance

    How to Access

    Pricing & Limits

    How to Top Up Your Prepaid Credit

    Need a custom setup (higher rate limits, dedicated infrastructure, SLA, or volume pricing)? Contact the GetBlock team.

    Next Step

    Wallet Audit
    docs
    endpoint
    Wallet Risk
    docs
    endpoint
    Rug Pull Checker
    docs
    endpoint
    Dashboard
    Via the API
    Access the available endpoints here
    account dashboard
    Wallet Audit Doc
    Wallet Risk Doc
    Rug Pull Checker Doc
    Address Audit API Reference
    Client Delivery: Structured blockchain data streams to your application via standard gRPC
    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

  • Block data: Full block information, including all transactions and metadata
  • Program logs: Subscribe to specific program execution logs

  • How It Works

    Accelerated Yellowstone gRPC

    Shred-Stream Network Optimization

    Frankfurt Data Center - Europe's Solana Hub

    Technical Architecture

    Why StreamFirst is Important for Developers

    Speed Advantages

    Typical latency improvements: 25-30ms faster than standard Yellowstone gRPC

    Use Cases

    Data Types Available

    Deployment and Availability

    Conclusion

    GetBlock support team
    How to create a node endpoint for blockchain API access
    Unlimited query capacity
  • Custom node builds & tooling

  • Dedicated Node
    history/clock icon
    Archive blockchain data access via GetBlock RPC endpoints
    Get RPC endpoint button on GetBlock's dashboard
    -H "Content-Type: application/json" \
    -d '{"address": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g", "visible": true}'
    const tronWeb = new TronWeb({
    fullHost: "https://go.getblock.io/<YOUR-ACCESS-TOKEN>/",
    });
    // Get TRX balance
    const balance = await tronWeb.trx.getBalance("TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g");
    console.log(`Balance: ${balance / 1e6} TRX`);
    // Get USDT balance (TRC-20)
    const contract = await tronWeb.contract().at("TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"); // USDT
    const usdtBalance = await contract.balanceOf("TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g").call();
    console.log(`USDT: ${usdtBalance / 1e6}`);
    "
    # Get latest block
    response = requests.post(f"{url}wallet/getnowblock")
    block = response.json()
    print(f"Block: {block['block_header']['raw_data']['number']}")
    # Get account info
    response = requests.post(f"{url}wallet/getaccount", json={
    "address": "TZ4UXDV5ZhNW7fb2AMSbgfAEZ7hWsnYS2g",
    "visible": True
    })
    print(f"Balance: {response.json().get('balance', 0) / 1e6} TRX")
    Smart contract exposure
  • Direct & indirect exposure (hop distance to flagged addresses)

  • Transaction volume & value concentration

  • Peel-chain & layering patterns

  • Mixer / tumbler interaction

  • Bridge & cross-chain movement

  • Wallet age & activity cadence

  • Dormancy and sudden-reactivation signals

  • Token-level exposure (per-asset flow scoring)

    • Sanctions feeds (OFAC, EU, UN, and national lists)

    • Public attribution data

    • Law-enforcement intelligence

    • Darknet-market address databases

    • Ransomware & extortion address feeds

    • Scam, phishing & fraud reports

    • Exchange & VASP attribution

    • Known mixer / tumbler service lists

    • High-risk jurisdiction indicators

    • Reported hack & exploit address sets

    Medium

    25–49

    Minor exposure detected. Reasonable to proceed after a quick review.

    high

    High

    50–74

    Notable exposure to risky counterparties. Review details before accepting funds.

    very-high

    Very high

    75–100

    Strong match with high-risk activity. Do not transact without enhanced due diligence.

  • Ransomware-associated cluster

  • Scam / phishing cluster

  • High-risk jurisdiction

  • Token-level breakdown

    Each token on the wallet is scored independently — a clean ETH balance does not mask a risky USDT flow.

    Band (riskBand)

    Label

    Score range

    Meaning

    low

    Low

    0–24

    No material risk indicators in the current evaluation.

    Historical exposure

    Aggregated risk across the wallet's entire on-chain history.

    Current exposure

    Risk weighted to the present-day balance and recent activity (last ~90 days).

    Direct interaction risk

    Exposure from counterparties one hop away — scored separately for incoming and outgoing flow.

    Signals evaluated

    Risk bands & thresholds

    The score is the output of a complex, probabilistic system. It combines many weighted signals, machine-learning models and continuously updated data sources — so it is an estimate, not a definitive verdict. The same address can score slightly differently over time as on-chain activity, attribution data and sanctions feeds change, and a result may sit near a band boundary. Treat the score and band as one input to your own risk decision, apply your own policy thresholds, and account for this natural fluctuation when acting on any particular result. If you have concerns about the origin of funds, you can use our KYT tool to trace fund movements in a graph form — following an address to its counterparties and their interconnections — and decide based on that.

    FATF flags

    Flag values shown in snake_case are the API form; the italic labels are the UI display form.

    Exposure axes in the detailed report

    Attribution

    medium

    GetBlock Product Demo

    Slots

    Slot notifications as they're processed by the leader

    Block Meta

    Block metadata with transaction counts and execution status

    DeFi strategy engines

  • 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

    Supported Data Streams

    Use Cases

    Note: gRPC is not supported in browsers. Yellowstone is designed for backend services and server-side applications.

    Getting Started

    Prerequisites

    Quick Example

    Additional Resources

    Need Help?

    getblock.io
    Dedicated Solana Node
    Yellowstone gRPC GitHub Repository
    GetBlock Solana Nodes
    GetBlock Support
    GetBlock dashboard
    support page

    Overview

    Learn how Yellowstone gRPC works and why it's essential for real-time Solana applications

    Quickstart Guide

    Enable the add-on and start streaming data with code examples in TypeScript, Python, Go, and Rust

    ~4.2 TRX

    13.1 TRX

    ~68%

    Operation

    Bandwidth Used

    Sending TRX

    ~268 Bandwidth

    Sending USDT (TRC-20)

    ~345 Bandwidth

    Scenario

    Energy

    Reason

    Activated address (has received USDT before)

    ~65,000

    Updating an existing storage slot

    Non-activated address (never received USDT)

    ~131,000

    Scenario

    Renting

    Burning TRX

    Savings

    Activated address (~65K Energy)

    ~2.1 TRX

    6.5 TRX

    ~68%

    Bandwidth

    Bandwidth Consumption Examples

    Energy

    Example: USDT (TRC-20) Transfer Energy Cost

    Transaction Cost When Burning TRX

    Cost Calculation: USDT Transfer to Activated Address (~65,000 Energy)

    Cost Calculation: USDT Transfer to New Address (~131,000 Energy)

    Where Energy Comes From: Staking and Delegation

    1. Staking (Freezing TRX)

    2. Delegation

    3. Rental Market

    Why Renting Energy Is More Cost-Effective Than Burning TRX

    Energy Recovery

    Next Steps

    API Reference

    Creating a new storage slot

    New address (~131K Energy)

    Pricing

    Network name

    Fetched automatically based on Chain ID

    Polygon zkEVM

    Currency symbol

    Suggested automatically based on Chain ID

    ETH

    Block explorer URL

    Optional field

    https://zkevm.polygonscan.com/

    How to set up the custom RPC URL on MetaMask
    How to change the RPC URL on MetaMask
    Adding a new network to MetaMask using custom RPC URL
    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}`);
      }
    });
    1 TRX = 1,000,000 SUN
    Cost when burning: 1 Bandwidth = 1,000 SUN (0.001 TRX)
    Cost when burning: 1 Energy = 100 SUN (0.0001 TRX)
    GET https://api.trongrid.io/wallet/getchainparameters
    Current rates: 1 Energy = 100 SUN (0.0001 TRX), 1 Bandwidth = 1,000 SUN (0.001 TRX)
    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"
      }'
    API Interface: JSON-RPC or Websocket
  • Region: Frankfurt (EU)

  • Click "Create": Your endpoint URL will be generated immediately.

  • ethers
    "
    ;
    const provider = new JsonRpcProvider("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/");
    console.log("Block:", await provider.getBlockNumber());
    Web3
    .
    HTTPProvider
    (
    "
    https://go.getblock.io/<YOUR-ACCESS-TOKEN>/
    "
    ))
    print("Chain ID:", w3.eth.chain_id) # 43114
    from
    "
    viem
    "
    ;
    import { arbitrum } from "viem/chains";
    const client = createPublicClient({
    chain: avalanche,
    transport: http("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"),
    });
    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/

    Copy Your Endpoint URL

    The long string after go.getblock.io/ is your access token — keep it private.

    Test the Connection

    curl -X POST https://go.getblock.io/<YOUR-ACCESS-TOKEN>/ \
      -H "Content-Type: application/json" \
      -d '{
      "jsonrpc":"2.0",
      "method":"eth_chainId",
      "params":[],
      "id":1
      }'
    { 
       "result": "0xa86a" (Chain ID 43114)
    }
    API Interface: JSON-RPC or Websocket or GraphQL
  • Region: Frankfurt (EU)

  • Click "Create": Your endpoint URL will be generated immediately.

  • ethers
    "
    ;
    const provider = new JsonRpcProvider("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/");
    console.log("Block:", await provider.getBlockNumber());
    from
    "
    viem
    "
    ;
    import { optimism } from "viem/chains";
    const client = createPublicClient({
    chain: optimism,
    transport: http("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"),
    });
    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/

    Copy Your Endpoint URL

    The long string after go.getblock.io/ is your access token — keep it private.

    Test the Connection

    curl -X POST https://go.getblock.io/<YOUR-ACCESS-TOKEN>/ \
      -H "Content-Type: application/json" \
      -d '{
      "jsonrpc":"2.0",
      "method":"eth_chainId",
      "params":[],
      "id":1
      }'
    
    {
       "jsonrpc":"2.0",
        "id":1,
        "result": "0xa"
     }

    Unlimited

    Production dApps

    150 RPS

    $500/mo

    Unlimited

    Indexers & trading bots

    300 RPS

    $1,000/mo

    Unlimited

    Enterprise workloads

    Optimism

    Sui

    Receive your RPC endpoint, generate
    . Connect your application and start sending requests.

    25 RPS

    $150/mo

    Unlimited

    Testing & prototypes

    50 RPS

    Ethereum

    Solana

    Bitcoin

    TRON

    Base

    Polygon

    Arbitrum

    Avalanche

    Limitless Node is a standalone product. You don't need an existing Shared or Dedicated plan to use it. You get a fully isolated RPC endpoint from day one.

    RPS tiers and pricing

    Requests above your RPS limit are rate-limited and return a standard rate-limit response. We do not charge overage fees. If you consistently reach your limit, consider upgrading to a higher tier.

    Supported chains

    Additional networks may be added over time. If you need a chain that isn't listed yet, a custom RPS ceiling, or multi-region redundancy, contact our team.

    Deploy a Limitless Node

    Next steps

    access tokens
    Get a free consultation.
    Endpoint setup
    Testing RPC connection
    API Reference
    Limitless Node Homepage

    $300/mo

    access token(s)

    Set ES module type

    Set the ES module "type": "module" in your package.json.

    5

    Add code

    index.js
    import axios from 
    

    Replace <ACCESS-TOKEN> with your actual access token from GetBlock (Base or Optimism endpoint).

    6

    Run the script

    node index.js

    The response contains the current in-progress block, updated every 200ms (Base) or 250ms (Optimism). Call it again a few hundred milliseconds later and you'll see additional transactions included as new Flashblocks land.

    7

    Result

    {
        "jsonrpc": "2.0"
    
    1

    Setup the project directory

    mkdir flashblocks-quickstart
    cd flashblocks-quickstart
    2

    Create and activate a virtual environment

    python -m venv venv
    source 
    
    3

    Install requests

    pip install requests
    4

    Create script

    main.py
    import requests
    import json
    

    Replace <ACCESS-TOKEN> with your actual GetBlock access token.

    5

    Setup project

    Install Axios

    Create file

    To make use of Flashblocks:

    npm
    yarn
    GetBlock dashboard
    mkdir flashblocks-quickstart
    cd flashblocks-quickstart
    npm init --yes
    npm install axios

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    -32600

    Invalid Request

    Subscription called over HTTP; use WebSocket

    subscriptionId

    string

    Yes

    The subscription ID returned by eth_subscribe.

    import asyncio
    import json
    import websockets
    
    async def main():
        async with websockets.connect('wss://go.getblock.io/<ACCESS-TOKEN>/') as ws:
            await ws.send(json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_unsubscribe",
        "params": [
            "0x9cef478923ff08bf67fde6c64013158d"
        ],
        "id": "getblock.io"
    }))
            async for message in ws:
                print(json.loads(message))
    
    asyncio.run(main())
    use tokio_tungstenite::connect_async;
    use tokio_tungstenite::tungstenite::Message;
    use serde_json::json;
    use futures_util::{SinkExt, StreamExt};
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let (mut ws_stream, _) = connect_async("wss://go.getblock.io/<ACCESS-TOKEN>/").await?;
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_unsubscribe",
            "params": [
                    "0x9cef478923ff08bf67fde6c64013158d"
            ],
            "id": "getblock.io"
    });
        ws_stream.send(Message::Text(payload.to_string())).await?;
    
        while let Some(msg) = ws_stream.next().await {
            println!("{:?}", msg?);
        }
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "id": 1,
        "result": true
    }

    result

    boolean

    true if the subscription was successfully cancelled, false if the subscription ID was not found.

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.WebSocketProvider('wss://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Flashblocks subscription types aren't first-class in ethers — use the raw send interface:
    const subscriptionId = await provider.send('eth_usubscribe', ["0xf48bfa9af6a7f77897a0f0e59c1061bc"]);
    console.log('Subscribed:', subscriptionId);
    import { createPublicClient, webSocket } from 'viem';
    
    const client = createPublicClient({
        transport: webSocket('wss://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // Flashblocks subscription types use the raw request interface:
    const subscriptionId = await client.request({
       "method": "eth_unsubscribe", 
        "params": ["0xf48bfa9af6a7f77897a0f0e59c1061bc"]
    });
    console.log('Subscribed:', subscriptionId);

    Request Example

    Response

    Response Parameters

    Error Handling

    SDK Integration

    # WebSocket-only method. Use wscat (or similar) to connect first:
    wscat -c 'wss://go.getblock.io/<ACCESS-TOKEN>/'
    
    # Then send:
    {"jsonrpc": "2.0", "method": "eth_unsubscribe", "params
    import WebSocket from 'ws';
    
    const ws = new WebSocket('wss://go.getblock.io/<ACCESS-TOKEN>/');
    
    ws.on('open', () => {
        ws.send(JSON.stringify({
        "jsonrpc": "2.0",
        "method": "eth_unsubscribe",
        "params": [
            "0x9cef478923ff08bf67fde6c64013158d"
        ],
        "id": "getblock.io"
    }));
    });
    
    ws.on('message', (data) => {
        console.log(JSON.parse(data.toString()));
    });

    Congestion handling

    Fails or delays

    Adaptive routing

    Bundle support

    No

    Yes (via Jito)

    MEV protection

    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)

    Technical Architecture

    How It Works

    Routing Intelligence:

    Use Cases

    Different Between Multi-Path Routing Advantage vs. Standard RPC Transaction Submission

    Available to Everyone

    GetBlock support team

    High (stake-weighted)

    Click Get, and the endpoint is ready.
    ) button right of Ethereum and then select
    Edit
    to open the account settings.

    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.

    3

    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.

    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.

    Voila—the free and highly secure Polygon zkEVM node endpoint is ready.

    3

    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.

    No overloads even during high chain activities

    Get a custom RPC API endpoint

    Without a subscription, you may have only 2 endpoints simultaneously. If you need more, consider deleting those you don’t need at the given moment.

    Modify an existing EVM network

    Add a new EVM network

    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 contact us and suggest it.

    compute unit
    How to start using a Brave browser wallet
    Creating Ethereum access token in GetBlock
    Getting an ETH RPC URL for Brave wallet
    Adding Polygon to Brave
    New Polygon zkEVM account with GetBlock endpoint
    three-dot menu
    Downloading Brave browser with integrated wallet

    Click "Create New Endpoint" or the "+" button

    1. Select:

      • Protocol: Polygon

      • Network: Mainnet or Amoy(test network)

      • API Interface: JSON-RPC or WebSocket

      • Region: Frankfurt (EU), New York (US), or Singapore (APAC)

    2. Click "Create": Your endpoint URL will be generated immediately.

    3

    Copy Your Endpoint URL

    Your endpoint URL looks like this:

    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/

    The long string after go.getblock.io/ is your access token — keep it private.

    4

    Test the Connection

    curl -X POST https://go.getblock.io/<YOUR-ACCESS-TOKEN
    
    {
      "jsonrpc": "
    

    50M/mo

    100

    Production

    Advanced ($199/mo)

    220M/mo

    300

    High-traffic

    Pro ($499/mo)

    600M/mo

    500

    Enterprise

    Dedicated ($1K+/mo)

    Unlimited

    Unlimited

    Learning

    Free

    50K/day

    20

    Side project

    Step-by-Step: Get Your Polygon RPC Endpoint

    Create a GetBlock Account

    Create a Polygon Endpoint

    Code Example

    Plans

    What's Next?

    GetBlock Dashboard
    You can learn more about our pricing here
    Full Polygon API Reference
    Using Web3.js with GetBlock
    Configure a Dedicated Polygon Node
    Contact us
    import { JsonRpcProvider } from "ethers";
    
    const provider = new JsonRpcProvider("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/");
    const block = await provider.getBlockNumber();
    console.log("Latest Polygon block:", block);
    from web3 import Web3
    
    w3 = Web3(Web3.HTTPProvider("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"))
    print("Chain ID:", w3.eth.chain_id)  # 137
    print("Block:", w3.eth.block_number)

    Starter ($49/mo)

    Managed: GetBlock handles all Gateway maintenance and updates

    Your application code remains the same. The improvement happens at the infrastructure layer, giving you faster data without code changes.

    State Transitions

    Account and contract state

    Fresher data for decisions

    Transaction

    Submiting Trsanction

    Submit single transactions or bundles with optimized propagation paths

    wss://go.getblock.io/<ACCESS-TOKEN>/

    Method
    Usage

    eth_getTransactionCount

    Pass "pending" for a nonce that accounts for Flashblock transactions

    eth_getStorageAt

    Pass "pending" for storage at preconfirmed state

    eth_getBalance

    Pass "pending" for the balance at the latest Flashblock state

    The example below reads the pending balance of the Optimism WETH contract 0x4200000000000000000000000000000000000006. Substitute any supported method and parameters; the "pending" tag is what selects Flashblock state.

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "jsonrpc": "2.0",
        "method": "eth_getBalance",
        "params": ["0x4200000000000000000000000000000000000006", "pending"],
        "id": "getblock.io"
    }'
    example.js
    const axios = require('axios');
    
    const response = await axios.post('https://go.getblock.io/<ACCESS-TOKEN>/', {
        jsonrpc: '2.0',
        method: 'eth_getBalance',
        params: ['0x4200000000000000000000000000000000000006', 'pending'],
        id: 'getblock.io'
    }, {
        headers: { 'Content-Type': 'application/json' }
    });
    
    console.log(response.data.result);
    example.py
    import requests
    
    response = requests.post(
        'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers={'Content-Type': 'application/json'},
        json={
            'jsonrpc': '2.0',
            'method': 'eth_getBalance',
            'params': ['0x4200000000000000000000000000000000000006', 'pending'],
            'id': 'getblock.io'
        }
    )
    
    print(response.json())
    example.rs
    use reqwest::Client;
    use serde_json::{json, Value};
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&json!({
                "jsonrpc": "2.0",
                "method": "eth_getBalance",
                "params": ["0x4200000000000000000000000000000000000006", "pending"],
                "id": "getblock.io"
            }))
            .send()
            .await?
            .json::<Value>()
            .await?;
    
        println!("Result: {}", response["result"]);
        Ok(())
    }

    The result is the hex-encoded balance in wei at the latest Flashblock. The same request with the "latest" tag returns the value at the last sealed block.

    • Trading Platforms: Surface preconfirmed order and swap results with sub-second latency.

    • Prediction Markets: Reflect changes in market state as soon as transactions are preconfirmed.

    • Wallets: Show instant transaction feedback and real-time balance updates before a block is sealed.

    • Nonce Management: Use eth_getTransactionCount with pending to avoid nonce collisions during rapid submission.

    • Preconfirmed Receipts: Poll eth_getTransactionReceipt to confirm inclusion at Flashblock cadence.

    HTTP

    https://go.getblock.io/<ACCESS-TOKEN>/

    Endpoints

    WebSocket

    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x0de0b6b3a7640000"
    }

    The pending tag works over HTTP. Flashblocks subscriptions require the WebSocket endpoint.

    Flashblocks-Aware Methods

    Example

    Response

    Use Cases

    Trace & Debug — debug_traceTransaction and related methods (Starter+)

  • WebSocket — wss://go.getblock.io/<TOKEN>/ for real-time subscriptions

  • Multi-region — Frankfurt, New York, Singapore

  • 1

    Create a GetBlock Account

    Go to GetBlock Dashboard and sign up. You can register with email or via Google/GitHub OAuth.

    2

    Create a Arbitrum Endpoint

    Once logged in:

    1. Click "Shared Nodes" in the left sidebar

    2. Click "Create New Endpoint" or the "+" button

    1. Select:

      • Protocol: Arbitrum

      • Network: Mainnet or Sepolia

    3

    Your endpoint URL looks like this:

    4
    import { JsonRpcProvider } from "
    
    from web3 import Web3
    
    w3 = 
    
    import { createPublicClient, http } 
    
    Network
    Chain ID
    Purpose

    Arbitrum Sepolia

    421614

    Development & testing

    Get testnet ETH from Arbitrum faucets.

    Use Case
    Plan
    CU
    RPS

    Development

    Free

    50K/day

    20

    Production dApp

    • Full Arbitrum API Reference →

    • How to Build a Hyperliquid Whale Tracker Bot →

    • Configure a Dedicated Arbitrum Node →

    • Learn more about our pricing

    Building DeFi on Arbitrum? Talk to us about enterprise-grade infrastructure.

    Features

    Arbitrum mainnet Dedicated Nodes may have custom pricing due to higher infrastructure requirements. for details.

    Step-by-Step: Get Your Arbitrum RPC Endpoint

    Code Sample

    Arbitrum Testnets

    Plans

    What's Next?

    The invite link is valid for 30 minutes. If it expires, please resend an invitation.

    The invite link is valid for 30 minutes. If it expires, ask the team owner or admin to send a new invitation.

    Next steps: Explore GetBlock

    Now that you’ve joined a team, here are a few useful resources to help you get started:

    • Getting Started – Learn more about GetBlock.

    • – How to create and manage node endpoints.

    • – Understanding plans and payments.

    permissions
    Inviting teammates to GetBlock's team account
    GetBlock sign-up page
    Adding users to the team account on GetBlock
    Viewing permissions for team account users

    eth_getTransactionCount - Flashblocks

    Example code for the eth_getTransactionCount Flashblocks method. Complete guide on how to use eth_getTransactionCount Flashblocks in GetBlock Web3 documentation.

    This returns the transaction count (nonce) for an address. When called with "pending", the returned nonce already accounts for transactions currently sitting in Flashblocks — preventing nonce collisions when an account submits many transactions in rapid succession.

    This is especially valuable for high-frequency trading bots and any application that fires more than one transaction per 2-second block.

    Parameters

    Parameter
    Type
    Required
    Description
    Field
    Type
    Description
    • Constructing the next transaction with the correct nonce, even during high-frequency submission

    • Preventing 'nonce too low' errors when submitting multiple transactions per block

    • Trading bot infrastructure — the primary use case for the pending nonce

    Status Code
    Error Message
    Cause

    delegate-energy - TRON energy

    Example code for the delegate-energy JSON RPC method

    This endpoint delegates energy to a TRON address. In most cases, the order completes immediately with status "success".

    Parameter

    Parameter

    Type

    Required

    Description

    target_address

    delegateEnergy charges your balance and may place an on-chain order. To make retries safe, send a unique key with each intent:

    A UUID is recommended. Generate a new key for each purchase, and reuse the same key when retrying the exact same purchase.

    Situation
    Result

    eth_getBlockTransactionCountByNumber - Flashblocks

    Example code for eth_getBlockTransactionCountByNumber Flashblocks method. Complete guide on how to use eth_getBlockTransactionCountByNumber Flashblocks in GetBlock Web3 documentation.

    This returns the pending number of transactions in a block.

    Parameters

    Parameter
    Type
    Required
    Description

    block number

    Field
    Type
    Description
    • Confirming a transaction has been received and included in a Flashblock

    • Reading calldata / value of a preconfirmed transaction for follow-up processing

    • Building activity feeds with sub-second latency

    Status Code
    Error Message
    Cause

    eth_getStorageAt - Flashblocks

    Example code for the eth_getStorageAt Flashblock method. Complete guide on how to use eth_getStorageAt Flashblock in GetBlock Web3 documentation.

    This returns the value stored at a specific storage slot of a contract. When called with "pending", reflects storage changes from every transaction preconfirmed into the latest Flashblock — letting applications read intermediate contract state before block seal.

    Parameters

    Parameter
    Type
    Required
    Description
    Field
    Type
    Description
    • Reading contract state that has been updated by preconfirmed transactions

    • Monitoring internal state changes in real-time (e.g. AMM reserves, oracle prices)

    • Auditing tools that need to-the-Flashblock state visibility

    Status Code
    Error Message
    Cause

    eth_getBalance - Flashblocks

    Example code for the eth_getBalance Flashblocksmethod. Complete guide on how to use eth_getBalance Flashblocks in GetBlock Web3 documentation.

    This returns the ETH balance of an address in wei. When called with "pending", includes the effect of every transaction preconfirmed into the latest Flashblock — usually within 200ms (Base) or 250ms (Optimism) of the user's submission. Applications that update balance UIs on the pending tag give users near-instant feedback that a transfer has landed.

    Parameters

    Parameter
    Type
    Required
    Description
    Field
    Type
    Description
    • Wallet UIs showing near-instant balance updates after a transfer

    • Payment applications confirming a payment has been received before block seal

    • Trading bots that need to know current available balance including unsealed transfers

    Status Code
    Error Message
    Cause

    How to Get a Base RPC Endpoint

    Step-by-step guide to getting a fast, reliable Base RPC endpoint

    Base has become one of the most active Ethereum Layer 2 networks for DeFi, social apps, and onchain consumer products.

    If you're building on Base for the first time or scaling a production application, this guide gets you set up with a reliable RPC endpoint in minutes.

    Step-by-Step: Get Your Base RPC Endpoint

    1

    Create a GetBlock Account

    Go to GetBlock Dashboard and sign up. You can register with email or via Google/GitHub OAuth.

    2

    Create an Avalanche Endpoint

    Once logged in:

    1. Click "Shared Nodes" in the left sidebar

    2. Click "Create New Endpoint" or the "+" button

    1. Select:

      • Protocol: Base

      • Network: Mainnet or Sepolia

    3

    Your endpoint URL looks like this:

    4
    1. MetaMask → Add Network → Add manually

    2. Enter:

      • Network Name: Base Mainnet (GetBlock)

    Base Sepolia Testnet:

    • Chain ID: 84532

    • Explorer: https://sepolia.basescan.org

    Base inherits Ethereum's security while offering:

    • Low gas fees (~$0.01 per transaction)

    • EVM compatibility — deploy existing Solidity contracts without changes

    • Coinbase ecosystem — seamless fiat on-ramp integration

    But Base's popularity means public RPC endpoints are frequently congested. A dedicated provider like GetBlock gives you consistent performance with up to 500 RPS and 99.9%+ uptime.

    Base introduced Flashblocks — a mechanism for pre-confirmation of transactions at sub-second speeds. GetBlock supports Flashblocks, enabling your application to react to transactions inclusions faster than waiting for full block confirmation.

    Use Case
    Plan
    Why

    Scaling on Base? for dedicated infrastructure with custom performance tuning.

    address-activate - TRON energy

    Example code for the addressActivate JSON RPC method. Сomplete guide on how to use addressActivate JSON RPC in GetBlock Web3 documentation.

    This activates (creates) a TRON address on-chain. This is required before delegating Energy or Bandwidth to a new (never-used) address. A newly generated TRON address must be activated before it can hold a balance or receive transfers. Activation is synchronous: the API returns 200 with the provider's activation receipt, and the realised on-chain cost is charged from your prepaid balance.

    Fixed cost: 1.87 TRX, charged in USD at the current TRX/USD rate.

    Body Parameter

    Parameter

    Type

    Required

    Description

    Field
    Type
    Charged
    Description

    Send a unique Idempotency-Key header (UUID format recommended) to ensure safe retries:

    Scenario
    Behavior

    A retry with the same key + body replays the original activation receipt — it does not activate the address twice or charge a second time.

    eth_getCode - Flashblocks

    Example code for the eth_getCode JSON-RPC method. Complete guide on how to use eth_getCode JSON-RPC in GetBlock Web3 documentation.

    The eth_getCode method returns the bytecode at a given address. This is used to determine if an address is a smart contract and to retrieve the deployed contract code. When the block reference is "pending", Flashblocks detect contract deployments before the block seals.

    Parameters

    Parameter
    Type
    Required
    Description
    Parameter
    Type
    Description
    • Contract Detection: Verify if address is a smart contract

    • Security Analysis: Examine contract bytecode for vulnerabilities

    • Contract Verification: Compare deployed code with source

    • Proxy Detection: Identify proxy patterns in bytecode

    Error Code
    Message
    Description

    base_transactionStatus - Flashblocks

    Example code for the base_transactionStatus Flashblocks method. Complete guide on how to use base_transactionStatus Flashblocks in GetBlock Web3 documentation.

    This Checks whether a specific transaction is currently present in the node's mempool. This confirms that a submitted transaction has been received by the sequencer before it appears in a Flashblocks — closing the gap between submission and first preconfirmation. Base-specific: this method exists on Base's Flashblocks endpoints but has no equivalent on Optimism.

    Base-only method. This method is exposed by Base's Flashblocks infrastructure but has no equivalent on Optimism. Calling it against an Optimism endpoint will return -32601 Method not found.

    Parameters

    Parameter
    Type
    Required
    Description
    Field
    Type
    Description
    • Confirming a submitted transaction reached the sequencer before it appears in a Flashblock

    • Detecting transactions that were dropped or rejected before entering the mempool

    • Debugging submission pipelines — distinguishing 'not submitted' from 'submitted but not yet preconfirmed'

    Status Code
    Error Message
    Cause

    Base Flashblocks

    Flashblocks-specific RPC methods, WebSocket subscriptions, and the infrastructure stream schema for Base pre-confirmations.

    Flashblocks deliver ~200ms transaction preconfirmations on Base by streaming partial blocks before the next full block is sealed. Each 2-second Base block is divided into ten Flashblocks streamed at 200ms intervals, exposing preconfirmed state through the standard JSON-RPC pending block tag.

    Endpoints

    Transport
    URL

    HTTP

    https://go.getblock.io/<ACCESS-TOKEN>/

    Method
    Usage

    The example below reads the pending balance of the Base WETH contract 0x4200000000000000000000000000000000000006. Substitute any supported method and parameters; the "pending" tag is what selects Flashblock state.

    • Instant UI Feedback: Update wallet and dApp interfaces the moment a transaction is preconfirmed, without waiting for a sealed block.

    • Responsive Swaps: Surface preconfirmed swap results on decentralized exchanges with sub-second latency.

    • Onchain Gaming: Reflect game state changes as soon as actions are included in a Flashblock.

    API Reference

    This contain all the endpoints, pricing and error codes to access Address Audit service

    The GetBlock Address Audit API provides access to all address audit services, which you can integrate into your dApp, including wallet audit, wallet riska nd rug pull checker

    Base URL

    https://services.getblock.io/v1

    Authentication

    All requests require an API key in the header:

    Authorization: Bearer <API_KEY>

    How to Get Address Audit API Key

    1. Go to your account dashboard

    2. Click on the product icon on the Navbar

    1. Scroll down and Select Address Audit

    2. After that, select the API key tab

    3. On the API Key tab, click on the plus icon, and your API key will be generated for you automatically

    In this example, you will be auditing a wallet address:

    • Axios (JavaScript / Node.js)

    • Python (Requests library)

    Before you begin, you must have already installed or on your local machine (for the Axios example) or Python and pip (for the Python example).

    1

    Create and initialize a new project:

    2
    3

    Create a new file named index.js. This is where you will make your first call.

    Dedicated nodes: Manage & extend subscriptions

    Track and extend your dedicated node subscriptions on GetBlock.

    This page explains how to manage your dedicated node subscriptions, including checking their status and extending the service duration—all from your user account.


    Tracking subscription status

    You can monitor the status of your dedicated node subscriptions in three different ways.

    1. Dashboard

    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.

    2. Plan manager

    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.

    3. "Endpoints" list

    Each endpoint in “My endpoints” list shows its current subscription status.


    Status
    Dashboard View
    Manage Plans View

    You can modify your subscription period at any time if you’re on a one-time payment plan paid with:

    • Cryptocurrency;

    • Credit card.

    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.

    1. Go to Dedicated Nodes tab from your dashboard. Look for the subscription alert widget.

    1. 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).

    1. Choose a new period and review details. Proceed to checkout.

    2. Complete the payment by following the instructions provided.

    3. 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.

    1. Navigate to your main dashboard and switch to the Dedicated Nodes tab.

    2. Choose a node to extend. Expand the node’s details and click "Extend" to begin the process.

    3. Follow the pop-up instructions to select the new subscription period and finalize the process.

    1. Navigate to Pricing > Manage Plans.

    2. Review all subscriptions. Subscriptions nearing expiration are listed at the top.

    3. 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.

    newFlashblocks - Flashblocks

    Example code for the newFlashblocks Flashblocks method. Complete guide on how to use newFlashblocks Flashblocks in GetBlock Web3 documentation.

    This subscribes to the full Flashblocks payload stream as each preconfirmed sub-block is built. Each notification delivers a Flashblocks Object containing payload_id, index (0-9 on Base, 0-7 on Optimism), diff (the delta since the previous Flashblocks), and — on the first Flashblocks of a new block (index: 0) — a base field with the block's initial state. This is the lowest-latency Flashblocks subscription and the canonical way to build sub-block indexers.

    WebSocket-only method. This method requires the WebSocket transport at wss://go.getblock.io/<ACCESS-TOKEN>/. It will not work via HTTP POST. Preconfirmed events arrive at the Flashblocks cadence — approximately every 200ms on Base, 250ms on Optimism.

    Parameters

    Parameter
    Type
    Required
    Description
    Field
    Type
    Description
    • Sub-block indexers — the primary streaming source for Flashblocks-native data

    • Real-time analytics dashboards showing block construction in progress

    • Trading infrastructure that needs the earliest possible view of sequencer-ordered transactions

    Status Code
    Error Message
    Cause

    delegate-bandwidth - TRON energy

    Example code for the delegate-bandwidth JSON RPC method. Сomplete guide on how to use delegate-bandwidth JSON RPC in GetBlock Web3 documentation.

    This is used to purchase and delegate TRON bandwidth to a target address. Unlike energy, bandwidth orders may be confirmed asynchronously: if the provider accepts the order but on-chain delivery is not yet confirmed, the API returns 202 Accepted and no charge is applied until delivery is confirmed.

    Body Parameter

    Parameter

    Type

    Required

    Description

    Send a unique Idempotency-Key header (UUID format recommended) to ensure safe retries:

    Scenario
    Behavior

    A retry of a 202 response replays the same 202 — it does not create a second order

    Rug Pull Checker

    GetBlock Rug Pull Checker: AI rug pull detection for smart contracts — score, trust, and flag

    Rug Pull Checks is a smart-contract rug-pull risk assessment service. The service analyzes contracts across two independent dimensions and returns an overall risk score.

    Two independent analysis blocks:

    1. Rug Pull Probability: AI-predictive score (0–100%). Analyzes the behavior of the contract creator and liquidity providers (LPs) based on their on-chain history. Does not analyze contract code.

    2. Contract Details: verification of basic contract properties (open source, proxy, self-destruct, withdrawal rights, blacklist). Does not affect the Rug Pull Probability.

    newFlashblockTransactions - Flashblocks

    Example code for the newFlashblockTransactions Flashblocks method. Complete guide on how to use newFlashblockTransactions Flashblocks in GetBlock Web3 documentation.

    This subscribes to individual preconfirmed transactions as they land in Flashblocks. Each notification carries one transaction. Pass true as a second parameter to include full transaction objects with associated logs; omit or pass false to receive only transaction hashes. Lighter-weight than newFlashblocks when you only care about the transaction stream and not the full block state.

    Parameter
    Type
    Required

    eth_getBlockReceipt - Flashblocks

    Example code for the eth_getBlockReceipt Flashblocks method. Complete guide on how to use eth_getBlockReceipt Flashblocks in GetBlock Web3 documentation.

    This returns the receipt of a block — preconfirmed OR finalized. Preconfirmed receipts are identifiable by their zero blockHash (0x00...00) and blockNumber: null. Once the parent block seals (within 2 seconds), the same receipt returns with a real block hash. This zero-hash convention is the canonical way to distinguish preconfirmed vs finalized receipts without additional RPC calls.

    Parameter
    Type
    Required

    Wallet Risk

    GetBlock Wallet Risk: fast AI fraud screening for wallets — risk score, level, and flags.

    Wallet Risk Check is a quick blockchain wallet risk assessment service. It returns an AI-predictive trust score, screening across 18 AML risk categories, and a sanctions check — in a single API call with response time under 100ms.

    This is a lightweight version of . Wallet Risk Check provides a quick go/no-go signal e.g "Can this wallet be trusted?"

    • Predicted Trust Score (0–100%): AI-predictive trust score

    • AML Risk Screening: screening across 18 risk categories (cybercrime, money laundering, phishing, etc.)

    pendingLogs - Flashblocks

    Example code for the pendingLogs Flashblocks method. Complete guide on how to use pendingLogs Flashblocks in GetBlock Web3 documentation.

    This Subscribes to contract event logs emitted by preconfirmed transactions — sub-block latency for on-chain events. Filter by contract address (single or array) and event topics (same format as eth_getLogs).

    This is the fastest way to react to on-chain events, up to ~1.8 seconds ahead of the standard logs subscription.

    Parameter
    Type
    Required
    Description

    How to Get an Ethereum RPC Endpoint

    Step-by-step guide to getting a fast, reliable Ethereum RPC endpoint. Set up free or production-grade ETH RPC access with GetBlock in under 2 minutes.

    An Ethereum RPC (Remote Procedure Call) endpoint is a URL that your application uses to send requests to an Ethereum node. When your dApp needs to:

    • Check a wallet balance (eth_getBalance)

    • Read a smart contract (eth_call)

    eth_call - Flashblocks

    Example code for the eth_call - Flashblocks method. Complete guide on how to use eth_call - Flashblocks in GetBlock Web3 documentation.

    This executes a read-only contract call without creating a transaction. When the block reference is "pending", the call executes against state including every transaction preconfirmed into the latest Flashblocks. This lets applications compute derived values (token balances, oracle prices, pool reserves) reflecting the freshest possible state.

    Parameter
    Type
    Required
    Description

    eth_estimateGas - Flashblocks

    Example code for the eth_estimateGas - Flashblocks method. Complete guide on how to use eth_estimateGas - Flashblocks in GetBlock Web3 documentation.

    This estimates the gas needed to execute a transaction without submitting it. When called with "pending", the estimate is computed against state including preconfirmed transactions in the latest Flashblock — giving more accurate estimates for transactions that depend on state changes happening in the current block.

    Parameter
    Type
    Required
    Description

    How to Get a TON RPC Endpoint

    Step-by-step guide to getting a fast, reliable TON RPC endpoint

    The Open Network (TON) has become the leading blockchain for Telegram-integrated applications, mini-apps, and payments. With TON's unique architecture (TVM, not EVM) and the massive Telegram user base, demand for reliable TON RPC access is growing fast. Here's how to set up a TON endpoint with GetBlock.

    TON uses its own HTTP API — not the JSON-RPC standard used by Ethereum and EVM chains. TON API methods include:

    • getAddressInformation — get account balance and state

    "
    :
    [
    "
    0x9cef478923ff08bf67fde6c64013158d
    "
    ],
    "
    id
    "
    :
    "
    getblock.io
    "
    }

    eth_getBlockByNumber

    Pass "pending" to retrieve the current Flashblock

    eth_getBlockReceipt

    Pass "pending" to get receipts for all pre-confirmed transactions in the current Flashblock.

    eth_getBlockTransactionCountByNumber

    Pass "pending" to get the count of pre-confirmed transactions in the current Flashblock.

    eth_estimateGas

    Pass "pending" to estimate gas against preconfirmed state

    eth_call

    Pass "pending" to execute against preconfirmed state

    eth_simulateV1

    Simulates against the latest preconfirmed state

    eth_getLogs

    Pass "fromBlock": "pending" and "toBlock": "pending" to query logs from pre-confirmed transactions, updated every ~200ms.

    eth_getCode

    Pass "pending" for contract code at preconfirmed state

    eth_subscribe

    Opens a Flashblocks WebSocket subscription

    eth_unsubscribe

    Cancels an active Flashblocks subscription

    Managing Endpoints
    Plans & Limits
    Exploring Brave Wallet network accounts
    Adding GetBlock Ethereum endpoint to Brave Wallet
    Creating zkEVM access token in GetBlock
    Adding GetBlock zkEVM endpoint to Brave Wallet’
    >
    /
    \
    -H "Content-Type: application/json" \
    -d '{
    "jsonrpc":"2.0",
    "method":"eth_chainId",
    "params":[],
    "id":1
    }'
    2.0
    "
    ,
    "result": 0x89,
    "id": 1
    }
    '
    axios
    '
    ;
    // Fetch the latest Flashblock (in-progress block with preconfirmed transactions)
    const data = JSON.stringify({
    "jsonrpc": "2.0",
    "method": "eth_getBlockByNumber",
    "params": ["pending", false],
    "id": "getblock.io"
    });
    const config = {
    method: 'post',
    url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
    headers: {
    'Content-Type': 'application/json'
    },
    data: data
    };
    axios(config)
    .then(response => console.log(JSON.stringify(response.data, null, 2)))
    .catch(error => console.log(error));
    ,
    "result": {
    "hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash": "0x64c3e43c9701407d6fb8bd853782a7fc77ba7f63e55a1cd1c5eaa1c0eaf3e8c4",
    "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
    "miner": "0x4200000000000000000000000000000000000011",
    "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "transactionsRoot": "0x38131951ed5e3c8fa20b3cb08a75ccc33cb19e3a3cdf6260eae76a173900b934",
    "receiptsRoot": "0x83434863672598b03e64b1effdb3ad205345ad5114fd8b55995ad26571663a40",
    "logsBloom": "0x363031c23351743880d55105b76437b4e05246402bc44898a3353f4531021a41092f44aab543e301cf9f41d3a1a636817fd88880854d2114e7260fc360b46ef01f7a875144df34dc8f308f08ab498b24167c560d99ff32b5b0d3676a87638c373f9ea87cbe7a0b186609584f972b2ca8b1608b028894556464c28195591b539094351a2d3b3979be4623f816c522b87e372b826b2aa47a4cf27f20759540d4990e742b86a08811cf5e40b7370dcec2807bc44273421c8e5afff70b23407a5cd2be20996a72898ce94611dcd1ab2590a5080d878a8e78f83af193c6c3f908ec64621ebd8c179c90a3b4420f2c0aeb5cb6f0ba86c2b59e2956b2343d70af419883",
    "difficulty": "0x0",
    "number": "0x2de03b4",
    "gasLimit": "0x17d78400",
    "gasUsed": "0x11b1f57",
    "timestamp": "0x6a46644b",
    "extraData": "0x01000000640000000500000000004c4b40",
    "mixHash": "0xcb2806e22a6932ee882e44cb4899082c4eb130745740b14f5110d32c0e463236",
    "nonce": "0x0000000000000000",
    "baseFeePerGas": "0x4c4b40",
    "withdrawalsRoot": "0x5a6218671840987892338b76625664c7060d7b55b9e82414f9117f5388c406d4",
    "blobGasUsed": "0x351e14",
    "excessBlobGas": "0x0",
    "parentBeaconBlockRoot": "0x41922b97f16dd4c26d9680c0888d6eca48a96638988a310578c91cb1f76865ea",
    "requestsHash": "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "uncles": [],
    "transactions": [
    "0x736d0f7b161888aef73271d4d147fa4ba5a4a42b1ef018fdab3605091aee21e3" "0xe58be418f85a1281a3c0ba4951c33edf948568879acda466663d568512ec8e92", "0x5bf2fba339a689973db07c54e1c22556c07a0c7fdcdf3f4918b2b7bd6fee75ab" "0xa6bec80fa9c94c0d330e27421e414eaef85cc39800120a557b3e93dcb9e81adb",
    "0x7f291369918ece59ccc88efde10a9807aa7da285dfec7744d5cc184b75227ba8"
    ],
    "withdrawals": []
    },
    "id": 1
    }
    venv/bin/activate
    # On Windows, use venv\Scripts\activate
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    payload = json.dumps({
    "jsonrpc": "2.0",
    "method": "eth_getBlockByNumber",
    "params": ["pending", False],
    "id": "getblock.io"
    })
    headers = {
    'Content-Type': 'application/json'
    }
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)

    Run the script

    python main.py
    spinner
    spinner

    Duplicate sent while the first is still in flight

    409 with a Retry-After header

    Idempotency store temporarily unavailable

    503 with a Retry-After header (retry shortly)

    string

    Yes

    TRON wallet address (starts with T, 34 characters)

    volume

    integer

    Yes

    Energy amount: 30,000 — 5,000,000

    duration

    string

    Yes

    "1h", "1d", "3d", "7d"

    Same key + same body

    The original response is replayed. No second charge, no second order.

    Same key + different body

    422

    Same key on a different endpoint

    409

    Idempotency

    Always send an idempotency key on write endpoints. It is the difference between a safe retry and an accidental double on-chain charge.

    Request Sample

    Response

    curl -X POST https://services.getblock.io/v1/tron-energy/delegate-energy \
      -H "Authorization: Bearer YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: 6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44" \
      -d '{
        "target_address": "TUo8pycbvje...zw67bpPs4GLFyD",
        "volume": 65000,
        "duration": "1h"
      }'
    import axios from 'axios';
    const data = JSON.stringify({
        "target_address": "TUo8pycbvje...zw67bpPs4GLFyD",
        "volume": 65000,
        "duration": "1h"
      }
    );
    
    const config = {
        method: 'post',
        url: 'https://services.getblock.io/v1/tron-energy/delegate-energy',
        headers: {
            'Content-Type': 'application/json',
            'Authorization: Bearer YOUR_API_KEY'
            'Idempotency-Key: 6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44' \
        },
        data: data
    };
    axios(config)
        .then(response => console.log(JSON.stringify(response.data)))
        .catch(error => console.log(error));

    No

    The TRON adrress that was activated

    cost

    integer

    Yes

    realised on-chain cost in sun(1 TRX = 1,000,000 sun); this what is deducted

    created_at

    string

    No

    RFC3339 timestamp of the activation

    In-flight duplicate request

    409 with Retry-After header

    target_address

    string

    Yes

    TRON wallet to activate (starts with T, 34 characters)

    id

    string

    No

    provider activation/order id

    address_to

    Same key + same body

    Original response replayed, no duplicate charge

    Same key + different body

    422

    Same key on different endpoint

    409

    Request Sample

    Response Sample

    Response Sample Definition

    Idempotency

    curl -X POST https://services.getblock.io/v1/tron-energy/address-activate \
      -H "Authorization: Bearer YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: 6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44" \
      -d '{
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD"
      }'
    import axios from 'axios';
    const data = JSON.stringify({
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD"
      }
    );
    
    const config = {
        method: 'post',
        url: 'https://services.getblock.io/v1/tron-energy/address-activate',
        headers: {
            'Content-Type': 'application/json',
            'Authorization: Bearer YOUR_API_KEY'
            'Idempotency-Key: 6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44' \
        },
        data: data
    };
    axios(config)
        .then(response => console.log(JSON.stringify(response.data)))
        .catch(error => console.log(error));

    string

    eth_getBlockByNumber

    Pass "pending" to retrieve the current Flashblock

    eth_getBlockReceipt

    Pass "pending" to get receipts for all pre-confirmed transactions in the current Flashblock.

    eth_getBlockTransactionCountByNumber

    Pass "pending" to get the count of pre-confirmed transactions in the current Flashblock.

    eth_estimateGas

    Pass "pending" to estimate gas against preconfirmed state

    eth_call

    Pass "pending" to execute against preconfirmed state

    eth_simulateV1

    Simulates against the latest preconfirmed state

    eth_getLogs

    Pass "fromBlock": "pending" and "toBlock": "pending" to query logs from pre-confirmed transactions, updated every ~200ms.

    eth_getCode

    Pass "pending" for contract code at preconfirmed state

    base_transactionStatus

    Reports whether a transaction hash is present in the mempool

    eth_subscribe

    Opens a Flashblocks WebSocket subscription

    eth_unsubscribe

    Cancels an active Flashblocks subscription

    Nonce Management: Use eth_getTransactionCount with pending to avoid nonce collisions when submitting transactions in rapid succession.
  • Preconfirmed Receipts: Poll eth_getTransactionReceipt on a 200ms interval to confirm inclusion at Flashblock cadence.

  • WebSocket

    wss://go.getblock.io/<ACCESS-TOKEN>/

    eth_getTransactionCount

    Pass "pending" for a nonce that accounts for Flashblock transactions

    eth_getStorageAt

    Pass "pending" for storage at preconfirmed state

    eth_getBalance

    Pass "pending" for the balance at the latest Flashblock state

    The pending tag works over HTTP. Flashblocks subscriptions require the WebSocket endpoint.

    Flashblocks-Aware Methods

    Example

    Response

    Use Cases

    In-flight duplicate request

    409 with Retry-After header

    target_address

    string

    Yes

    TRON wallet address (starts with T, 34 characters)

    volume

    integer

    Yes

    Bandwidth amount: 1,000 — 200,000

    duration

    string

    Yes

    "1h" (only 1 hour supported for Bandwidth)

    Same key + same body

    Original response replayed, no duplicate charge

    Same key + different body

    422

    Same key on different endpoint

    409

    Request Sample

    Bandwidth only supports "1h" duration.

    Response Sample

    Idempotency

    curl -X POST https://services.getblock.io/v1/tron-energy/delegate-bandwidth \
      -H "Authorization: Bearer YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD",
        "volume": 5000,
        "duration": "1h"
      }
    '
    import axios from 'axios';
    const data = JSON.stringify({
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD",
        "volume": 5000,
        "duration": "1h"
      }
    );
    
    const config = {
        method: 'post',
        url: 'https://services.getblock.io/v1/tron-energy/delegate-bandwidth',
        headers: {
            'Content-Type': 'application/json',
            'Authorization: Bearer YOUR_API_KEY'
        },
        data: data
    };
    axios(config)
        .then(response => console.log(JSON.stringify(response.data)))
        .catch(error => console.log(error));
    Idempotency-Key: 6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44
    import requests
    import json
    
    url = "https://services.getblock.io/v1/tron-energy/delegate-energy"
    
    payload = json.dumps({
        "target_address": "TUo8pycbvje...zw67bpPs4GLFyD",
        "volume": 65000,
        "duration": "1h"
      }
    )
    
    headers = {
            'Content-Type': 'application/json',
            'Authorization: Bearer YOUR_API_KEY',
            'Idempotency-Key: 6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44' 
        },
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::header;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = reqwest::Client::new();
    
        let url = "https://services.getblock.io/v1/tron-energy/delegate-energy";
        let payload = r#"{{
        "target_address": "TUo8pycbvje...zw67bpPs4GLFyD",
        "volume": 65000,
        "duration": "1h"
      }
    "#;
    
        let response = client
            .post(url)
            .header(header::CONTENT_TYPE, "application/json")
            .header(header::AUTHORIZATION, "Bearer YOUR_API_KEY")
            .header(header::IDEMPOTENCY_KEY: "6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44")
            .body(payload)
            .send()
            .await?;
    
        println!("{}", response.text().await?);
    
        Ok(())
    }
    package main
    import (
        "bytes"
        "encoding/json"
        "fmt"
        "net/http"
    )
    func main() {
        url := "https://services.getblock.io/v1/tron-energy/delegate-energy"
        payload := map[string]interface{}{
        "target_address": "TUo8pycbvje...zw67bpPs4GLFyD",
        "volume": 65000,
        "duration": "1h"
      }
    
        jsonData, _ := json.Marshal(payload)
        req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
        req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
        req.Header.Set("Content-Type", "application/json")
        req.Header.Set("Idempotency-Key": "6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44")
        client := &http.Client{}
        resp, err := client.Do(req)
        if err != nil {
            panic(err)
        }
        defer resp.Body.Close()
        
        var result map[string]interface{}
        json.NewDecoder(resp.Body).Decode(&result)
        fmt.Println(result)
    }
    {
      "data": {
        "status": "success",
        "target_address": "TUo8...",
        "resource_type": "energy",
        "volume": 65000,
        "duration": "1h",
        "price_usd": "0.59",
        "trx_spent": 3,
        "order_id": "1H76d06176b8",
        "txid": "db47c131876a504ceee32f023a4aa3aa23629362e...",
        "message": "Delegation completed successfully."
      }
    }
    import requests
    import json
    
    url = "https://services.getblock.io/v1/tron-energy/address-activate"
    
    payload = json.dumps({
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD"
      }
    )
    
    headers = {
            'Content-Type': 'application/json',
            'Authorization: Bearer YOUR_API_KEY',
            'Idempotency-Key: 6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44' 
        },
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::header;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = reqwest::Client::new();
    
        let url = "https://services.getblock.io/v1/tron-energy/address-activate";
        let payload = r#"{
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD"
      }
    "#;
    
        let response = client
            .post(url)
            .header(header::CONTENT_TYPE, "application/json")
            .header(header::AUTHORIZATION, "Bearer YOUR_API_KEY")
            .header(header::IDEMPOTENCY_KEY: "6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44")
            .body(payload)
            .send()
            .await?;
    
        println!("{}", response.text().await?);
    
        Ok(())
    }
    package main
    import (
        "bytes"
        "encoding/json"
        "fmt"
        "net/http"
    )
    func main() {
        url := "https://services.getblock.io/v1/tron-energy/address-activate"
        payload := map[string]interface{}{
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD"
      }
    
        jsonData, _ := json.Marshal(payload)
        req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
        req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
        req.Header.Set("Content-Type", "application/json")
        req.Header.Set("Idempotency-Key": "6f9c2a1e-3b7d-4c08-9f21-2e5a7c0b1d44")
        client := &http.Client{}
        resp, err := client.Do(req)
        if err != nil {
            panic(err)
        }
        defer resp.Body.Close()
        
        var result map[string]interface{}
        json.NewDecoder(resp.Body).Decode(&result)
        fmt.Println(result)
    }
    {
    "data": {
    "id": "a1b2c3d4-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
    "address_to": "TUo8pycbvje...zw67bpPs4GLFyD",
    "cost": 1700000,
    "created_at": "2026-06-18T10:42:00Z"
            }
    }
    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "jsonrpc": "2.0",
        "method": "eth_getBalance",
        "params": ["0x4200000000000000000000000000000000000006", "pending"],
        "id": "getblock.io"
    }'
    example.js
    const axios = require('axios');
    
    const response = await axios.post('https://go.getblock.io/<ACCESS-TOKEN>/', {
        jsonrpc: '2.0',
        method: 'eth_getBalance',
        params: ['0x4200000000000000000000000000000000000006', 'pending'],
        id: 'getblock.io'
    }, {
        headers: { 'Content-Type': 'application/json' }
    });
    
    console.log(response.data.result);
    example.py
    import requests
    
    response = requests.post(
        'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers={'Content-Type': 'application/json'},
        json={
            'jsonrpc': '2.0',
            'method': 'eth_getBalance',
            'params': ['0x4200000000000000000000000000000000000006', 'pending'],
            'id': 'getblock.io'
        }
    )
    
    print(response.json())
    example.rs
    use reqwest::Client;
    use serde_json::{json, Value};
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&json!({
                "jsonrpc": "2.0",
                "method": "eth_getBalance",
                "params": ["0x4200000000000000000000000000000000000006", "pending"],
                "id": "getblock.io"
            }))
            .send()
            .await?
            .json::<Value>()
            .await?;
    
        println!("Result: {}", response["result"]);
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x3bdf5275488a29a8a57c"
    }
    import requests
    import json
    
    url = "https://services.getblock.io/v1/tron-energy/delegate-bandwidth"
    
    payload = json.dumps({
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD",
        "volume": 5000,
        "duration": "1h"
      }
    )
    
    headers = {
            'Content-Type': 'application/json',
            'Authorization: Bearer YOUR_API_KEY'
        },
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::header;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = reqwest::Client::new();
    
        let url = "https://services.getblock.io/v1/tron-energy/delegate-bandwidth";
        let payload = r#"{
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD",
        "volume": 5000,
        "duration": "1h"
      }
    "#;
    
        let response = client
            .post(url)
            .header(header::CONTENT_TYPE, "application/json")
            .header(header::AUTHORIZATION, "Bearer YOUR_API_KEY")
            .body(payload)
            .send()
            .await?;
    
        println!("{}", response.text().await?);
    
        Ok(())
    }
    package main
    import (
        "bytes"
        "encoding/json"
        "fmt"
        "net/http"
    )
    func main() {
        url := "https://services.getblock.io/v1/tron-energy/delegate-bandwidth"
        payload := map[string]interface{}{
        "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD",
        "volume": 5000,
        "duration": "1h"
      }
    
        jsonData, _ := json.Marshal(payload)
        req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
        req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
        req.Header.Set("Content-Type", "application/json")
        client := &http.Client{}
        resp, err := client.Do(req)
        if err != nil {
            panic(err)
        }
        defer resp.Body.Close()
        
        var result map[string]interface{}
        json.NewDecoder(resp.Body).Decode(&result)
        fmt.Println(result)
    }
    {
      "order_id": "clxyz123...",
      "status": "success",
      "target_address": "TUo8pycbvje9w2XYsNnnzw67bpPs4GLFyD",
      "resource_type": "energy",
      "volume": 65000,
      "duration": "3d",
      "price_usd": "4.97",
      "trx_spent": 20.12,
      "provider_order_id": 12345,
      "txid": "abc123def...",
      "message": "Order completed successfully."
    }
    {
      "data": {
      "status": "accepted",
      "target_address": "TUo8pycbvje...zw67bpPs4GLFyD",
      "resource_type": "bandwidth",
      "volume": 1000,
      "duration": "1h",
      "provider_order_id": "36898a97-a8b9-46ea-b4cb-38a81e28992d",
      "message": "Order accepted by provider, awaiting on-chain confirmation."
     }
    }
    API Interface: JSON-RPC or Websocket
  • Region: Frankfurt (EU) or New York, USA

  • Click "Create": Your endpoint URL will be generated immediately.

  • ethers
    "
    ;
    const provider = new JsonRpcProvider("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/");
    const block = await provider.getBlockNumber();
    console.log("Latest Arbitrum block:", block);
    Web3
    (
    Web3
    .
    HTTPProvider
    (
    "
    https://go.getblock.io/<YOUR-ACCESS-TOKEN>/
    "
    ))
    print("Chain ID:", w3.eth.chain_id) # 42161
    from
    "
    viem
    "
    ;
    import { arbitrum } from "viem/chains";
    const client = createPublicClient({
    chain: arbitrum,
    transport: http("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"),
    });
    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/

    Starter ($49/mo)

    50M/mo

    100

    DeFi / DEX

    Advanced ($199/mo)

    220M/mo

    300

    High-traffic

    Pro ($499/mo)

    600M/mo

    500

    Institutional

    Dedicated (custom)

    Unlimited

    Unlimited

    Copy Your Endpoint URL

    The long string after go.getblock.io/ is your access token — keep it private.

    Test the Connection

    Contact sales
    curl -X POST https://go.getblock.io/<YOUR-ACCESS-TOKEN>/ \
      -H "Content-Type: application/json" \
      -d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
    "result": "0xa4b1" 

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    address

    DATA (20 bytes)

    Yes

    Address to check

    block

    QUANTITY

    TAG

    Yes

    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_getTransactionCount",
        "params": [
            "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
            "pending"
        ],
        "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_getTransactionCount",
            "params": [
                    "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
                    "pending"
            ],
            "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x42"
    }

    result

    QUANTITY

    Transaction count / next nonce in hex, including transactions in Flashblocks

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Generic JSON-RPC call — 'pending' returns Flashblocks-preconfirmed state:
    const result = await provider.send('eth_getTransactionCount', ["0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a", "pending"]);
    console.log(result);
    
    // Many standard methods have typed wrappers on ethers Provider that accept 'pending':
    // provider.getBalance(addr, 'pending'), provider.getTransactionCount(addr, 'pending'), etc.
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // viem's read methods accept blockTag: 'pending' for Flashblocks-preconfirmed state:
    const result = await client.request({
        method: 'eth_getTransactionCount',
        params: ["0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a", "pending"]
    });
    console.log(result);
    
    // Typed wrappers also accept blockTag: 'pending':
    // client.getBalance({ address, blockTag: 'pending' })
    // client.getBlock({ blockTag: 'pending' })

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "jsonrpc": "2.0",
        "method": "eth_getTransactionCount",
        "params": [
            "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
            "pending"
        ],
        "id": "getblock.io"
    }'
    import axios from 'axios';
    
    const data = JSON.stringify({
        "jsonrpc": "2.0",
        "method": "eth_getTransactionCount",
        "params": [
            "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
            "pending"
        ],
        "id": "getblock.io"
    });
    
    const config = {
        method: 'post',
        url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers: {
            'Content-Type': 'application/json'
        },
        data: data
    };
    
    axios(config)
        .then(response => console.log(JSON.stringify(response.data, null
        .catch(error => console.log(error));

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    QUANTITY

    TAG, Yes

    the pending transaction

    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({
      "jsonrpc": "2.0",
      "method": "eth_getBlockTransactionCountByNumber",
      "params": [
        "pending"
      ],
      "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_getTransactionByHash",
            "params": [
                    "0xa8f9b3c7d2e4f6a1b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6"
            ],
            "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "result": "0x8b",
        "id": "getblock.io"
    }
    

    result

    string

    0x00...00 for preconfirmed; real hash once finalized

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Generic JSON-RPC call — 'pending' returns Flashblocks-preconfirmed state:
    const result = await provider.send('eth_getBlockTransactionCountByNumber', ["pending"]);
    console.log(result);
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // viem's read methods accept blockTag: 'pending' for Flashblocks-preconfirmed state:
    const result = await client.request({
        method: 'eth_getBlockTransactionCountByNumber',
        params: ["pending"]
    });
    console.log(result);

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
      "jsonrpc": "2.0",
      "method": "eth_getBlockTransactionCountByNumber",
      "params": [
        "pending"
      ],
      "id": "getblock.io"
    }'
    import axios from 'axios';
    
    const data = JSON.stringify({
      "jsonrpc": "2.0",
      "method": "eth_getBlockTransactionCountByNumber",
      "params": [
        "pending"
      ],
      "id": "getblock.io"
    });
    
    const config = {
        method: 'post',
        url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers: {
            'Content-Type': 'application/json'
        },
        data: data
    };
    
    axios(config)
        .then(response => console.log(JSON.stringify(response.data, null
        .catch(error => console.log(error));

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    address

    DATA (20 bytes)

    Yes

    Contract address

    slot

    QUANTITY

    Yes

    Storage slot index (hex)

    block

    QUANTITY

    TAG

    Yes

    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_getStorageAt",
        "params": [
            "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "0x0",
            "pending"
        ],
        "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_getStorageAt",
            "params": [
                    "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                    "0x0",
                    "pending"
            ],
            "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x0000000000000000000000000000000000000000000000000000000000000064"
    }

    result

    DATA (32 bytes)

    Value at the storage slot, reflecting preconfirmed state

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Generic JSON-RPC call — 'pending' returns Flashblocks-preconfirmed state:
    const result = await provider.send('eth_getStorageAt', ["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "0x0", "pending"]);
    console.log(result);
    
    // Many standard methods have typed wrappers on ethers Provider that accept 'pending':
    // provider.getBalance(addr, 'pending'), provider.getTransactionCount(addr, 'pending'), etc.
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // viem's read methods accept blockTag: 'pending' for Flashblocks-preconfirmed state:
    const result = await client.request({
        method: 'eth_getStorageAt',
        params: ["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "0x0", "pending"]
    });
    console.log(result);
    
    // Typed wrappers also accept blockTag: 'pending':
    // client.getBalance({ address, blockTag: 'pending' })
    // client.getBlock({ blockTag: 'pending' })

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "jsonrpc": "2.0",
        "method": "eth_getStorageAt",
        "params": [
            "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "0x0",
            "pending"
        ],
        "id": "getblock.io"
    }'
    import axios from 'axios';
    
    const data = JSON.stringify({
        "jsonrpc": "2.0",
        "method": "eth_getStorageAt",
        "params": [
            "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
            "0x0",
            "pending"
        ],
        "id": "getblock.io"
    });
    
    const config = {
        method: 'post',
        url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers: {
            'Content-Type': 'application/json'
        },
        data: data
    };
    
    axios(config)
        .then(response => console.log(JSON.stringify(response.data, null
        .catch(error => console.log(error));

    -32601

    Method not found

    Method does not exist or is not enabled on this endpoint. Confirm your endpoint is Flashblocks-aware.

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    -32602

    Invalid address

    Address is not a valid 20-byte hex string

    address

    DATA (20 bytes)

    Yes

    Address to check

    block

    QUANTITY

    TAG

    Yes

    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_getBalance",
        "params": [
            "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
            "pending"
        ],
        "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_getBalance",
            "params": [
                    "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
                    "pending"
            ],
            "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x1bc16d674ec80000"
    }

    result

    QUANTITY

    Balance in wei (hex). Divide by 10^18 to get ETH

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Generic JSON-RPC call — 'pending' returns Flashblocks-preconfirmed state:
    const result = await provider.send('eth_getBalance', ["0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a", "pending"]);
    console.log(result);
    
    // Many standard methods have typed wrappers on ethers Provider that accept 'pending':
    // provider.getBalance(addr, 'pending'), provider.getTransactionCount(addr, 'pending'), etc.
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // viem's read methods accept blockTag: 'pending' for Flashblocks-preconfirmed state:
    const result = await client.request({
        method: 'eth_getBalance',
        params: ["0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a", "pending"]
    });
    console.log(result);
    
    // Typed wrappers also accept blockTag: 'pending':
    // client.getBalance({ address, blockTag: 'pending' })
    // client.getBlock({ blockTag: 'pending' })

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "jsonrpc": "2.0",
        "method": "eth_getBalance",
        "params": [
            "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
            "pending"
        ],
        "id": "getblock.io"
    }'
    import axios from 'axios';
    
    const data = JSON.stringify({
        "jsonrpc": "2.0",
        "method": "eth_getBalance",
        "params": [
            "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
            "pending"
        ],
        "id": "getblock.io"
    });
    
    const config = {
        method: 'post',
        url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers: {
            'Content-Type': 'application/json'
        },
        data: data
    };
    
    axios(config)
        .then(response => console.log(JSON.stringify(response.data, null
        .catch(error => console.log(error));
    API Interface: JSON-RPC or Websocket or MEV-Protected(JSON-RPC) or MEV-protected(Websocket)
  • Region: Frankfurt (EU) or Singapore or New York

  • Click "Create": Your endpoint URL will be generated immediately.

  • RPC URL: https://go.getblock.io/<YOUR-ACCESS-TOKEN>/
  • Chain ID: 8453

  • Symbol: ETH

  • Explorer: https://basescan.org

  • Save

  • Growing DeFi ecosystem — Aerodrome, Uniswap, Aave, and more

    High-traffic DeFi app

    Advanced ($199/mo)

    220M CU/month, 300 RPS

    Onchain consumer product

    Pro ($499/mo)

    600M CU/month, 24/7 support

    Infrastructure provider

    Dedicated (from $1,000/mo)

    Unlimited, custom SLA

    Get testnet ETH from Base Sepolia faucets.

    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/

    Building on Base

    Free ($0)

    50K CU/day, perfect for development

    Production dApp

    Starter ($49/mo)

    50M CU/month, 100 RPS

    Copy Your Endpoint URL

    The long string after go.getblock.io/ is your access token, keep it private.

    Test the Connection

    Code Examples

    How to Connect MetaMask to Base via GetBlock

    Why a Dedicated RPC Provider For Base?

    Base Flashblocks Support

    Choosing Your Plan

    What's Next?

    How to Build a Base Flashblocks Listener →
    Full Base API Reference →
    How to Build a Base Flashblocks Listener →
    Using Ethers.js with GetBlock →
    Configure a Dedicated Base Node →
    Contact us
    curl -X POST https://go.getblock.io/<YOUR-ACCESS-TOKEN>/ \
      -H "Content-Type: application/json" \
      -d '{
      "jsonrpc":"2.0",
      "method":"eth_chainId",
      "params":[],
      "id":1
      }'
    {
      "result": "0x2105"
    }
    import { JsonRpcProvider, formatEther } from "ethers";
    
    const provider = new JsonRpcProvider(
      "https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"
    );
    
    const blockNumber = await provider.getBlockNumber();
    console.log("Latest Base block:", blockNumber);
    
    const balance = await provider.getBalance("0xYOUR_ADDRESS");
    console.log(`Balance: ${formatEther(balance)} ETH`);
    from web3 import Web3
    
    w3 = Web3(Web3.HTTPProvider("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"))
    
    print("Chain ID:", w3.eth.chain_id)  # 8453
    print("Latest block:", w3.eth.block_number)
    import { createPublicClient, http } from "viem";
    import { base } from "viem/chains";
    
    const client = createPublicClient({
      chain: base,
      transport: http("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"),
    });
    
    const blockNumber = await client.getBlockNumber();
    console.log("Block:", blockNumber);
    
    const balance = await client.getBalance({
      address: "0xYOUR_ADDRESS",
    });
    console.log("Balance:", balance);

    result

    string

    Bytecode at the address (hex). Returns "0x" for EOAs

  • Contract Indexing: Catalog deployed contracts

  • address

    string

    Yes

    20-byte address to check

    blockParameter

    string

    Yes

    Block number in hex, or "pending"

    import requests
    
    response = requests.post(
        'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers={'Content-Type': 'application/json'},
        json={
            'jsonrpc': '2.0',
            'method': 'eth_getCode',
            'params': [
        '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
        'pending'],
            'id': 'getblock.io'
        }
    )
    
    result = response.json()
    code = result['result']
    is_contract = code != '0x'
    print(f'Is Contract: {is_contract}')
    print(f'Code Length: {(len(code) - 2) // 2} bytes')
    use reqwest::Client;
    use serde_json::{json, Value};
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
        
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&json!({
                "jsonrpc": "2.0",
                "method": "eth_getCode",
                "params": [
        "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "pending"],
                "id": "getblock.io"
            }))
            .send()
            .await?
            .json::<Value>()
            .await?;
        
        let code = response["result"].as_str().unwrap();
        let is_contract = code != "0x";
        println!("Is Contract: {}", is_contract);
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x608060405234801561001057600080fd5b50..."
    }

    jsonrpc

    string

    JSON-RPC protocol version ("2.0")

    id

    string

    Request identifier matching the request

    -32602

    Invalid params

    Invalid address format

    -32603

    Internal error

    Node internal failure

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Generic JSON-RPC call — 'pending' returns Flashblocks-preconfirmed state:
    const result = await provider.send('eth_code', [
        "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "pending"]);
    console.log(result);
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // viem's read methods accept blockTag: 'pending' for Flashblocks-preconfirmed state:
    const result = await client.request({
        method: 'eth_code',
        params: [
        "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "pending"]
    });
    console.log(result);
    
    // Typed wrappers also accept blockTag: 'pending':
    // client.getBlock({ blockTag: 'pending' })

    Request

    Response

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "jsonrpc": "2.0",
        "method": "eth_getCode",
        "params": [
        "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        "pending",
        ]
        "id": "getblock.io"
    }'
    const axios = require('axios');
    
    const response = await axios.post('https://go.getblock.io/<ACCESS-TOKEN>/', {
        jsonrpc: '2.0',
        method: 'eth_getCode',
        params: [
        '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
        'pending'],
        id: 'getblock.io'
    }, {
        headers: { 'Content-Type': 'application/json' }
    });
    
    const code = response.data.result;
    const isContract = code !== '0x';
    console.log('Is Contract:', isContract);
    console.log('Code Length:', (code.length - 2) / 2, 

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    transactionHash

    DATA (32 bytes)

    Yes

    The 32-byte transaction hash to query

    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({
        "jsonrpc": "2.0",
        "method": "base_transactionStatus",
        "params": [
            "0xa8f9b3c7d2e4f6a1b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6"
        ],
        "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "base_transactionStatus",
            "params": [
                    "0xa8f9b3c7d2e4f6a1b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6"
            ],
            "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": {
            "status": "Known"
        }
    }

    result.status

    string

    "Known" if the transaction is present in the mempool; "Unknown" if it has not been seen by this node

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Flashblocks-specific methods use the raw send interface:
    const result = await provider.send('base_transactionStatus', ["0xa8f9b3c7d2e4f6a1b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6"]);
    console.log(result);
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // Flashblocks-specific methods need the raw request transport:
    const result = await client.request({
        method: 'base_transactionStatus',
        params: ["0xa8f9b3c7d2e4f6a1b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6"]
    });
    console.log(result);

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "jsonrpc": "2.0",
        "method": "base_transactionStatus",
        "params": [
            "0xa8f9b3c7d2e4f6a1b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6"
        ],
        "id": "getblock.io"
    }'
    import axios from 'axios';
    
    const data = JSON.stringify({
        "jsonrpc": "2.0",
        "method": "base_transactionStatus",
        "params": [
            "0xa8f9b3c7d2e4f6a1b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6"
        ],
        "id": "getblock.io"
    });
    
    const config = {
        method: 'post',
        url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers: {
            'Content-Type': 'application/json'
        },
        data: data
    };
    
    axios(config)
        .then(response => console.log(JSON.stringify(response.data, null
        .catch(error => console.log(error));
    4

    Set ES module type

    Set the ES module "type": "module" in your package.json.

    5

    Add code

    Add the following code to index.js:

    index.js
    import axios from "axios";
    
    const data = 
      {  "network": "ETH", "address": "0xa45f...a675"};
    
    const config = {
      method: "post",
      url: "https://services.getblock.io/v1/wallet-audit/check",
      headers: {
        Authorization: "Bearer YOUR_API_KEY",
        "Content-Type": "application/json",
      },
      data: data,
    };
    
    axios(config)
      .then((response) => console.log(JSON.stringify(response.data, null, 2)))
      .catch((error) => console.log(error));
    

    Replace <YOUR_API_KEY> with your actual API Key from the GetBlock dashboard.

    6

    Run the script

    node index.js

    Expected output (example):

    {
        "data": {
            "message": "Success",
            "walletAddress": "0xa45f...a675",
            "status": "Fraud",
            "probabilityFraud": "0.9329851866",
            "token": null,
            "chain": "ETH",
            "lastChecked": "2026-03-19T07:02:56.000Z",
            "forensic_details": {
                "cybercrime": "0",
                "money_laundering": "0",
                "number_of_malicious_contracts_created": "0",
                "gas_abuse": "0",
                "financial_crime": "0",
                "darkweb_transactions": "0",
                "reinit": "0",
                "phishing_activities": "0",
                "fake_kyc": "0",
                "blacklist_doubt": "0",
                "fake_standard_interface": "0",
                "data_source": "",
                "stealing_attack": "0",
                "blackmail_activities": "0",
                "sanctioned": "0",
                "malicious_mining_activities": "0",
                "mixer": "0",
                "fake_token": "0",
                "honeypot_related_address": "0"
            },
            "checked_times": 3,
            "createdAt": "2026-03-19T06:52:28.000Z",
            "updatedAt": "2026-05-15T17:01:48.000Z",
            "sanctionData": [
                {
                    "id": 205813,
                    "trustscore_id": 18360032,
                    "category": null,
                    "name": null,
                    "description": null,
                    "url": null,
                    "isSanctioned": false,
                    "createdAt": "2026-05-15T17:01:48.000Z",
                    "updatedAt": "2026-05-15T17:01:48.000Z"
                }
            ]
        }
    }
    1

    Setup the project directory

    mkdir wallet-audit-quickstart
    cd wallet-audit-quickstart
    2

    Create and activate a virtual environment

    python -m venv venv
    source venv/bin/activate
    
    # On Windows, use:
    venv\Scripts\activate
    3

    Install requests

    pip install requests
    4

    Create script

    Create a file called main.py with the following content:

    Replace <YOUR_API_KEY> with your actual GetBlock API Key.

    5

    Wallet Risk Homepage

  • Rug Pull Checker Homepage

  • mkdir wallet-audit-quickstart
    cd wallet-audit-quickstart
    npm init --yes
    npm install axios

    Ensure you store your API Key securely

    QuickStart

    Setup project

    Install Axios

    Create file

    Next Step

    npm
    yarn
    Wallet Risk endpoint
    Wallet Audit endpoint
    Rug Pull Checker endpoint
    Wallet Audit Homepage

    Expiring Soon

    (One-Time Payment)

    In Grace Period

    (Recurring /One-Time)

    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.

    Active

    (Recurring Payment)

    Active

    (One-Time Payment)

    Subscription status breakdown

    Changing the subscription period

    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.

    Available options

    How to extend your Dedicated Node plan

    Option 1: The Dedicated Nodes dashboard

    Video guide

    Option 2: From “Endpoints” list

    Option 3: Via the "Manage Plans" menu

    How to keep your Dedicated Node running smoothly

    Checking the status of dedicated node subscriptions from the main GetBlock user dashboard
    How to manage node subscriptions from the GetBlock dashboard
    How to extend dedicated node plan using GetBlock
    Managing RPC node subscriptions from the main dashboard's endpoints list
    Flexible dedicated RPC node plan subscription
    tracking the status of dedicated blockchain node subscriptions from GetBlock account
    How to manage dedicated node plans and subsciriptions from GetBlock's user account
    MEV monitoring — observing preconfirmed transactions as they land

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    -32600

    Invalid Request

    newFlashblocks subscription called over HTTP; use WebSocket

    subscriptionType

    string

    Yes

    Must be "newFlashblocks"

    import asyncio
    import json
    import websockets
    
    async def main():
        async with websockets.connect('wss://go.getblock.io/<ACCESS-TOKEN>/') as ws:
            await ws.send(json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_subscribe",
        "params": [
            "newFlashblocks"
        ],
        "id": "getblock.io"
    }))
            async for message in ws:
                msg = json.loads(message)
                if msg.get('method') == 'eth_subscription':
                    # Preconfirmed data update
                    print(msg['params']['result'])
                else:
                    # Subscription ID response
                    print('Subscribed:', msg.get('result'))
    
    asyncio.run(main())
    use tokio_tungstenite::connect_async;
    use tokio_tungstenite::tungstenite::Message;
    use serde_json::json;
    use futures_util::{SinkExt, StreamExt};
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let (mut ws_stream, _) = connect_async("wss://go.getblock.io/<ACCESS-TOKEN>/").await?;
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_subscribe",
            "params": [
                    "newFlashblocks"
            ],
            "id": "getblock.io"
    });
        ws_stream.send(Message::Text(payload.to_string())).await?;
    
        while let Some(msg) = ws_stream.next().await {
            println!("{:?}", msg?);
        }
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x3b8cd9e5f4a7b2c1d0e3f4a5b6c7d8e9"
    }

    result

    string

    Hex-encoded subscription ID. Each subsequent eth_subscription notification carries a Flashblocks Object payload with payload_id, index, diff, and (on index 0) base

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.WebSocketProvider('wss://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Flashblocks subscription types aren't first-class in ethers — use the raw send interface:
    const subscriptionId = await provider.send('eth_subscribe', ["newFlashblocks"]);
    console.log('Subscribed:', subscriptionId);
    
    // Listen for incoming events on the WebSocket transport
    provider.websocket.addEventListener('message', (event) => {
        const msg = JSON.parse(event.data);
        if (msg.method === 'eth_subscription' && msg.params?.subscription === subscriptionId) {
            console.log('Flashblocks update:', msg.params.result);
        }
    });
    import { createPublicClient, webSocket } from 'viem';
    
    const client = createPublicClient({
        transport: webSocket('wss://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // Flashblocks subscription types use the raw request interface:
    const subscriptionId = await client.request({
        method: 'eth_subscribe',
        params: ["newFlashblocks"]
    });
    console.log('Subscribed:', subscriptionId);

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    # WebSocket-only. Use wscat (or similar) to connect first:
    wscat -c 'wss://go.getblock.io/<ACCESS-TOKEN>/'
    
    # Then send:
    {"jsonrpc": "2.0", "method": "eth_subscribe", "params
    import WebSocket from 'ws';
    
    const ws = new WebSocket('wss://go.getblock.io/<ACCESS-TOKEN>/');
    
    ws.on('open', () => {
        ws.send(JSON.stringify({
        "jsonrpc": "2.0",
        "method": "eth_subscribe",
        "params": [
            "newFlashblocks"
        ],
        "id": "getblock.io"
    }));
    });
    
    ws.on('message', (data) => {
        const msg = JSON.parse(data.toString());
        if (msg.method === 'eth_subscription') {
            // Preconfirmed data update
            console.log(msg.params.result);
        } else {
            // Subscription ID response
            console.log('Subscribed:', msg.result);
        }
    });

    Rug Pull Checks

    Wallet Audit

    Input

    Smart contract address

    Wallet address (EOA)

    What it analyzes

    Creator behavior + LPs + basic contract properties

    On-chain wallet behavior, AML, intent

    GetBlock also provides the Risk API service, powered by Hexens Glider Token Risks. This is a fundamentally different product; they do not compete but complement each other.

    Rug Pull Checks

    Risk API

    Provider

    ChainAware.ai

    Hexens (Glider Token Risks)

    What it analyzes

    Behavior of the contract creator and liquidity providers (LPs)

    1. Ethereum

    2. BNB Smart Chain

    3. Base

    There are four steps involved, which are:

    1. Find the contract creator: It identifies the wallet that deployed the contract and runs it through the Fraud Detector to obtain the creator's Trust Score.

    2. Trace the deployment chain: if the contract was deployed by another contract, it follows the chain to the actual wallet. The obfuscation through the chain itself is a red flag.

    3. Analyze the liquidity providers (LPs): run each LP through the Fraud Detector and obtain the Trust Score for each LP.

    4. Generate the Rug Pull Probability: based on the combination of the creator's Trust Score + LP Trust Scores.

    • New creator address (no history to evaluate)

    • Low Trust Score for the creator (behavioral history matches fraud patterns)

    • New addresses adding liquidity (classic rug pull pattern)

    • Low Trust Score for LPs

    • Obfuscated deployment chain (contract deploys contract)

    • Creator with a long clean on-chain history

    • LPs with high Trust Scores

    • Transparent addresses without routing through mixers

    Accuracy: 68%

    The algorithm correctly identifies 68 out of 100 rug pulls based on purely behavioral analysis, without code analysis. The 32% miss rate consists of more sophisticated operators who invest in building a legitimate-looking wallet history before executing a rug pull.

    1. Go to your GetBlock Account Dashboard and click Rug Pull

    1. Select the choice of your network using the dropdown:

    1. Enter the contract address:

    1. Click on Run Check

    2. Scroll down to see the analysis:

    If you want to interact with or integrate this service via API, check the Rug pull checker endpoint.

    • Address Audit API Reference

    • Wallet Audit Homepage

    • Wallet Risk Homepage

    • Rug Pull Checker Homepage

    These are two independent blocks. Contract Details (green checkmarks) do not affect the Rug Pull Probability. A contract with clean code, but a suspicious creator will receive a high risk score.

    Difference Between Rug Pull Checker And Wallet Audit

    Difference Between Rug Pull Checker And Risk API (Hexens Glider)

    Both products complement each other: ChainAware may give a green light to a contract with a clean deployer, but with a honeypot in the code. Hexens may show clean code, but the contract was created by a wallet that previously executed a rug pull. Using the two gives a full picture.

    Disclaimer

    Rug Pull Check provides automated risk indicators based on publicly available on-chain data. Results are informational in nature and do not constitute investment advice, a security audit, or legal counsel. The predictive model accuracy is 68% — 32% of rug pulls may go undetected. We do not guarantee the accuracy or completeness of the data. The decision to interact with a contract is made by the user.

    Supported Networks

    How Rug Pull Probability Is Calculated

    What increases the risk score:

    What decreases the risk score:

    • The service works only with smart contracts. If a regular wallet address (EOA) is submitted, an empty result will be returned. To check wallets, use Wallet Audit.

    • Rug Pull Probability does not analyze the contract source code. It evaluates the behavior of the people behind the contract, not the code.

    How to Check the Risk In A Wallet Address

    This report includes the following:
    1. Contract name

    2. Contract address

    Need a custom setup (higher rate limits, dedicated infrastructure, SLA, or volume pricing)? .

    Next Step

    Description

    subscriptionType

    string

    Yes

    Must be "newFlashblockTransactions"

    includeFullObjects

    boolean

    No

    true to receive full transaction objects with logs; false (default) for hashes only

    # WebSocket-only. Use wscat (or similar) to connect first:
    wscat -c 'wss://go.getblock.io/<ACCESS-TOKEN>/
    
    import WebSocket from 'ws';
    
    import asyncio
    import json
    import websockets
    
    async def main():
        async with websockets.connect('wss://go.getblock.io/<ACCESS-TOKEN>/') as ws:
            await ws.send(json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_subscribe",
        "params": [
            "newFlashblockTransactions",
            true
        ],
        "id": "getblock.io"
    }))
            async for message in ws:
                msg = json.loads(message)
                if msg.get('method') == 'eth_subscription':
                    # Preconfirmed data update
                    print(msg['params']['result'])
                else:
                    # Subscription ID response
                    print('Subscribed:', msg.get('result'))
    
    asyncio.run(main())
    use tokio_tungstenite::connect_async;
    use tokio_tungstenite::tungstenite::Message;
    use serde_json::json;
    use futures_util::{SinkExt, StreamExt};
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let (mut ws_stream, _) = connect_async("wss://go.getblock.io/<ACCESS-TOKEN>/").await?;
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_subscribe",
            "params": [
                    "newFlashblockTransactions",
                    true
            ],
            "id": "getblock.io"
    });
        ws_stream.send(Message::Text(payload.to_string())).await?;
    
        while let Some(msg) = ws_stream.next().await {
            println!("{:?}", msg?);
        }
        Ok(())
    }
    Field
    Type
    Description

    result

    string

    Hex-encoded subscription ID. Each subsequent notification carries either a transaction hash (default) or a full transaction object with logs (true param)

    • Wallet infrastructure watching for a specific user's transactions to preconfirm

    • Transaction-level analytics without the overhead of full block payloads

    • Building activity feeds for accounts with sub-second latency

    • Front-running detection at the sub-block level

    Status Code
    Error Message
    Cause

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.WebSocketProvider('wss://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Flashblocks subscription types aren't first-class in ethers — use the raw send interface:
    const subscriptionId = await provider.send('eth_subscribe', ["newFlashblockTransactions", true]);
    console.log('Subscribed:', subscriptionId);
    
    // Listen for incoming events on the WebSocket transport
    provider.websocket.addEventListener('message', (event) => {
        const msg = JSON.parse(event.data);
        if (msg.method === 'eth_subscription' && msg.params?.subscription === subscriptionId) {
            console.log('Flashblocks update:', msg.params.result);
        }
    });
    import { createPublicClient, webSocket } from 'viem';
    
    const client = createPublicClient({
        transport: webSocket('wss://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // Flashblocks subscription types use the raw request interface:
    const subscriptionId = await client.request({
        method: 'eth_subscribe',
        params: ["newFlashblockTransactions", true]
    });
    console.log('Subscribed:', subscriptionId);

    WebSocket-only method. This method requires the WebSocket transport at wss://go.getblock.io/<ACCESS-TOKEN>/. It will not work via HTTP POST. Preconfirmed events arrive at the Flashblock cadence — approximately every 200ms on Base, 250ms on Optimism.

    Parameters

    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x5c1de6a7b8c9d0e1f2a3b4c5d6e7f8a9"
    }

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    Description

    blockNumber

    QUANTITY

    TAG

    Yes

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/
    
    import axios from 'axios';
    
    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({{
      "jsonrpc": "2.0",
      "method": "eth_getBlockReceipts",
      "params": [
        "pending"
      ],
      "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
      "jsonrpc": "2.0",
      "method": "eth_getBlockReceipts",
      "params": [
        "pending"
      ],
      "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    Field
    Type
    Description

    result.blockHash

    DATA

    0x00...00 (zero hash) for preconfirmed receipts; real block hash for finalized

    result.blockNumber

    QUANTITY

    null for preconfirmed; block number in hex for finalized

    • Wallet UIs showing preconfirmed transaction success within 200ms of submission

    • Polling for confirmed inclusion at 200ms cadence instead of 2s

    • Distinguishing 'transaction preconfirmed' vs 'transaction finalized' UX states

    • Detecting transaction revert or success before block seal

    Status Code
    Error Message
    Cause

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Generic JSON-RPC call — 'pending' returns Flashblocks-preconfirmed state:
    const result = await provider.send('eth_getBlockReceipts', ["pending"]);
    console.log(result);
    
    // Many standard methods have typed wrappers on ethers Provider that accept 'pending':
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // viem's read methods accept blockTag: 'pending' for Flashblocks-preconfirmed state:
    const result = await client.request({
        method: 'eth_getBlockReceipts',
        params: ["pending"]
    });
    console.log(result);

    Parameters

    {
        "jsonrpc": "2.0",
        "result": [
            {
                "type": "0x7e",
                "status": "0x1",
                "cumulativeGasUsed": "0xb496",
                "logs": [],
                "depositNonce": "0x2ddfd39",
                "depositReceiptVersion": "0x1",
                "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
                "transactionHash": "0xd6586cd3a1cf6f2a79dfdc513863cbaff925578131dc9e42872acdc3dab4aee9",
                "transactionIndex": "0x0",
                "blockHash": "0xe9526259318b13325e3926a3d29a4323d53d7e3c25ebfcf6b0f7ace7376af639",
                "blockNumber": "0x2ddfd36",
                "gasUsed": "0xb496",
                "effectiveGasPrice": "0x0",
                "blobGasUsed": "0x41e8",
                "from": "0xdeaddeaddeaddeaddeaddeaddeaddeaddead0001",
                "to": "0x4200000000000000000000000000000000000015",
                "contractAddress": null,
                "l1GasPrice": "0x1564212e",
                "l1GasUsed": "0x72a",
                "l1Fee": "0x0",
                "l1BaseFeeScalar": "0x8dd",
                "l1BlobBaseFee": "0x1571d4a",
                "l1BlobBaseFeeScalar": "0x101c12",
                "daFootprintGasScalar": "0x94"
      }
       ],
        "id": "getblock.io"
    }

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    Sanctions Check: verification against sanctions lists

    Wallet Risk Check

    Wallet Audit

    Response time

    < 100ms

    Several seconds

    Trust Score

    Yes

    They are two-step logic involved in this calculation:

    If at least one field in forensic_details = "1" → probabilityFraud is automatically set to 1.0 (Predicted Trust = 0%). The ML model is not invoked. Any AML flag = automatic maximum risk.

    If all forensic_details fields = "0" → the predictive AI model analyzes on-chain wallet behavior and returns probabilityFraud from 0.0 to 1.0. Predicted Trust = 1 − probabilityFraud.

    Examples:

    • vitalik.eth: all forensic_details = "0" → ML model → probabilityFraud = 0.042 → Predicted Trust = 95.8%

    • Fraudulent wallet: money_laundering = "1" → hard override → probabilityFraud = 1.0 → Predicted Trust = 0%

    1. Ethereum(ETH)

    2. BNB Smart Chain

    3. Base

    4. Polygon

    5. TRON

    1. Go to your GetBlock Account Dashboard and click Wallet Risk

    1. Select the choice of your network using the dropdown:

    1. Enter the wallet address:

    1. Click on Run Check:

    1. Scroll down to see the analysis:

    If you want to interact with or integrate this service via API, check the Wallet risk endpoint.

    1. Wallet Audit Doc

    2. Rug Pull Checker Doc

    3. Address Audit API Reference

    4. Wallet Audit Homepage

    For a full behavioral profile (intentions, experience, protocols, transactions), use Wallet Audit.

    What Wallet Risk Does?

    Wallet Audit

    Difference Between Wallet Risk And Wallet Audit

    How Predicted Trust Score is Calculated

    Step 1: AML Check (hard override)

    Step 2: ML Model (if AML is clean)

    • The service only works with regular wallets (EOA — Externally Owned Accounts). Contract addresses are not supported.

    • A minimum of 10–15 transactions is required to calculate an accurate predictive score. Wallets with less history lack sufficient data for a reliable assessment

    Supported Networks

    How to Check the Risk In A Wallet Address

    This report includes the following:
    1. Predicted trust score: This is the main indicator of a wallet's level of trust, ranging from 0% to 100%. Calculated as 1 − probability of fraud. Displayed with a status badge (Not Fraud / Fraud / New Address) and a sanctions badge (Not Sanctioned / Sanctioned).

    Need a custom setup (higher rate limits, dedicated infrastructure, SLA, or volume pricing)? .

    Next Step

    subscriptionType

    string

    Yes

    Must be "pendingLogs"

    filter

    object

    No

    Filter object: address (single address or array), topics (same format as eth_getLogs)

    # WebSocket-only. Use wscat (or similar) to connect first:
    wscat -c 'wss://go.getblock.io/<ACCESS-TOKEN>/
    
    import WebSocket from 'ws';
    
    import asyncio
    import json
    import websockets
    
    async def main():
        async with websockets.connect('wss://go.getblock.io/<ACCESS-TOKEN>/') as ws:
            await ws.send(json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_subscribe",
        "params": [
            "pendingLogs",
            {
                "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "topics": [
                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
                ]
            }
        ],
        "id": "getblock.io"
    }))
            async for message in ws:
                msg = json.loads(message)
                if msg.get('method') == 'eth_subscription':
                    # Preconfirmed data update
                    print(msg['params']['result'])
                else:
                    # Subscription ID response
                    print('Subscribed:', msg.get('result'))
    
    asyncio.run(main())
    use tokio_tungstenite::connect_async;
    use tokio_tungstenite::tungstenite::Message;
    use serde_json::json;
    use futures_util::{SinkExt, StreamExt};
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let (mut ws_stream, _) = connect_async("wss://go.getblock.io/<ACCESS-TOKEN>/").await?;
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_subscribe",
            "params": [
                    "pendingLogs",
                    {
                            "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                            "topics": [
                                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
                            ]
                    }
            ],
            "id": "getblock.io"
    });
        ws_stream.send(Message::Text(payload.to_string())).await?;
    
        while let Some(msg) = ws_stream.next().await {
            println!("{:?}", msg?);
        }
        Ok(())
    }
    Field
    Type
    Description

    result

    string

    Hex-encoded subscription ID. Each subsequent notification carries a Log object matching the filter, from a preconfirmed transaction

    • Real-time event indexers — the lowest-latency way to react to on-chain events

    • Trading bots watching for specific ERC-20 transfers, DEX swaps, or oracle updates

    • Liquidation bots watching for Aave/Compound account state changes

    • Social/gaming applications reacting to on-chain events with instant UX feedback

    Status Code
    Error Message
    Cause

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.WebSocketProvider('wss://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Flashblocks subscription types aren't first-class in ethers — use the raw send interface:
    const subscriptionId = await provider.send('eth_subscribe', ["pendingLogs", {"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]}]);
    console.log('Subscribed:', subscriptionId);
    
    // Listen for incoming events on the WebSocket transport
    provider.websocket.addEventListener('message', (event) => {
        const msg = JSON.parse(event.data);
        if (msg.method === 'eth_subscription' && msg.params?.subscription === subscriptionId) {
            console.log('Flashblocks update:', msg.params.result);
        }
    });
    import { createPublicClient, webSocket } from 'viem';
    
    const client = createPublicClient({
        transport: webSocket('wss://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // Flashblocks subscription types use the raw request interface:
    const subscriptionId = await client.request({
        method: 'eth_subscribe',
        params: ["pendingLogs", {"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]}]
    });
    console.log('Subscribed:', subscriptionId);

    WebSocket-only method. This method requires the WebSocket transport at wss://go.getblock.io/<ACCESS-TOKEN>/. It will not work via HTTP POST. Preconfirmed events arrive at the Flashblocks cadence — approximately every 200ms on Base, 250ms on Optimism.

    Parameters

    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x7e2ef8b9c0d1e2f3a4b5c6d7e8f9a0b1"
    }

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    Send a transaction (eth_sendRawTransaction)

  • Get block data (eth_getBlockByNumber)

  • Fetch transaction receipts (eth_getTransactionReceipt)

  • It sends a JSON-RPC request to an Ethereum node through an RPC endpoint. The node processes the request and returns the data.

    For example:

    {
        "jsonrpc": "
    
    {
      "jsonrpc": "
    
    1

    Create a GetBlock Account

    Go to GetBlock Dashboard and sign up. You can register with email or via Google/GitHub OAuth.

    2

    Create an Ethereum Endpoint

    Once logged in:

    1. Click "Shared Nodes" in the left sidebar

    2. Click "Create New Endpoint" or the "+" button

    1. Configure your endpoint:

    • Protocol: Ethereum (ETH)

    • Network: Mainnet (or Sepolia/Holesky for testing)

    • API Interface: JSON-RPC (most common), WebSocket, or Beacon API

    1. Click "Create": Your endpoint URL will be generated immediately.

    3

    Your endpoint URL looks like this:

    4
    import { JsonRpcProvider } from "ethers";
    
    const provider = new JsonRpcProvider(
      "https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"
    );
    
    // Get latest block number
    const blockNumber = await provider.getBlockNumber();
    console.log("Latest block:", blockNumber);
    
    // Get ETH balance
    const balance = await provider.getBalance("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045");
    console.log("Balance:", balance.toString(), "wei");
    from web3 import Web3
    
    w3 = Web3(Web3.HTTPProvider("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"))
    
    # Check connection
    print("Connected:", w3.is_connected())
    
    # Get latest block
    block_number = w3.eth.block_number
    print(f"Latest block: {block_number}")
    
    # Get balance
    balance = w3.eth.get_balance("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045")
    print(f"Balance: {w3.from_wei(balance, 'ether')} ETH")
    import requests
    
    url = "https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"
    headers = {"Content-Type": "application/json"}
    
    # Get gas price
    payload = {
        "jsonrpc": "2.0",
        "method": "eth_gasPrice",
        "params": [],
        "id": "getblock.io"
    }
    
    response = requests.post(url, headers=headers, json=payload)
    gas_price = int(response.json()["result"], 16)
    print(f"Gas price: {gas_price / 1e9:.2f} Gwei")

    For real-time events (new blocks, pending transactions, log subscriptions), use a WebSocket connection:

    WebSocket endpoint format:

    import { WebSocketProvider } from "ethers";
    
    const provider = new WebSocketProvider(
      "wss://go.getblock.io/<YOUR-ACCESS-TOKEN>/"
    );
    
    provider.on("block", (blockNumber) => {
      console.log("New block:", blockNumber);
    });
    import asyncio
    import websockets
    import json
    
    async def listen_blocks():
        uri = "wss://go.getblock.io/<YOUR-ACCESS-TOKEN>/"
        async with websockets.connect(uri) as ws:
            # Subscribe to new block headers
            await ws.send(json.dumps({
                "jsonrpc": "2.0",
                "method": "eth_subscribe",
                "params": ["newHeads"],
                "id": 1
            }))
            
            print("Subscribed to new blocks")
            
            while True:
                response = json.loads(await ws.recv())
                if "params" in response:
                    block = response["params"]["result"]
                    print(f"Block {int(block['number'], 16)}: {block['hash']}")
    
    asyncio.run(listen_blocks())

    For development and testing, use testnet endpoints. GetBlock supports:

    Testnet
    Purpose
    How to Get Tokens

    Sepolia

    Primary Ethereum testnet

    Need to query the historical state at any past block? Enable archive mode on your endpoint.

    Archive data lets you:

    • Call eth_getBalance at any historical block

    • Execute eth_call against old contract state

    • Run debug_traceTransaction for any past transaction

    • Use trace_block and trace_call for deep analysis

    Archive mode is available on all paid plans and Dedicated Nodes.

    Example — get balance at a specific historical block:

    • Full Ethereum API Reference

    • Using Ethers.js with GetBlock

    Need help choosing the right setup for your Ethereum project? Contact our team, and we'll help you find the best configuration.

    wss://go.getblock.io/<YOUR-ACCESS-TOKEN>/
    curl -X POST https://go.getblock.io/<YOUR-ACCESS-TOKEN>/ \
      -H "Content-Type: application/json" \
      -d '{
        "jsonrpc": "2.0",
        "method": "eth_getBalance",
        "params": ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "0xE8D4A5"],
        "id": "getblock.io"
      }'

    Step-by-Step: Get Your Ethereum RPC Endpoint

    Using Your Endpoint with Popular Libraries

    WebSocket Endpoint for Real-Time Data

    Subscribe to new blocks

    Ethereum Testnet Endpoints

    Archive Data Access

    What's Next?

    object

    Yes

    Call params: to, data, from (optional), gas (optional), gasPrice (optional), value (optional)

    block

    QUANTITY

    TAG

    Yes

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/
    
    import axios from 'axios';
    
    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_call",
        "params": [
            {
                "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "data": "0x70a082310000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a"
            },
            "pending"
        ],
        "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_call",
            "params": [
                    {
                            "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                            "data": "0x70a082310000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a"
                    },
                    "pending"
            ],
            "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    Field
    Type
    Description

    result

    DATA

    ABI-encoded return value from the contract call

    • Reading ERC-20 balances / allowances reflecting the latest preconfirmed transfers

    • Fetching oracle prices with sub-block latency

    • Pre-flight quotes for DEX swaps against the freshest reserves

    • Any read that needs to reflect state 200ms ahead of the standard latest tag

    Status Code
    Error Message
    Cause

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Generic JSON-RPC call — 'pending' returns Flashblocks-preconfirmed state:
    const result = await provider.send('eth_call', [{"to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "data": "0x70a082310000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a"}, "pending"]);
    console.log(result);
    
    // Many standard methods have typed wrappers on ethers Provider that accept 'pending':
    // provider.getBalance(addr, 'pending'), provider.getTransactionCount(addr, 'pending'), etc.
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // viem's read methods accept blockTag: 'pending' for Flashblocks-preconfirmed state:
    const result = await client.request({
        method: 'eth_call',
        params: [{"to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "data": "0x70a082310000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a"}, "pending"]
    });
    console.log(result);
    
    // Typed wrappers also accept blockTag: 'pending':
    // client.getBalance({ address, blockTag: 'pending' })
    // client.getBlock({ blockTag: 'pending' })

    Parameters

    callObject

    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0x000000000000000000000000000000000000000000000000000000000098967f"
    }

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    object

    Yes

    Same shape as eth_call parameters

    block

    QUANTITY

    No

    "pending" for gas estimate against preconfirmed state (default is "latest")

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/
    
    import axios from 'axios';
    
    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_estimateGas",
        "params": [
            {
                "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
                "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0"
            },
            "pending"
        ],
        "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_estimateGas",
            "params": [
                    {
                            "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
                            "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                            "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0"
                    },
                    "pending"
            ],
            "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    Field
    Type
    Description

    result

    QUANTITY

    Estimated gas units (hex)

    • Accurate gas estimation for transactions that depend on preconfirmed state (e.g. sequential swaps in a bundle)

    • Detecting transactions that would revert given preconfirmed state changes

    • Wallet fee suggestion UIs with Flashblocks-aware accuracy

    Status Code
    Error Message
    Cause

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Generic JSON-RPC call — 'pending' returns Flashblocks-preconfirmed state:
    const result = await provider.send('eth_estimateGas', [{"from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a", "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0"}, "pending"]);
    console.log(result);
    
    // Many standard methods have typed wrappers on ethers Provider that accept 'pending':
    // provider.getBalance(addr, 'pending'), provider.getTransactionCount(addr, 'pending'), etc.
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // viem's read methods accept blockTag: 'pending' for Flashblocks-preconfirmed state:
    const result = await client.request({
        method: 'eth_estimateGas',
        params: [{"from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a", "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0"}, "pending"]
    });
    console.log(result);
    
    // Typed wrappers also accept blockTag: 'pending':
    // client.getBalance({ address, blockTag: 'pending' })
    // client.getBlock({ blockTag: 'pending' })

    Parameters

    callObject

    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": "0xc350"
    }

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    getTransactions — fetch transaction history
  • detectAddress — normalize address formats

  • estimateFee — estimate transaction cost

  • sendBoc — submit transactions

  • 1

    Create a GetBlock Account

    Go to GetBlock Dashboard and sign up. You can register with email or via Google/GitHub OAuth.

    2

    Create a TON Endpoint

    Once logged in:

    1. Click "Shared Nodes" in the left sidebar

    2. Click "Create New Endpoint" or the "+" button

    1. Select:

      • Protocol: TON

      • Network: Mainnet

    3

    Your endpoint URL looks like this:

    4
    import TonWeb from "tonweb";
    
    import requests
    
    base_url = "https://go.getblock.io/<YOUR-ACCESS-TOKEN>/
    
    • Reliable infrastructure — 99.9%+ uptime vs unreliable public endpoints

    • No rate limiting drama — up to 500 RPS vs public endpoint throttling

    • Global reach — Frankfurt, New York, Singapore

    • Telegram Mini App scaling — handle sudden user surges from Telegram viral growth

    Use Case
    Plan
    CU
    RPS

    Mini App prototype

    Free

    50K/day

    20

    Production Mini App

    • Full TON API Reference →

    • TON Documentation →

    • Configure a Dedicated TON Node →

    • Learn more about our pricing

    Building a Telegram Mini App at scale? Contact us for custom TON infrastructure.

    TON's API is Different from EVM Chains

    GetBlock supports the full TON HTTP API specification.

    Step-by-Step: Get Your TON RPC Endpoint

    Code Example

    Why GetBlock for TON?

    Plans

    What's Next?

    eth_getBlockByNumber - Flashblocks

    Example code for the eth_getBlockByNumber Flashblocks method. Complete guide on how to use eth_getBlockByNumber Flashblocks in GetBlock Web3 documentation.

    This returns the current in-progress Flashblock when called with "pending" — including every transaction that has landed in Flashblocks since the last block sealed. Pass true as the second parameter for full transaction objects; false for hashes only. When called with "latest", returns the last sealed block as usual. Preconfirmed Flashblocks are distinguishable from finalized blocks by their zero stateRoot and by the absence of a final block hash.

    Parameters

    Parameter
    Type
    Required
    Description
    Field
    Type
    Description
    • Fast block scanning — read the current preconfirmed state up to 1.8 seconds before the block seals

    • Building real-time DeFi dashboards that show transactions as they land

    • MEV analysis — inspecting sequencer-ordered transactions before finalization

    Status Code
    Error Message
    Cause

    Wallet Audit

    GetBlock Wallet Audit: assess on-chain risk, AML exposure, and wallet behavior in seconds.

    Wallet audit is a service that conducts risk assessments for an automated wallet on the blockchain. The service analyzes on-chain wallet behavior and provides a comprehensive report that includes a trust score, an AML check, a behavioral profile, a protocol interaction history, and predictive intentions.

    Wallet Audit provides automated risk indicators based on publicly available on-chain data. The results are for informational purposes only and do not constitute AML compliance verification, legal advice, or regulatory screening. We do not guarantee the accuracy or completeness of the data. The decision to interact with an address is made by the user.

    Use Cases

    Wallet Audit provides a complete behavioral wallet profile, not just a "fraud / not fraud" check. Below are six key scenarios where a full audit creates measurable value.

    1. DeFi Protocol — Personalized Onboarding

    All users connecting to the protocol see the same interface, regardless of their experience, preferences, or financial capabilities. Beginners get lost in complex products, while experienced users don't see what they need.

    With Wallet Audit, the moment a wallet connects, an audit runs instantly. Based on Risk Willingness, Experience, and Intentions, the protocol surfaces relevant products.

    Example:

    • Beginner (Experience = 2, Risk Willingness = 3) → simple ETH staking, basic pools

    • Experienced user (Experience = 10, Intentions: Leveraged Lending = HIGH) → directly to margin products, concentrated liquidity

    Parameters used: Experience Level, Risk Willingness, Intentions, Protocols

    In DeFi lending, all borrowers are assessed equally — only by collateral volume. There is no data on the borrower's financial stability or behavioral history.

    With Wallet Audit, Risk Capability, Total Balance, and Experience, determine maximum loan size and collateral requirements.

    Example:

    • Wallet A: Risk Capability = 1, balance $0.09, Experience = 10 → experienced but without funds. High collateral, low limit.

    • Wallet B: Risk Capability = 8, balance $100K, Experience = 9 → experienced and financially stable. Standard collateral, increased limit.

    Parameters used: Risk Capability, Total Balance, Experience Level, Risk Willingness

    Marketing campaigns in Web3 operate "blindly". The protocol only knows wallet addresses but doesn't understand who its users are, what they do, or what they need.

    With Wallet Audit, a mass audit of connected wallets uses Transaction Categories, Protocols, and Intentions to split the base into cohorts for targeted marketing.

    Example:

    • 40% of users with Prob_Trade = HIGH and Uniswap interaction → launch a DEX aggregator for them

    • 25% with Prob_Lend = HIGH and Aave, Compound protocols → cross-promo with lending product

    • 15% with Prob_NFT = HIGH → partnership with NFT marketplace

    Parameters used: Transaction Categories, Protocols, Intentions, Experience Level

    Token sales are filled with airdrop farmers and bots who dump tokens on the first day of listing. Real investors don't receive allocation.

    With Wallet Audit, Wallet Rank, Experience, and Risk Capability, provide objective applicant scoring. Allocation priority goes to wallets with a verified history.

    Example:

    • Investor A: Wallet Rank in top 10K, Experience = 9, Risk Capability = 7, Intentions: Staking = HIGH → long-term holder, priority allocation

    • Investor B: fresh wallet, 3 transactions, Wallet Rank = 0, Experience = 1 → likely farmer, low priority

    Parameters used: Wallet Rank, Experience Level, Risk Capability, Intentions, Transaction Count

    Quest platforms (Layer3, Zealy, Galxe) offer the same tasks to everyone. Too difficult for beginners, too easy for experienced users. Bot farms collect rewards intended for real users.

    With Wallet Audit, Experience and Protocols determine different quests for different levels, while Wallet Rank filters sybil accounts from real users.

    Example:

    • Beginner (Experience = 2) → quest: "Make your first swap on Uniswap", "Stake ETH via Lido"

    • Experienced (Experience = 8, Protocols: Aave, Lido, Curve) → quest: "Provide concentrated liquidity on Uniswap V3", "Create a leveraged position on Aave"

    • Sybil filter: Wallet Rank < threshold or Transaction Count < 15 → wallet does not receive rewards

    Parameters used: Experience Level, Protocols, Wallet Rank, Transaction Count, Intentions

    Most airdrop campaigns distribute tokens indiscriminately to everyone. Result — 80%+ of recipients sell on the first day, the price crashes, and real protocol users don't receive a fair allocation.

    With Wallet Audit, Wallet Rank, Experience, and Transaction Categories objectively assess whether a wallet belongs to a real protocol user.

    Example:

    • Tier 1 (increased airdrop): Wallet Rank in top 20K, Experience >= 7, Transaction Categories include the protocol core category, AML = clean

    • Tier 2 (standard airdrop): Wallet Rank in top 100K, Experience >= 4

    • Exclusion: Wallet Rank = 0, Experience = 1, fewer than 15 transactions → airdrop farmer, does not receive allocation

    Parameters used: Wallet Rank, Experience Level, Transaction Categories, Predicted Trust, AML Analysis

    1. Ethereum(ETH)

    2. BNB Smart Chain(BSC)

    3. Base

    1. Go to your

    1. Select the network you want to work with:

    1. Enter the wallet address you want to analyze:

    1. Click on Run Check:

    1. Scroll down to see the analysis:

    If you want to interact with or integrate this service via API, check the

    Migrate to GetBlock with AI

    AI agent runbook to migrate your project's blockchain RPC endpoints to GetBlock using any coding agent.

    This page is both a migration guide and an executable runbook for AI coding agents. Paste the one-liner below into any AI coding agent (Claude Code, Codex CLI, Cursor, Windsurf, Gemini CLI, Antigravity), and the agent fetches this page and follows it.

    Quick start

    Paste this into your AI agent:

    get docs.getblock.io/migration/migrate-to-getblock-with-ai.md

    The agent fetches this page and walks through the migration in three phases: Assess, Plan, and Implement. It stops after Plan and waits for your approval before making any changes to the code.

    How the agent works with GetBlock

    GetBlock's documentation is published as machine-readable Markdown. The agent does not need a custom integration to read it.

    • Documentation index: https://docs.getblock.io/llms.txt lists every doc page. The agent reads this first to discover what is available.

    • Full corpus in one file: https://docs.getblock.io/llms-full.txt is the entire documentation concatenated, for agents that prefer a single fetch.

    • Any page as Markdown: append .md to a doc URL, or fetch the page directly, to get clean Markdown instead of HTML.

    The Assess and Plan phases run entirely on public docs and read-only checks. The Implement phase creates endpoints, which happens in the GetBlock dashboard. GetBlock endpoints embed your access token in the URL, so there is no API key to register with the agent and no auth header to manage.

    Migrate this project's blockchain RPC endpoints to GetBlock.

    1. Scan the codebase for every blockchain RPC endpoint other than GetBlock. Check source files, environment variables, config files (hardhat.config.*, foundry.toml, .env, truffle-config.js), and any hardcoded URLs.

    2. For each endpoint found, identify:

    • The protocol and network (mainnet or a named testnet).

    • The interface in use: JSON-RPC, REST, WebSocket, GraphQL, or gRPC.

    • The methods called, and whether any need archive data (historical state, old blocks, eth_getLogs over wide ranges, trace or debug calls).

    1. Verify GetBlock coverage for each protocol. Fetch https://docs.getblock.io/llms.txt, find the network's reference page, and confirm the network, the interface, and the specific methods are documented. Fetch the page as Markdown for method-level detail.

    2. Report four buckets: fully covered, covered but needs a specific setting (archive mode, MEV protection, a specific region), unsupported, and any endpoints in the codebase that are already dead or deprecated.

    3. Flag these GetBlock features explicitly when the codebase needs them, so the user selects them at endpoint-creation time:

    • Archive mode. A toggle when creating the endpoint. Required for historical state and full block-zero history. Available from the Starter plan up.

    • MEV protection. A selectable interface that routes transactions through private channels to shield them from front-running and sandwich attacks. Off by default.

    • Region routing. Endpoints resolve to a regional host: go.getblock.io (EU, Frankfurt), go.getblock.us

    If the user is migrating from another RPC provider, estimate the GetBlock cost and the savings versus their current bill. GetBlock meters usage in Compute Units (CUs).

    1. Get the user's current usage from their existing provider, lowest-friction path first:

    • QuickNode exposes usage through its Admin API. Ask the user for a QuickNode API key and fetch their billing-period usage and per-method breakdown.

    • Alchemy has no usage API. Ask for a screenshot of Settings, then Usage, and Settings, then Billing. Read the Compute Units used, plan, and spend straight from the image.

    • Any other provider or no programmatic access: ask for a screenshot of the usage and billing dashboard, or the approximate monthly request volume and current spend.

    1. Pull GetBlock's live plans and the CU model from https://getblock.io/pricing and the Plans and limits doc page.

    1. Route results based on volume: high-volume, dedicated-node needs, or enterprise terms go to GetBlock sales; self-serve volumes go straight to the dashboard.

    If the user already has GetBlock endpoints, or is willing to create one test endpoint first:

    1. For each method the codebase uses, send a test request to the matching GetBlock endpoint and confirm the response shape matches what the app expects.

    2. If the codebase has known throughput patterns (batch calls, polling intervals, concurrent requests), test at that rate and watch for rate-limit responses.

    3. Report what works, what fails, and any method or rate-limit gaps.

    For each endpoint to migrate, lay out the exact replacement: which GetBlock network, interface, region, and mode (full or archive, MEV on or off) it maps to, and whether a new endpoint needs to be created. Flag anything that needs the user's decision (region choice, archive cost, unsupported chains that need a dedicated node or a sales conversation).

    GetBlock endpoints are created in the dashboard, not via a remote API, so this phase involves a guided handoff and code changes.

    1. Tell the user exactly which endpoints to create at https://account.getblock.io (or the GetBlock dashboard), with the precise settings from the approved plan:

    • protocol

    • network

    • interface

    • region,

    Each created endpoint produces a URL of the form https://go.getblock.io/<ACCESS_TOKEN>/.

    1. Have the user paste the new endpoint URLs.

    1. Replace each old endpoint with its GetBlock equivalent across source, env files, and build configs.

    2. Verify each swap with a live call before declaring it done (see snippets below).

    3. Summarize what changed: files touched, endpoints swapped, and anything still pending (a dedicated node, a sales follow-up, an unverified method).

    Need in the codebase
    GetBlock equivalent
    1. EVM chain ID check (confirms the endpoint is live and on the expected network):

    1. Latest block height:

    1. WebSocket smoke test:

    1. Library swap examples the agent can apply directly:

    For implementation issues, unsupported chains, or dedicated-node and enterprise questions, point the user to . Keep the token secret at every step: it is the full credential, embedded in the URL.

    CU and rate limits

    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.


    GetBlock’s shared node service is subject to several usage limits. These are the key limits that directly affect costs and performance:

    • : 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.

    How to Use Multicall3

    Multicall3 batches multiple operations into a single transaction with atomic execution.

    Multicall3 batches multiple operations into a single transaction with atomic execution using bsc_private_tx to get MEV protection with internal fee payment.

    This is very good for most use cases, e.g., DEX swaps, token purchases, etc but consumes a lot of gas. If any part fails, the entire transaction reverts.

    This is how Multicall3 works:

    You must have the following:

    • Node.js v18 or later installed

    How to Get a BNB Smart Chain (BSC) RPC Endpoint

    Step-by-step guide to getting a fast, reliableBSC RPC endpoint

    BNB Smart Chain remains one of the most active blockchains for DeFi, trading bots, and dApp development. With block times under 3 seconds and significantly lower gas fees than Ethereum, BSC handles massive transaction volumes, and your RPC infrastructure needs to keep pace.

    This guide walks you through setting up BSC RPC access with GetBlock, from free development endpoints to Accelerated Dedicated Nodes with private mempool support.

    1

    Go to and sign up. You can register with email or via Google/GitHub OAuth.

    2

    Dedicated node performance tiers

    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:

    1. 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.

    ,
    2
    )))
    ,
    2
    )))
    ,
    2
    )))
    ,
    2
    )))
    '
    bytes
    '
    )
    ;
    ,
    2
    )))
    "
    :
    [
    "
    newFlashblocks
    "
    ],
    "
    id
    "
    :
    "
    getblock.io
    "
    }
    '
    # Then send:
    {"jsonrpc": "2.0", "method": "eth_subscribe", "params": ["newFlashblockTransactions", true], "id": "getblock.io"}
    const ws = new WebSocket('wss://go.getblock.io/<ACCESS-TOKEN>/');
    ws.on('open', () => {
    ws.send(JSON.stringify({
    "jsonrpc": "2.0",
    "method": "eth_subscribe",
    "params": [
    "newFlashblockTransactions",
    true
    ],
    "id": "getblock.io"
    }));
    });
    ws.on('message', (data) => {
    const msg = JSON.parse(data.toString());
    if (msg.method === 'eth_subscription') {
    // Preconfirmed data update
    console.log(msg.params.result);
    } else {
    // Subscription ID response
    console.log('Subscribed:', msg.result);
    }
    });

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    -32600

    Invalid Request

    Subscription called over HTTP; use WebSocket

    '
    \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "jsonrpc": "2.0",
    "method": "eth_getBlockReceipts",
    "params": [
    "pending"
    ],
    "id": "getblock.io"
    }'
    const data = JSON.stringify({
    "jsonrpc": "2.0",
    "method": "eth_getBlockReceipts",
    "params": [
    "pending"
    ],
    "id": "getblock.io"
    });
    const config = {
    method: 'post',
    url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
    headers: {
    'Content-Type': 'application/json'
    },
    data: data
    };
    axios(config)
    .then(response => console.log(JSON.stringify(response.data, null, 2)))
    .catch(error => console.log(error));

    result.status

    QUANTITY

    0x1 = success, 0x0 = reverted

    result.gasUsed

    QUANTITY

    Actual gas consumed

    result.effectiveGasPrice

    QUANTITY

    Effective gas price paid

    result.logs

    array of Log

    Event logs emitted during execution

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    '
    # Then send:
    {"jsonrpc": "2.0", "method": "eth_subscribe", "params": ["pendingLogs", {"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]}], "id": "getblock.io"}
    const ws = new WebSocket('wss://go.getblock.io/<ACCESS-TOKEN>/');
    ws.on('open', () => {
    ws.send(JSON.stringify({
    "jsonrpc": "2.0",
    "method": "eth_subscribe",
    "params": [
    "pendingLogs",
    {
    "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "topics": [
    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
    ]
    }
    ],
    "id": "getblock.io"
    }));
    });
    ws.on('message', (data) => {
    const msg = JSON.parse(data.toString());
    if (msg.method === 'eth_subscription') {
    // Preconfirmed data update
    console.log(msg.params.result);
    } else {
    // Subscription ID response
    console.log('Subscribed:', msg.result);
    }
    });

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    -32600

    Invalid Request

    Subscription called over HTTP; use WebSocket

    -32602

    Invalid filter

    Filter object malformed — check address and topics format

    '
    \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "jsonrpc": "2.0",
    "method": "eth_call",
    "params": [
    {
    "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "data": "0x70a082310000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a"
    },
    "pending"
    ],
    "id": "getblock.io"
    }'
    const data = JSON.stringify({
    "jsonrpc": "2.0",
    "method": "eth_call",
    "params": [
    {
    "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "data": "0x70a082310000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a"
    },
    "pending"
    ],
    "id": "getblock.io"
    });
    const config = {
    method: 'post',
    url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
    headers: {
    'Content-Type': 'application/json'
    },
    data: data
    };
    axios(config)
    .then(response => console.log(JSON.stringify(response.data, null, 2)))
    .catch(error => console.log(error));

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    3

    execution reverted

    Contract execution reverted — the contract's logic rejected the call

    -32602

    Invalid call object

    Malformed call parameters

    '
    \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "jsonrpc": "2.0",
    "method": "eth_estimateGas",
    "params": [
    {
    "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
    "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0"
    },
    "pending"
    ],
    "id": "getblock.io"
    }'
    const data = JSON.stringify({
    "jsonrpc": "2.0",
    "method": "eth_estimateGas",
    "params": [
    {
    "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a",
    "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0"
    },
    "pending"
    ],
    "id": "getblock.io"
    });
    const config = {
    method: 'post',
    url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
    headers: {
    'Content-Type': 'application/json'
    },
    data: data
    };
    axios(config)
    .then(response => console.log(JSON.stringify(response.data, null, 2)))
    .catch(error => console.log(error));

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    3

    execution reverted

    Transaction would revert against the preconfirmed state — estimation cannot complete

    Data freshness depends on the last ChainAware scan (lastChecked field).

    Creator wallet address
  • Network

  • Badges

  • Rug Pull probability: The primary indicator, ranging from 0% to 100%, is displayed with a progress bar and a High Risk / Medium Risk / Low Risk label.

  • Contract details: This contains parameters that are displayed as a green checkmark (safe) or a red flag (risk).

  • Primary score

    Rug Pull Probability (0–100%)

    Predicted Trust (0–100%)

    When to use

    Before investing in a contract/pool/token

    Before transacting with a counterparty

    Smart contract code — logic of each function and dependencies

    Method

    Behavioral AI/ML — analysis of on-chain wallet history

    Static code analysis — parsing of ERC-20 function logic

    Key question

    "Can the people behind this contract be trusted?"

    "Is there malicious code in this contract?"

    What it catches

    Suspicious creators, new LP addresses, links to fraud wallets

    Honeypot, hidden mint, blacklist, selfdestruct, hidden fees, backdoors, pausable proxy, etc. (22+ threat types)

    Networks

    ETH, BNB, Base

    32+ EVM chains

    Analogy

    Catches the "bomber by handwriting"

    Catches the "bomb in the code"

    Limitations

    Contact the GetBlock team
    spinner

    Interpretation

    80–100%

    Low Risk

    Wallet with clean history

    50–79%

    Medium Risk

    Risk factors detected, full Wallet Audit recommended

    0–49%

    High Risk

    Wallet is highly likely associated with fraudulent activity

    0% (auto)

    AML Flag

    At least one AML flag detected — score automatically set to 0%

    1. AML Analysis: This shows 18 risk categories with each parameter displayed as No (clean) or Yes (flag detected).

    1. Sanctions Check: This shows sanctions list verification. It displayed as a badge: Not Sanctioned (green) or Sanctioned (red). If the wallet is sanctioned, the category, name, and source link are displayed.

    Yes

    AML Screening (18 categories)

    Yes

    Yes

    Sanctions Check

    Yes

    Yes

    Intentions (14 categories)

    No

    Yes

    Experience / Risk Profile

    No

    Yes

    Protocols / Categories

    No

    Yes

    Wallet Overview / Rank

    No

    Yes

    Networks

    5 (ETH, BNB, Base, Polygon, TRON)

    3 (ETH, BNB, Base)

    When to use

    Quick screening: allow / reject

    Deep analysis: who is this wallet

    Predicted Trust

    Limitations

    Wallet Risk Homepage
    Rug Pull Checker Homepage
    Contact the GetBlock team
    wallet risk
    network selection

    Level

    If at least one parameter forensic_details = "1" → probabilityFraud is automatically set to 1.0 (i.e. Predicted Trust = 0%). This is a hard override; the ML model is not used.

    Run the script

    Region: Choose the closest — Frankfurt (EU), New York (US), or Singapore (APAC)
    2.0
    "
    ,
    "method": "eth_blockNumber",
    "params": [],
    "id": "getblock.io"
    }
    2.0
    "
    ,
    "id": "getblock.io",
    "result": "0x134A5B2"
    }
    // The result field contains the latest block number in hexadecimal.

    Copy Your Endpoint URL

    The long string after go.getblock.io/ is your access token — keep it private.

    Test the Connection

    Sepolia faucets
    curl -X POST https://go.getblock.io/<YOUR-ACCESS-TOKEN>/ \
      -H "Content-Type: application/json" \
      -d '{
        "jsonrpc": "2.0",
        "method": "eth_blockNumber",
        "params": [],
        "id": "getblock.io"
      }'
    {
      "jsonrpc": "2.0",
      "id": "getblock.io",
      "result": "0x134A5B2"
    }
    // The result field contains the latest block number in hexadecimal.
    Whether the project depends on streaming (WebSocket subscriptions, or Solana Yellowstone gRPC / Geyser).
    (US, New York),
    go.getblock.asia
    (Asia, Singapore). Latency-sensitive workloads should pick the nearest region.
  • WebSocket. Same token, wss:// scheme: wss://go.getblock.io/<ACCESS_TOKEN>/.

  • Yellowstone gRPC / Geyser for high-throughput Solana streaming. Confirm availability on the Solana reference page.

  • REST and GraphQL interfaces where the protocol supports them (for example, TON REST, TRON HTTP API).

  • archive on/off,

  • MEV on/off.

  • Front-running protection

    MEV Protected interface

    Region pinning for latency

    .io (Frankfurt), .us (New York), .asia (Singapore) host

    Solana high-throughput streaming

    Yellowstone gRPC / Geyser

    REST or GraphQL interface

    Select the matching interface where the protocol offers it

    Many chains in one place

    One account, one token format, 130+ networks

    HTTP JSON-RPC

    https://go.getblock.io/<ACCESS_TOKEN>/

    WebSocket subscriptions

    wss://go.getblock.io/<ACCESS_TOKEN>/

    Historical / archive queries

    Archive mode toggle at endpoint creation (Starter plan+)

    Do not rely on training data for what GetBlock supports. Network coverage, methods, and interfaces change. Always verify against llms.txt and the live network reference pages. If something cannot be verified there, flag it as uncertain and point the user to GetBlock support rather than guessing.

    Optional: on-chain reads during the dry run

    If the agent needs to make live blockchain calls while testing (balances, transactions, block heights), GetBlock ships a local MCP server for ETH and Solana data queries: github.com/GetBlock-io/mcp-server. It runs locally with your access tokens as environment variables. This is optional. A plain curl against the new endpoint is enough to verify a migration.

    Agent instructions

    Assess

    Coverage check

    Cost and savings estimate

    Do not quote prices from memory; they change. Fit the user's converted usage to the cheapest plan that covers it, and present the monthly GetBlock cost next to their current bill.

    Dry run

    Plan

    STOP here. Present the plan and wait for the user to approve or adjust before changing anything. Do not edit code until the user confirms. Answer follow-up questions using the docs. For unsupported chains, point the user to GetBlock support for information on dedicated-node availability.

    Implement

    The token is the credential, so never ask the user to paste it into chat in plaintext; instead, reference it from the .env var.

    Feature mapping

    Verification snippets

    Support

    GetBlock support
    main.py
    import requests
    import json
    
    url = "https://services.getblock.io/v1/wallet-audit/check"
    
    payload = json.dumps({  "network": "ETH", "address": "0xa45f...a675"})
    
    headers = {
          "Authorization": "Bearer YOUR_API_KEY",
      "Content-Type": "application/json",
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    python main.py
    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/
    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"}'
    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"}'
    wscat -c 'wss://go.getblock.io/<ACCESS_TOKEN>/'
    # then send:
    {"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":"getblock.io"}
    // ethers v6
    const provider = new ethers.JsonRpcProvider("https://go.getblock.io/<ACCESS_TOKEN>/");
    // viem
    const client = createPublicClient({
      chain: mainnet,
      transport: http("https://go.getblock.io/<ACCESS_TOKEN>/"),
    });
    # web3.py
    w3 = Web3(Web3.HTTPProvider("https://go.getblock.io/<ACCESS_TOKEN>/"))
    API Interface: JSON-RPC or JSON-RPC(v3) or HTTP API(v4)
  • Region: Frankfurt (EU)

  • Click "Create": Your endpoint URL will be generated immediately.

  • const tonweb = new TonWeb(
    new TonWeb.HttpProvider("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/")
    );
    // Get balance
    const balance = await tonweb.getBalance("EQDtFpEwcFAEcRe5mLVh2N6C0x-_hJEM7W61_JLnSF74p4q2");
    console.log(`Balance: ${TonWeb.utils.fromNano(balance)} TON`);
    "
    # Get address info
    response = requests.get(
    f"{base_url}getAddressInformation",
    params={"address": "EQDtFpEwcFAEcRe5mLVh2N6C0x-_hJEM7W61_JLnSF74p4q2"}
    )
    data = response.json()
    balance = int(data["result"]["balance"]) / 1e9
    print(f"Balance: {balance} TON")
    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/

    Starter ($49/mo)

    50M/mo

    100

    Growing Telegram app

    Advanced ($199/mo)

    220M/mo

    300

    Viral Telegram app

    Pro ($499/mo)

    600M/mo

    500

    Payment infrastructure

    Dedicated (custom)

    Unlimited

    Unlimited

    Copy Your Endpoint URL

    The long string after go.getblock.io/ is your access token — keep it private.

    Test the Connection

    curl "https://go.getblock.io/853387a2f5fb45938bc031b8dca61109/getTransactions?address=EQDtFpEwcFAEcRe5mLVh2N6C0x-_hJEM7W61_JLnSF74p4q2&limit=10"
    {
        "ok": true,
        "result": [
            {
                "@type": "raw.transaction",
                "address": {
                    "@type": "accountAddress",
                    "account_address": "EQDtFpEwcFAEcRe5mLVh2N6C0x-_hJEM7W61_JLnSF74p4q2"
                },
                "utime": 1776290803,
                "data": "te6cckECBgEAAWoAA7V+0WkTBwUARxF7mYtWHY3oLTH7+EkQztbrX8kudIXvinAABAWCj9eUOD7/OUrBX59ddg7e3dzvZoID+aKx+fen8wasJez5upJwAAQFZjZhbDaeAL8wABRhp1GIAQIDAQGgBACCch7Abw4H6w6slWcoil9zY7JBOborq1xVIKW99Tsth1ejdzUxO3jSz9uuy9Y1yGPJMw/Wr1dV7299L8x9tJpO574BIQSA7wjD0JAQYabaDQDBhqAQBQC5aAAkFnkPv5yCP72kT5+cJ0xbYR+O+oNCl+CYiPHg8WnI4QA7RaRMHBQBHEXuZi1YdjegtMfv4SRDO1utfyS50he+Kcw9CQAGCCNaAACAsFH68oTTwBfmAAAAAAVAAJxBDqgnEAAAAAB8AAAARgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASDQZX",
                "transaction_id": {
                    "@type": "internal.transactionId",
                    "lt": "70747389000003",
                    "hash": "02cNpr7ukamUPb7hxvpcD2X9o4wzFR/ur0m5tfh6bXM="
                },
                "fee": "866956",
                "storage_fee": "956",
                "other_fee": "866000",
                "in_msg": {
                    "@type": "raw.message",
                    "hash": "q36VnTxNsF94CFWxG9ACJ7WY/6hNABx9i2YSMW4in5I=",
                    "source": "EQASCzyH385BH97SJ8_OE6YtsI_HfUGhS_BMRHjweLTkcOnQ",
                    "destination": "EQDtFpEwcFAEcRe5mLVh2N6C0x-_hJEM7W61_JLnSF74p4q2",
                    "value": "1000000",
                    "extra_currencies": [],
                    "fwd_fee": "266669",
                    "ihr_fee": "0",
                    "created_lt": "70747389000002",
                    "body_hash": "F99CaqBqWUd2tl2GzHTvFJZ3LcXszDAxo+ZkWq9ydzo=",
                    "msg_data": {
                        "@type": "msg.dataText",
                        "text": "Cg=="
                    },
                    "message": "\n"
                },
                "out_msgs": []
            },
    ]
    }

    result.parentHash

    DATA

    Parent block hash (last sealed block)

    result.stateRoot

    DATA

    Zero hash on Flashblocks (state not yet committed); real root when block seals

    result.transactions

    array

    Every transaction preconfirmed into Flashblocks so far in this in-progress block

    result.timestamp

    QUANTITY

    Timestamp of the in-progress block

    Detecting the current Flashblock index to time downstream operations

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    -32000

    Sequencer unavailable

    Flashblocks stream is temporarily down — response falls back to latest state

    blockNumber

    QUANTITY

    TAG

    Yes

    fullTransactions

    boolean

    Yes

    true for full transaction objects, false for hashes only

    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_getBlockByNumber",
        "params": [
            "pending",
            false
        ],
        "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_getBlockByNumber",
            "params": [
                    "pending",
                    false
            ],
            "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": {
            "number": "0x16e3600",
            "hash": null,
            "parentHash": "0x47edbdc8da5cd1b3127ea8f1ce5da6739fa39e7e6d2eb1c9b50f1c83de0a98b4",
            "timestamp": "0x68f3b85f",
            "miner": "0x4200000000000000000000000000000000000011",
            "gasLimit": "0x3938700",
            "gasUsed": "0x1c2b40",
            "baseFeePerGas": "0x2540be400",
            "stateRoot": "0x0000000000000000000000000000000000000000000000000000000000000000",
            "transactions": [
                "0xa8f9b3c7d2e4f6a1b9c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d9e8f7a6"
            ],
            "size": "0x42a"
        }
    }

    result.number

    QUANTITY

    In-progress block number (the same as the next latest will be)

    result.hash

    DATA

    null for Flashblocks (block not yet sealed) — a real hash appears only after seal

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Generic JSON-RPC call — 'pending' returns Flashblocks-preconfirmed state:
    const result = await provider.send('eth_getBlockByNumber', ["pending", false]);
    console.log(result);
    
    // Many standard methods have typed wrappers on ethers Provider that accept 'pending':
    // provider.getBalance(addr, 'pending'), provider.getTransactionCount(addr, 'pending'), etc.
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // viem's read methods accept blockTag: 'pending' for Flashblocks-preconfirmed state:
    const result = await client.request({
        method: 'eth_getBlockByNumber',
        params: ["pending", false]
    });
    console.log(result);
    
    // Typed wrappers also accept blockTag: 'pending':
    // client.getBalance({ address, blockTag: 'pending' })
    // client.getBlock({ blockTag: 'pending' })

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "jsonrpc": "2.0",
        "method": "eth_getBlockByNumber",
        "params": [
            "pending",
            false
        ],
        "id": "getblock.io"
    }'
    import axios from 'axios';
    
    const data = JSON.stringify({
        "jsonrpc": "2.0",
        "method": "eth_getBlockByNumber",
        "params": [
            "pending",
            false
        ],
        "id": "getblock.io"
    });
    
    const config = {
        method: 'post',
        url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers: {
            'Content-Type': 'application/json'
        },
        data: data
    };
    
    axios(config)
        .then(response => console.log(JSON.stringify(response.data, null
        .catch(error => console.log(error));

    Wallet Risk Homepage

  • Rug Pull Checker Homepage

  • 2. Lending Protocol — Borrower Assessment

    3. Growth/Marketing — User Base Segmentation

    4. Token Sale/Launchpad — Investor Quality Filtering

    5. Quest Platforms — Adaptive Tasks and Sybil Protection

    6. Airdrop Campaigns — Farmer Filtering

    Limitations

    • The service only works with regular wallets (EOA — Externally Owned Accounts). Contract addresses are not supported.

    • A minimum of 10–15 transactions is required to calculate an accurate predictive score. Wallets with less history lack sufficient data for a reliable assessment

    Supported Network

    How to Audit a Wallet Address

    This report includes the following:
    1. Wallet balance, age, and number of transactions

    2. Risk Willingness / Experience Level / Risk Capability scale

    i. Risk Willingness: This measures psychological willingness to take risks. Determined by on-chain behavior: leverage usage, volatile assets, experimental protocols.

    ii. Experience Level: This measures the depth and duration of Web3 activity: number of protocols, activity duration, transaction complexity, and multi-chain activity.

    iii. Risk Capability: This measures financial ability to withstand losses, weighted by behavioral risk appetite.

    Roughly: available capital × Risk Willingness. A wallet with high willingness but a small balance gets a low Risk Capability — it can act riskily but cannot absorb meaningful loss.

    The reverse is also true: a large balance with low willingness scores low because the capital stays idle. ChainAware does not disclose the exact formula but considers asset size, diversification, and portfolio composition.

    1. Predicted trust score: The main safety indicator — the probability that the wallet is legitimate. Displayed as a percentage from 0% to 100%.

    Need a custom setup (higher rate limits, dedicated infrastructure, SLA, or volume pricing)? Contact the GetBlock team.

    Next Step

    GetBlock Account Dashboard
    Wallet audit endpoint.
    Wallet Risk Doc
    Rug Pull Checker Doc
    Address Audit API Reference
    Wallet Audit Homepage
    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.

  • Plan
    Price (monthly)
    CU Allocation
    RPS Limit
    Access Tokens
    CU Top-ups

    Free

    $0

    50,000 / day

    20 RPS

    Check https://getblock.io/pricing/ for current pricing and annual discounts across all tiers.

    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

    To increase usage limits, choose between the higher-tier options.

    For use cases that are growing beyond the free tier — a first production app or side project. Offers a significant increase in CU and RPS compared to the Free plan.

    • CU: 90M per month (~3M/day)

    • Throughput: 100 requests per second (RPS)

    For apps with a growing user base: higher daily call volumes and room for several services or environments at once.

    • CU: 185M per month (~6.2M/day)

    • Throughput: 150 requests per second (RPS)

    Mid-to-upper tier, production-ready plan, suitable for moderate-to-high traffic applications.

    • CU: 385M per month (~12.8M/day)

    • Throughput: 300 requests per second (RPS)

    For larger apps and teams. More CU headroom and endpoints to run many services or environments from one account.

    • CU: 700M per month (~23.3M/day)

    • Throughput: 400 requests per second (RPS)

    For applications that need significantly higher throughput and increased resource availability compared to lower tier plans.

    • CU: 1B per month (~33.3M/day)

    • Throughput: 500 requests per second (RPS)

    Highest standard tier before custom Enterprise terms. Built for sustained high-volume production traffic.

    • CU: 1.6B per month (~53.3M/day)

    • Throughput: 700 requests per second (RPS)

    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


    Your monthly plan CUs (main balance) are valid for the current billing cycle only. The balance is reset when your subscription renews. Main-balance CUs don't carry over.

    Extra CUs (extra balance) — anything on top of your plan allocation — do carry over to the next month, as long as your subscription stays active and renews on time.


    Limitless Node removes Compute Unit limits entirely. You can send unlimited requests within the RPS tier you choose.

    • CU: No limit

    • Rate limit: Capped at selected RPS tier


    Our Dedicated Node service is perfect for teams and projects that demand absolute freedom from rate limits and CU monitoring.

    • CU: Unlimited

    • Rate limit: 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.

    • Shared Nodes operate on a system of limits defined by Compute Units (CUs) and Requests Per Second (RPS). Each plan also determines how many endpoints you can use simultaneously.

    • Limitless Node has no CU limits - only an RPS limit.

    • With Dedicated Nodes, you’re not limited by CUs or RPS.

    Shared node limits

    CU (Compute Units)

    Your balance of CUs for Shared Nodes is distributed on all endpoints added under the ‘Shared nodes’ tab.

    Managing unused & extra CUs

    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.

    Limitless node limits

    See for tiers, supported chains, and setup.

    Dedicated node limits

    A funded BSC wallet with sufficient BNB for transactions and gas

  • GetBlock's BSC Accelerated Dedication Node

  • Address
    Purpose

    0xcA11bde05977b3631167028862bE2a173976CA11

    Multicall3 contract

    0x6374Ca2da5646C73Eb444aB99780495d61035f9b

    Gateway fee recipient

    1

    Set up the project

    mkdir multicall3-example
    cd multicall3-example
    
    mkdir multicall3-example
    cd multicall3-example
    
    2

    Create a new file named index.js. This is where you will make your first call.

    3

    Set the ES module "type": "module" in your package.json.

    4

    Create .env file and add the following:

    5

    Add the following code to index.js:

    The following example demonstrates a simple BNB transfer with a priority fee:

    6

    Run the code using this command:

    7

    Sample response

    You can extend this code for a DEX swap by encoding the router call and including it as the second Multicall3 call:

    Problem
    Solution

    "Multicall3: call failed"

    • Check you have enough BNB for all calls + gas

    • Increase gas limit to 200000

    • Verify target addresses are correct

    TX not included

    • Increase tip amount

    • Check if you're rate limited

    • Verify TX is valid (simulate first)

    Low priority despite tip

    • Increase tip amount

    • Check builder status

    • Try different builders: mev_builders: ["48club", "bloxroute"]

    This is the simplest method for adding tips to private transactions: batch multiple operations into a single transaction with atomic execution. This is very good and highly recommended for day-to-day activities like sending transactions or DEX swaps.

    How it works

    Prerequisites

    const PANCAKE_ROUTER = '0x10ED43C718714eb63d5aA57B78B54704E256024E';
    const WBNB = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c';
    const TOKEN_ADDRESS = '0xYOUR_TOKEN_ADDRESS';
    
    // Build the swap calldata
    const routerABI = [
      'function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline)'
    ];
    const router = new ethers.Contract(PANCAKE_ROUTER, routerABI, wallet);
    
    const deadline = Math.floor(Date.now() / 1000) + 300;  // 5 minutes from now
    const swapData = router.interface.encodeFunctionData('swapExactETHForTokens', [
      minAmountOut,
      [WBNB, TOKEN_ADDRESS],
      wallet.address,
      deadline
    ]);
    
    // Construct the Multicall3 calls
    const calls = [
      {
        target: BLOXROUTE_FEE,
        allowFailure: false,
        value: ethers.parseEther('0.0005'),  // Priority fee
        callData: '0x'
      },
      {
        target: PANCAKE_ROUTER,
        allowFailure: false,
        value: ethers.parseEther('1.0'),  // Swap amount
        callData: swapData
      }
    ];

    Reference Addresses

    Example

    Extension sample

    Troubleshooting

    Conclusion

    Create a BSC Endpoint

    Once logged in:

    1. Click "Shared Nodes" in the left sidebar

    2. Click "Create New Endpoint" or the "+" button

    1. Select:

      • Protocol: BSC

      • Network: Mainnet or Testnet

      • API Interface: JSON-RPC or Websocket or GraphQL or MEV-Protected(JSON-RPC) or MEV-Protected(Websocket)

    2. Click "Create": Your endpoint URL will be generated immediately.

    3

    Copy Your Endpoint URL

    Your endpoint URL looks like this:

    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/

    The long string after go.getblock.io/ is your access token — keep it private.

    4

    Test the Connection

    curl -X POST https://go.getblock.io/<YOUR-ACCESS-TOKEN
    
    {
       "jsonrpc":"2.0",
    
    # Get USDT balance on BSC using eth_call
    curl -X POST 
    
    import { JsonRpcProvider, formatEther } 
    
    from web3 import Web3
    
    w3 = Web3(Web3.HTTPProvider("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"))
    
    print("Connected:", w3.is_connected())
    print("Chain ID:", w3.eth.chain_id)  # 56 for BSC Mainnet
    print("Latest block:", w3.eth.block_number)
    
    # Get BNB balance
    balance = w3.eth.get_balance("0x8894E0a0c962CB723c1ef41B18a7bb7E76FB4675")
    print(f"Balance: {w3.from_wei(balance, 'ether')} BNB")
    1. Open MetaMask → Add Network → Add manually

    2. Enter:

      • Network Name: BSC Mainnet (GetBlock)

      • RPC URL: https://go.getblock.io/<YOUR-ACCESS-TOKEN>/

      • Chain ID: 56

      • Symbol: BNB

      • Explorer: https://bscscan.com

    3. Save

    Feature
    Public RPC
    GetBlock

    Rate limits

    Heavy throttling

    Up to 500 RPS

    Uptime

    No guarantee

    99.9%+ SLA

    GetBlock offers BSC-specific infrastructure with an integrated BloXroute BDN (Blockchain Distribution Network):

    Private Mempool Submission

    Submit transactions to a private mempool, bypassing the public mempool entirely:

    • MEV protection — your transactions aren't visible to sandwich bots

    • Higher landing rate — direct submission to block producers

    • Priority fee support — set custom priority fees for faster inclusion

    How to Submit to Private Mempool

    Bundle Support (Multicall3)

    Execute multiple transactions atomically:

    • All-or-nothing execution

    • MEV-resistant operations

    • Complex DeFi strategies in a single block

    How to Use Bundles

    Stream Subscription

    Subscribe to real-time BSC data streams:

    • New pending transactions

    • New blocks

    • Transaction receipts

    How to Subscribe to Streams

    Use Case
    Plan
    Key Benefit

    Development & testing

    Free

    50K CU/day

    Production dApp

    Starter ($49/mo)

    100 RPS, trace/debug

    • Full BSC API Reference

    • BSC Private Mempool Guide

    • Configure a Dedicated BSC Node

    • Using Web3.js with GetBlock

    Need high-performance BSC infrastructure for trading or DeFi? Contact us to discuss Accelerated Dedicated Nodes with private mempool and bundle support.

    Step-by-Step: Get Your BSC RPC Endpoint

    Create a GetBlock Account

    GetBlock Dashboard

    Code Examples

    Connect MetaMask to BSC via GetBlock

    Public BSC RPC vs GetBlock

    BSC Advanced Tooling — Exclusive to GetBlock

    Accelerated Dedicated Node

    Choosing Your Plan

    What's Next?

    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.

    Feature
    High Performance
    Standard Performance

    Resource allocation

    Maximum hardware and bandwidth

    Balanced hardware profile

    Throughput

    Highest supported


    Dedicated Nodes are billed at a set monthly rate determined by configured settings:

    1. Performance tier: Total cost scales with the performance tier selected – High tier is priced at a premium relative to the Standard tier.

    2. Blockchain network: Each protocol has different hardware requirements, which impact both High and Standard tier pricing.

    3. Node mode: Full or Archive.

    4. Client parameters.

    Refer to your Dashboard for up-to-date pricing details and protocol-specific options.

    Dedicated Node pricing in the GetBlock Dashboard

    To select a tier during node setup, open the Dedicated Node dashboard:

    1. Select protocol, network, deployment region, node mode, and a preferred client.

    2. As a final step, choose the Performance Tier (High or Standard).

    1. 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. Contact us for tailored deployments.

    Dedicated Node tiers overview

    Always check available configurations in your dashboard

    Reference High vs Standard tier comparison

    Dedicated Node pricing

    Monthly costs are always shown during configuration in the Dashboard for each supported network and region.

    Steps to configure dedicated node tiers

    Need a more customized setup?

    What counts as a CU

    Learn what Compute Units (CUs) are and how GetBlock calculates them to track and price API calls

    In our Shared Node plans, we use CU-based pricing. CUs, Compute Units, is a way to measure the computational resources that each API request consumes.

    Requests are the raw number of calls (e.g., an RPC method call) you make to the node, while Compute Units show how much computing power each call uses.

    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 three main factors:

    1. Base CU cost (chain multiplier) reflecting the network's resource intensity

    2. Method-specific multiplier which varies by API method

    3. Archive Modifier applied when a request is served by an archive node

    The total Compute Units for an API call are calculated using the following formula:

    Where:

    • Archive Modifier = 1 for standard full-node requests

    • Archive Modifier = 2 for requests served by archive endpoint


    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:

    • Protocol complexity and the size of the blockchain data

    • Node infrastructure costs

    • Operational overhead

    Here’s how blockchains are grouped based on their average resource intensity:

    Chains
    Multiplier

    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 for the full node queries.

    Ethereum RPC Method
    Method Multiplier
    Base Chain Multiplier
    Total CU

    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 .


    GetBlock Shared Node endpoints can be configured in to provide historical state access from managed archive nodes.

    To reflect the heavier load on node infrastructure, requests to these endpoints use an Archive Modifier of 2 applied on top of an existing method multiplier.

    Example: Ethereum (chain multiplier = 20), debug_traceTransaction (method multiplier = 2):

    • Regular full-node request: 20 × 2 × 1 = 40 CU

    • Archive-mode request: 20 × 2 × 2 = 80 CU (archive modifier applied)

    The table below shows CU costs for some Ethereum RPC methods when requests are sent to an archive-enabled endpoint (Archive Modifier = 2).

    Ethereum RPC Method
    Method Multiplier
    Base Chain Multiplier
    Archive Modifier
    Total CU (Archive Endpoint)

    The tables above includes selected RPC methods for illustration purposes. The complete list of all CU costs is maintained on the .


    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.

    Rug Pull Checker Endpoint

    Example code for the /rug-pull/check method. Сomplete guide on how to use /rug-pull/check in GetBlock Address Audit documentation.

    This method checks a smart contract for rug pull indicators. Proxied to ChainAware.

    Body Parameters

    Parameter
    Type
    Required
    Description

    network

    string

    eth_simulateV1 - Flashblocks

    Example code for the eth_simulateV1 - Flashblocks method. Complete guide on how to use eth_simulateV1 - Flashblocks in GetBlock Web3 documentation.

    This simulates a bundle of transactions against the latest Flashblocks — including state overrides, transfer tracing, and full validation. This is critical for MEV searchers, liquidation bots, and any application that needs to know "what would happen if I submitted this bundle right now, given the preconfirmed state?" The simulation reflects every transaction already committed to the in-progress block.

    Parameter
    Type
    Required
    Description
    ,
    2
    )))
    Access Tokens: 10
  • Additional CU packages can be purchased as needed.

  • Access Tokens
    : 15
  • Additional CU packages can be purchased as needed.

  • Access Tokens: 25
  • Add extra compute units (CU) to your account balance when needed without switching plans

  • Access
    Tokens
    : 35
  • Extra CU packages also available

  • Access Tokens: 50
  • Purchase additional CU packages when required

  • Access Tokens: 75
  • CU top-ups available

  • Access Tokens: Custom
  • Additional CU packages can be purchased on demand

  • 2

    Starter

    $49

    90M / mo

    100 RPS

    10

    Growth

    $99

    185M / mo

    150 RPS

    15

    Advanced

    $199

    385M / mo

    300 RPS

    25

    Scale

    $349

    700M / mo

    400 RPS

    35

    Pro

    $499

    1B / mo

    500 RPS

    50

    Premium

    $699

    1.6B / mo

    700 RPS

    75

    Enterprise

    from $999

    Custom

    Custom

    Custom

    Compute Units are renewed daily, but unused CUs cannot be transferred to the next day.

    Top up CUs and boost limits
    Limitless Node
    Starter plan limits for Shared RPC nodes by GetBlock
    GetBlock "Growth" RPC plan limits
    GetBlock Advanced plan CU limits and RPS limits
    GetBlock's "Scale" RPC node plan limits - Compute Units (CUs) and requests-per-second
    GetBlock's "Pro" subscription plan CU allowance and rate limits
    GetBlock's RPC plan with highest request and RPS limits - "Premium"
    GetBlock's Enterprise plan with custom usage limit settings
    GetBlock's free RPC node plan limits
    GetBlock's Limitless Node with fixed RPS and unlimited requests
    Dedicated node for scalable and unlimited RPC node access
    Region:
    Frankfurt (EU) or Singapore or New York
    >
    /
    \
    -H "Content-Type: application/json" \
    -d '{
    "jsonrpc":"2.0",
    "method":"eth_chainId",
    "params":[],
    "id":1
    }'
    "id":1,
    "result":"0x38"
    }
    https://go.getblock.io/
    <
    YOUR-ACCESS-TOKE
    N
    >
    /
    \
    -H "Content-Type: application/json" \
    -d '{
    "jsonrpc": "2.0",
    "method": "eth_call",
    "params": [{
    "to": "0x55d398326f99059fF775485246999027B3197955",
    "data": "0x70a08231000000000000000000000000YOUR_ADDRESS_WITHOUT_0x"
    }, "latest"],
    "id": "getblock.io"
    }'
    from
    "
    ethers
    "
    ;
    const provider = new JsonRpcProvider(
    "https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"
    );
    // Get BNB balance
    const balance = await provider.getBalance("0x8894E0a0c962CB723c1ef41B18a7bb7E76FB4675");
    console.log(`Balance: ${formatEther(balance)} BNB`);
    // Get gas price
    const gasPrice = await provider.getFeeData();
    console.log(`Gas price: ${gasPrice.gasPrice} wei`);
    // Read a BEP-20 token balance (e.g., USDT on BSC)
    const usdtContract = new Contract(
    "0x55d398326f99059fF775485246999027B3197955", // BSC USDT
    ["function balanceOf(address) view returns (uint256)"],
    provider
    );
    const tokenBalance = await usdtContract.balanceOf("0x...");

    Trace/Debug methods

    Not available

    Available (Starter+)

    Archive data

    Limited

    Full history

    Private mempool

    No

    Available (Accelerated Dedicated)

    MEV protection

    None

    Via BloXroute BDN integration

    WebSocket

    Unreliable

    Persistent connections

    DeFi protocol

    Advanced ($199/mo)

    300 RPS, archive

    Trading bot / DEX

    Dedicated (from $1,000/mo)

    Unlimited, private mempool

    HFT / MEV

    Accelerated Dedicated (custom)

    BloXroute BDN, bundles

    Configure Dedicated Node
    Learn more about our pricing

    High

    Uptime SLA

    99.95%

    99.9%

    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

    GetBlock private node configuration tool with pricing
    Setting up a Dedicated Node performance tier via GetBlock dashboard

    50–80%

    Medium Risk

    Warning signals present, additional analysis recommended

    Below 50%

    High Risk

    Behavioral patterns match known fraud schemes

  • Intentions: This predicts the next actions across categories, each receiving a score of HIGH, MEDIUM, or LOW, calculated based on the wallet's entire historical activity.

  • Recommendations: These show activities based on the wallet's risk profile. Examples: WBTC holding, ETH holding, Stablecoin lending.

  • Transaction: This shows the breakdown of historical transactions by type: DeFi, Decentralized Exchanges, Layer 1, Layer 2, NFT, Bridge, Lending & Borrowing, Business Services, Gaming. Shows the number of transactions in each category.

  • Protocols: This lists the specific protocols and services the wallet has interacted with, along with transaction counts. Examples: 1inch, Uniswap, Wrapped Ether, Tether, Zora, Arbitrum, Starknet, Opensea.

  • AML Analysis: This shows wallet check across 18+ parameters for links to criminal activity. Each parameter is displayed as Yes or No.

  • Range

    Level

    Interpretation

    80–100%

    Low Risk

    Behavior typical of legitimate wallets

    0g, Akash, Atleta, Berachain, Bitlayer, Botanix, Cardano, Core, Cronos zkEVM, Etherlink, Flare, Goat, Gravity, IOTA, IOTA EVM, Immutable zkEVM, Matchain, Metis, Midnight, Monad, Movement, Nervos, Oasis, Rollux, Siacoin, Solana, Somnia, Soneium, Stacks, Stellar, Swellchain, TON, Taiko, Tenet, XDC, Xai, Zora

    50

    Kusama, Polkadot

    60

    ZKsync

    80

    Arbitrum Nova, Celo, Corn, Ink, Lens, Scroll, Shiba Inu, StarkNet, Sui, TAC, Unichain

    100

    Filecoin

    140

    Ronin

    180

    B3, Electroneum, Incentiv

    200

    Moonbeam, Sei

    300

    1

    20

    20

    debug_traceTransaction

    2

    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

    eth_getTransactionByHash

    1

    20

    2

    40

    debug_traceTransaction

    2

    20

    2

    80

    debug_traceBlock

    2

    20

    2

    80

    trace_call

    2

    20

    2

    80

    trace_transaction

    2

    20

    2

    80

    txpool_status

    2

    20

    2

    80

    trace_replayTransaction

    4

    20

    2

    160

    Total CU=Chain Multiplier×Method Multiplier×Archive Modifier\text{Total CU} = \text{Chain Multiplier} \times \text{Method Multiplier} \times \text{Archive Modifier} Total CU=Chain Multiplier×Method Multiplier×Archive Modifier

    Algorand, Bitcoin, Bitcoin Cash, Dash, Dogecoin, Ethereum Classic, Litecoin, Near, Rootstock, Sonic,Telos, Zcash, others

    10

    Aptos, Arbitrum, Avalanche, BNB Smart Chain, Base, Blast, Cosmos, Cronos, Ethereum, Flow, Gnosis, Harmony, Kaia, Linea, OKT, Optimism, Polygon, Polygon zkEVM, Tezos, Tron, XRP, opBNB

    20

    Allora, Avail, Bahamut, Chiliz, Zilliqa, Xphere

    30

    eth_blockNumber

    1

    20

    20

    20 (Ethereum base multiplier)×2 (method multiplier)=40 CU20\ (\text{Ethereum base multiplier}) \times 2\ (\text{method multiplier}) = \mathbf{40\ CU}20 (Ethereum base multiplier)×2 (method multiplier)=40 CU

    eth_blockNumber

    1

    20

    2

    Learn More

    • CU and rate limits — Check how many CUs are included in each plan.

    How CUs are calculated

    1. Chain-based multipliers

    2. Method-specific multipliers

    3. Archive modifier

    The Archive Modifier is applied to all requests sent to an archive-enabled endpoint.

    If a request is routed to an archive endpoint, the Archive Modifier = 2, even if the specific method does not require historical state.

    Requests sent to full node endpoints use Archive Modifier = 1.

    Why we use the CU system at GetBlock?

    🛡️ It helps keep infrastructure stable

    💰 Compute Units provide a fair, usage-based billing model

    ⚙️ To help developers build smarter

    Request vs CU

    Compute Units page
    Archive Mode
    Compute Units page
    How to check your CU balance in GetBlock accounts

    eth_getTransactionByHash

    40

    number

    0.5488

    Rug pull probability score ranging from 0.0 to 1.0.

    contractCreationTime

    string (ISO 8601)

    "2021-11-10T12:00:00.000Z"

    Exact timestamp when the smart contract was deployed.

    lastChecked

    string (ISO 8601)

    "2026-03-25T18:42:00.000Z"

    Timestamp of the most recent security and fraud analysis.

    chain

    string

    "ETH"

    The network/blockchain name (e.g., "ETH").

    forensic_details

    object

    See sub-fields below

    Deep analysis of the contract's security properties. Core flags are binary: 0 (clean) or 1 (flagged).

    ↳ .contract_name

    string

    "PFToken"

    The registered name of the smart contract.

    ↳ .is_open_source

    number (0/1)

    1

    Indicates if the source code is verified on the network explorer.

    ↳ .is_proxy

    number (0/1)

    0

    Indicates if the contract uses a proxy pattern (allowing the underlying logic to be replaced).

    ↳ .selfdestruct

    number (0/1)

    0

    Indicates if the contract contains a selfdestruct function capability.

    ↳ .privilege_withdraw

    number (0/1)

    0

    Indicates if the owner has excessive privileges to arbitrarily withdraw user assets.

    ↳ .withdraw_missing

    number (0/1)

    0

    Indicates if critical withdrawal mechanisms are missing, preventing users from recovering funds.

    ↳ .blacklist

    number (0/1)

    0

    Indicates if the contract owner has the power to blacklist specific wallet addresses.

    ↳ .approval_abuse

    number (0/1)

    0

    Indicates if the owner can potentially abuse token allowances/approvals given by users.

    ↳ `.owner**

    object

    See sub-fields below

    Details regarding the administrative ownership of the smart contract.

    ↳ .owner_type

    string

    "contract"

    The type of owner account. Possible values: "contract" (Multi-sig/DAO/Other contract) or "eoa" (Externally Owned Account/Regular wallet).

    ↳ .owner_address

    string (nullable)

    null

    The public address of the owner. Returns null if the contract ownership has been renounced.

    502

    Provider error

    Yes

    The blockchain network to verify(ETH, BNB,POLY, TRON or BASE)

    contract_address

    string

    Yes

    the contract address

    import requests
    import json
    
    url = "https://services.getblock.io/v1/rug-pull/check"
    
    payload = json.dumps({  "network": "ETH", "contract_address": "0xdac17f958d2ee523a2206206994597c13d831ec7"})
    
    headers = {
          "Authorization": "Bearer YOUR_API_KEY",
      "Content-Type": "application/json",
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({  "network": "ETH", "contract_address": "0xdac17f958d2ee523a2206206994597c13d831ec7"});
    
        let response = client
            .post("https://services.getblock.io/v1/rug-pull/check")
            .header("Content-Type", "application/json")
            .header("Authorization: "Bearer YOUR_API_KEY")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    {
        "data": {
            "message": "Success",
            "contractAddress": "0xdac17f958d2ee523a2206206994597c13d831ec7",
            "pairAddress": null,
            "contractCreatorAddress": "0x36928500bc1dcd7af6a2b4008875cc336b927d57",
            "risk_score": 0,
            "risk_status": null,
            "risk_indicators": {},
            "status": "Not Fraud",
            "probabilityFraud": "0.0028322712",
            "chain": "ETH",
            "lastChecked": "2026-05-14T14:23:18.000Z",
            "contractCreationTime": "2017-11-28T00:41:21.000Z",
            "forensic_details": {
                "owner": {
                    "owner_address": "0xc6cde7c39eb2f0f0095f41570af89efc2c1ea828",
                    "owner_name": "owner",
                    "owner_type": "contract"
                },
                "privilege_withdraw": 0,
                "withdraw_missing": 0,
                "is_open_source": 1,
                "blacklist": 1,
                "contract_name": "TetherToken",
                "selfdestruct": 0,
                "is_proxy": 0,
                "approval_abuse": 0
            },
            "checked_times": 1,
            "createdAt": "2025-09-04T04:55:17.000Z",
            "updatedAt": "2026-05-14T14:23:20.000Z"
        }
    }

    Field Path

    Type

    Example

    Description

    status

    string

    "Fraud"

    Model verdict. Possible values: "Fraud", "Not Fraud", "Investable", "Not Investable", "Safe".

    Status

    Description

    400

    Invalid network or missing fields

    401

    Missing or invalid auth

    402

    Insufficient balance

    Request Example

    Response Example

    Response Parameters

    Error Handling

    curl --location --request POST 'https://services.getblock.io/v1/rug-pull/check' \
    -- header 'Authorization: Bearer YOUR_API_KEY',
    --header 'Content-Type: application/json' \
    --data-raw ' {  "network": "ETH", "contract_address": "0xdac17f958d2ee523a2206206994597c13d831ec7"}'
    import axios from "axios";
    
    const data = 
      {  "network": "ETH", "contract_address": "0xdac17f958d2ee523a2206206994597c13d831ec7"};
    
    const config = {
      method: "post",
      url: "https://services.getblock.io/v1/rug-pull/check",
      headers: {
        Authorization: "Bearer YOUR_API_KEY",
        "Content-Type": "application/json",
      },
      data: data,
    };
    
    axios(config)
      .then((response) => console.log(JSON.stringify(response.data,
      .catch((error) => console.log(error));
    

    probabilityFraud

    npm init -y
    npm install ws ethers dotenv
    yarn init -y
    yarn ws ethers
    ACCESS_TOKEN=your-accelerated-node-endpoint
    RPC_URL=your-normal-bsc-node-endppoint //e.g https
    PRIVATE_KEY=your-wallet-private-key
    import WebSocket from "ws"; 
    import { ethers } from "ethers";
    import "dotenv/config";
    const PRIVATE_KEY = process.env.PRIVATE_KEY
    const RPC_URL = process.env.RPC_URL;
    
    // Constants
    const MULTICALL3 = "0xcA11bde05977b3631167028862bE2a173976CA11";
    const BLOXROUTE_FEE = "0x6374Ca2da5646C73Eb444aB99780495d61035f9b";
    
    const MULTICALL_ABI = [
      "function aggregate3Value(tuple(address target, bool allowFailure, uint256 value, bytes callData)[] calls) payable returns (tuple(bool success, bytes returnData)[])",
    ];
    
    async function sendPrivateTxWithTip() {
      const provider = new ethers.JsonRpcProvider(RPC_URL);
      const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
    
      console.log("Wallet:", wallet.address);
    
      // Define amounts
      const tipAmount = ethers.parseEther("0.0001"); // 0.0001 BNB tip
      const transferAmount = ethers.parseEther("0.001"); // Your actual transfer
      const totalValue = tipAmount + transferAmount;
    
      // Build Multicall3 calls
      const calls = [
        {
          target: BLOXROUTE_FEE, // Tip payment FIRST
          allowFailure: false,
          value: tipAmount,
          callData: "0x", // Empty = simple transfer
        },
        {
          target: process.env.TO_ADDRESS, // Your actual transaction
          allowFailure: false,
          value: transferAmount,
          callData: "0x", // Or your contract calldata
        },
      ];
      // Encode Multicall3 call
      const multicall = new ethers.Contract(MULTICALL3, MULTICALL_ABI, wallet);
      const data = multicall.interface.encodeFunctionData("aggregate3Value", [
        calls,
      ]);
      // Get nonce
      const nonce = await provider.getTransactionCount(wallet.address);
      // Sign transaction
      const signedTx = await wallet.signTransaction({
        nonce: nonce,
        to: MULTICALL3,
        value: totalValue,
        data: data,
        gasPrice: ethers.parseUnits("3", "gwei"),
        gasLimit: 150000, // Higher for Multicall3
        chainId: 56,
      });
      const signedTxNoPrefix = signedTx.startsWith("0x")
      ? signedTx.slice(2)
      : signedTx;
    
      console.log("Transaction built:");
      console.log("  Tip:", ethers.formatEther(tipAmount), "BNB");
      console.log("  Transfer:", ethers.formatEther(transferAmount), "BNB");
      console.log("  Total:", ethers.formatEther(totalValue), "BNB");
    
      // Send via bsc_private_tx
      const ws = new WebSocket(process.env.ACCESS_TOKEN);
    
      ws.on("open", () => {
        const request = {
          jsonrpc: "2.0",
          id: 1,
          method: "bsc_private_tx",
          params: {
            transaction: signedTxNoPrefix,
            mev_builders: ["all"],
          },
        };
    
        console.log("\nSending private TX with tip...");
        ws.send(JSON.stringify(request));
      });
    
      ws.on("message", (data) => {
        const response = JSON.parse(data);
    
        if (response.result) {
          console.log("\n✅ Transaction submitted!");
          console.log("TX Hash:", response.result.txHash);
          console.log(
            "BSCScan:",
            `https://bscscan.com/tx/${response.result.txHash}`,
          );
        } else {
          console.error("\n❌ Error:", response.error);
        }
    
        ws.close();
      });
    }
    sendPrivateTxWithTip().catch(console.error);
    
    node index.js
    Wallet: 0xD1AF2dAc.....
    Transaction built:
      Tip: 0.0001 BNB
      Transfer: 0.001 BNB
      Total: 0.0011 BNB
    Sending private TX with tip...
    ✅ Transaction submitted!
    TX Hash: 61bd625be986bb45e9fb495a5dba7bf39e00fd6871176971663436465311c970
    BSCScan: https://bscscan.com/tx/61bd625be986bb45e9fb495a5dba7bf39e00fd6871176971663436465311c970

    object

    Yes

    Simulation object: blockStateCalls (array of call bundles), traceTransfers (bool), validation (bool)

    block

    QUANTITY

    TAG

    Yes

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/
    
    import axios from 'axios';
    
    const data = JSON.stringify({
        "jsonrpc": "2.0",
        "method": "eth_simulateV1",
        "params": [
            {
                "blockStateCalls": [
                    {
                        "calls": [
                            {
                                "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                                "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0",
                                "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a"
                            }
                        ],
                        "stateOverrides": {}
                    }
                ],
                "traceTransfers": true,
                "validation": true
            },
            "pending"
        ],
        "id": "getblock.io"
    });
    
    const config = {
        method: 'post',
        url: 'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers: {
            'Content-Type': 'application/json'
        },
        data: data
    };
    
    axios(config)
        .then(response => console.log(JSON.stringify(response.data, null, 2)))
        .catch(error => console.log(error));
    import requests
    import json
    
    url = "https://go.getblock.io/<ACCESS-TOKEN>/"
    
    payload = json.dumps({
        "jsonrpc": "2.0",
        "method": "eth_simulateV1",
        "params": [
            {
                "blockStateCalls": [
                    {
                        "calls": [
                            {
                                "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                                "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0",
                                "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a"
                            }
                        ],
                        "stateOverrides": {}
                    }
                ],
                "traceTransfers": true,
                "validation": true
            },
            "pending"
        ],
        "id": "getblock.io"
    })
    
    headers = {
        'Content-Type': 'application/json'
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({
            "jsonrpc": "2.0",
            "method": "eth_simulateV1",
            "params": [
                    {
                            "blockStateCalls": [
                                    {
                                            "calls": [
                                                    {
                                                            "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                                                            "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0",
                                                            "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a"
                                                    }
                                            ],
                                            "stateOverrides": {}
                                    }
                            ],
                            "traceTransfers": true,
                            "validation": true
                    },
                    "pending"
            ],
            "id": "getblock.io"
    });
    
        let response = client
            .post("https://go.getblock.io/<ACCESS-TOKEN>/")
            .header("Content-Type", "application/json")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    Field
    Type
    Description

    result

    array

    Simulated block(s) — one entry per block state call bundle

    result[].calls

    array

    Per-call simulation result

    • MEV searchers testing bundle profitability against preconfirmed state

    • Liquidation bots validating a liquidation call would succeed at the current preconfirmed price

    • DEX aggregators simulating multi-hop swap routes against the freshest reserves

    • Wallet UX preflight — showing users the projected outcome of their transaction before signing

    Status Code
    Error Message
    Cause

    403

    Forbidden

    Missing or invalid <ACCESS-TOKEN>

    -32602

    Invalid params

    Request parameters are missing or malformed

    import { ethers } from 'ethers';
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    // Flashblocks-specific methods use the raw send interface:
    const result = await provider.send('eth_simulateV1', [{"blockStateCalls": [{"calls": [{"to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0", "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a"}], "stateOverrides": {}}], "traceTransfers": true, "validation": true}, "pending"]);
    console.log(result);
    import { createPublicClient, http } from 'viem';
    
    const client = createPublicClient({
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    // Flashblocks-specific methods need the raw request transport:
    const result = await client.request({
        method: 'eth_simulateV1',
        params: [{"blockStateCalls": [{"calls": [{"to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0", "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a"}], "stateOverrides": {}}], "traceTransfers": true, "validation": true}, "pending"]
    });
    console.log(result);

    Parameters

    simulationParams

    {
        "jsonrpc": "2.0",
        "id": "getblock.io",
        "result": [
            {
                "number": "0x16e3600",
                "hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
                "timestamp": "0x68f3b85f",
                "gasLimit": "0x3938700",
                "gasUsed": "0x5208",
                "calls": [
                    {
                        "status": "0x1",
                        "gasUsed": "0x5208",
                        "returnData": "0x0000000000000000000000000000000000000000000000000000000000000001",
                        "logs": [
                            {
                                "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
                                "topics": [
                                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
                                ],
                                "data": "0x00000000000000000000000000000000000000000000000000000000000186a0"
                            }
                        ]
                    }
                ]
            }
        ]
    }

    Request Example

    Response Example

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    eth_getLogs - Flashblocks

    Example code for the eth_getLogs JSON-RPC method. Complete guide on how to use eth_getLogs JSON-RPC in GetBlock Web3 documentation.

    This returns query logs from pre-confirmed transactions, updated every ~200ms.

    Parameters

    Parameter
    Type
    Required
    Description

    filterObject

    object

    Field
    Type
    Required
    Description
    Parameter
    Type
    Description
    • Token Transfer Tracking: Monitor ERC-20/ERC-721 transfers

    • DEX Event Processing: Track swaps, liquidity events

    • Contract Event Indexing: Build event-driven databases

    • Real-time Notifications: Alert on specific events

    Error Code
    Message
    Description

    How to Get a Solana RPC Endpoint

    Step-by-step guide to getting a fast, reliable Solana RPC endpoint.

    Solana is the go-to chain for high-frequency trading, DeFi, and real-time applications — which means your RPC infrastructure needs to keep up.

    A Solana RPC endpoint is a URL that connects your application to a Solana validator node. Through this endpoint, your app can:

    • Query account balances and token holdings (getBalance, getTokenAccountsByOwner)

    • Fetch transaction data (getTransaction, getSignaturesForAddress)

    • Submit transactions (sendTransaction)

    • Monitor real-time events via WebSocket (accountSubscribe, logsSubscribe)

    • Access slot and block information (getSlot, getBlock)

    Solana's JSON-RPC API follows a different specification than Ethereum — it's not EVM-based, so you'll use Solana-specific libraries like @solana/web3.js or solana-py.

    Endpoint format:

    1

    Go to and sign up. You can register with email or via Google/GitHub OAuth.

    2

    Once logged in:

    1. Click "Shared Nodes" in the left sidebar

    Solana's WebSocket API is essential for real-time monitoring:

    Solana is especially demanding on RPC infrastructure:

    Challenge
    Public RPC
    GetBlock

    For applications that need the fastest possible data e.g., trading bots, MEV searchers, indexers. GetBlock offers managed Yellowstone gRPC endpoints as an add-on to Dedicated Solana Nodes.

    Why Yellowstone gRPC over standard RPC:

    • Near-zero latency: streams data directly from validators

    • Millions of events per minute: handles Solana's full throughput

    • Rich filtering: subscribe only to accounts/programs you care about

    GetBlock's proprietary StreamFirst infrastructure delivers on-chain data faster than standard Yellowstone by combining:

    • Accelerated Yellowstone gRPC with optimized serialization

    • Shred-stream delivery: receives block fragments directly via UDP before blocks are fully confirmed

    The Frankfurt data center provides 6ms latency within Europe and is positioned near the highest density of Solana validators.

    For sending transactions with high landing probability:

    • SWQoS connections to high-stakes validators

    • Jito Block Engine integration for bundle support

    • Intelligent routing based on leader schedule and network conditions

    Combines StreamFirst (data) + LandFirst (execution) + Jito integration for high-frequency trading:

    • See opportunities ~17ms faster than standard RPC

    • Execute trades via optimal routing paths

    • Bundle support for atomic multi-transaction operations

    Building something ambitious on Solana? about custom infrastructure — we specialize in high-performance Solana deployments.

    Choosing your plan

    Compare GetBlock's subscription options to find the one that fits your project.

    GetBlock offers four main service options: Shared Nodes, Limitless Node, 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

    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.

    • Multi-chain accessibility: Prototype, test, and deploy applications across different networks without the complexities of deploying infrastructure for each blockchain individually.

    • 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.


    Limitless Node is the middle ground between Shared and Dedicated Nodes. It's an isolated endpoint with guaranteed RPS and a flat monthly fee. Pricing is set by throughput rather than Compute Units, so you can send unlimited requests within your RPS tier without per-request metering.

    • Dedicated routing to ensure consistent performance and throughput.

    • Fixed RPS tiers: Choose the throughput level that matches your workload, from smaller setups to higher-volume production traffic.

    • No Compute Unit (CU) or request limits: Each plan includes a set RPS limit with unlimited requests within that tier.


    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.

    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.

    How to extend your node subscription with a card payment

    How to Submit Transactions to Public Mempool

    Learn how to submit transactions to the BNB Chain public mempool through GetBlock's BDN fast path.

    This process involves submitting transactions to the BNB Chain public mempool via GetBlock's BDN fast path. Your transaction propagates to validators significantly faster than through standard P2P gossip, increasing the probability of earlier block inclusion.

    Use public mempool submission when:

    • You want faster propagation without hiding your transaction

    • MEV exposure is acceptable for your use case

    null
    ,
    2
    )))
    '
    \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "jsonrpc": "2.0",
    "method": "eth_simulateV1",
    "params": [
    {
    "blockStateCalls": [
    {
    "calls": [
    {
    "to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "data": "0xa9059cbb0000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a00000000000000000000000000000000000000000000000000000000000186a0",
    "from": "0x7a25d0f0Ff6a25f36De0a19C3d5f6dC2C6EAeD6a"
    }
    ],
    "stateOverrides": {}
    }
    ],
    "traceTransfers": true,
    "validation": true
    },
    "pending"
    ],
    "id": "getblock.io"
    }'

    result[].calls[].status

    QUANTITY

    0x1 = success, 0x0 = reverted

    result[].calls[].gasUsed

    QUANTITY

    Gas consumed by the call

    result[].calls[].returnData

    DATA

    ABI-encoded return value

    result[].calls[].logs

    array

    Event logs the call would emit

    -32603

    Internal error

    Server-side error while processing the request

    429

    Too Many Requests

    Rate limit exceeded for your plan

    3

    execution reverted

    One or more calls in the simulation reverted

    -32602

    Invalid simulation parameters

    Malformed simulation object

    Multi-region geo-routing: Traffic is routed to the nearest healthy node across Europe, the USA, and Asia.
  • Fixed pricing: Flat monthly or yearly fee with no usage-based charges.

  • 24/7 support: Priority coverage with a response time under 5 minutes.

  • Fully customizable: Complete control over your node configurations, including access to archive data.

  • Predictable pricing:

    • Full Node: from $1,000/month;

    • Archive Node: from $1,500/month.

  • Expert support: 24/7 coverage and immediate issue resolution.

  • Priority assistance from GetBlock experts

    This option is ideal for developers and teams looking for reliable connectivity to various blockchain networks without the higher costs of dedicated server resources.

    Limitless Node

    Limitless Node fits workloads with high but predictable request volumes, where a Shared plan's Compute Unit billing is hard to forecast, but a full Dedicated Node is more than you need.

    Dedicated Nodes

    If your project demands the fastest, most reliable blockchain infrastructure, a Dedicated Node from GetBlock is a perfect choice.

    A few high-resource blockchain settings (e.g., Solana mainnet, Arbitrum mainnet, NEAR mainnet) may come with custom pricing due to their intense infrastructure requirements.

    Enterprise solutions

    Compute Units (CU)
    Enterprise Solutions page
    GetBlock's blockchain RPC Plan without request limits
    What does it cost to deploy a private blockchain node
    GetBlock shared RPC node pricing options

    No

    End block number (hex) or "latest", "earliest"

    address

    string/array

    No

    Contract address or array of addresses

    topics

    array

    No

    Array of topic filters (up to 4 topics)

    blockHash

    string

    No

    Specific block hash (alternative to fromBlock/toBlock)

    data

    string

    Non-indexed event data (hex)

    blockNumber

    string

    Block number in hex

    transactionHash

    string

    Transaction hash

    transactionIndex

    string

    Transaction index in block (hex)

    blockHash

    string

    Block hash

    logIndex

    string

    Log index in block (hex)

    removed

    boolean

    True if log was removed due to chain reorg

  • Historical Analysis: Analyze past contract activity

  • -32005

    Query returned more than limit

    Too many logs in response

    Yes

    Filter options object

    fromBlock

    string

    No

    Start block number (hex) or "latest", "earliest" or "pending"

    toBlock

    address

    string

    Contract address that emitted the log

    topics

    array

    Indexed event parameters (up to 4)

    -32602

    Invalid params

    Invalid filter object

    -32603

    Internal error

    Query range too large or node failure

    Filter Object

    Request

    Response

    Response Parameters

    Use Cases

    Error Handling

    SDK Integration

    curl --location --request POST 'https://go.getblock.io/<ACCESS-TOKEN>/' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "jsonrpc": "2.0",
        "method": "eth_getLogs",
        "params": [{
          "fromBlock": "pending",
          "toBlock": "pending",
          "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
          "topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"]
        }],
        "id": 1
      }'
    const axios = require('axios');
    
    // Query ERC-20 Transfer events
    const transferTopic = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
    
    const response = await axios.post('https://go.getblock.io/<ACCESS-TOKEN>/', {
        "jsonrpc": "2.0",
        "method": "eth_getLogs",
        "params": [{
          "fromBlock": "pending",
          "toBlock": "pending",
          "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
        }],
        "id": 1
      }, {
        headers: { 'Content-Type': 'application/json' }
    });
    
    const logs = response.data.result;
    console.log('Found', logs.length, 'transfer events');
    logs.forEach(log => {
        console.log('Block:', parseInt(log.blockNumber, 16));
        console.log('Tx:', log.transactionHash);
    });

    string

    import requests
    
    # ERC-20 Transfer event signature
    transfer_topic = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
    
    response = requests.post(
        'https://go.getblock.io/<ACCESS-TOKEN>/',
        headers={'Content-Type': 'application/json'},
        json={
        "jsonrpc": "2.0",
        "method": "eth_getLogs",
        "params": [{
          "fromBlock": "pending",
          "toBlock": "pending",
          "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
        }],
        "id": "getblock.io"
      }
    )
    
    result = response.json()
    logs = result['result']
    print(f'Found {len(logs)} transfer events')
    for log in logs:
        print(f'Block: {int(log["blockNumber"], 16)}')
    {
        "jsonrpc": "2.0",
        "result": [
            {
                "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
                "topics": [
                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
                    "0x000000000000000000000000b2cc224c1c9fee385f8ad6a55b4d94e92359dc59",
                    "0x00000000000000000000000051c72848c68a965f66fa7a88855f9f7784502a7f"
                ],
                "data": "0x00000000000000000000000000000000000000000000000000000000c2c9d499",
                "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
                "blockNumber": "0x2ddffa0",
                "blockTimestamp": "0x6a465c23",
                "transactionHash": "0xfe22be1e04c2b149559b7244f4c5b03693a071cfa5a834590dc16bed318ebeab",
                "transactionIndex": "0x1",
                "logIndex": "0x0",
                "removed": false
            },
            {
                "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
                "topics": [
                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
                    "0x0000000000000000000000004e962bb3889bf030368f56810a9c96b83cb3e778",
                    "0x00000000000000000000000051c72848c68a965f66fa7a88855f9f7784502a7f"
                ],
                "data": "0x00000000000000000000000000000000000000000000000000000001309ccb9c",
                "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
                "blockNumber": "0x2ddffa0",
                "blockTimestamp": "0x6a465c23",
                "transactionHash": "0x201d890aee2c4b934801032f2b72e888c6a332cda7ccd76cf9e549bd166bf91a",
                "transactionIndex": "0x3",
                "logIndex": "0x3",
                "removed": false
            },
            {
                "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
                "topics": [
                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
                    "0x000000000000000000000000d4dc229a997a73e86c13e3ce8019be02cd4827a6",
                    "0x0000000000000000000000009e7243b98a8a9713cb9dc37fe9f18879f0e64dcb"
                ],
                "data": "0x0000000000000000000000000000000000000000000000000000000000d7057c",
                "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
                "blockNumber": "0x2ddffa0",
                "blockTimestamp": "0x6a465c23",
                "transactionHash": "0x0f9c2aee37cff0d3cc5564c685923f6d19ec5c7c6a0d7234ee6fe06655950a2b",
                "transactionIndex": "0xb",
                "logIndex": "0x7",
                "removed": false
            },
            {
                "address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
                "topics": [
                    "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
                    "0x00000000000000000000000040378d78b14f46c35e2f69590b733e5275ac1d3b",
                    "0x000000000000000000000000fb08f1c035c05d5c12e12657baee1d1d951c2c6c"
                ],
                "data": "0x0000000000000000000000000000000000000000000000000000000005f5e100",
                "blockHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
                "blockNumber": "0x2ddffa0",
                "blockTimestamp": "0x6a465c23",
                "transactionHash": "0xc93d2aca48444c29d5538c2a79fe8bc13047f4efa656e0cc6877db0de8ea553c",
                "transactionIndex": "0xd",
                "logIndex": "0xb",
                "removed": false
            },
        ],
        "id": "getblock.io"
    }
    const { ethers } = require('ethers');
    
    const provider = new ethers.JsonRpcProvider('https://go.getblock.io/<ACCESS-TOKEN>/');
    
    async function getLogs() {
        // Using filter
        const filter = {
            address: '0x4200000000000000000000000000000000000006', // WETH
            topics: [
                ethers.id('Transfer(address,address,uint256)')
            ],
            fromBlock: 'pending',
            toBlock: 'latest'
        };
        
        const logs = await provider.getLogs(filter);
        
        logs.forEach(log => {
            console.log('Block:', log.blockNumber);
            console.log('Tx:', log.transactionHash);
            console.log('Data:', log.data);
        });
        
        return logs;
    }
    
    // Using Contract interface for parsed events
    async function getTransferEvents() {
        const abi = ['event Transfer(address indexed from, address indexed to, uint256 value)'];
        const contract = new ethers.Contract(
            '0x4200000000000000000000000000000000000006',
            abi,
            provider
        );
        
        const filter = contract.filters.Transfer();
        const events = await contract.queryFilter(filter, -100, 'latest');
        
        events.forEach(event => {
            console.log('From:', event.args.from);
            console.log('To:', event.args.to);
            console.log('Value:', ethers.formatEther(event.args.value));
        });
        
        return events;
    }
    
    getLogs();
    import { createPublicClient, http, parseAbiItem } from 'viem';
    import { base } from 'viem/chains';
    
    const client = createPublicClient({
        chain: base,
        transport: http('https://go.getblock.io/<ACCESS-TOKEN>/')
    });
    
    async function getLogs() {
        const logs = await client.getLogs({
            address: '0x4200000000000000000000000000000000000006',
            event: parseAbiItem('event Transfer(address indexed from, address indexed to, uint256 value)'),
            fromBlock: 'pending',
            toBlock: 'latest'
        });
        
        logs.forEach(log => {
            console.log('From:', log.args.from);
            console.log('To:', log.args.to);
            console.log('Value:', log.args.value);
        });
        
        return logs;
    }
    
    // Watch for new logs
    async function watchLogs() {
        const unwatch = client.watchEvent({
            address: '0x4200000000000000000000000000000000000006',
            event: parseAbiItem('event Transfer(address indexed from, address indexed to, uint256 value)'),
            onLogs: logs => {
                logs.forEach(log => {
                    console.log('New Transfer:', log.args);
                });
            }
        });
        
        return unwatch;
    }
    
    getLogs();

    Click "Create New Endpoint" or the "+" button

    1. Select:

      • Protocol: Solana (SOL)

      • Network: Mainnet

      • API Interface: JSON-RPC or WebSocket or MEV protected (JSON-RPC)

      • Region: Frankfurt (EU), New York (US), or Singapore (APAC)

    1. Click "Create": Your endpoint URL will be generated immediately.

    3

    Copy Your Endpoint URL

    Your endpoint URL looks like this:

    https://go.getblock.io/a1b2c3d4e5f6789012345678abcdef01/

    The long string after go.getblock.io/ is your access token — keep it private.

    4

    Test the Connection

    curl -X POST https://go.getblock.io/<YOUR-ACCESS-TOKEN
    
    {
      "jsonrpc": "
    

    WebSocket stability

    Frequent disconnects

    Persistent connections

    getProgramAccounts support

    Usually blocked

    Available

    MEV protection

    None

    Available (Dedicated)

    gRPC streaming (Yellowstone)

    Not available

    Available as add-on

    Archive/historical data

    Limited

    Full history

    Transaction landing rate

    Low priority

    High via LandFirst

    Protobuf encoding: parsed, typed data instead of base64

    Solana Indexed Archive

  • Configure a Dedicated Solana Node

  • https://go.getblock.io/<YOUR-ACCESS-TOKEN>/
    import requests
    
    url = "https://go.getblock.io/<YOUR-ACCESS-TOKEN>/"
    headers = {"Content-Type": "application/json"}
    
    # Get token accounts for a wallet
    payload = {
        "jsonrpc": "2.0",
        "id": 1,
        "method": "getTokenAccountsByOwner",
        "params": [
            "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
            {"programId": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"},
            {"encoding": "jsonParsed"}
        ]
    }
    
    response = requests.post(url, headers=headers, json=payload)
    accounts = response.json()["result"]["value"]
    for acc in accounts:
        info = acc["account"]["data"]["parsed"]["info"]
        print(f"Token: {info['mint']}, Amount: {info['tokenAmount']['uiAmountString']}")
    use solana_client::rpc_client::RpcClient;
    use solana_sdk::pubkey::Pubkey;
    use std::str::FromStr;
    
    fn main() {
        let client = RpcClient::new("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/");
        
        // Get current slot
        let slot = client.get_slot().unwrap();
        println!("Current slot: {}", slot);
        
        // Get balance
        let pubkey = Pubkey::from_str("7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU").unwrap();
        let balance = client.get_balance(&pubkey).unwrap();
        println!("Balance: {} SOL", balance as f64 / 1e9);
    }
    wss://go.getblock.io/<YOUR-ACCESS-TOKEN>/
    import WebSocket from "ws";
    
    const ws = new WebSocket("wss://go.getblock.io/<YOUR-ACCESS-TOKEN>/");
    
    ws.on("open", () => {
      // Subscribe to SOL balance changes for an address
      ws.send(JSON.stringify({
        jsonrpc: "2.0",
        id: 1,
        method: "accountSubscribe",
        params: [
          "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
          { encoding: "jsonParsed", commitment: "confirmed" }
        ]
      }));
    });
    
    ws.on("message", (data) => {
      const msg = JSON.parse(data);
      if (msg.method === "accountNotification") {
        console.log("Account updated:", msg.params.result.value);
      }
    });
    // Monitor Raydium AMM trades
    ws.send(JSON.stringify({
      jsonrpc: "2.0",
      id: 2,
      method: "logsSubscribe",
      params: [
        { mentions: ["675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"] },  // Raydium v4
        { commitment: "confirmed" }
      ]
    }));

    Rate limits

    Aggressive (2-5 RPS)

    Up to 500 RPS

    getSignaturesForAddress depth

    Often limited to recent

    Full history available

    Step-by-Step: Get Your Solana RPC Endpoint

    Create a GetBlock Account

    Create a Solana Endpoint

    Code Examples

    WebSocket for Real-Time Solana Data

    Why You Need a Dedicated RPC Provider for Solana

    Advanced Solana Infrastructure on GetBlock

    1. Yellowstone gRPC (Geyser Plugin)

    2. StreamFirst: Ultra-Low Latency Data

    3. LandFirst: Smart Transaction Routing

    4. TradeFirst — Complete HFT Infrastructure

    What's Next?

    GetBlock Dashboard
    Learn more about Yellowstone gRPC
    Learn more about StreamFirst
    Learn more about LandFirst
    Learn more about TradeFirst
    Full Solana API Reference
    Yellowstone gRPC Quickstart
    How to Track Pump.fun Token Mints
    Sniping New Solana Tokens (Python Tutorial)
    Talk to our team
    import { Connection, PublicKey, LAMPORTS_PER_SOL } from "@solana/web3.js";
    
    const connection = new Connection(
      "https://go.getblock.io/<YOUR-ACCESS-TOKEN>/",
      "confirmed"
    );
    
    // Get current slot
    const slot = await connection.getSlot();
    console.log("Current slot:", slot);
    
    // Get SOL balance
    const pubkey = new PublicKey("7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU");
    const balance = await connection.getBalance(pubkey);
    console.log(`Balance: ${balance / LAMPORTS_PER_SOL} SOL`);
    
    // Get recent blockhash (needed for transactions)
    const { blockhash } = await connection.getLatestBlockhash();
    console.log("Blockhash:", blockhash);
    from solana.rpc.api import Client
    from solders.pubkey import Pubkey
    
    client = Client("https://go.getblock.io/<YOUR-ACCESS-TOKEN>/")
    
    # Get current slot
    slot = client.get_slot()
    print(f"Current slot: {slot.value}")
    
    # Get SOL balance
    pubkey = Pubkey.from_string("7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU")
    balance = client.get_balance(pubkey)
    print(f"Balance: {balance.value / 1e9} SOL")
    
    # Get recent transactions for an address
    sigs = client.get_signatures_for_address(pubkey, limit=5)
    for sig in sigs.value:
        print(f"  TX: {sig.signature}")

    You're competing on speed rather than privacy

  • You need broad validator visibility quickly

  • For MEV-sensitive transactions, see Private Transactions instead.

    wss://go.getblock.io/<ACCESS_TOKEN>
    blxr_tx
    Parameter
    Type
    Required
    Description

    nonce

    int

    Yes

    1

    Set up the project

    mkdir transaction-public-mempool
    cd transaction-public-mempool
    
    mkdir transaction-public-mempool
    cd transaction-public-mempool
    
    2

    Create a new file named index.js. This is where you will make your first call.

    3

    Set the ES module "type": "module" in your package.json.

    4

    Create .env file and add the following:

    5

    Add the following code to index.js:

    6
    7

    Create and Sign Your Transaction

    8

    Submit via WebSocket

    9

    Response

    Priority
    Gas Price
    Use Case

    Standard

    3 gwei

    Regular transfers

    Fast

    5 gwei

    Time-sensitive trades

    1. "nonce too low"

    Your nonce is behind the network state. Fetch the latest:

    1. "insufficient funds"

    Ensure you have enough BNB for both the transaction value and gas:

    1. "replacement transaction underpriced"

    If replacing a pending transaction, increase the gas price by at least 10%:

    1. Transaction not included

    • Increase gas price for higher priority

    • Check that the transaction is valid

    • Verify sufficient balance

    For transactions that need MEV protection, see:

    • Private Transactions — Hidden from public mempool

    • Private Transactions with Tips — Prioritized private submission

    When to Use Public Mempool

    const nonce = await provider.getTransactionCount(wallet.address, 'pending');
    Required = value + (gasPrice × gasLimit)
    const newGasPrice = existingGasPrice * 110n / 100n;

    Sample Request

    How to Submit a Transaction to Public Mempool

    Complete Example: BNB Transfer
    Complete Example: Token Swap on PancakeSwap

    Gas Price Recommendations

    Note: Higher gas prices increase inclusion priority but also increase transaction cost.

    Troubleshooting

    Next Steps

    How to Submit Transaction to Private Mempool

    Learn how to submit transaction to private mempool directly to block builders, protecting you from MEV extraction until it's included in a block.

    When you submit a transaction to the public mempool, it's visible to everyone. MEV bots can:

    • Sandwich your trade: Place orders before and after yours to extract value

    • Front-run you: Copy your trade and execute it first

    • Back-run you: Profit from the price impact you create

    Meanwhile, Private transactions eliminate this exposure by hiding your transactions until they are included.

    Aspect
    Public Mempool
    Private TX

    Use private transactions when:

    • Executing large swaps that could be sandwiched

    • Trading tokens with low liquidity

    • Running strategies you don't want copied

    • Protecting any transaction from front-running

    Parameter
    Type
    Required
    Description
    1

    Set up the project

    2

    Set the ES module "type": "module" in your package.json.

    3

    There are list of builders who should receive the transaction without delay. There are:

    • bloxroute: bloXroute internal builder(default)

    • all: all builders

    • Other options: 48club, blockrazor

    Problem
    Solution

    To increase the priority for inclusion in your private transactions, see

    How to use Bundle

    This guide explains how to submit transaction bundles on BNB Smart Chain using GetBlock's MEV endpoint.

    A bundle is a group of transactions submitted together with a guarantee that either all transactions execute in sequence or none are included. This atomic execution model supports several advanced use cases:

    • Arbitrage: Execute a buy on one DEX and a sell on another within the same block, ensuring both trades complete, or neither does

    • Liquidations: Check a position's health and liquidate it atomically, preventing front-running

    Quickstart guide

    Follow these steps to activate the Solana Yellowstone gRPC add-on on GetBlock

    GetBlock offers with the Solana Geyser gRPC plugin, so you can start using it immediately, without any node setup and maintenance — simply enable the add-on and point your gRPC client at our endpoints.

    • A GetBlock account with a Dedicated Solana Node subscription

    • Your gRPC endpoint URL with access token (found in GetBlock dashboard)

    The Yellowstone gRPC add-on to Solana currently requires a subscription on GetBlock. Here’s how to set it up with gRPC API:

    >
    /
    \
    -H "Content-Type: application/json" \
    -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getSlot",
    "params": []
    }'
    2.0
    "
    ,
    "result": 298765432,
    "id": 1
    }
    spinner
    npm init -y
    npm install ws ethers dotenv
    yarn init -y
    yarn ws ethers dotenv

    Transaction count for your address

    to

    string

    Yes

    Recipient address

    value

    BigInt

    Yes

    Amount in wei

    gasPrice

    BigInt

    Yes

    Gas price (minimum 3 gwei)

    gasLimit

    int

    Yes

    Gas limit for execution

    data

    string

    No

    Calldata for contract calls

    chainId

    int

    Yes

    56 for BSC Mainnet

    Urgent

    10+ gwei

    Competitive scenarios

    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "blxr_tx",
      "params": ["0x<signed_transaction_hex>"]
    }
    {
      "jsonrpc": "2.0",
      "id": 1,
      "result": "0x<transaction_hash>"
    }
    import WebSocket from "ws";
    import { ethers } from "ethers";
    import "dotenv/config";
    
    const PRIVATE_KEY = process.env.PRIVATE_KEY;
    const RPC_URL = process.env.RPC_URL;
    const provider = new ethers.JsonRpcProvider(RPC_URL);
    const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
    
    
    // Get current nonce
    const nonce = await provider.getTransactionCount(wallet.address);
    
    // Build transaction
    const tx = {
      nonce: nonce,
      to: "0xd26ea0f03100358b2Ebd4c9638f042aAda9a1BcF",
      value: ethers.parseEther("0.001"),
      gasPrice: ethers.parseUnits("3", "gwei"), // Minimum 3 gwei for BSC
      gasLimit: 21000,
      chainId: 56, // BSC Mainnet
    };
    
    // Sign transaction
    const signedTx = await wallet.signTransaction(tx); // e.g. "0xabcdef..."
    const signedTxNoPrefix = signedTx.startsWith("0x")
      ? signedTx.slice(2)
      : signedTx;
    
    console.log(signedTxNoPrefix);
    
    const ws = new WebSocket(process.env.ACCESS_TOKEN);
    ws.on("open", () => {
      ws.send(
        JSON.stringify({
          jsonrpc: "2.0",
          id: 1,
          method: "blxr_tx",
          params: {"transaction": signedTxNoPrefix},
        }),
      );
    });
    
    ws.on("message", (data) => {
      const response = JSON.parse(data);
      if (response.result?.txHash) {
      const hash = response.result.txHash;
      console.log("TX Hash:", hash);
      console.log(`https://bscscan.com/tx/${hash}`);
    } else if (response.error) {
        console.error("❌ Error:", response.error.message);
      }
    
      ws.close();
    });

    Inclusion speed

    Gas price dependent

    Builder dependent

    Best for

    Speed-competitive scenarios

    Value-sensitive trades

    mev_builders

    array

    No

    Builders to send to. Default: ["all"]

    Create a file and name it index.js

    4

    Create .env file and add the following:

    5

    Import the dependencies

    6

    Create and Sign Your Transaction

    7

    Submit Privately

    8

    Response

    ,
    jetbldr
    ,
    nodereal

    Visibility

    Everyone sees it

    Only builders see it

    MEV exposure

    Vulnerable

    Protected

    transaction

    string

    Yes

    Transaction not included

    Without a priority tip, private transactions compete based on gas fees alone. If your transaction isn't being included:

    • Increase gas price — Higher gas = higher priority for builders

    • Add a priority tip — See Private Transactions with Tips

    • Try specific builders — Some builders may be more responsive

    "Invalid transaction"

    • Verify your transaction is properly signed

    • Check the chain ID is 56 (BSC Mainnet)

    • Ensure the nonce is correct

    Connection issues

    • Verify your API key is valid

    • Check network connectivity

    • Try reconnecting after a few seconds

    Private TX vs Public Mempool

    When to Use Private Transactions

    Request Sample

    How to Submit Transaction to Private Mempool

    Complete Example: Private BNB Transfer
    Complete Example: MEV-Protected PancakeSwap Trade

    Selecting Specific Builders

    Troubleshooting

    Next Steps

    Private Transactions with Tips.

    Signed raw transaction hex

    ACCESS_TOKEN=your-accelerated-node-endpoint
    RPC_URL=your-normal-bsc-node-endppoint //e.g https
    PRIVATE_KEY=your-wallet-private-key
    TO_ADDRESS=the-receiver-address
    import WebSocket from "ws";
    import { ethers } from "ethers";
    import "dotenv/config";
    const PRIVATE_KEY = process.env.PRIVATE_KEY;
    const RPC_URL = process.env.RPC_URL;
    const provider = new ethers.JsonRpcProvider(RPC_URL);
    const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
    
    // Get current nonce
    const nonce = await provider.getTransactionCount(wallet.address);
    // Build transaction
    const tx = {
      nonce: nonce,
      to: process.env.TO_ADDRESS,
      value: ethers.parseEther("0.001"),
      gasPrice: ethers.parseUnits("3", "gwei"), // Minimum 3 gwei for BSC
      gasLimit: 21000,
      chainId: 56, // BSC Mainnet
    };
    // Sign transaction
    const signedTx = await wallet.signTransaction(tx); 
    const signedTxNoPrefix = signedTx.startsWith("0x")
      ? signedTx.slice(2)
      : signedTx;
    const ws = new WebSocket(process.env.ACCESS_TOKEN);
    ws.on("open", () => {
      ws.send(
        JSON.stringify({
          jsonrpc: "2.0",
          id: 1,
          method: "blxr_tx",
          params: {"transaction": signedTxNoPrefix},
        }),
      );
    });
    ws.on("message", (data) => {
      const response = JSON.parse(data);
      if (response.result?.txHash) {
      const hash = response.result.txHash;
      console.log("TX Hash:", hash);
      console.log(`https://bscscan.com/tx/${hash}`);
    } else if (response.error) {
        console.error("❌ Error:", response.error.message);
      }
      ws.close();
    });
    01f86c380384b2d05e0082520894d26ea0f03100358b2ebd4c9638f042aada9a1bcf87038d7ea4c6800080c001a04647f98754480337ae409bcc225f2d62b706b47f31385221421cea20e41080b0a03ae32f07bb7110c4153c2ab121c152db7d3030d54cc0c5341f0b75b20e3d439d
    TX Hash: 00d4fe2db5c667ce549318cf621913af1bcb130022ec51020cbb6cae2b7eedce
    https://bscscan.com/tx/00d4fe2db5c667ce549318cf621913af1bcb130022ec51020cbb6cae2b7eedce
    import WebSocket from 'ws';
    import { ethers } from 'ethers';
    import 'dotenv/config';
    
    const PRIVATE_KEY = process.env.PRIVATE_KEY;
    const RPC_URL = process.env.RPC_URL;
    
    const PANCAKE_ROUTER = '0x10ED43C718714eb63d5aA57B78B54704E256024E';
    const WBNB = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c';
    
    async function swapBNBForToken(tokenAddress, amountBNB, minAmountOut) {
      const provider = new ethers.JsonRpcProvider(RPC_URL);
      const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
      
      // Router ABI
      const routerABI = [
        'function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable'
      ];
      const router = new ethers.Contract(PANCAKE_ROUTER, routerABI, wallet);
      
      // Build swap calldata
      const deadline = Math.floor(Date.now() / 1000) + 300;  // 5 minutes
      const swapData = router.interface.encodeFunctionData('swapExactETHForTokens', [
        minAmountOut,
        [WBNB, tokenAddress],
        wallet.address,
        deadline
      ]);
      
      // Get nonce
      const nonce = await provider.getTransactionCount(wallet.address);
      
      // Build transaction
      const tx = {
        nonce: nonce,
        to: PANCAKE_ROUTER,
        value: ethers.parseEther(amountBNB),
        data: swapData,
        gasPrice: ethers.parseUnits('3', 'gwei'),
        gasLimit: 300000,  // Higher gas limit for swaps
        chainId: 56
      };
      
      // Sign transaction
      const signedTx = await wallet.signTransaction(tx);
      const signedTxNoPrefix = signedTx.startsWith("0x")
     ? signedTx.slice(2)
     : signedTx;
      
      console.log('Swap details:');
      console.log('  Amount:', amountBNB, 'BNB');
      console.log('  Token:', tokenAddress);
      console.log('  Min out:', ethers.formatEther(minAmountOut));
      
      // Submit via BDN
     const ws = new WebSocket(`wss://go.getblock.io/${process.env.ACCESS_TOKEN}`);
      
      return new Promise((resolve, reject) => {
        ws.on('open', () => {
          ws.send(JSON.stringify({
            jsonrpc: '2.0',
            id: 1,
            method: "blxr_tx",
            params: {"transaction": signedTxNoPrefix},
          }));
        });
        
        ws.on('message', (data) => {
          const response = JSON.parse(data);
          ws.close();
          
          if (response.result) {
            console.log('\n✅ Swap submitted!');
            console.log('TX Hash:', response.result);
            resolve(response.result);
          } else {
            console.error('\n❌ Error:', response.error);
            reject(response.error);
          }
        });
      });
    }
    
    // Usage: Swap 0.001 BNB for BUSD
    swapBNBForToken(
      '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',  // BUSD
      '0.001',                                          // 0.001 BNB
      ethers.parseEther('50')                         // Min 50 BUSD
    ).catch(console.error);
    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "bsc_private_tx",
      "params": {
        "transaction": "0xf86c...",
        "mev_builders": ["all"]
      }
    }
    {
      "jsonrpc": "2.0",
      "id": 1,
      "result": {
        "txHash": "0x..."
      }
    }
    ACCESS_TOKEN=your-accelerated-node-endpoint
    RPC_URL=your-normal-bsc-node-endppoint //e.g https
    PRIVATE_KEY=your-wallet-private-key
    import WebSocket from 'ws';
    import { ethers } from 'ethers';
    import 'dotenv/config';
    
    const PRIVATE_KEY = process.env.PRIVATE_KEY;
    const RPC_URL = process.env.RPC_URL
    const provider = new ethers.JsonRpcProvider(RPC_URL);
    const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
    
    // Get current nonce
    const nonce = await provider.getTransactionCount(wallet.address);
    
    // Build transaction
    const tx = {
      nonce: nonce,
      to: '0xRECIPIENT_ADDRESS',
      value: ethers.parseEther('0.1'),
      gasPrice: ethers.parseUnits('3', 'gwei'),
      gasLimit: 21000,
      chainId: 56
    };
    
    // Sign transaction
    const signedTx = await wallet.signTransaction(tx);
    const ws = new WebSocket(`wss://go.getblock.io/${process.env.ACCESS_TOKEN}`);
    
    ws.on('open', () => {
      ws.send(JSON.stringify({
        jsonrpc: '2.0',
        id: 1,
        method: 'bsc_private_tx',
        params: {
          transaction: signedTx,
          mev_builders: ['all']
        }
      }));
    });
    
    ws.on('message', (data) => {
      const response = JSON.parse(data);
      
      if (response.result) {
        console.log('✅ Private TX submitted!');
        console.log('TX Hash:', response.result.txHash);
      } else {
        console.error('❌ Error:', response.error);
      }
      
      ws.close();
    });
    Wallet: 0xD1AF2dAc4e0a....
    Recipient: 0xd26ea.....
    Amount: 0.001 BNB
    Mode: Private (MEV Protected)
    
    Submitting private transaction...
    
    ✅ Private transaction submitted!
    TX Hash: 14223ac9adf33b77e4b52e8612dd351517b1bbc5b771567089994a6183f46df2
    BSCScan: https://bscscan.com/tx/14223ac9adf33b77e4b52e8612dd351517b1bbc5b771567089994a6183f46df2
    wss://go.getblock.io/<ACCESS_TOKEN>
    bsc_private_tx
    mkdir transaction-private-mempool
    cd transaction-private-mempool
    npm init -y
    npm install ws ethers dotenv
    mkdir transaction-private-mempool
    cd transaction-private-mempool
    yarn init -y
    yarn ws ethers
    params: {
      transaction: signedTx,
      mev_builders: ['48club', 'bloxroute']  // Specific builders only
    }
    import WebSocket from "ws";
    import { ethers } from "ethers";
    import "dotenv/config";
    
    const PRIVATE_KEY = process.env.PRIVATE_KEY;
    const RPC_URL = process.env.RPC_URL;
    
    async function sendPrivateTransaction(recipient, amountBNB) {
      const provider = new ethers.JsonRpcProvider(RPC_URL);
      const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
    
      console.log("Wallet:", wallet.address);
      console.log("Recipient:", recipient);
      console.log("Amount:", amountBNB, "BNB");
      console.log("Mode: Private (MEV Protected)");
    
      // Get nonce
      const nonce = await provider.getTransactionCount(wallet.address);
    
      // Build transaction
      const signedTx = await wallet.signTransaction({
        nonce: nonce,
        to: recipient,
        value: ethers.parseEther(amountBNB),
        gasPrice: ethers.parseUnits("3", "gwei"),
        gasLimit: 21000,
        chainId: 56,
      });
    const signedTxNoPrefix = signedTx.startsWith("0x")
      ? signedTx.slice(2)
      : signedTx;
    
    
      // Submit privately
      const ws = new WebSocket(process.env.ACCESS_TOKEN);
    
      return new Promise((resolve, reject) => {
        ws.on("open", () => {
          console.log("\nSubmitting private transaction...");
    
          ws.send(
            JSON.stringify({
              jsonrpc: "2.0",
              id: 1,
              method: "bsc_private_tx",
              params: {
                transaction: signedTxNoPrefix,
                mev_builders: ["all"],
              },
            }),
          );
        });
    
        ws.on("message", (data) => {
          const response = JSON.parse(data);
          ws.close();
    
          if (response.result) {
            console.log("\n✅ Private transaction submitted!");
            console.log("TX Hash:", response.result.txHash);
            console.log(
              "BSCScan:",
              `https://bscscan.com/tx/${response.result.txHash}`,
            );
            resolve(response.result.txHash);
          } else {
            console.error("\n❌ Error:", response.error);
            reject(response.error);
          }
        });
    
        ws.on("error", reject);
      });
    }
    
    // Usage
    sendPrivateTransaction(process.env.TO_ADDRESS, "0.001").catch(console.error);
    
    import  WebSocket from 'ws';
    import { ethers } from 'ethers';
    import 'dotenv/config';
    
    const PRIVATE_KEY = process.env.PRIVATE_KEY;
    const RPC_URL = process.env.RPC_URL;
    const PANCAKE_ROUTER = '0x10ED43C718714eb63d5aA57B78B54704E256024E';
    const WBNB = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c';
    
    async function privateSwap(tokenAddress, amountBNB, minAmountOut) {
      const provider = new ethers.JsonRpcProvider(RPC_URL);
      const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
      
      // Router ABI
      const routerABI = [
        'function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable'
      ];
      const router = new ethers.Contract(PANCAKE_ROUTER, routerABI, wallet);
      
      // Build swap calldata
      const deadline = Math.floor(Date.now() / 1000) + 300;
      const swapData = router.interface.encodeFunctionData('swapExactETHForTokens', [
        minAmountOut,
        [WBNB, tokenAddress],
        wallet.address,
        deadline
      ]);
      
      // Get nonce
      const nonce = await provider.getTransactionCount(wallet.address);
      
      // Sign transaction
      const signedTx = await wallet.signTransaction({
        nonce: nonce,
        to: PANCAKE_ROUTER,
        value: ethers.parseEther(amountBNB),
        data: swapData,
        gasPrice: ethers.parseUnits('3', 'gwei'),
        gasLimit: 300000,
        chainId: 56
      });
      
      console.log('Swap details:');
      console.log('  Amount:', amountBNB, 'BNB');
      console.log('  Token:', tokenAddress);
      console.log('  Min out:', ethers.formatEther(minAmountOut));
      console.log('  Mode: Private (MEV Protected)');
      
      // Submit privately
      const ws = new WebSocket(`wss://go.getblock.io/${process.env.ACCESS_TOKEN}`);
      
      return new Promise((resolve, reject) => {
        ws.on('open', () => {
          ws.send(JSON.stringify({
            jsonrpc: '2.0',
            id: 1,
            method: 'bsc_private_tx',
            params: {
              transaction: signedTx,
              mev_builders: ['all']
            }
          }));
        });
        
        ws.on('message', (data) => {
          const response = JSON.parse(data);
          ws.close();
          
          if (response.result) {
            console.log('\n✅ Private swap submitted!');
            console.log('TX Hash:', response.result.txHash);
            console.log('BSCScan:', `https://bscscan.com/tx/${response.result.txHash}`);
            resolve(response.result.txHash);
          } else {
            console.error('\n❌ Error:', response.error);
            reject(response.error);
          }
        });
      });
    }
    
    // Usage: Swap 1 BNB for BUSD (MEV protected)
    privateSwap(
      '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',  // BUSD
      '1.0',                                          // 1 BNB
      ethers.parseEther('200')                        // Min 200 BUSD
    ).catch(console.error);

    Complex strategies: Coordinate multi-step transactions with guaranteed execution order

    Before submitting bundles, ensure you have:

    • A GetBlock API key with MEV endpoint access

    • Node.js v16 or later

    • A funded BSC wallet with sufficient BNB for all transactions and gas

    Connect to the MEV WebSocket endpoint with your API key:

    wss://go.getblock.io/<ACCESS_TOKEN>
    Parameter
    Type
    Required
    Description

    transactions

    array

    Submit bundles using the mev_sendBundle method:

    A successful submission returns a bundle hash:

    1

    Set up the project

    mkdir bundle-example
    cd bundle-example
    
    
    mkdir bundle-example
    cd bundle-example
    
    
    2

    Create a new file named index.js. This is where you will make your first call.

    3

    Set the ES module "type": "module" in your package.json.

    4

    Create .env file and add the following:

    5

    Add the following code to index.js:

    The following example demonstrates a simple BNB transfer with a priority fee:

    6

    Run the code using this command:

    7

    Sample response

    Choose the appropriate method based on your use case:

    Aspect

    bsc_privateTx

    mev_sendBundle

    Transaction count

    Single

    Multiple

    Atomicity

    Not applicable

    1. Use Sequential Nonces

    All transactions in a bundle must have consecutive nonces starting from your wallet's current nonce:

    2. Include a Priority Fee

    Adding a fee payment as the final transaction increases the likelihood of bundle inclusion:

    The blocks_count parameter determines how long your bundle remains valid. Shorter validity periods signal higher urgency to builders:

    Use Case
    Recommended blocks_count

    Time-sensitive arbitrage

    2–3

    Standard bundles

    5

    Less urgent operations

    10–20

    Test your transaction logic before submitting a bundle by simulating each transaction:

    Problem
    Solution

    Bundle Not Included

    If your bundle is not included after the specified block count:

    • Increase the priority fee — Add a higher fee payment transaction

    • Verify nonce sequence — Nonces must be strictly consecutive with no gaps

    • Reduce blocks_count — Shorter validity signals higher priority to builders

    "Invalid bundle" Error

    This error indicates a formatting or validation issue:

    • Check parameter format — The transactions parameter must be an array; mev_builders must be an object

    • Verify signatures — All transactions must be properly signed

    Partial Execution

    Bundles execute atomically, so partial execution should not occur. If you observe partial execution:

    • Contact support — This indicates a potential builder issue

    • Verify using the bundle hash — Check the bundle status on a block explorer

    const nonce = await provider.getTransactionCount(wallet.address);
    
    // Transaction 1: nonce
    // Transaction 2: nonce + 1
    // Transaction 3: nonce + 2
    const feeTx = await wallet.signTransaction({
      nonce: lastNonce,
      to: '0x6374Ca2da5646C73Eb444aB99780495d61035f9b',
      value: ethers.parseEther('0.001'),
      gasPrice: ethers.parseUnits('3', 'gwei'),
      gasLimit: 21000,
      chainId: 56
    });
    await provider.call({
      to: tx1.to,
      data: tx1.data,
      value: tx1.value
    });

    Prerequisites

    Sample Request

    Example

    Example: DEX Arbitrage

    This example demonstrates a complete arbitrage strategy: buying a token on PancakeSwap V2 and selling on PancakeSwap V3 within the same block, with an optional priority fee.
    Address
    Purpose

    Comparing Bundles and Private Transactions

    Best Practices

    Choose an Appropriate blocks_count Value

    Simulate Before Submitting

    Troubleshooting

  • Sign up / log in: Create an account at GetBlock.io or log in to your existing account.

  • Deploy a dedicated Solana node:

    1. Go to your user dashboard, switch the tab to “Dedicated nodes”, and scroll down to “My endpoints”

    2. Choose Solana under “Protocol”, set the network to mainnet.

    3. Click on Get.

    1. Enable the gRPC add-on: In Step 3 (Select API and Add‑ons) of your node setup, check Yellowstone gRPC under Add‑ons.

    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:

    Stream Field
    Proto Name
    What You Get

    slots

    slots: SlotsFilter

    Slot numbers as they’re processed by leader

    blocks

    blocks: BlocksFilter

    Block metadata (slot, parent slot, timestamp)

    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:

    cd go-client
    go mod tidy
    go run main.go

    Make sure the following dependencies are installed:

    go get github.com/rpcpool/yellowstone-grpc/examples/golang@latest
    go get google.golang.org/grpc@latest

    Go Example (go-client/main.go):

    import (
       "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())
       }
    }

    Make sure you clone the Yellowstone repo (for the examples.grpc module):

    git clone https://github.com/rpcpool/yellowstone-grpc
    export PYTHONPATH=$PYTHONPATH:$(pwd)/yellowstone-grpc/examples/python

    Python Example (python-client/stream.py):

    from 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)

    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.


    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.

    Prerequisites

    Enabling the Solana gRPC add-on on GetBlock

    SOL nodes
    Dedicated Node
    // 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-grpc
    import 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);
    

    All Dedicated Node plan subscribers receive the Yellowstone gRPC API at no extra cost together with their Solana node.

    Get your gRPC endpoint

    Endpoint & authentication

    Your node’s region is locked in when you deploy it, during the setup flow. Once the node is provisioned in that region, all your endpoint URLs will correspond to the location you selected.

    GetBlock provides a single TLS endpoint – you don’t need to open or configure a different port for gRPC access.

    Subscribing to Data Streams: Code examples

    All filters can be combined in the same request.

    1. CLI (using grpcurl)

    2. Using a high‑level SDK (Node.js / TypeScript)

    3. Python, Rust, and Go streaming examples

    Unary RPC methods

    Yellowstone gRPC best practices

    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.

    💬 Need help?

  • 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.

    blocksMeta

    blocksMeta: BlocksFilter

    Block metadata + transaction counts + status

    accounts

    accounts: AccountsFilter

    Account lamports, owner, executable flag, rent epoch

    accountsDataSlice

    accountsDataSlice: AccountsDataSliceFilter

    Partial account data blobs

    transactions

    transactions: TransactionsFilter

    Full transaction data + meta

    About commitment levels

    Deploying a private Solana node with GetBlock RPC provider
    Configuring a dedicated SOL node on GetBlock

    Validate each transaction — Ensure every transaction in the bundle is valid independently

    Confirm chain ID — Use chain ID 56 for BSC Mainnet

    0x13f4EA83D0bd40E75C8222255bc855a974568Dd4

    PancakeSwap V3 Router

    0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c

    WBNB

    0x6374Ca2da5646C73Eb444aB99780495d61035f9b

    Priority fee recipient

    npm init -y
    npm install ws ethers dotenv
    yarn init -y
    yarn ws ethers dotenv

    Yes

    Array of signed raw transactions (hex-encoded)

    mev_builders

    object

    No

    Target builders. Use {"all": ""} for all builders, or specify individual builders

    blocks_count

    integer

    No

    Number of blocks the bundle remains valid. Default: 5, Maximum: 20

    All-or-nothing execution

    Use cases

    Simple transfers, individual swaps

    Arbitrage, multi-step operations

    Adding priority fees

    Via Multicall3

    Separate transaction in bundle

    mev_builders format

    Array: ["all"]

    Object: {"all": ""}

    0x10ED43C718714eb63d5aA57B78B54704E256024E

    PancakeSwap V2 Router

    Reference Addresses

    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "mev_sendBundle",
      "params": {
        "transactions": ["0xf86c...", "0xf86c..."],
        "mev_builders": { "all": "" },
        "blocks_count": 5
      }
    }
    {
      "jsonrpc": "2.0",
      "id": 1,
      "result": {
        "bundleHash": "0x..."
      }
    }

    Code Example

    cd rust-client
    cargo build
    cargo run
    [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);
       }
    }
    ACCESS_TOKEN=your-accelerated-node-endpoint
    RPC_URL=your-normal-bsc-node-endppoint //e.g https
    PRIVATE_KEY=your-wallet-private-key
    import WebSocket from "ws";
    import { ethers } from "ethers";
    import "dotenv/config";
    const PRIVATE_KEY = process.env.PRIVATE_KEY;
    const RPC_URL = process.env.RPC_URL;
    async function submitBundle() {
      const provider = new ethers.JsonRpcProvider(RPC_URL);
      const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
      // Get the current nonce for your wallet
      const nonce = await provider.getTransactionCount(wallet.address);
      // Transaction 1: First operation
      const tx1 = await wallet.signTransaction({
        nonce: nonce,
        to: DEX_A,
        value: ethers.parseEther("0.001"),
        data: buyCalldata,
        gasPrice: ethers.parseUnits("3", "gwei"),
        gasLimit: 300000,
        chainId: 56,
      });
      // Transaction 2: Second operation (must use nonce + 1)
      const tx2 = await wallet.signTransaction({
        nonce: nonce + 1,
        to: DEX_B,
        value: 0,
        data: sellCalldata,
        gasPrice: ethers.parseUnits("3", "gwei"),
        gasLimit: 300000,
        chainId: 56,
      });
      // Connect to the MEV endpoint
      const ws = new WebSocket(process.env.ACCESS_TOKEN);
    
      ws.on("open", () => {
        ws.send(
          JSON.stringify({
            jsonrpc: "2.0",
            id: 1,
            method: "mev_sendBundle",
            params: {
              transactions: [tx1.slice(2), tx2.slice(2)],
              mev_builders: { all: "" },
              blocks_count: 5,
            },
          }),
        );
      });
      ws.on("message", (data) => {
        const response = JSON.parse(data);
    
        if (response.result) {
          console.log("Bundle submitted successfully");
          console.log("Bundle Hash:", response.result.bundleHash);
        } else {
          console.error("Submission failed:", response.error);
        }
    
        ws.close();
      });
    }
    submitBundle();
    node index.js
    const WebSocket = require('ws');
    const { ethers } = require('ethers');
    import 'dotenv/config';
    
    const PRIVATE_KEY = process.env.PRIVATE_KEY;
    const RPC_URL= process.env.RPC_URL
    
    // Contract addresses
    const PANCAKE_V2_ROUTER = '0x10ED43C718714eb63d5aA57B78B54704E256024E';
    const PANCAKE_V3_ROUTER = '0x13f4EA83D0bd40E75C8222255bc855a974568Dd4';
    const FEE_ADDRESS = '0x6374Ca2da5646C73Eb444aB99780495d61035f9b';
    const WBNB = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c';
    const TOKEN = '0xYOUR_TOKEN';
    
    async function arbitrage() {
      const provider = new ethers.JsonRpcProvider(RPC_URL);
      const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
      
      const nonce = await provider.getTransactionCount(wallet.address);
      const deadline = Math.floor(Date.now() / 1000) + 300;
      
      // Encode the V2 swap
      const v2ABI = [
        'function swapExactETHForTokens(uint256 amountOutMin, address[] path, address to, uint256 deadline) payable'
      ];
      const v2Router = new ethers.Contract(PANCAKE_V2_ROUTER, v2ABI, wallet);
      
      const buyData = v2Router.interface.encodeFunctionData('swapExactETHForTokens', [
        0,  // amountOutMin (set appropriately in production)
        [WBNB, TOKEN],
        wallet.address,
        deadline
      ]);
      
      // Transaction 1: Buy on PancakeSwap V2
      const tx1 = await wallet.signTransaction({
        nonce: nonce,
        to: PANCAKE_V2_ROUTER,
        value: ethers.parseEther('1.0'),
        data: buyData,
        gasPrice: ethers.parseUnits('3', 'gwei'),
        gasLimit: 300000,
        chainId: 56
      });
      
      // Transaction 2: Sell on PancakeSwap V3
      // Note: V3 uses a different interface; replace with your actual V3 swap calldata
      const tx2 = await wallet.signTransaction({
        nonce: nonce + 1,
        to: PANCAKE_V3_ROUTER,
        value: 0,
        data: '0x...',  // Your V3 swap calldata
        gasPrice: ethers.parseUnits('3', 'gwei'),
        gasLimit: 300000,
        chainId: 56
      });
      
      // Transaction 3: Priority fee (optional but recommended)
      const tx3 = await wallet.signTransaction({
        nonce: nonce + 2,
        to: FEE_ADDRESS,
        value: ethers.parseEther('0.001'),
        gasPrice: ethers.parseUnits('3', 'gwei'),
        gasLimit: 21000,
        chainId: 56
      });
      
      // Submit the bundle
      const ws = new WebSocket(process.env.ACCESS_TOKEN);
      
      return new Promise((resolve, reject) => {
        ws.on('open', () => {
          ws.send(JSON.stringify({
            jsonrpc: '2.0',
            id: 1,
            method: 'mev_sendBundle',
            params: {
              transactions: [tx1, tx2, tx3],
              mev_builders: { all: '' },
              blocks_count: 3  // Short validity for time-sensitive arbitrage
            }
          }));
        });
        
        ws.on('message', (data) => {
          const response = JSON.parse(data);
          ws.close();
          
          if (response.result) {
            console.log('Bundle submitted successfully');
            console.log('Bundle Hash:', response.result.bundleHash);
            resolve(response.result.bundleHash);
          } else {
            console.error('Submission failed:', response.error);
            reject(response.error);
          }
        });
      });
    }
    
    arbitrage();

    How to Subscribe to Stream

    Learn how to direct real-time access to transaction and block streams sourced from the BDN, bypassing RPC node-level execution and processing entirely.

    Stream subscription provides you with direct access to blockchain data as it propagates through the BDN network. This is very good for users e.g traders who want to get data earlier e.g new released token With a stream subscription, you enjoy:

    • Faster blocks: Receive new blocks before standard RPC propagation

    • Mempool access: See pending transactions before they're mined

    Lower latency: Edge infrastructure minimizes network hops

    Here, you will be checking if you are connected to streams

    wss://go.getblock.io/<ACCESS_TOKEN>
    index.js
    //npm install ws dotenv
    import
    
    > bsc-node@1.0.0 start
    > node index.js
    
    Connected

    To subscribe to streams, there are four parameters you can make use of as seen below:

    Stream
    Description
    Use Case

    bdnBlocks

    New blocks with headers and transactions

    Block monitoring, analytics

    newTxs

    New transactions entering mempool

    MEV detection, copy trading

    Subscribe to new blocks as they're produced.

    Include Options

    Field
    Description

    header

    Block header (number, hash, timestamp, gasUsed, gasLimit)

    transactions

    Full transaction list

    hash

    Block hash only

    Example: Subscribe to Blocks

    subscribe-blocks.js
    import WebSocket from "ws";
    import "dotenv/config";
    
    const ws = new WebSocket(`wss://go.getblock.io/${process.env.ACCESS_TOKEN}`);
    
    ws.on("open", () => {
      console.log("Connected");
    
      // Subscribe to new blocks
      ws.send(
        JSON.stringify({
          jsonrpc: "2.0",
          id: 1,
          method: "subscribe",
          params: ["bdnBlocks", { include: ["header", "transactions", "hash"] }],
        }),
      );
    });
    
    ws.on("message", (data) => {
      const message = JSON.parse(data);
    
      // Subscription confirmation
      if (message.id === 1 && message.result) {
        console.log("Subscribed! ID:", parseInt(message.result));
        return;
      }
    
      // Block notification
      if (message.params?.result) {
        const block = message.params.result;
        console.log("New block:", {
          number: parseInt(block.header.number, 16),
          hash: block.header.hash,
          txCount: block.transactions?.length || 0,
        });
      }
    });
    
    Connected
    Subscribed! ID: 9
    New block: { number: 84411561, hash: undefined, txCount: 86 }
    New block: { number: 84411562, hash: undefined, txCount: 105 }
    New block: { number: 84411563, hash: undefined, txCount: 66 }
    New block: { number: 84411564, hash: undefined, txCount: 66 }
    New block: { number: 84411565, hash: undefined, txCount: 78 }
    New block: { number: 84411566, hash: undefined, txCount: 93 }
    New block: { number: 84411567, hash: undefined, txCount: 63 }

    Subscribe to mempool transactions as they propagate through the network.

    Include Options

    Field
    Description

    tx_hash

    Transaction hash

    from

    Sender address

    to

    Recipient address

    Filters

    Reduce bandwidth by filtering server-side:

    Filter
    Type
    Description

    to

    array

    Transaction recipient addresses

    from

    array

    Transaction sender addresses

    Example: Monitor PancakeSwap Transactions

    monitor-pancakeswap.js
    import WebSocket from "ws";
    import { ethers } from "ethers";
    import "dotenv/config";
    
    const PANCAKE_ROUTER = "0x10ED43C718714eb63d5aA57B78B54704E256024E";
    
    const SWAP_METHODS = {
      "0x38ed1739": "swapExactTokensForTokens",
      "0x7ff36ab5": "swapExactETHForTokens",
      "0x18cbafe5": "swapExactTokensForETH",
      "0xfb3bdb41": "swapETHForExactTokens",
      "0x5c11d795": "swapExactTokensForTokensSupportingFeeOnTransferTokens",
      "0xb6f9de95": "swapExactETHForTokensSupportingFeeOnTransferTokens",
    };
    
    function monitorPancakeSwap() {
      const ws = new WebSocket(`wss://go.getblock.io/${process.env.ACCESS_TOKEN}`);
    
      ws.on("open", () => {
        console.log("🔌 Connected to BSC stream");
        console.log("📊 Monitoring PancakeSwap...\n");
    
        ws.send(
          JSON.stringify({
            jsonrpc: "2.0",
            id: 1,
            method: "subscribe",
            params: [
              "pendingTxs",
              {
                include: ["tx_hash", "from", "to", "value", "input", "gas_price"],
                filters: {
                  to: [PANCAKE_ROUTER],
                },
              },
            ],
          }),
        );
      });
    
      ws.on("message", (data) => {
        const msg = JSON.parse(data);
    
        // Subscription confirmed
        if (msg.id === 1) {
          console.log("✅ Subscribed to PancakeSwap transactions\n");
          return;
        }
    
        // New transaction
        if (msg.params?.result) {
          const tx = msg.params.result;
          const methodId = tx.input?.slice(0, 10);
          const methodName = SWAP_METHODS[methodId] || "unknown";
    
          if (SWAP_METHODS[methodId]) {
            const value = ethers.formatEther(tx.value || "0");
            const gasPrice = ethers.formatUnits(tx.gas_price || "0", "gwei");
    
            console.log("🔄 Swap detected:");
            console.log(`   Hash: ${tx.tx_hash.slice(0, 18)}...`);
            console.log(`   Method: ${methodName}`);
            console.log(`   From: ${tx.from.slice(0, 10)}...`);
            console.log(`   Value: ${value} BNB`);
            console.log(`   Gas: ${gasPrice} gwei`);
            console.log("");
          }
        }
      });
    
      ws.on("close", () => {
        console.log("Disconnected, reconnecting in 5s...");
        setTimeout(monitorPancakeSwap, 5000);
      });
    
      ws.on("error", (err) => {
        console.error("WebSocket error:", err.message);
      });
    }
    
    monitorPancakeSwap();
    
    {
      "tx_hash": "0xdef456...",
      "from": "0xabc...",
      "to": "0x10ED43C718714eb63d5aA57B78B54704E256024E",
      "value": "0x16345785d8a0000",
      "gas_price": "0xb2d05e00",
      "input": "0x38ed1739..."
    }
    import WebSocket from 'ws';
    import 'dotenv/config';
    
    const PANCAKE_ROUTER = '0x10ED43C718714eb63d5aA57B78B54704E256024E';
    
    const SWAP_METHODS = {
      '0x38ed1739': 'swapExactTokensForTokens',
      '0x7ff36ab5': 'swapExactETHForTokens',
      '0x18cbafe5': 'swapExactTokensForETH',
      '0xfb3bdb41': 'swapETHForExactTokens',
    };
    
    function monitorNewTxs() {
      const ws = new WebSocket(`wss://go.getblock.io/${process.env.ACCESS_TOKEN}`);
    
      ws.on('open', () => {
        console.log('Connected to BSC stream');
        console.log('Monitoring confirmed PancakeSwap swaps...\n');
    
        ws.send(JSON.stringify({
          jsonrpc: '2.0',
          id: 1,
          method: 'subscribe',
          params: ['newTxs', {
            include: ['tx_hash', 'from', 'to', 'value', 'input'],
            filters: {
              to: [PANCAKE_ROUTER],
              method_id: Object.keys(SWAP_METHODS)
            }
          }]
        }));
      });
    
      ws.on('message', (data) => {
        const msg = JSON.parse(data);
    
        if (msg.id === 1) {
          console.log('Subscribed to confirmed PancakeSwap transactions\n');
          return;
        }
    
        if (msg.params?.result) {
          const tx = msg.params.result;
          const methodId = tx.input?.slice(0, 10);
          const methodName = SWAP_METHODS[methodId] || 'unknown';
    
          console.log('Confirmed swap:');
          console.log(`  Hash:   ${tx.tx_hash}`);
          console.log(`  Method: ${methodName}`);
          console.log(`  From:   ${tx.from}`);
          console.log(`  To:     ${tx.to}`);
          console.log(`  Value:  ${tx.value}`);
          console.log('');
        }
      });
    
      ws.on('close', () => {
        console.log('Disconnected, reconnecting in 5s...');
        setTimeout(monitorNewTxs, 5000);
      });
    
      ws.on('error', (err) => {
        console.error('WebSocket error:', err.message);
      });
    }
    
    monitorNewTxs();
    
    {
        "jsonrpc":"2.0",
        "id":1,
        "result":"0x11"
    }

    Subscribe to transaction confirmations.

    Include Options

    Field
    Description

    receipt

    Full transaction receipt

    logs

    Event logs emitted

    Example:

    import WebSocket from 'ws';
    import 'dotenv/config';
    
    const ws = new WebSocket(`wss://go.getblock.io/${process.env.ACCESS_TOKEN}`);
    
    ws.on("open", () => {
      console.log("Connected");
    
      // Subscribe to new blocks
      ws.send(JSON.stringify({
        jsonrpc: '2.0',
        id: 1,
        method: 'subscribe',
        params: ['txReceipts', {
          include: ['receipt', 'logs']
        }]
      }));
    });
    
    ws.on("message", (data) => {
      const message = JSON.parse(data);
      console.log(message)})
    { 
      jsonrpc: '2.0', 
      id: 1, 
      result: '0x10' 
    }

    To stop receiving notifications, unsubscribe using the subscription ID:

    unsubscribe.js
    import WebSocket from "ws";
    import "dotenv/config";
    const ws = new WebSocket(`wss://go.getblock.io/${process.env.ACCESS_TOKEN}`);
    ws.on("open", () => {
      console.log("Connected");
    
    ws.send(
      JSON.stringify({
        jsonrpc: "2.0",
        id: 10,
        method: "unsubscribe",
        params: ["23"], // Subscription ID
      }),
    );})
    
    ws.on("message", (data) => {
      const message = JSON.parse(data);
      console.log(JSON.stringify(message, null, 2));
    });
    { 
        jsonrpc: '2.0', 
        id: 10, 
        result: true 
    }

    1. Request Only What You Need

    // ❌ Bad: Request everything
    include: ['tx_contents']  // Large payloads, high bandwidth
    // ✅ Good: Request specific fields
    include: ['tx_hash', 'from', 'to', 'value']  // Small payloads
    1. Use Server-Side Filters

    // ❌ Bad: Filter client-side
    params: ['newTxs', { include: ['tx_contents'] }]
    // Then filter in your code... wasteful!
    // ✅ Good: Filter server-side
    params: ['newTxs', {
      include: ['tx_hash', 'to', 'input'],
      filters: { to: ['0xTargetContract'] }
    }]
    1. Handle Reconnection

    1. Process Messages Asynchronously

    Tier
    Concurrent Subscriptions
    Message Rate

    Standard

    5

    1,000/sec

    Pro

    20

    10,000/sec

    Contact support to upgrade your tier.

    Problem
    Solution

    No messages received

    • Check subscription response—did you receive a subscription ID?

    • Verify filters aren't too restrictive

    • Confirm your API key is valid and active

    High latency

    • Reduce the number of include fields

    • Add filters to reduce message volume

    • Check your network connection

    Missed messages

    • Process messages asynchronously

    • Increase your message queue buffer

    • Consider multiple connections for different streams

    1. Submitting transactions to public mempool with accelerated propagation

    2. Using private transactions for MEV protection or without MEV Protection

    function createConnection() {
      const ws = new WebSocket(`wss://bsc.getblock.io/mev/ws?api_key=${API_KEY}`);
      
      ws.on('close', () => {
        console.log('Disconnected, reconnecting...');
        setTimeout(createConnection, 5000);
      });
      
      ws.on('open', () => {
        // Re-subscribe after reconnect
        subscribeToFeeds(ws);
      });
      
      return ws;
    }
    ws.on('message', async (data) => {
      // Don't block the message loop
      setImmediate(() => {
        processMessage(JSON.parse(data));
      });
    });

    Code Sample

    How to Subscribe to Streams

    1. Block Streams (bdnBlocks)

    2. Transaction Streams (newTxs / pendingTxs)

    3. Transaction Receipts (txReceipts)

    Unsubscribing

    Best Practices

    Rate Limits

    Troubleshooting

    Next Step

    WebSocket
    from
    "
    ws
    "
    ;
    import "dotenv/config";
    const ws = new WebSocket(
    `wss://go.getblock.io/${process.env.ACCESS_TOKEN}`,
    );
    ws.on("open", () => {
    console.log("Connected to BSC streams");
    });
    ws.on("error", (err) => {
    console.error("WebSocket error:", err.message);
    });
    to
    BSC
    streams

    pendingTxs

    Pending transactions

    Front-running protection

    txReceipts

    Transaction receipts after confirmation

    Trade confirmation

    value

    Transaction value (hex)

    gas_price

    Gas price (hex)

    input

    Transaction calldata

    method_id

    array

    Function selectors (first 4 bytes of calldata)

    Enterprise

    Unlimited

    Unlimited

    Connection Drop

    • Implement automatic reconnection (see example above)

    • Re-subscribe after each reconnect—subscriptions don't persist

    • Check your network stability

    Wallet Audit Endpoint

    Example code for the /wallet-audit/audit method. Сomplete guide on how to use /wallet-audit/audit in GetBlock Address Audit documentation.

    This method performs a comprehensive fraud audit on a wallet address. Proxied to ChainAware.

    Body Parameters

    Parameter
    Type
    Required
    Description

    network

    string

    Wallet Risk Endpoint

    Example code for the /wallet-audit/check method. Сomplete guide on how to use /wallet-audit/check in GetBlock Address Audit documentation.

    This method performs a quick risk score check on a wallet address. Supports more networks than the full audit.

    Parameter
    Type
    Required
    Description

    string

    "0.0191140026"

    Fraud probability score ranging from 0.0 to 1.0.

    walletAddress

    string

    "0xa45f..."

    The audited blockchain wallet address.

    chain

    string

    "ETH"

    The network/blockchain name (e.g., "ETH").

    lastChecked

    string (ISO 8601)

    "2026-04-15T12:02:21Z"

    Timestamp of the most recent fraud analysis.

    checked_times

    number

    183

    Total number of times this address has been checked.

    createdAt

    string (ISO 8601)

    "2023-07-19T10:15:00Z"

    Record creation timestamp.

    updatedAt

    string (ISO 8601)

    "2026-05-08T14:30:22Z"

    Last update timestamp.

    forensic_details

    object

    See sub-fields below

    Contains 18 AML flags. Each is "0" (clean) or "1" (flagged). If any flag is "1", probabilityFraud defaults to 1.0.

    ↳ .cybercrime

    string

    "0"

    Cybercrime activity.

    ↳ .money_laundering

    string

    "0"

    Money laundering activity.

    ↳ .number_of_malicious_contracts_created

    string

    "0"

    Creation of malicious smart contracts.

    ↳ .gas_abuse

    string

    "0"

    Gas price manipulation behavior.

    ↳ .financial_crime

    string

    "0"

    General financial crime flag.

    ↳ .darkweb_transactions

    string

    "0"

    Transactions associated with darkweb marketplaces.

    ↳ .reinit

    string

    "0"

    Smart contract reinitialization abuse.

    ↳ .phishing_activities

    string

    "0"

    Phishing vector participation.

    ↳ .fake_kyc

    string

    "0"

    Use or association with fake KYC data.

    ↳ .blacklist_doubt

    string

    "0"

    Association with blacklisted entities.

    ↳ .fake_standard_interface

    string

    "0"

    Spoofed/fake token interface usage.

    ↳ .stealing_attack

    string

    "0"

    Active theft or exploit activity.

    ↳ .blackmail_activities

    string

    "0"

    Blackmail or extortion activities.

    ↳ .sanctioned

    string

    "0"

    Presence on known sanctions lists.

    ↳ .malicious_mining_activities

    string

    "0"

    Malicious or hijacked mining operations.

    ↳ .mixer

    string

    "0"

    Interaction with crypto mixing services (e.g., Tornado Cash).

    ↳ .fake_token

    string

    "0"

    Creation or deployment of fake/honeypot tokens.

    ↳ .honeypot_related_address

    string

    "0"

    Association with honeypot contract setups.

    categories

    array (object)

    [{"Category": "NFT", "Count": 12}]

    Transaction count breakdown by category. Examples: "Decentralized Exchanges", "Bridge", "NFT", "Layer 1", "Layer 2", "Lending & Borrowing".

    riskProfile

    array (object)

    [{"Category": "Stable Coin", "Balance_age": "..."}]

    Balance distribution. Categories include: "Stable Coin", "1to10", "10to20", ..., "300+", "Meme Token", "Risk_Profile". Note: The "Risk_Profile" entry represents the Risk Willingness score in the UI.

    segmentInfo

    string (JSON)

    "{\"Maker\":0,\"Aave_borrow\":0,...}"

    Protocol interaction flags packed as a JSON string. 1 = interacted, 0 = not. Supported keys: Maker, Aave_borrow, Aave_lend, Lido, Uniswap, Compound_lend, Compound_borrow.

    experience

    object

    {"Type": "Experience", "Value": 8}

    User experience rating mapped on a scale of 1-10.

    intention

    object

    See description

    Expected behavior map. Format: {"Type": "Intentions", "Value": { ... }} where Value contains 14 sub-keys, each rated as "Low", "Medium", or "High".

    ↳ Sub-keys

    string

    "Low", "Medium", "High"

    Prob_Borrow, Prob_Gamble, Prob_Game, Prob_Lend, Prob_Leverage_Long, Prob_Leverage_Long_ETH, Prob_Leveraged_Lend, Prob_Leveraged_Stake, Prob_Leveraged_Stake_ETH, Prob_NFT, Prob_Stake, Prob_Stake_ETH

    protocols

    array (object)

    [{"Protocol": "Uniswap", "Count": 45}]

    Array of specific protocols the wallet has interacted with alongside their usage frequency.

    userDetails

    object

    See sub-fields below

    General metadata and structural metrics of the wallet.

    ↳ .wallet_age_days

    number

    1024

    Age of the wallet in days.

    ↳ .total_balance_usd

    number

    15430.50

    Current aggregate wallet balance in USD.

    ↳ .transaction_count

    number

    450

    Cumulative historical transaction count.

    ↳ .wallet_rank

    number

    88

    Internal wallet ranking score.

    riskCapability

    number

    7

    User's risk capability evaluated on a scale of 1-10.

    recommendation

    object

    {"Type": "Recommendation", "Value": ["ETH holding"]}

    Tailored system recommendations. Value is an array of strings (e.g., ["ETH holding", "Stablecoin lending"]).

    sanctionData

    array (object)

    See sub-fields below

    Definitive sanction matches associated with this address.

    ↳ .isSanctioned

    boolean

    false

    true if sanctioned, false if clean.

    ↳ .category

    string (nullable)

    "Terrorism"

    Category of sanction if applicable; otherwise null.

    ↳ .name

    string (nullable)

    "Entity Name"

    Official name of the sanctioned entity/person; otherwise null.

    ↳ .description

    string (nullable)

    "Details here..."

    Contextual details regarding the sanction; otherwise null.

    ↳ .url

    string (nullable)

    "https://..."

    Reference URL providing sanction evidence; otherwise null.

    502

    Provider error

    Yes

    The blockchain network to verify(ETH, BNB, or BASE)

    address

    string

    Yes

    the wallet address

    import requests
    import json
    
    url = "https://services.getblock.io/v1/wallet-audit/audit"
    
    payload = json.dumps({  "network": "ETH", "address": "0xa45f...a675"})
    
    headers = {
          "Authorization": "Bearer YOUR_API_KEY",
      "Content-Type": "application/json",
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({  "network": "ETH", "address": "0xa45f...a675"});
    
        let response = client
            .post("https://services.getblock.io/v1/wallet-audit/audit")
            .header("Content-Type", "application/json")
            .header("Authorization: "Bearer YOUR_API_KEY")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }
    {
        "data": {
            "message": "Success",
            "walletAddress": "0xa45f...a675",
            "status": "Fraud",
            "probabilityFraud": "0.9329851866",
            "token": null,
            "chain": "ETH",
            "lastChecked": "2026-03-19T07:02:56.000Z",
            "forensic_details": {
                "cybercrime": "0",
                "money_laundering": "0",
                "number_of_malicious_contracts_created": "0",
                "gas_abuse": "0",
                "financial_crime": "0",
                "darkweb_transactions": "0",
                "reinit": "0",
                "phishing_activities": "0",
                "fake_kyc": "0",
                "blacklist_doubt": "0",
                "fake_standard_interface": "0",
                "data_source": "",
                "stealing_attack": "0",
                "blackmail_activities": "0",
                "sanctioned": "0",
                "malicious_mining_activities": "0",
                "mixer": "0",
                "fake_token": "0",
                "honeypot_related_address": "0"
            },
            "categories": [],
            "riskProfile": [
                {
                    "Category": "Stable Coin",
                    "Balance_age": 0
                },
                {
                    "Category": "1to10",
                    "Balance_age": 100
                },
                {
                    "Category": "10to20",
                    "Balance_age": 0
                },
                {
                    "Category": "20to30",
                    "Balance_age": 0
                },
                {
                    "Category": "30to50",
                    "Balance_age": 0
                },
                {
                    "Category": "50to100",
                    "Balance_age": 0
                },
                {
                    "Category": "100to200",
                    "Balance_age": 0
                },
                {
                    "Category": "200to300",
                    "Balance_age": 0
                },
                {
                    "Category": "300+",
                    "Balance_age": 0
                },
                {
                    "Category": "Meme Token",
                    "Balance_age": 0
                },
                {
                    "Category": "Risk_Profile",
                    "Balance_age": 2
                }
            ],
            "segmentInfo": "{\"Maker\":0,\"Aave_borrow\":0,\"Aave_lend\":0,\"Lido\":0,\"Compound_lend\":0,\"Compound_borrow\":0}",
            "experience": {
                "Type": "Experience",
                "Value": 0
            },
            "intention": {
                "Type": "Intentions",
                "Value": {
                    "Prob_Borrow": "Low",
                    "Prob_Gamble": "Low",
                    "Prob_Game": "Medium",
                    "Prob_Lend": "High",
                    "Prob_Leverage_Long": "Low",
                    "Prob_Leverage_Long_ETH": "Low",
                    "Prob_Leveraged_Lend": "Low",
                    "Prob_Leveraged_Stake": "Low",
                    "Prob_Leveraged_Stake_ETH": "Low",
                    "Prob_NFT": "Medium",
                    "Prob_Stake": "Low",
                    "Prob_Stake_ETH": "Medium",
                    "Prob_Trade": "High",
                    "Prob_Yield_Farm": "Low"
                }
            },
            "protocols": [],
            "userDetails": {
                "wallet_age_days": 349,
                "total_balance_usd": 0.26,
                "transaction_count": 2,
                "wallet_rank": 0
            },
            "riskCapability": 1,
            "recommendation": {
                "Type": "Recommendation",
                "Value": [
                    "WBTC holding",
                    "ETH holding",
                    "Stablecoin lending",
                    "Stablecoin lending with FIFs (SmartCredit.io)"
                ]
            },
            "checked_times": 6,
            "createdAt": "2026-03-19T06:52:28.000Z",
            "updatedAt": "2026-05-15T17:17:02.000Z",
            "sanctionData": [
                {
                    "id": 205878,
                    "trustscore_id": 18360032,
                    "category": null,
                    "name": null,
                    "description": null,
                    "url": null,
                    "isSanctioned": false,
                    "createdAt": "2026-05-15T17:17:02.000Z",
                    "updatedAt": "2026-05-15T17:17:02.000Z"
                }
            ]
        }
    }

    Field Path

    Type

    Example

    Description

    status

    string

    "Not Fraud"

    ML model verdict. Possible values: "Not Fraud", "Fraud", "New Address".

    Status

    Description

    400

    Invalid network or missing fields

    401

    Missing or invalid auth

    402

    Insufficient balance

    Request Example

    Response Example

    Response Parameters

    Error Handling

    curl --location --request POST 'https://services.getblock.io/v1/wallet-audit/audit' \
    -- header 'Authorization: Bearer YOUR_API_KEY',
    --header 'Content-Type: application/json' \
    --data-raw ' {  "network": "ETH", "address": "0xa45f...a675"}'
    import axios from "axios";
    
    const data = 
      {  "network": "ETH", "address": "0xa45f...a675"};
    
    const config = {
      method: "post",
      url: "https://services.getblock.io/v1/wallet-audit/audit",
      headers: {
        Authorization: "Bearer YOUR_API_KEY",
        "Content-Type": "application/json",
      },
      data: data,
    };
    
    axios(config)
      .then((response) => console.log(JSON.stringify(response.data,
      .catch((error) => console.log(error));
    

    probabilityFraud

    The blockchain network to verify(ETH, BNB,POLY, TRON or BASE)

    address

    string

    Yes

    the wallet address

    curl --location --request POST 'https://services.getblock.io/v1/wallet-audit/check
    
    import axios from "axios";
    
    import requests
    import json
    
    url = "https://services.getblock.io/v1/wallet-audit/check"
    
    payload = json.dumps({  "network": "ETH", "address": "0xa45f...a675"})
    
    headers = {
          "Authorization": "Bearer YOUR_API_KEY",
      "Content-Type": "application/json",
    }
    
    response = requests.post(url, headers=headers, data=payload)
    print(response.text)
    use reqwest::Client;
    use serde_json::json;
    
    #[tokio::main]
    async fn main() -> Result<(), Box<dyn std::error::Error>> {
        let client = Client::new();
    
        let payload = json!({  "network": "ETH", "address": "0xa45f...a675"});
    
        let response = client
            .post("https://services.getblock.io/v1/wallet-audit/check")
            .header("Content-Type", "application/json")
            .header("Authorization: "Bearer YOUR_API_KEY")
            .json(&payload)
            .send()
            .await?;
    
        let result: serde_json::Value = response.json().await?;
        println!("{:#?}", result);
    
        Ok(())
    }

    Field Path

    Type

    Example

    Description

    status

    string

    "Not Fraud"

    ML model verdict. Possible values: "Not Fraud", "Fraud", "New Address".

    Status

    Description

    400

    Invalid network or missing fields

    401

    Missing or invalid auth

    402

    Insufficient balance

    network

    string

    Body Parameters

    Yes

    {
        "data": {
            "message": "Success",
            "walletAddress": "0xa45f...a675",
            "status": "Fraud",
            "probabilityFraud": "0.9329851866",
            "token": null,
            "chain": "ETH",
            "lastChecked": "2026-03-19T07:02:56.000Z",
            "forensic_details": {
                "cybercrime": "0",
                "money_laundering": "0",
                "number_of_malicious_contracts_created": "0",
                "gas_abuse": "0",
                "financial_crime": "0",
                "darkweb_transactions": "0",
                "reinit": "0",
                "phishing_activities": "0",
                "fake_kyc": "0",
                "blacklist_doubt": "0",
                "fake_standard_interface": "0",
                "data_source": "",
                "stealing_attack": "0",
                "blackmail_activities": "0",
                "sanctioned": "0",
                "malicious_mining_activities": "0",
                "mixer": "0",
                "fake_token": "0",
                "honeypot_related_address": "0"
            },
            "checked_times": 7,
            "createdAt": "2026-03-19T06:52:28.000Z",
            "updatedAt": "2026-05-18T11:11:19.000Z",
            "sanctionData": [
                {
                    "id": 212143,
                    "trustscore_id": 18360032,
                    "category": null,
                    "name": null,
                    "description": null,
                    "url": null,
                    "isSanctioned": false,
                    "createdAt": "2026-05-18T11:11:19.000Z",
                    "updatedAt": "2026-05-18T11:11:19.000Z"
                }
            ]
        }
    }

    Request Example

    Response Example

    Response Parameters

    Error Handling

    null
    ,
    2
    )))
    ,
    Prob_Trade
    ,
    Prob_Yield_Farm
    .
    '
    \
    -- header 'Authorization: Bearer YOUR_API_KEY',
    --header 'Content-Type: application/json' \
    --data-raw ' { "network": "ETH", "address": "0xa45f...a675"}'
    const data =
    { "network": "ETH", "address": "0xa45f...a675"};
    const config = {
    method: "post",
    url: "https://services.getblock.io/v1/wallet-audit/check",
    headers: {
    Authorization: "Bearer YOUR_API_KEY",
    "Content-Type": "application/json",
    },
    data: data,
    };
    axios(config)
    .then((response) => console.log(JSON.stringify(response.data, null, 2)))
    .catch((error) => console.log(error));

    probabilityFraud

    string

    "0.0191140026"

    Fraud probability score ranging from 0.0 to 1.0.

    walletAddress

    string

    "0xa45f..."

    The audited blockchain wallet address.

    chain

    string

    "ETH"

    The network/blockchain name (e.g., "ETH").

    lastChecked

    string (ISO 8601)

    "2026-04-15T12:02:21Z"

    Timestamp of the most recent fraud analysis.

    checked_times

    number

    169

    Total number of times this address has been checked.

    createdAt

    string (ISO 8601)

    "2023-07-19T10:15:00Z"

    Record creation timestamp.

    updatedAt

    string (ISO 8601)

    "2026-05-08T14:30:22Z"

    Last update timestamp.

    forensic_details

    object

    See sub-fields below

    Contains 18 AML flags. Each is "0" (clean) or "1" (flagged). If any flag is "1", probabilityFraud defaults to 1.0.

    ↳ .cybercrime

    string

    "0"

    Cybercrime activity flag.

    ↳ .money_laundering

    string

    "0"

    Money laundering flag.

    ↳ .number_of_malicious_contracts_created

    string

    "0"

    Creation of malicious smart contracts flag.

    ↳ .gas_abuse

    string

    "0"

    Gas price manipulation behavior flag.

    ↳ .financial_crime

    string

    "0"

    General financial crime flag.

    ↳ .darkweb_transactions

    string

    "0"

    Transactions associated with darkweb marketplaces flag.

    ↳ .reinit

    string

    "0"

    Smart contract reinitialization abuse flag.

    ↳ .phishing_activities

    string

    "0"

    Phishing vector participation flag.

    ↳ .fake_kyc

    string

    "0"

    Use or association with fake KYC data flag.

    ↳ .blacklist_doubt

    string

    "0"

    Association with blacklisted entities flag.

    ↳ .fake_standard_interface

    string

    "0"

    Spoofed/fake token interface usage flag.

    ↳ .stealing_attack

    string

    "0"

    Active theft or exploit activity flag.

    ↳ .blackmail_activities

    string

    "0"

    Blackmail or extortion activities flag.

    ↳ .sanctioned

    string

    "0"

    Presence on known sanctions lists flag.

    ↳ .malicious_mining_activities

    string

    "0"

    Malicious or hijacked mining operations flag.

    ↳ .mixer

    string

    "0"

    Interaction with crypto mixing services (e.g., Tornado Cash) flag.

    ↳ .fake_token

    string

    "0"

    Creation or deployment of fake/honeypot tokens flag.

    ↳ .honeypot_related_address

    string

    "0"

    Association with honeypot contract setups flag.

    sanctionData

    array (object)

    See sub-fields below

    Definitive sanction matches associated with this address.

    ↳ .isSanctioned

    boolean

    false

    true if sanctioned, false if clean.

    ↳ .category

    string (nullable)

    "Terrorism"

    Category of sanction if applicable; otherwise null.

    ↳ .name

    string (nullable)

    "Entity Name"

    Official name of the sanctioned entity/person; otherwise null.

    ↳ .description

    string (nullable)

    "Details here..."

    Contextual details regarding the sanction; otherwise null.

    ↳ .url

    string (nullable)

    "https://..."

    Reference URL providing sanction evidence; otherwise null.

    502

    Provider error