Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Configure, 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.
This section provides simple examples to help you test your connection to the blockchain, using Ethereum API as a reference.
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.
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.
Get started with our most in-demand blockchain networks.
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.
GetBlock Nonstandard Client Support runs extra namespaces, private forks, and exotic configs — all on managed infrastructure.
Nonstandard Client Support runs the namespaces, client builds, and configurations that a default node does not enable — extra RPC namespaces, a patched or forked client, or an exotic set of flags. GetBlock operates the setup for you on managed infrastructure, so you get the capability without taking on the operations.
A default node exposes a standard set of RPC namespaces on a standard client build, tuned for the common case. That covers most workloads, but some workloads need what the default deliberately leaves off: the debug, trace, txpool, or admin namespaces; a specific client version or a private fork; or custom flags such as an archive sync mode or a particular tracer configuration.
Enabling these yourself means running the node, and running a nonstandard node means owning its upgrades, its monitoring, and its incidents. This add-on takes that on. You describe what you need; GetBlock deploys and operates it.
For example, a default node does not expose the pending transaction pool and does not run a custom tracer. With this add-on, GetBlock enables the txpool namespace and deploys your tracer, so you can read the pending pool and trace transactions with your own logic — on infrastructure you do not have to manage.
Access to hidden data: Reach namespaces and traces that a default node does not expose.
Your client build: Run a specific version, a private fork, or a patched client.
Managed operation: GetBlock runs the exotic setup, so your engineers do not manage the machine.
You run MEV or search workloads that need txpool access and custom tracers.
Your security or forensics work needs debug_traceTransaction with a custom tracer.
You need a patched client, a private fork, or a niche chain client that no shared node runs.
This add-on costs more than the others because it is bespoke operations rather than a configuration toggle.
A nonstandard build needs lead time to prepare and deploy.
GetBlock MEV Protection routes your transactions through a private mempool against front-running and sandwich attacks
Traditionally, when you send a transaction, your node validates it and places it in the mempool. The mempool is a public holding area for transactions that are not yet confirmed. The node then broadcasts the transaction to its peers, so the pending transaction is visible across the network while it waits.
MEV Protection routes your transactions through a private mempool so that MEV bots never see them. This stops front-running and sandwich attacks before they can happen. You enable it at the endpoint level, and your application code does not change.
Block builders — the validators and searchers who assemble the next block — read the mempool and choose which transactions to include and in what order. That power to order, insert, and exclude transactions is where the risk begins.
MEV — Maximal Extractable Value — is the value that a block builder can extract purely by controlling transaction order. Most of this value is not found by the builders themselves. It is found by searchers: third parties who run bots that watch the public mempool and calculate which ordering earns them a profit. The profit usually comes at the expense of an ordinary user whose pending transaction sits in the open.
Front-running: A searcher sees your large trade waiting in the mempool. It submits its own buy with a higher fee, so the builder places it ahead of yours. The searcher buys at the lower price, your trade then pushes the price up, and the searcher profits.
Sandwiching: The searcher places one transaction before yours and one after. The first rides the price up ahead of you; the second sells into the price move your trade caused. Your trade is the filling in the sandwich, and you get the worst price.
Back-running: The searcher positions its transaction right after yours to capture a price gap your trade opened, for example between two exchanges.
The common thread is visibility. Every one of these attacks depends on the searcher seeing your transaction while it waits in the public mempool.
MEV Protection removes your transaction from that public view. Instead of the public mempool, GetBlock routes it through a private mempool in partnership with Merkle, which acts as a trusted private builder. The transaction travels straight to the builder without being broadcast, so a searcher never sees it and has nothing to attack.
The protection lives at the RPC endpoint layer. You select the MEV-protected endpoint and send transactions exactly as you do today. There is no in-app defense to build and no change to your transaction code.
No in-app defenses to build: The protection sits in the endpoint, which lowers your cost and complexity.
Protection against front-running and sandwiching: A bot cannot attack a transaction it cannot see.
The same integration: You keep your existing code and only change the endpoint URL.
Better outcomes for users: Your users keep the value that a searcher would otherwise take from their trades.
Not every transaction needs protection. A plain transfer of ETH, an NFT, or a token exposes no arbitrage, so a bot has no reason to touch it. Protection matters when a transaction moves value in a way a searcher can exploit: a token swap on a DEX, an NFT mint, an auction, or activity in a lending protocol. If your users trade, protect their transactions.
GetBlock Custom Endpoint URL: replace the autogenerated hash with your own URL for your dedicated node.
Custom Endpoint URL lets you serve your dedicated node from a domain you own instead of the autogenerated address. Rather than a URL that carries a random access token, you present a clean, branded address such as rpc.yourapp.com, while the node behind it stays exactly the same.
By default, your endpoint carries a random access token in the path, e.g a typical path from GetBlock shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/. That works, but it ties your public configuration to a provider hash, and it places a secret inside a URL, where it tends to end up in server logs, browser history, and proxy records.
This add-on changes the address in two ways:
You input the domain you own at your GetBlock node with a Canonical name (CNAME) record, or choose a readable subdomain in place of the hash.
You keep your authentication in a header, such as x-access-token, instead of in the URL, so the secret no longer travels as part of the address.
The node, the performance, and the behavior are unchanged. Only the address your application points at is different.
Your brand on your URLs. A white-label product serves endpoints that carry your name, not a provider hash.
A private stack. Your public configuration does not reveal which infrastructure provider you use.
A stable address. The URL survives token rotation, because the token lives in a header rather than in the path.
A safer secret. Keeping the token out of the URL keeps it out of logs and browser history.
You build a white-label product, and your URLs must carry your brand.
You prefer that your public configuration not name your provider.
You want a readable, stable URL that does not change when you rotate keys.
If the endpoint is internal and no user ever sees it, the default URL is already enough.
Setup requires a domain you own and a DNS change on your side.
GetBlock Dedicated Ingress Proxy gives you your own routing layer, fully isolated from all other traffic.
A Dedicated Ingress Proxy gives you your own routing layer in front of your node — a proxy fleet that serves only your traffic. It isolates the one part of the path that a standard dedicated node still shares with everyone else: the gateway.
A dedicated node isolates the compute that runs the chain, but a request does not reach that compute directly. It first passes through an ingress proxy that terminates TLS, checks authentication, applies rate limits, and routes the request onward. On a standard setup, that proxy layer is shared across many customers. Your node is private, but the front door is not.
Most of the time this is fine. It matters when the shared front door becomes the constraint — when another customer's traffic surge slows the gateway, or when your own throughput and policy needs outgrow a shared default.
The add-on gives you a proxy fleet that no other customer uses. Because your traffic is the only traffic on it, no other customer's load can compete with yours at the gateway, and the time the proxy adds stays predictable. It also becomes yours to configure: you can apply rate-limit and routing rules that fit your workload rather than a shared default, and your traffic stays isolated from the edge all the way to the node.
No noisy neighbor at the gateway: Another customer's load cannot affect your routing layer.
Predictable gateway latency: With only your traffic on the proxy, the added latency stays stable.
Custom policy: Set rate-limit and routing behavior that a shared policy cannot offer.
End-to-end isolation: Traffic is isolated from the edge to the node, which supports strict compliance requirements.
Your application runs at high request rates, and the shared gateway has become the limit.
Your compliance rules require an isolated traffic path, not just an isolated node.
You need custom rate-limit or routing behavior at the gateway.
If your traffic is moderate and the shared gateway keeps up, you do not need a dedicated proxy.
The add-on isolates the routing layer. It does not change the node's own compute capacity.
GetBlock Beacon API: access the Ethereum consensus layer (Proof-of-Stake), separate from the usual JSON-RPC execution layer.
The Beacon API opens access to the Ethereum consensus layer — the Proof-of-Stake side of the network. This is a different layer from the one the standard eth_* JSON-RPC serves, and it exposes data that the execution layer simply does not hold.
Since the Merge, an Ethereum node runs as two coupled clients. The execution layer processes transactions and smart-contract state; you read it through the familiar eth_* methods. The consensus layer runs Proof-of-Stake: it manages validators, organizes time into slots and epochs, and decides finality. Each layer answers a different kind of question, and each has its own API.
A standard node gives you the execution layer. The Beacon API add-on gives you the consensus layer alongside it, so a single dedicated node answers both.
The Beacon API returns data that the eth_* API does not:
Chain timing and finality — slots, epochs, and finalization status.
Validators — balances, statuses, entry and exit queues, and effectiveness.
Consensus duties — attestations, sync committees, and block proposals.
Staking data — the information that validator monitoring and staking dashboards depend on.
For example, when you query a validator by its index, the response returns the validator's status, its balance, and its position in any activation or exit queue. There is no execution-layer method that can answer this, because the execution layer has no concept of a validator.
A complete view of the chain: You read both the execution and consensus layers from one dedicated node.
Direct staking data: You track finalization, validator effectiveness, and queue position without a separate service in the path.
Live monitoring: You watch validator status and attestation performance as it changes.
You run a staking provider and monitor validator health.
You build a validator dashboard or a Proof-of-Stake analytics tool.
You need finalization status or sync-committee data for your product.
GetBlock Overlay Methods: access debug/trace over a block range and replay history with modified contract bytecode, without any real on-chain deployment.
Overlay methods let you replay chain history as if a contract had run different code. You change a contract's bytecode — or its balance, nonce, or storage — and re-run past blocks to see the logs and events it would have produced. Nothing is deployed on-chain, and no real transaction is sent.
A contract only emits the events its code was written to emit. If a contract shipped without an event you now need — a missing Transfer log, an unindexed state change — that data does not exist on-chain, and no normal query can recover it. Re-deploying a fixed contract does not help either, because it cannot rewrite the past.
Overlay methods approach this from the other direction. They take the real historical state and replay it through your version of the contract. The chain's inputs stay real; only the contract logic changes. The result is the data the original contract would have emitted if it had carried your code.
This mirrors how state-override works in eth_call, extended across a range of historical blocks rather than a single call.
Trace a block range (debug/trace block-by-range). Process history in bulk instead of sending one request per block.
overlay_getLogs. Replay a block range with modified bytecode and pull logs that never existed on the real chain.
overlay_callConstructor. See how a contract would have initialized under different deployment logic.
Reconstruct missing events: Recover data the original contract never logged.
Bulk history processing: Block-range tracing removes the per-block request overhead of a normal node.
Safe experimentation: Test modified logic against real history with no deployment and no risk to on-chain state.
You run on-chain analytics and need events a contract never emitted.
You reverse-engineer contract behavior.
You reconstruct historical data for indexing or audit.
GetBlock Automatic RPC Failover switches your traffic to shared RPC automatically when your dedicated node degrades.
Automatic RPC Failover keeps your application online when your dedicated node degrades. If the node falls behind or starts to fail, the system moves your traffic to GetBlock shared RPC and moves it back once the node recovers. The switch is automatic, and your endpoint URL never changes.
A dedicated node gives you isolated, predictable performance, but it is still a single resource. It needs client upgrades, it can fall behind the chain head during a heavy sync, and a traffic spike can push it past its capacity. Without a fallback, any of these moments becomes downtime for your users. Failover removes that single point of failure.
The system checks the health of your node on a set interval. It treats the node as degraded when any of these conditions appears:
the node lags the chain head by more than a set number of blocks;
its error rate crosses a set threshold;
its response latency crosses a set limit.
When the node is healthy, all your traffic goes to it, and you get the full benefit of dedicated performance. When the node degrades, the system reroutes your requests to the shared pool, so no request is dropped while the node is unavailable. When the node returns to a healthy state, the system routes traffic back to it.
Because the endpoint URL stays the same throughout, your application does not know the switch happened. You do not reconfigure a client or restart a service.
Continuous availability: A degraded node no longer takes your application down with it.
Safe maintenance: Your node can take client upgrades and maintenance windows without a visible service gap.
Spike absorption: Traffic beyond your dedicated capacity fails over instead of failing outright.
No code change: The URL is unchanged, so your integration is unchanged.
You run a production application that cannot drop requests.
Your node needs regular maintenance or client upgrades.
Your traffic is bursty and sometimes exceeds your dedicated capacity.
You hold an uptime commitment to your own users.
The shared pool has its own rate limits. Failover is there to keep you online during a problem; it is not a way to get unlimited dedicated capacity on demand. If your steady-state traffic already needs more than your node provides, the answer is more dedicated capacity, not failover. Treat failover as insurance, not as headroom.
GetBlock Unified Multichain Endpoint: use one URL for every node and chain in your stack.
A Unified Multichain Endpoint gives you one URL and one credential for every node and chain in your stack. Instead of managing a separate endpoint and key per network, you point at a single base address and name the chain you want in the request.
A multichain application usually collects endpoints as it grows. Each chain brings its own URL, its own access token, and its own security settings, and every new network adds another entry to configure, rotate, and keep in sync. The complexity is not in any single endpoint; it is in the growing set of them.
This add-on collapses that set into one. You keep your dedicated nodes, but you reach them through a single unified endpoint. You select the target chain with a subdomain, a path, or a chain-id parameter, and one credential authenticates across all of them.
Security follows the same principle. You set your rate limits and your IP allowlist once on the unified endpoint, and the policy applies to every chain behind it, rather than being configured network by network.
One URL template. Your client code holds a single pattern, not one URL per network.
One credential. A single token authenticates across all your chains.
One security policy. Rate limits and the allowlist are set once and cover every chain.
Less configuration drift. Adding a chain does not add another endpoint and key to track.
You build a cross-chain application, a wallet, or an aggregator.
You run an indexer that reads several chains.
You manage one endpoint and one key per network today, and the overhead slows you down.
If you use a single chain and expect to stay on it, one standard endpoint is enough.
One shared credential across chains is convenient, but it also concentrates access. Scope it carefully and rotate it on a schedule.
To start using GetBlock's services, you need to register for an account. You’ll be ready to go in just a few clicks
Go to GetBlock
Visit the homepage and click on the 'Dashboard' button in the upper-right corner, or use this direct link.

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.
Review and accept policies
During registration, you will be asked to accept our Terms of Service and Privacy Policy.
Once you've created an account and signed in, you'll be directed to the GetBlock Dashboard.
You can create endpoints
Monitor your usage plan
Access statistics.
Click on your profile icon
Click on the Copy Icon to copy your User ID
GetBlock uses a secure authentication method based on access tokens to ensure that only authorized users can interact with blockchain nodes.
Every endpoint you create is assigned a unique access token:
https://shared.<region>.getblock.io/<ACCESS_TOKEN>/The <ACCESS_TOKEN> authenticates requests directly through the endpoint URL.
To make a request, include your full endpoint URL with the access token in the path.
For example, here’s how to fetch the latest Ethereum block number:
curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
curl --location --request POST 'https://shared.us-east-1.getblock.io/<ACCESS-TOKEN>/
curl --location --request POST 'https://shared.ap-southeast-1.getblock.io/<ACCESS-TOKEN>/
Response:
{
"jsonrpc":"2.0",
"id":"getblock.io",
"result":"0x1449641"
}Always store your access tokens securely. Avoid exposing them in publicly accessible code repositories or logs.
If a token is compromised, you can quickly roll or delete it without disrupting other endpoints:
Go to your GetBlock Dashboard.
Locate the endpoint associated with the token.
Click the three-dot icon () next to the endpoint.
Select the option to either roll (regenerate) or delete the token.
This authentication method ensures that all your interactions with GetBlock’s services remain secure, reliable, and easy to manage.
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.
Once the page loads, you'll find a 'Run in Postman' button in the top-right corner. Click this button to open the collection directly in your Postman application.
Select the desired network from the drop-down list on the sidebar.
Paste the access token copied from your account instead of {YOUR_ACCESS_TOKEN}.
This token will grant you the necessary permissions to explore our node functionalities.
This page provides a guide to common JSON-RPC and HTTP errors when testing your connection with GetBlock's API.
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.

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
For more detailed analysis, visit the Statistics tab in the dashboard.
Select the time period, protocol name, networks (mainnet/testnet), region, and API interfaces to analyze the data by parameters.
All data is displayed through infographics, including:
Number of requests and CUs
Response statuses
Method call distribution
Rate limit rejections
GetBlock provides 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
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 the GetBlock Docs MCP server to Claude, Claude Code, Cursor, VS Code, or ChatGPT and query the documentation directly from your AI assistant.
The GetBlock documentation is available as a Model Context Protocol (MCP) server — a live, machine-readable interface to docs.getblock.io that AI agents can query directly:
https://docs.getblock.io/~gitbook/mcpInstead of getting non-factual or hallucinated answers, your AI assistant connected to this server searches and reads our documentation from API references, guides, pricing, and setup steps etc, the moment you ask. The server uses streamable HTTP transport and requires no API key or authentication.
The server exposes three tools to any connected agent:
searchDocumentation
Searches all of docs.getblock.io and returns matching pages with excerpts and links
getPage
Fetches the full markdown content of a specific docs page by URL
sendFeedback
Sends feedback about the documentation back to the GetBlock team
Once connected, ask your assistant things like:
“How do I enable the Yellowstone gRPC add-on on a dedicated Solana node?”
“What are GetBlock's CU and rate limits per plan?”
“Show me the Flashblocks API methods for Base.”
In claude.ai or the Claude Desktop app:
Go to Settings → Connectors → Add custom connector.
Name it GetBlock Docs and paste https://docs.getblock.io/~gitbook/mcp.
Enable it from the tools menu in any chat.
Run one command in your terminal:
Verify the connection with /mcp inside a session.
Go to Settings → MCP → Add new MCP server, or add to .cursor/mcp.json:
Run MCP: Add Server from the Command Palette and choose HTTP, or add to .vscode/mcp.json:
Enable Developer mode under Settings → Apps & Connectors.
Choose Create connector and paste https://docs.getblock.io/~gitbook/mcp (no authentication).
The connector becomes available in chat and deep research.
A private Grafana workspace for your dedicated node. It shows how your node is used in real time.
Advanced Analytics is a private Grafana workspace for your dedicated node. It records every request the node handles and turns that raw activity into a clear picture of how your node is used, in real time. Without it, a dedicated node is a black box: it serves your traffic, but you cannot see the shape of that traffic or where it strains. It shows request counts, latencies, and errors.
You see the data as time-series charts, which gives you a more readable and understandable in-depth analysis. You can tell which requests consume more compute units(CU).
The add-on measures every request and stores it as a time series. It then lets you view that data along three dimensions:
by RPC method,
by access key,
and by region
So you can move from a high-level number down to the exact cause behind it.
Three core signals sit at the center of the workspace:
Request volume: how many calls the node receives over time.
Latency: shown as percentiles (p50, p95, p99) rather than a single average. An average hides the slow requests; percentiles expose the tail where real problems live.
Error rate: the share of requests that fail.
The per-method view shows which calls cost you the most; heavy methods such as debug_traceTransaction and eth_getLogs stand out here. The per-key view shows which client or service drives your traffic. The per-region view shows where your users connect from.
The value comes from following one signal to its source. Say your p99 latency jumps at 14:00. You open the per-method view, filter to that window, and find that eth_getLogs latency tripled while everything else held steady. You now know exactly what to optimize, and you never had to guess.
Cost attribution. Assign traffic to a team, a customer, or a feature by looking at the per-key view.
Real capacity planning. Size the node from measured traffic rather than an estimate.
Faster debugging. Trace a latency spike to the method behind it in a single view.
Abuse detection. Spot a key that starts sending abnormal traffic, with the data to prove it.
You want to attribute cost to a team, a customer, or a feature.
You plan capacity and need real numbers.
You debug latency spikes and need to find their cause quickly.
You suspect one key is behaving abnormally and want evidence.
Analytics gives you visibility, not control. It shows you what is happening; it does not block or shape traffic. When you need to act on what you see — to restrict access or stop abuse — pair it with the IP Allowlist. And because it works from real traffic, a node with very low, steady volume gains little from it.
GetBlock IP Allowlist: a network security control that restricts access to your RPC endpoint based on the source IP address of each request.
An Internet Protocol (IP) allowlist is a network security control that restricts access to your RPC endpoint based on the source IP address of each request. When the allowlist is active, only requests from addresses you have approved can reach your node. Every other request is blocked at the gateway, before it reaches the node and before any processing takes place. In effect, it is a "friend or foe" filter based on where the request comes from.
This adds a layer of defense beyond your access token. A token authenticates who is calling. An allowlist controls where the call comes from. Together they mean that a leaked token is not enough on its own: an attacker would also need to send the request from an approved network.
You add one or more entries to the allowlist. An entry is a single IP address, such as 203.0.113.10, or a whole subnet in Classless Inter-Domain Routing (CIDR) notation, such as 203.0.113.0/24. The add-on supports both IPv4 and IPv6.
On every incoming request, the gateway compares the source IP against your list. A match lets the request continue to the node. No match returns an access error (403 Forbidden) and the request stops there. Because the check runs at the gateway, a rejected request never consumes your node capacity or your quota.
The allowlist follows a deny-by-default posture. When the list is empty, the node behaves as normal. As soon as you add the first entry, the node accepts only the addresses on the list and rejects the rest.
A few things to plan before you configure the allowlist:
Account for every trusted network: List each environment that calls your node: production backends, staging, workers, and any third-party service that makes requests on your behalf. An address you forget is an address that gets blocked.
Do not lock yourself out: If you administer the node from a fixed IP, add that IP before you rely on the list.
Plan for addresses that change: Some cloud hosts and office connections use addresses that rotate over time. For those, use a CIDR range that covers the expected pool, or route the traffic through a gateway with a static egress IP.
Protection if your endpoint leaks: Even if your URL or token reaches the wrong hands, an unauthorized server cannot use it, because its requests do not pass the IP filter.
Protection against quota theft and abuse: No outside party can burn through your request limits from an address you did not approve.
Defense in depth: The allowlist works on top of token authentication. An attacker would need to steal the token and operate from an allowed IP.
The allowlist fits server-side workloads with stable, known addresses: backends, workers, indexers, other nodes, and corporate networks. For example:
You work in a regulated field such as payments, custody, or exchange operations.
Your backend runs from static egress IPs.
You need to prove that only approved systems reach your node.
The allowlist does not fit clients with dynamic IPs, such as mobile apps and browser-based dApps. In those cases, the request comes straight from the end user's device, and the address changes constantly, so there is no stable list to maintain. For those cases, use token authentication together with referrer or origin restrictions instead.
GetBlock Zero-hop Node Access: connect straight to your dedicated node, bypassing the proxy layer entirely.
Zero-Hop Node Access gives you a direct connection to your node, removing the routing layer that normally sits in the path. It is built for the workloads where latency is measured in milliseconds, and every one of them counts.
A normal request does not travel straight to the node. It passes through a gateway and a load balancer first. Those layers do useful work—authentication, rate limiting, health-aware routing—but each one adds a small amount of time and, just as important, a small amount of variance. For an ordinary application, this overhead is invisible. For a trading engine competing on speed, that variance is the problem: not only the average latency, but how much it wobbles from request to request.
Zero-Hop pins your connection to your node and takes those intermediate layers out of the path.
Because you always reach the same node rather than being routed to whichever one the balancer picks, you also get a consistent view of the mempool and chain state — which, for trading, is as valuable as the raw speed. For the largest gain, pair Zero-Hop with a node in the region closest to your own systems, so the short path is also a physically short one.
Lower latency. Removing the gateway and load-balancer hops shortens the path.
Predictable latency. A fixed, direct route removes the variance those layers introduce.
A consistent node view. Always hitting the same node keeps your mempool and state view consistent.
You run a high-frequency trading bot or an arbitrage engine.
You run an MEV searcher, where every millisecond changes the outcome.
You send transactions where a consistent node view decides success.
The direct path is also an unprotected one. By removing the routing layer, you give up the automatic failover and load balancing it provides. That is the right trade for a latency-critical workload and the wrong trade for a normal one — if reliability matters more to you than the last few milliseconds, keep the proxy.
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
They are Two approaches exist for adding priority fees to private transactions:
Choose the appropriate method based on your use case:
Learn how to submit transactions via or method to the private mempool.
The web UI is the fastest way to screen a wallet or transaction — no code required.
Entry point: https://account.getblock.io/products/aml-check→ Run a check.
The individual flow is a simple, three-step screen:
01
Pick a network — ETH, TRX , BTC, LTC, BCH
The report ("Address risk — Detailed view") surfaces:
Total risk score — the wallet-wide 0–100 result. It reflects the wallet’s complete screened history across the returned assets, not only its current balance or riskiest token. The interface groups it as Low (0–24), Medium (25–49), High (50–74), or Very high (75–100).
Recommendation — a plain-language interpretation and suggested review level based on the score. It highlights what to examine but does not automatically tell you to accept or reject the wallet.
Individuals can configure screenings and receive reports inside @GetBlockAMLBot — no separate dashboard needed (Coming soon).
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.
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.
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 documented per network. Endpoints, method tables, and chain-specific methods are covered on the dedicated pages:
Getting Started
Create your account, explore plans & features, and make your first API call
Guides
Set up endpoints, manage access tokens, and integrate GetBlock APIs step-by-step
API Reference
View supported networks, available endpoints, and full API specifications



GetBlock Blockbook: an address and wallet indexer for UTXO chains such as Bitcoin.
Blockbook is an indexer for UTXO chains. It answers questions about an address or a whole wallet — balances, transaction history, and unspent outputs — that a standard Bitcoin node cannot answer on its own.
A Bitcoin node tracks the set of unspent transaction outputs (UTXOs), but it does not organize them by address. Ask a plain node for the balance of an address and it has no direct way to reply, because it was never built to look up history that way. Anyone who needs address-level data has to build a separate index over the chain.
Blockbook, built by Trezor, is that index. It reads the chain and maintains an address-indexed and xpub-indexed view on top of it. You query an address or a wallet, and Blockbook returns the answer from its index.
Address queries: Ask for the balance, transaction history, or unspent outputs for a single address.
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.
In the setup window:
Select the blockchain protocol and the network type (e.g., mainnet, testnet, devnet, etc)
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:
Cancel an active EVM Data Stream subscription. Complete guide on how to use getblock_unsubscribe in GetBlock EVM Data Stream documentation.
getblock_unsubscribe cancels a subscription created with . Delivery for that subscription stops and it no longer counts toward your 15-subscription limit. Other subscriptions on the same socket are unaffected.
params is an array containing exactly one object:
GetBlock supports three payment methods: fiat, crypto, and prepaid Credits.
Fiat and crypto payments go directly toward a subscription or one-time charge. Credits are a prepaid balance you fund first, then spend across any service on the platform.
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
GetBlock ERC-4337 Methods: access bundler RPC calls for smart accounts, so gasless and batched transactions work without your own UserOperation relay.
This add-on adds the account-abstraction methods. Account abstraction lets a smart contract act as a wallet, enabling transactions without native ETH for gas, third-party gas sponsorship, and custom validation logic.
Account abstraction does not change the base protocol. It works through a separate transaction-like object, the UserOperation, and a set of off-chain roles that process it. The geth and reth clients do not know about UserOperations, so they cannot serve the ERC-4337 methods on their own.
To close that gap, GetBlock runs a bundler as a sidecar next to your node. The bundler is the component that understands UserOperations. It exposes the full ERC-4337 RPC to your client and settles the operations on-chain through the EntryPoint contract.
A UserOperation describes an action for a smart-contract wallet. Your client submits it to the bundler rather than to the chain directly. The bundler validates it, holds it in its own mempool, groups several operations together, and submits the bundle to the EntryPoint contract, which executes each one against its target wallet.
Owner — the known entity believed to control the address, such as an exchange or service. An owner is an identity signal and does not have its own risk score.
Cluster — a group of addresses linked through common control or on-chain behaviour. Unlike an owner, a cluster has its own risk score and can raise the wallet’s total score even when the address has little history or no risky current balance.
Labels — external-list memberships associated with the address, such as an issuer freeze, sanctions reference, or functional role such as contract deployer. Critical labels are highlighted, but a label is not automatically a risk score or proof of wrongdoing.
Why this score — the principal wallet-wide drivers, including FATF category matches, cluster risk, and confirmed external reports. Each driver has its own impact level; these values do not add up directly to the total score.
FATF indicators — flagged counterparties grouped by category, direction of funds, interaction count, and risk level. Rows are evaluated independently and should not be added together.
Wallet exposure — a composition view showing each category’s share of the screened historical exposure. These percentages are exposure shares, not risk scores and not percentages of the current wallet balance.
Calculation ID and PDF export — the calculation ID identifies the exact screening result. Save it with the PDF and timestamp so the decision can be reconstructed later.
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.



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": ""}
Most use cases
Single nonce, atomic execution, slightly higher gas
Advanced scenarios requiring separate transactions
Method
bsc_privateTx
mev_sendBundle
Transaction count
Single
Multiple
Atomicity
Two nonces, more complex setup
Not applicable
-32602
Invalid argument
Ensure the parameters in the params array match the expected format for the method.
-32700
Parse error (invalid JSON format)
Double-check your JSON syntax. Ensure your request is properly formatted.
401
Unknown token
The token isn't recognized on this host. This covers several causes: the token is simply wrong (typo), it was rolled or deleted, it was never issued, or — since access tokens are region-bound — it's a completely valid token, just issued for a different region than the host you're calling (eu-central-1, us-east-1, or ap-southeast-1). If you're sure the token is current and correct, check it matches the region shown for that endpoint in your Dashboard; if it might have been rolled, generate a fresh one.
— (no HTTP response)
Could not resolve host / DNS lookup failure
Your request never reached GetBlock. Check the host segment of the URL is spelled correctly, e.g. <service>.<region>.getblock.io, and matches one of the regions shown in your Dashboard.
429
Too many requests
Check your GetBlock account for usage limits. Upgrade your plan if necessary
-32600
Invalid Request ("method must be POST")
JSON-RPC requests must be sent as POST with a JSON body. This is what you'll see if you open the endpoint URL directly in a browser or send a GET request.
-32601
The method does not exist/is not available
Verify the method name (eth_blockNumber, eth_getBalance, etc.) against the blockchain's JSON-RPC .
Derivation support: The add-on covers the BIP44, BIP49, BIP84, and BIP86 (Taproot) schemes, so it reads legacy, SegWit, native SegWit, and Taproot wallets.
Filtering and paging: Page through large result sets and filter transactions by block-height range.
An xpub query, for instance, returns the balance for the entire wallet, the derived addresses, and the transactions, sorted by block height with the newest first.
Because Blockbook indexes unspent outputs by address, the configurator offers it only on Bitcoin-type chains:
Bitcoin
BTC
Bitcoin Cash
BCH
Dash
Each chain's paths and methods are listed under its own entry in the API reference. The schema is shared across all of them, so a query written for one chain works on another with only the endpoint changed.
Wallet-level answers: One xpub call returns a full wallet, instead of many per-address calls.
No indexer to build: You skip building and operating an address index next to your node.
Direct UTXO access: You read unspent outputs to construct a spending transaction.
Broad wallet coverage: Legacy through Taproot wallets are all supported.
You build a Bitcoin wallet or a portfolio tracker.
You need address balances or transaction history on a UTXO chain.
You construct transactions and need the UTXOs behind an address.
Blockbook serves UTXO (Bitcoin-type) chains. It does not apply to account-based chains such as Ethereum.
The interface serves many coins through a shared schema, so some fields apply only to specific chains.
Node type: Choose between Full Node or Archive Node
Pick a deployment location: Germany (Frankfurt), USA (New York), Singapore
Node client: Choose your preferred node implementation (e.g., Geth)
API interface: Review available interface types
Under the Performance section, select a performance tier:
High: premium specs, max throughput
Standard: enterprise specs, optimized pricing for moderate-high loads
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:
Review the final pricing and node settings
Billing Contact — Enter your contact information so the GetBlock team can notify you when your node is ready.
Payment method — Choose between Credit Card or Crypto.
Subscription — Enable the subscription toggle if you want to ensure your node renews automatically each billing cycle.
When ready, click Go to Payment.
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:
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.
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.
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.


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 or call, but pushed in real time.
In addition to streaming methods, Dragon’s Mouth also exposes several unary RPCs via the same gRPC interface for quick queries about:
The Slot;
Block height;
Latest blockhash;
Valid blockhash.
Together, this provides a way to both fetch state on demand and receive updates in real time.
Near-zero latency: By streaming directly from leaders, Dragon’s Mouth delivers updates often hundreds of milliseconds faster than standard RPC/WebSocket APIs.
High throughput: The plugin can handle millions of events per minute under load, built for Solana’s high transaction volume. Optional compression can be applied for even more efficiency.
Built-in support for bi-directional streaming: Keep-alives, ping/pong frames help maintain long-lived connections.
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
subscription
string
Yes
The subscription ID returned by getblock_subscribe.
wscat -c 'wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream' -H
ws.send(JSON.stringify({
await ws.send(json.dumps({
result
boolean
true when the subscription was cancelled. false when no active subscription with that ID exists on this connection, for example because it was already cancelled.
Switching a wallet view from one address to another without dropping the socket
Freeing a slot when you approach the 15-subscription limit
Replacing a subscription with one that has different filters (subscriptions cannot be modified in place)
Tearing down cleanly when a component unmounts
-32602
getblock_unsubscribe params must contain one object
params was empty, held more than one entry, or the entry was not an object, such as a bare ID string.
-32602
subscription is required
{
"jsonrpc": "2.0",
"id": 2,
"result": true
}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.
To update your payment information while you have an active subscription:
Go to Billing → Billing Information.
Click ‘Edit’.
Enter your updated payment details and save the changes.
Users can pay for subscriptions or top up their Credits 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.
GetBlock Credits are a universal, USD-denominated prepaid balance you can use to pay for any service on the platform — Shared Node subscriptions, Dedicated Nodes, Limitless plans, CU top-ups, and on-demand Products (Wallet Audit, AML Checks, TRON Energy delegation, Solana Shred Streaming, Solana Market Data, etc.)
How it works:
Prepaid model: Top up your balance in advance. It can then cover subscription costs or one-time service fees without triggering a new external transaction each time.
"Credits" appears as a payment option alongside fiat and crypto during checkout.
GetBlock Credits are prepaid service credits. Once topped up, they can't be withdrawn or refunded to a bank account or crypto wallet.
Your balance is tied to your account and can't be moved to another GetBlock account.
Go to Billing in your dashboard and select "Top up Credits."
Choose a preset amount (e.g. $10, $50, $100) or enter a custom value
Pick a payment method to fund it: card payments via Stripe, or crypto via NOWPayments.
The Billing page shows your current balance, top-up history, and invoices.
At the payment step, enable the Subscription toggle to use recurring billing. Your subscription renews automatically, and Credits are deducted at the end of each billing period.
Your balance needs to cover tax as well as the plan price. Top up enough to cover the plan price plus tax.
eth_sendUserOperation
Submit a UserOperation to the bundler mempool
eth_estimateUserOperationGas
Estimate the gas a UserOperation needs
eth_getUserOperationByHash
Fetch a UserOperation by its hash
Native ERC-4337 support: You get the full account-abstraction RPC on a node that does not provide it by default.
Gasless transactions: With a paymaster, your users transact without holding native ETH, because the paymaster sponsors the gas.
No bundler to run: You build on smart-contract wallets without operating and maintaining your own bundler.
You build a product around smart-contract wallets.
You run a paymaster or a gas-sponsorship flow.
You build account-abstraction infrastructure and need a reliable bundler RPC.
claude mcp add --transport http getblock-docs https://docs.getblock.io/~gitbook/mcp{
"mcpServers": {
"getblock-docs": { "url": "https://docs.getblock.io/~gitbook/mcp" }
}
}{
"servers": {
"getblock-docs": { "type": "http", "url":
}
}Learn what each GetBlock add-on does, the problem it solves, and which blockchain it serves
An add-on extends your node with a capability that the standard JSON-RPC API does not provide: a second API layer, an address indexer, a bundler, a private mempool, or a real-time stream. Each add-on solves one specific problem that a standard node cannot solve on its own.
The eth_* API cannot see validators, slots, or finality
Since the Merge, an Ethereum node runs as two coupled clients: the execution layer, which processes transactions and serves the familiar eth_* methods, and the consensus layer, which runs Proof-of-Stake. A standard node only exposes the execution layer. The Beacon API add-on opens the consensus layer alongside it, so a single dedicated node answers both.
A Bitcoin-type node tracks unspent transaction outputs, but it does not organize them by address — ask a plain node for the balance of an address and it has no direct way to reply. Blockbook, an indexer built by Trezor, maintains an address-indexed and xpub-indexed view on top of the chain and answers those questions from its index.
Account abstraction lets a smart contract act as a wallet — enabling gasless transactions, third-party gas sponsorship, and custom validation logic — but standard clients such as geth and reth do not understand UserOperations, so they cannot serve the ERC-4337 methods. This add-on runs a bundler as a sidecar next to your node: it validates UserOperations, holds them in its own mempool, and settles them on-chain through the EntryPoint contract
If a contract shipped without an event you now need — a missing Transfer log, an unindexed state change — that data does not exist on-chain, and re-deploying a fixed contract cannot rewrite the past. Overlay methods take the real historical state and replay it through your version of the contract: the chain's inputs stay real, only the contract logic changes, and out come the logs the original contract would have emitted.
A pending transaction normally waits in the public mempool, where MEV bots watch for trades they can exploit — front-running your trade, sandwiching it between two of their own, or back-running the price gap it opens. Every one of those attacks depends on the bot seeing your transaction while it waits. MEV Protection routes your transactions through a private mempool, in partnership with Merkle, so a searcher never sees them and has nothing to attack.
Yellowstone gRPC is a high-performance Solana Geyser plugin, built by Triton One, that streams on-chain data directly from validators with millisecond-level latency—often hundreds of milliseconds faster than standard RPC or WebSocket APIs —and can handle millions of events per minute.
In the dedicated node configurator, Step 3 (Select API and Add-ons) lists the add-ons available for your chain — check the ones you need. For a node that is already running, open the node's Add-ons tab in the Dashboard: from there you can add a new add-on, cancel an active one, or create an endpoint for it. Included add-ons come at no extra cost depending on your configuration; advanced add-ons are billed in addition to the base node price.
How EVM Data Stream reports chain reorganizations on the original subscription, what delivery guarantees apply, and how to reconcile events on the client.
A block that looked canonical can be replaced by a competing block a few seconds later. Every event the stream delivered from the replaced block (headers, transactions, receipts, logs, transfers, and traces) is then no longer true.
EVM Data Stream reports this on the same subscription that delivered the original event. There is no separate reorg topic and no includeRemoved option: corrections are always on.
Every event, including a correction, carries the same four fields:
A delivered event and its later correction:
Store every removed: false event by eventId.
When the same eventId arrives with removed: true, undo or delete the stored value.
Events from the new canonical branch may arrive before or after the removals. Apply every event by
A minimal client reducer:
Corrections are always on. A client that does not want them ignores removed: true.
Corrections pass the same filters as the original event. A filtered subscription never receives a correction for an event it could not have received.
A correction is sent only for an event this subscription received.
Events of the new canonical branch may arrive before the old branch is removed.
Exactly-once delivery.
A common order across different subscriptions on one socket, or across API replicas.
Replay of events published while you were disconnected, corrections included. After a reconnect, rebuild state from your own source (for example, an RPC node) before trusting the stream again.
Inclusion in a block is not finality. The stream delivers events as soon as blocks are observed, and a correction may follow. If your application must act only on final data, such as crediting a deposit, wait for your own confirmation depth or for the network's finalized block before acting, and use corrections to reverse anything you showed provisionally.
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.
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 Wallet Audit, check out it docs, or access its endpoint
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
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.
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.
— 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.
On your , click on the credit balance as seen below:
Click on Top Up
Select the amount you want to pay or enter the amount:
After that, click on Proceed to checkout
You'll be routed to another page to complete your payment
Once you've completed your payment, go back to your dashboard to see it reflected.
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), (contract, slot, blockNumber), (address, blockNumber), etc.
Call view functions against historical state: e.g. (..., blockNumber).
Run historical queries and debugging that rely on old state: forensics, audits, explorers, indexing, and retroactive analytics.
Support tracing and higher-fidelity debugging that may require historical state.
This feature removes the need to run a dedicated archive infrastructure for some use cases, letting developers perform on-demand historical queries via GetBlock RPC API.
Archive functionality is included with all Shared Node subscriptions, excluding the Free plan. No additional fee required.
Archive support is provided for a set of popular protocol mainnets, including Ethereum, BSC, Polygon, Base, Arbitrum, TRON, Sui, Cardano, etc.
Look for the small history icon ( ) when picking a protocol during the . It indicates that Archive mode is available for that blockchain.
Sign in to your GetBlock dashboard and make sure you’re on the Shared Node tab.
Click Get endpoint and choose a required blockchain protocol.
Find the Mode toggle and switch the Archive mode on.
Finish configuring endpoint details by choosing the API interface and server location as usual.
After clicking Get, the new Archive endpoint appears in your Endpoints list. The endpoint URLs will follow the existing GetBlock format but point to archive nodes.
Archive endpoints usage remains subject to your plan’s .
However, serving requests from archive infrastructure involves heavier storage and compute power compared to regular full nodes.
Therefore, enabling the Archive mode affects how CU usage is calculated:
GetBlock applies a 2× Compute Unit (CU) multiplier to all requests made through the Archive endpoint.
The multiplier is applied to all requests made to an archive endpoint, even if the invoked RPC call does not require a historical state.
You can review the per-chain CU values for each method on our page.
Example:
If
eth_getBalancecosts 20 CU on a standard shared endpoint for a given chain, the same call to an Archive-enabled shared endpoint will cost 40 CU.
Plan accordingly and consider using standard Full mode endpoints for non-archive traffic to avoid unnecessary CU consumption.
Use archive endpoints only for workloads that require a historical state. For transactions or current state queries, use a standard Full mode to save CU.
Monitor CU consumption on the dashboard and set alerts for spikes or when usage nears your plan limit.
If you run sustained, high-volume archive queries, consider using a Dedicated Node.
what you’re building — our team can guide you to the most efficient archive node setup.
GetBlock’s Dedicated Nodes are available in two performance tiers – High and Standard. Choose the right balance of performance and cost for your private infrastructure
Dedicated Nodes are fully private blockchain nodes deployed and managed for your team. With two distinct performance presets, you can balance throughput, SLA, and budget to fit your workload.
Available tiers:
High Performance Tier: Designed to provide maximum available resources, throughput, and reliability. It is intended for applications where performance and availability are critical. The focus is on delivering the highest service levels and supporting the most demanding production workloads.
Standard Performance Tier: Designed to offer enterprise-grade performance sufficient for the majority of professional and business use cases, but at a more cost-efficient level. It targets demanding business applications and sustained usage, but without the additional (and sometimes excessive) headroom reserved for High Performance tier.
By providing these options, GetBlock helps you to deploy Dedicated Nodes that are tailored to your application’s technical, operational, and budget requirements.
When deploying a Dedicated Node, you can choose between High and Standard setups to align with your application’s resource needs and expected workload.
Select High if your workload is latency-sensitive, demands very high concurrent throughput, or is critical to business continuity.
Select Standard for typical production apps, where workload is within supported performance bounds.
Configuring tiers is available for all supported protocols unless there are specific infrastructure limitations for a given network. In this case, a chain will only support a single tier.
Dedicated Nodes are billed at a set monthly rate determined by configured settings:
Performance tier: Total cost scales with the performance tier selected – High tier is priced at a premium relative to the Standard tier.
Blockchain network: Each protocol has different hardware requirements, which impact both High and Standard tier pricing.
Node mode: Full or Archive.
Client parameters.
Refer to your Dashboard for up-to-date pricing details and protocol-specific options.
To select a tier during node setup, open the Dedicated Node dashboard:
Select protocol, network, deployment region, node mode, and a preferred client.
As a final step, choose the Performance Tier (High or Standard).
Review updated performance and pricing details.
Your dedicated node will be ready for use upon activation. To switch between tiers after deploying, reach out to support.
For advanced workloads or unique requirements, our engineering team can help craft a custom private node solution beyond the High/Standard presets. for tailored deployments.
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? Reach us 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.
Connection: We connect your dedicated node's P2P interface to the GetBlock Data center.
Data Flow: The node receives transactions and blocks from both the standard P2P layer and the BDN propagation network.
Automatic Selection: Your node automatically uses the first source to deliver data.
The BDN Gateway improves the delivery speed of:
Traders: To buy and sell tokens faster and submit transactions
Developers: To build a lower-latency dApp, access fresher data, and deliver more responsive user experiences
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:
for direct access to BDN data
with accelerated propagation
Using private transactions for or
GetBlock EVM Data Stream delivers real-time blockchain events such as blocks, logs, token and NFT transfers, receipts, and traces over WebSocket on Ethereum, BNB Smart Chain, Polygon, and Robinhood.
GetBlock EVM Stream delivers blockchain events in real time for wallets, payment services, DeFi applications, and analytics platforms. You select a network, event types, and filters, then receive updates over a persistent WebSocket connection.
This reduces the need to continuously poll RPC endpoints, extract events from blocks, and maintain event delivery infrastructure. Filters for addresses, contracts, and other parameters let applications receive the data they need while saving cost.
With EVM Data Stream, you can carry out the following operations:
EVM Data Stream is live on four networks. Each has its own WebSocket endpoint, and every topic is available on every network:
EVM Data Stream is charged by usage in Compute Units (CU). Standard pricing costs 10 CU per delivered event. Usage depends on the number of notifications delivered to the customer after filters are applied; for example;
1,000 events = 10,000 CU.
100,000 events = 1,000,000 CU.
1,000,000 events = 10,000,000 CU.
Each notification counts separately. One transaction can generate multiple notifications; delivering the same event to multiple subscriptions is counted separately. Precise filters help customers control data volume and CU consumption.
: connect and receive your first events.
: keep your state correct when blocks are replaced.
: methods, all 15 topics, limits, and errors.
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. It evaluates wallet addresses or transaction hashes and sends a detailed structured risk report thats contains a composite score, an exposure breakdown, and FATF-aligned flags within seconds.
It is built to give small teams, exchanges, OTC desks, and individual traders the same FATF-aligned data and scoring as large compliance vendors, but without KYB, annual contracts, or lengthy onboarding.
Before you accept, send, or clear crypto funds, you will have to answer this question:
has this wallet been used by 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.
Safely accept incoming funds so a downstream exchange doesn't flag or lock the deposit.
Onboard customers / KYT — screen wallets during onboarding or ongoing monitoring.
Crypto AML currently covers five networks — chosen because they carry the bulk of emerging-market exchange and remittance volume:
The engine combines on-chain and off-chain data:
On-chain: behavioral patterns, wallet clusters, counterparty flow, smart contract exposure, etc.
Off-chain: sanctions feeds, public attribution data, law-enforcement intelligence.
Choose the access method that fits your workflow:
Web — Select a network, enter a wallet address or transaction hash, and view the report. Export a PDF and keep an audit-ready history in your account.
REST API — Integrate bearer-authenticated screening endpoints into your backend.
Choose a pricing model:
Pay as you go: Top up your prepaid balance with a card or crypto. Each check deducts credits.
Bulk packages: Buy checks upfront for a lower per-check rate. Larger packages receive larger discounts. Reach out to the
GetBlock’s configuration file provides a more organized and flexible way to interact with blockchain nodes and networks without exposing sensitive API keys or credentials in the code.
Using GetBlock’s JSON configuration file with curl is particularly helpful when you need to access various node endpoints without hardcoding API keys in the code:
Download the getblock.config.json file from your GetBlock account;
Make sure you have jq installed. jq is a versatile command-line tool that enables extracting values from JSON files;
Navigate to your workspace or directory where you have imported the getblock.config.json file and open a terminal;
Now, you can make a GET request to a selected node endpoint using the curl command.
Connect to Ethereum nodes and other EVM-compatible networks using web3.js and GetBlock’s JS configuration file.
Make sure the web3.js library is added to your project. In order to do that, use one of the following methods:
Npm: npm install web3
Yarn: yarn add web3
Pure js link: dist/web3.min.js
Download the getblock.config.js file from your GetBlock account. Add this file to your project directory.
Import the getblock module to a .js file that configures a new Web3 instance:
Connect to an Ethereum node and start sending API calls using web3.js over HTTP or WebSocket in the format below:
Use go() method to access an entire endpoint or token() to fetch the token.
Set up GetBlock’s JS config file in Hardhat following the steps below:
Ensure you have Hardhat installed as a dependency in your Node.js project or run the following command to do so:
Navigate to your GetBlock account and install the getblock.config.js file. Copy and paste it into your working directory;
Open the hardhat.config.js file from your project directory and import the getblock module:
To set up GetBlock as a provider, modify the Hardhat configuration file with the credentials as shown below. Use go() method to access an entire endpoint or token() to fetch the token only.
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.
The steps below cover how to generate a new endpoint URL with an Access Token:
Log in to your GetBlock account and navigate to the Dashboard
Find the Endpoints section on the Dashboard
Click Get endpoint to open the endpoint setup menu
In the modal that opens, select:
The desired blockchain protocol (Ethereum, BNB Chain, Polygon, etc.)
The network you want to interact with: mainnet or testnet
Node mode:
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.
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 and get one of the 100+ available chain endpoints.
Every wallet’s network can be modified this way, and this step-by-step guide shows how to do that.
You need to set up the Brave wallet and prepare the GetBlock API endpoints.
Brave Wallet is inseparable from the Brave browser. So, download and install the browser from the . It’s available for desktop, Android, and iOS.
After opening the browser, look at the wallet icon in the upper right corner. Click on it to open the Brave Wallet. Import the account using a seed phrase or create a new one.
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
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).
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.
These examples provide a starting point for testing your connection and querying blockchain data using cURL commands.
Before you start:
Create a JSON-RPC endpoint for the Ethereum blockchain from your GetBlock account.
Replace the endpoint URLs in the examples below with your actual URLs.
Run the following command to retrieve the latest block number:
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.
Power your Solana dApps and backends with the fastest, most reliable streaming data available. Yellowstone gRPC add-on is for apps that need every live event as fast as the network can deliver.
Yellowstone gRPC is a high-performance Solana Geyser plugin that provides real-time streaming access to on-chain data. Built by Triton One, it delivers blocks, transactions, and account updates with millisecond-level latency directly from Solana validators.
GetBlock offers managed Yellowstone gRPC endpoints as an add-on to Dedicated Solana Node subscriptions, eliminating the need for infrastructure setup and maintenance.
Near-zero latency: Streams data directly from validators, often hundreds of milliseconds faster than standard RPC/WebSocket APIs
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.
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 .
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:
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.
If the network is already in your list but uses a default RPC provider, you can switch to GetBlock by following these steps:
GetBlock Solana Shreds Streaming delivers raw block data straight from validators, over UDP, before the block is assembled.
Solana Shreds Streaming delivers raw block data directly from validators over UDP before the block is assembled. It gives you the earliest possible view of what is happening on Solana — earlier than any standard RPC or gRPC feed.
A Solana leader does not publish a finished block all at once. As it produces a block, it splits the data into small fragments called shreds and streams them across the network through Turbine, Solana's stake-weighted propagation layer. Other validators receive the shreds and reassemble them into a complete block.
DASH
Dogecoin
DOGE
Litecoin
LTC
Zcash
ZEC
The object has no subscription field. id is not an accepted alias.
eth_getUserOperationReceipt
Get the receipt for a UserOperation
eth_supportedEntryPoints
List the EntryPoint contracts the bundler supports
getTransactiongetProgramAccountsEthereum
A plain node cannot answer address or wallet queries
UTXO chains (Bitcoin-type)
Standard clients do not serve account-abstraction methods
EVM chains
Data a contract never emitted does not exist on-chain
EVM chains
Bots see your transactions in the public mempool
EVM chains
Standard RPC and WebSockets report Solana events too late
Solana





Free daily quota
5 requests
Price per request
$0.20 USD
Billing method




Prepaid balance
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
Resource allocation
Maximum hardware and bandwidth
Balanced hardware profile
Throughput
Highest supported

High
State Transitions
Account and contract state
Fresher data for decisions
Transaction
Submiting Trsanction
Submit single transactions or bundles with optimized propagation paths
New Blocks
Block headers and transactions
React to state changes faster
Mempool Updates
Pending transactions
See opportunities earlier
NFT transfers, mints/burns, approvals, and metadata update signals
nftTransfers, nftApprovals, nftMetadataUpdates
Smart wallets / Account Abstraction
Smart account operation events through EntryPoint, including execution and errors
accountAbstractionOperations
Pending transaction monitoring
Transactions observed in the mempool before inclusion in a block
newPendingTransactions
Network analytics and custom indexing
Block headers or full blocks to update applications and process new data
newHeads, newBlocks
Execution and internal activity analysis
Call traces at the block or individual transaction level for analytics and troubleshooting
newBlockTraces, newMinedTransactionsTraces
Robinhood Mainnet
wss://stream.eu-central-1.getblock.io/v1/robinhood-mainnet/stream
Payments and wallets
ERC-20 transfers, transaction inclusion in a block, and execution results for incoming payment notifications and status updates
erc20Transfers, newMinedTransactions, transactionReceipts
Token approval monitoring
Events granting or changing ERC-20 spending allowances for alerts and risk monitoring
erc20Allowence
DeFi and smart contract events
Contract logs, including events decoded using the customer's ABI, such as swaps, deposits, and loans
logs, decodedLogs
Ethereum Mainnet
wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream
BNB Smart Chain
wss://stream.eu-central-1.getblock.io/v1/bsc-mainnet/stream
Polygon Mainnet
NFT applications and marketplaces
wss://stream.eu-central-1.getblock.io/v1/polygon-mainnet/stream
LTC
Litecoin
BCH
Bitcoin Cash
ETH
Ethereum
TRX
TRON
BTC
Bitcoin
eth_getBalanceeth_getStorageAteth_getCodeeth_callcurl -X GET https://shared.eu-central-1.getblock.io/"$(jq -r '.shared.btc.mainnet.rest[0]' getblock.config.json)"/rest/chaininfo.jsonconst { getblock } = require('./getblock.config.js');const { getblock } = require('./getblock.config.js');
const { Web3, HttpProvider, WebSocketProvider } = require('web3');
// Create the JSON-RPC provider
var web3Rpc = new Web3(new HttpProvider(
getblock.shared.eth.mainnet.rpc[0].go()
));
// Create the WebSocket provider
var web3Ws = new WebSocketProvider(
`wss://shared.eu-central-1.getblock.io/${getblock.shared.eth.mainnet.ws[0].token()}`
);npm install --save-dev hardhatconst { getblock } = require('./getblock.config.js');const { getblock } = require('./getblock.config.js');
module.exports = {
defaultNetwork: "sepolia",
networks: {
hardhat: {
},
sepolia: {
url: getblock.shared.eth.sepolia.rpc[0].go() // https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
},
goerli: {
url: `https://shared.eu-central-1.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
}
}any
The topic payload. A correction repeats the payload of the event it removes.
eventIdrevisionIgnore any event whose revision is not greater than the one you already applied for that eventId. This also makes duplicate deliveries harmless.
Delivery is at-least-once. A repeated event is safe to apply because eventId is stable and revision identifies the newer state.
eventId
string
Stable identifier for the event. A correction reuses the eventId of the event it removes.
removed
boolean
false for a canonical event, true for a correction that removes a previously delivered event.
revision
number
Version number. For one eventId, a greater revision is always the newer state.
const revisions = new Map();
const state = new Map();
function applyEvent(event) {
const previous = revisions.get(event.eventId);
if (previous !== undefined && event.revision <= previous) return; // already applied
revisions.set(event.eventId, event.revision);
if (event.removed) {
state.delete(event.eventId);
} else {
state.set(event.eventId, event.data);
}
}
ws.on('message', (raw) => {
const msg = JSON.parse(raw);
if (msg.method === 'getblock_subscribe') applyEvent(msg.params.result);
});{
"eventId": "eth:mainnet:block:0x19ddc6864bd5ec1cdbd493e3d3653b529d79293a6773517018153cdff6ac0be2:newHeads:0x19ddc6864bd5ec1cdbd493e3d3653b529d79293a6773517018153cdff6ac0be2",
"removed": false,
"revision": 116876399,
"data": { "number": "0x18d1e1e", "hash":
}{
"eventId": "eth:mainnet:block:0x19ddc6864bd5ec1cdbd493e3d3653b529d79293a6773517018153cdff6ac0be2:newHeads:0x19ddc6864bd5ec1cdbd493e3d3653b529d79293a6773517018153cdff6ac0be2",
"removed": true,
"revision": 116876512,
"data": { "number": "0x18d1e1e", "hash":
}data
The API interface that you need (JSON-RPC, WebSockets, GraphQL, etc.)
One of the available server locations (Frankfurt, New York, or Singapore)
Now, it’s time to prepare the working part: the GetBlock node.
Proceed to the GetBlock dashboard and create an account or log in.
Click on the Get button to add a new RPC endpoint, and select the Ethereum mainnet.
Pick the endpoint location. Currently, Frankfurt, Singapore, and New York endpoints are available for a free node. Selecting the physically closest one is usually the best option.
Click Get, and the endpoint is ready.
It’s now available via the access token URL and can be used to perform transactions, deploy smart contracts, and much more.
Free node endpoints offer a generous 50,000 free Compute Units per day with a 20 RPS limit. It’s more than enough for single-person activities.
Brave Wallet supports a wide range of EVM and non-EVM networks. Let’s modify an Ethereum account.
Go to Brave Wallet settings
In the upper right corner of the wallet interface, click on the three-dot options () button and select Settings. Here, a list of supported networks can be found.
Locate the network in the list
If the network of interest is already present, such as with Ethereum, click on the three-dot options () button right of Ethereum and then select Edit to open the account settings.
Look at the RPC URLs settings fro Ethereum: usually, a default Brave Wallet endpoint is present here. As every wallet user connects to it by default, it’s overloaded and insecure. That’s why a custom RPC URL is essential for Web3 activities.
Add a custom API URL to the network
Go to the GetBlock dashboard and copy the newly obtained Ethereum RPC access token. Add it under RPC URLs as shown below.
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 compute unit 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.
Search the network ID in Brave settings
Return to the Wallet Networks menu. Instead of selecting existing networks, click on the Add button. Start typing “polygon zkevm” to locate the network quickly.
After clicking on it, Brave fills all required fields automatically.
Get a network’s RPC URL at GetBlock
Return to the GetBlock dashboard, click Get again, and select Polygon zkEVM mainnet this time. Currently, only the Frankfurt region is available for zkEVM nodes.
Voila—the free and highly secure Polygon zkEVM node endpoint is ready.
Add a custom API URL to the new network
Copy the access token and go to the Brave settings. Add the new RPC URLs field and paste the access token.
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.
Set the ES module "type": "module" in your package.json.
Replace <ACCESS-TOKEN> with your actual access token from GetBlock (Base or Optimism endpoint).
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.
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.
wss://shared.eu-central-1.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
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://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["0x4200000000000000000000000000000000000006", "pending"],
"id": "getblock.io"
}'const axios = require('axios');
const response = await axios.post('https://shared.eu-central-1.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);import requests
response = requests.post(
'https://shared.eu-central-1.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())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://shared.eu-central-1.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://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
WebSocket
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x0de0b6b3a7640000"
}curl --location --request POST 'https://shared.ap-southeast-1.getblock.io/<ACCESS_TOKEN>/
If successful, the response will include the current block number in hexadecimal value:
Identify the blockchain network with the eth_chainId method:
curl --location --request POST 'https://shared.eu-central-1.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://shared.us-east-1.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://shared.ap-southeast-1.getblock.io/<ACCESS_TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_chainId",
"params": [],
"id": "getblock.io"
}'Response example:
In this example, 0x1 indicates the Ethereum Mainnet. The chain ID helps confirm which blockchain network you are interacting with.
Retrieve the balance of an Ethereum address using eth_getBalance. Replace <ACCOUNT_ADDRESS> with the target wallet address:
curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS_TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["<ACCOUNT_ADDRESS>", "latest"],
"id": "getblock.io"
}'curl --location --request POST 'https://shared.us-east-1.getblock.io/<ACCESS_TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["<ACCOUNT_ADDRESS>", "latest"],
"id": "getblock.io"
}'curl --location --request POST 'https://shared.ap-southeast-1.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:
The result field shows the account balance in wei (1 ether = 10¹⁸ wei).
curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS_TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": "getblock.io"
}'curl --location --request POST 'https://shared.us-east-1.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"
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x1"
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x5a70dac3910910"
}WebSocket
wss://shared.eu-central-1.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
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.
curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["0x4200000000000000000000000000000000000006", "pending"],
"id": "getblock.io"
}'const axios = require('axios');
const response = await axios.post('https://shared.eu-central-1.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);import requests
response = requests.post(
'https://shared.eu-central-1.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())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://shared.eu-central-1.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(())
}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.
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.
HTTP
https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x3bdf5275488a29a8a57c"
}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:
Accounts
Real-time account updates including lamports, owner, and data
Transactions
Full transaction data with metadata and instruction details
Blocks
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
DeFi strategy engines
Alerting and notification systems
NFT marketplace trackers
Wallet activity monitors
To use Yellowstone gRPC on GetBlock:
A GetBlock account (sign up at getblock.io)
A Dedicated Solana Node 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 GetBlock dashboard or visit our support page.
import Client, {
SubscribeRequest,
CommitmentLevel
} from "@triton-one/yellowstone-grpc";
const client = new Client("https://shared.eu-central-1.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}`);
}
});string
Yes
The subscription ID returned by eth_subscribe.
# WebSocket-only method. Use wscat (or similar) to connect first:
wscat -c 'wss://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
import WebSocket from 'ws';
import asyncio
import json
import websockets
async def main():
async with websockets.connect('wss://shared.eu-central-1.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://shared.eu-central-1.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(())
}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
import { ethers } from 'ethers';
const provider = new ethers.WebSocketProvider('wss://shared.eu-central-1.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://shared.eu-central-1.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);subscriptionId
{
"jsonrpc": "2.0",
"id": 1,
"result": true
}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.
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.
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.
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.
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
Priority assistance from GetBlock experts
Visit the Enterprise Solutions page to learn more about how we tailor services to fit complex, high-demand environments.

Click on the current network name in MetaMask to open the dropdown of networks.
Find the network you want to edit and click the settings menunext to it. Select 'Edit'.
Open the ‘Default RPC URL’ dropdown and select 'Add RPC URL'.
Paste the JSON-RPC endpoint URL from your GetBlock account (https://shared.eu-central-1.getblock.io/<ACCESS_TOKEN>/).
Name the new RPC URL for easier identification.
Click 'Add URL', then 'Save' to confirm.
You can now switch between RPC URLs for that network as needed.
If the network isn’t in your list, you can add it as a custom network. For this example, we will add the Polygon zkEVM to MetaMask.
Click on the current network name.
Select 'Add a custom network'.
Fill in the required fields:
RPC URL
The network's JSON-RPC URL from your GetBlock account
https://shared.<region>.getblock.io/<ACCESS_TOKEN>/
Chain ID
The ID of the network
Click 'Save', and the custom network will be added and selected as default.
From the shreds, you reconstruct transaction intent as the leader is packing it: transaction signatures, the accounts involved, the instructions (program, accounts, data), address lookup table references, and slot numbers. This arrives roughly 100 to 500 milliseconds earlier than a standard commitment-based feed reports the same activity.
That head start is the entire point. In latency-sensitive strategies, seeing a transaction before it is confirmed is the difference between reacting first and reacting too late.
As a dedicated node add-on: You attach shreds streaming to your Solana dedicated node, giving your node and your workloads a faster, steadier source of block data.
As a standalone service — no node needed: You top up credits, open a UDP port, and start receiving shreds. You do not run or rent a Solana node at all. Decoding the shreds gives you the transaction data directly, and your credit balance meters the usage.
The service connects to validators and forwards their shreds to your listener over UDP. UDP carries data at wire speed: it has no handshakes and no retransmissions, so it removes the overhead that slows a TCP-based feed. You run a listener on an open UDP port, decode the incoming shreds into transactions, and act on them.
The earliest view of the chain: You act on transaction intent before a standard feed reports it.
Lower tail latency: Shreds arrive with less timing variance, so the feed stays steady slot after slot.
A redundant data path: Direct shreds add a second source next to Turbine, which helps in remote or less-peered regions.
No node required: In standalone mode you receive data without the cost and the operations of a full Solana node.
You run a high-frequency trading bot or an arbitrage engine.
You run an MEV searcher and need to react first.
You run a liquidation bot where a few milliseconds decide the outcome.
You run high-frequency analytics that need the earliest possible data.
Pre-execution data only: Shreds show intent, not results. You do not get success or failure, balance changes, logs, or compute usage, so some transactions you observe will later fail. Treat the stream as a signal, and confirm outcomes through a normal feed.
Possible packet loss: UDP trades reliability for speed, so a raw stream may drop packets. This is acceptable for speed-critical work, but you design for it.
You decode the stream: Raw shreds need a listener that decodes them. This is a low-level integration, not a single RPC call.
Solana only: Shreds are a Solana concept; the service does not apply to other chains.
Protocol
UDP (raw shreds)
Access modes
Dedicated node add-on · standalone credit-based service
Available Regions
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.
You can monitor the status of your dedicated node subscriptions in three different ways.
The widget on your dashboard alerts you when your subscription is about to expire or is in a grace period. Click the widget to open a pop-up that lists all nodes that require renewal.
The Manage Plans section can be found by navigating to the “Pricing” option in the left-side menu. You'll see three tabs: click on “Manage Plans” to view all your subscriptions in one place.
Each endpoint in “My endpoints” list shows its current subscription status.
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.
Go to Dedicated Nodes tab from your dashboard. Look for the subscription alert widget.
Click the widget to see a list of nodes needing renewal and choose one. A pop-up will show extension options (1, 6, or 12 months).
Choose a new period and review details. Proceed to checkout.
Complete the payment by following the instructions provided.
Check the "Payment History" under the Pricing tab to track the progress.
For fiat (credit card) payments:
Payments are processed via Paddle.
VAT may apply depending on the user's location.
The extension is applied instantly once the payment is completed.
Navigate to your main dashboard and switch to the Dedicated Nodes tab.
Choose a node to extend. Expand the node’s details and click "Extend" to begin the process.
Follow the pop-up instructions to select the new subscription period and finalize the process.
Navigate to Pricing > Manage Plans.
Review all subscriptions. Subscriptions nearing expiration are listed at the top.
Follow the same steps: Select your node, choose a new period, and confirm your payment.
If you face any issues with renewal or extensions, feel free to reach out to GetBlock support—we’re happy to assist.
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.
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
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
https://services.getblock.io/v1All requests require an API key in the header:
Authorization: Bearer <API_KEY>Go to your account dashboard
Click on the product icon on the Navbar
Scroll down and Select Address Audit
After that, select the API key tab
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).
Create and initialize a new project:
Create a new file named index.js. This is where you will make your first call.
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.
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
Learn how Crypto AML evaluates signals, assigns risk bands, and reports exposure.
Crypto AML evaluates on-chain and off-chain signals for each wallet. It returns a composite risk score, risk band, exposure breakdown, flags, and attribution.
Each check passes through three stages.
The engine collects two types of evidence:
Address attribution: whether the address is associated with a known owner, service, organization, or wallet cluster.
On-chain exposure: the types of counterparties and activities connected to the address through observed transactions or asset flows.
A signal is a normalized piece of evidence—not merely a raw label. A signal may describe:
a direct match to a reported or regulated entity;
membership in an identified wallet cluster;
exposure to a particular risk category;
the direction of an interaction;
Related internal findings may be combined into a broader customer-facing category. Internal source labels and provider-specific terminology are never returned in the public report.
The engine evaluates more than 30 criteria. Each signal is normalized and assigned an internal weight based on its relevance and evidential strength.
A simplified representation is:
The engine then combines these contributions with rule-based checks and supervised machine-learning models:
This is more accurate than describing the result as a simple average. A direct, high-confidence finding may affect the result differently from indirect exposure, even when both appear in the same risk category.
The exact weights and decision rules are not exposed, but the report provides the evidence needed to understand the result. Median processing time is under two seconds.
The report includes:
Overall risk score: the composite result from 0 to 100.
Exposure breakdown: how the observed exposure is distributed across public categories.
Compliance flags: direct findings that may require additional review.
Attribution: identified owners, services, or wallet clusters, when available.
The fields answer different questions:
The score indicates the overall level of risk.
The exposure share shows what the observed activity consists of; it is not the percentage contribution to the score.
Flags identify direct or particularly significant findings.
Attribution explains the entity or cluster context behind the address.
A customer should therefore read the score together with the exposure, flags, and attribution—not as a standalone decision.
On-chain behavioral patterns
Wallet clusters
Counterparty flow
Smart contract exposure
The composite riskScore ranges from 0 to 100. It maps to one riskBand. The thresholds are exact:
The report includes attribution when it can establish an identity:
owner — a wallet owner
cluster — a cluster identifier.
labels — Entity names or inferred tags, such as ["sanctioned_entity", "mixer"].
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.
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
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.
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
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.
block number
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
Learn more about extra services specifically for GetBlock dedicated nodes
A GetBlock dedicated node gives you isolated compute for one workload. These extra services extend that node. Each service solves one specific problem that a standard node cannot solve on its own.
You cannot see how your node is used
A private Grafana workspace that records every request your node handles and turns it into time-series charts: request volume, latency as percentiles (p50, p95, p99), and error rate — sliced by RPC method, by access key, and by region. You can trace a latency spike to the exact method behind it, attribute cost to a team or customer, size capacity from measured traffic, and spot a key that starts behaving abnormally.
Health-checks your node at set intervals and treats it as degraded when it lags the chain head, its error rate rises, or its latency crosses a limit. Degraded traffic moves to GetBlock's shared RPC pool automatically and moves back once the node recovers — the endpoint URL never changes, so your application never notices the switch. Client upgrades and maintenance windows stop being downtime.
Serves your node from a domain you own — rpc.yourapp.com via a CNAME record — instead of the autogenerated address with a random access token in the path. Authentication moves to a header such as x-access-token, so the secret no longer travels inside the URL, where it tends to end up in server logs and browser history. The URL also survives token rotation.
A dedicated node isolates the compute, but every request still passes through a shared ingress layer that terminates TLS, checks authentication, applies rate limits, and routes the request. This service gives you a proxy fleet that serves only your traffic: no other customer's surge can slow your gateway, the added latency stays predictable, and the rate-limit and routing rules become yours to configure.
Use it when you run at high request rates and the shared gateway has become the limit, or your compliance rules require an isolated traffic path end to end. Skip it when your traffic is moderate and the shared gateway keeps up — it isolates the routing layer, not the node's compute.
Restricts your endpoint by source IP: only requests from addresses you approved reach the node; everything else is rejected at the gateway with 403 Forbidden, before it consumes node capacity or quota. Entries can be single addresses or CIDR subnets, IPv4 and IPv6. A token authenticates who is calling; the allowlist controls where the call comes from — so a leaked token alone is no longer enough.
Runs what a default node deliberately leaves off: the debug, trace, txpool, or admin namespaces; a specific client version, patched build, or private fork; custom flags or a custom tracer. You describe what you need, and GetBlock deploys and operates it — upgrades, monitoring, and incidents included — so you get the exotic setup without owning its operations.
Delivers raw block fragments (shreds) straight from validators over UDP, before the block is assembled — roughly 100 to 500 milliseconds before a standard commitment-based feed reports the same activity. You decode the shreds into transaction intent as the leader is packing it: signatures, accounts, instructions, and slot numbers. It comes in two modes: attached to your Solana dedicated node, or as a standalone credit-based service with no node at all.
Collapses your per-chain endpoints into one URL and one credential. You keep your dedicated nodes but reach them all through a single unified endpoint, selecting the target chain with a subdomain, a path, or a chain-id parameter. Rate limits and the IP allowlist are set once and apply to every chain behind it, so adding a network no longer adds another endpoint and key to configure, rotate, and keep in sync.
Removes the gateway and load balancer from the path and connects your application straight to your node. Those layers each add a small amount of time and, worse for trading, a small amount of variance; a fixed direct route removes both. Because you always reach the same node, you also keep a consistent view of the mempool and chain state. Pair it with a node in the region closest to your systems for the largest gain.
Set up a dedicated node from your account dashboard. It covers most workloads on its own.
Add a capability only when you have the problem it solves.
Read the "When you can skip it" section on each page before you buy.
For blockchain-specific capabilities — Beacon API, Blockbook, ERC-4337, Overlay Methods, MEV Protection, Yellowstone gRPC — see the section instead.
To add any of these to your dedicated node, use the configurator setting of Dedicated Nodes or contact the support team for assistance.
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.
Every Limitless Node includes:
Guaranteed requests-per-second (RPS) throughput with no per-method throttling
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.)
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.
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.
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.
Pass "pending" for the balance at the latest Flashblock state
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
Pass "pending" for the balance at the latest Flashblock state
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
Request parameters are missing or malformed
-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
eu-central-1, us-east-1, ap-southeast-1
Block metadata including slot, parent slot, and timestamp
Slots
Slot notifications as they're processed by the leader
Block Meta
Block metadata with transaction counts and execution status
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
$199
Your app breaks when the node degrades
$199
Your endpoint URL exposes a random hash
$199
Other traffic shares your routing layer
$199
Anyone with the key can call the node
$199
You need a namespace or client we do not run by default
$500
Standard feeds report Solana activity too late
On request
You manage one URL per chain
$199
The proxy layer adds latency you cannot afford
$199

the amount or share associated with that exposure;
the strength and specificity of the available attribution.
Calculation details: the time of the assessment and its unique calculation ID.
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
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.
Band (riskBand)
Label
Score range
Meaning
low
Low
0–24
No material risk indicators in the current evaluation.
1101
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/
signal contributionᵢ = weightᵢ × normalized signal valueᵢoverall risk score = scoring model(weighted signals, direct findings, attribution context)curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_chainId",
"params": [],
"id": "getblock.io"
}'Expiring Soon
(One-Time Payment)
In Grace Period
(Recurring /One-Time)
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)
-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
subscriptionType
string
Yes
Must be "newFlashblockTransactions"
includeFullObjects
boolean
No
true to receive full transaction objects with logs; false (default) for hashes only
import asyncio
import json
import websockets
async def main():
async with websockets.connect('wss://shared.eu-central-1.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://shared.eu-central-1.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(())
}{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x5c1de6a7b8c9d0e1f2a3b4c5d6e7f8a9"
}result
string
Hex-encoded subscription ID. Each subsequent notification carries either a transaction hash (default) or a full transaction object with logs (true param)
403
Forbidden
Missing or invalid <ACCESS-TOKEN>
-32602
Invalid params
import { ethers } from 'ethers';
const provider = new ethers.WebSocketProvider('wss://shared.eu-central-1.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://shared.eu-central-1.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. Use wscat (or similar) to connect first:
wscat -c 'wss://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/'
# Then send:
{"jsonrpc": "2.0", "method": "eth_subscribe", "paramsimport WebSocket from 'ws';
const ws = new WebSocket('wss://shared.eu-central-1.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);
}
});Request parameters are missing or malformed
Add the following code to 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.
node index.jsExpected 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"
}
]
}
}mkdir wallet-audit-quickstart
cd wallet-audit-quickstart
npm init --yesnpm install axios

-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://shared.eu-central-1.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://shared.eu-central-1.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
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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' })curl --location --request POST 'https://shared.eu-central-1.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://shared.eu-central-1.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));Request parameters are missing or malformed
-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://shared.eu-central-1.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://shared.eu-central-1.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
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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' })curl --location --request POST 'https://shared.eu-central-1.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://shared.eu-central-1.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));Request parameters are missing or malformed
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://shared.eu-central-1.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://shared.eu-central-1.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
-32602
Invalid params
Invalid address format
-32603
Internal error
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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' })curl --location --request POST 'https://shared.eu-central-1.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://shared.eu-central-1.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, Request identifier matching the request
Node internal failure
-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://shared.eu-central-1.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://shared.eu-central-1.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
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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);curl --location --request POST 'https://shared.eu-central-1.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://shared.eu-central-1.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));Request parameters are missing or malformed
import axios from '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://shared.eu-central-1.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));node index.js{
"jsonrpc": "2.0",
"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
}
python main.pyUnlimited 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 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 access tokens, 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
One Limitless Node subscription corresponds to one blockchain network. The service is currently available on 11 high-demand blockchains:
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.
25 RPS
$150/mo
Unlimited
50 RPS
Supported networks: Arbitrum, Avalanche, Base, Bitcoin, BNB Smart Chain, Ethereum, Optimism, Polygon, Sui, TRON
5 RPS
$150/mo
Unlimited
15 RPS
$450/mo
Prices shown are for monthly billing. Annual billing saves 20%. You can move between tiers at any time with no lock-in.
You can configure and launch a Limitless Node from your GetBlock Dashboard → Limitless Nodes.
In your account, open Limitless Nodes and click Create new node.
Configure the node:
The blockchain network
Mode - Full or Archive*
Node location
API interface (all supported interfaces included by default)
Select an RPS plan
Choose a billing term: 1, 6, or 12 months
Complete checkout
*Not every network offers an archive tier. Check availability in your dashboard first.
If you need a chain that isn't listed, contact our team directly. We can also recommend a tier based on your workload.
Sanctions Check: verification against sanctions lists
Wallet Risk Check
Wallet Audit
Response time
< 100ms
Several seconds
Trust Score
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%
Ethereum(ETH)
BNB Smart Chain
Base
Polygon
TRON
Go to your GetBlock Account Dashboard and click Wallet Risk
Select the choice of your network using the dropdown:
Enter the wallet address:
Click on Run Check:
Scroll down to see the analysis:
If you want to interact with or integrate this service via API, check the Wallet risk endpoint.
DATA (32 bytes)
Yes
The 32-byte transaction hash to query
curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
import axios from 'axios';
import requests
import json
url = "https://shared.eu-central-1.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://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/")
.header("Content-Type", "application/json")
.json(&payload)
.send()
.await?;
let result: serde_json::Value = response.json().await?;
println!("{:#?}", result);
Ok(())
}result.status
string
"Known" if the transaction is present in the mempool; "Unknown" if it has not been seen by this node
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'
403
Forbidden
Missing or invalid <ACCESS-TOKEN>
-32602
Invalid params
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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);transactionHash
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": {
"status": "Known"
}
}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://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
import axios from 'axios';
import requests
import json
url = "https://shared.eu-central-1.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://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/")
.header("Content-Type", "application/json")
.json(&payload)
.send()
.await?;
let result: serde_json::Value = response.json().await?;
println!("{:#?}", result);
Ok(())
}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
403
Forbidden
Missing or invalid <ACCESS-TOKEN>
-32602
Invalid params
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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' })callObject
{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0xc350"
}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://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
import WebSocket from 'ws';
import asyncio
import json
import websockets
async def main():
async with websockets.connect('wss://shared.eu-central-1.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://shared.eu-central-1.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(())
}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
403
Forbidden
Missing or invalid <ACCESS-TOKEN>
-32602
Invalid params
import { ethers } from 'ethers';
const provider = new ethers.WebSocketProvider('wss://shared.eu-central-1.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://shared.eu-central-1.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);{
"jsonrpc": "2.0",
"id": "getblock.io",
"result": "0x7e2ef8b9c0d1e2f3a4b5c6d7e8f9a0b1"
}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.
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
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:
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.
Contract Details: verification of basic contract properties (open source, proxy, self-destruct, withdrawal rights, blacklist). Does not affect the Rug Pull Probability.
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.
Ethereum
BNB Smart Chain
Base
There are four steps involved, which are:
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.
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.
Analyze the liquidity providers (LPs): run each LP through the Fraud Detector and obtain the Trust Score for each LP.
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
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.
Go to your and click Rug Pull
Select the choice of your network using the dropdown:
Enter the contract address:
Click on Run Check
Scroll down to see the analysis:
If you want to interact with or integrate this service via API, check the .
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 a complete behavioral wallet profile, not just a "fraud / not fraud" check. Below are six key scenarios where a full audit creates measurable value.
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
Ethereum(ETH)
BNB Smart Chain(BSC)
Base
Go to your
Select the network you want to work with:
Enter the wallet address you want to analyze:
Click on Run Check:
Scroll down to see the analysis:
If you want to interact with or integrate this service via API, check the
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.
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
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.
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
MEV monitoring — observing preconfirmed transactions as they land
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.
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.
Connect to GetBlock EVM Data Stream, open your first subscription, and handle live events in Node.js or Python.
This guide takes you from an API key to a running client that receives live ERC-20 transfers on Ethereum.
Log in to your .
Open Settings → API Keys and copy a key. Keys start with gb_.
Data Stream is billed from your CU balance at 10 CU per delivered event, so make sure your account has CU available.
Each network has its own endpoint:
Request parameters are missing or malformed
-32603
Internal error
Server-side error while processing the request
429
Too Many Requests
Rate limit exceeded for your plan
Request parameters are missing or malformed
-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
Request parameters are missing or malformed
-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
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"
Obfuscated deployment chain (contract deploys contract)
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
Rug Pull Checks
Risk API
Provider
ChainAware.ai
Hexens (Glider Token Risks)
What it analyzes




Primary score
Behavior of the contract creator and liquidity providers (LPs)
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.pyUnlimited
50 RPS
$500/mo
Unlimited
100 RPS
$1,000/mo
Unlimited
Supported Networks: Arbitrum, Base, BNB Smart Chain, Ethereum, Optimism, Polygon, Sui, TRON
$300/mo
Unlimited
150 RPS
$500/mo
Unlimited
300 RPS
$1,000/mo
Unlimited
15 RPS
$150/mo
Unlimited
30 RPS
Unlimited
30 RPS
$900/mo
Unlimited
50 RPS
$1,500/mo
Unlimited
Ethereum
Solana
Bitcoin
Base
BNB Smart Chain
Tron
Polygon
Avalanche
Arbitrum
Optimism
Sui
$300/mo
-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
callObject
object
Yes
Call params: to, data, from (optional), gas (optional), gasPrice (optional), value (optional)
block
QUANTITY
TAG
Yes
import requests
import json
url = "https://shared.eu-central-1.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://shared.eu-central-1.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": "0x000000000000000000000000000000000000000000000000000000000098967f"
}result
DATA
ABI-encoded return value from the contract call
403
Forbidden
Missing or invalid <ACCESS-TOKEN>
-32602
Invalid params
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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' })curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/' \
--header 'Content-Type: application/json' \
--data-raw '{
"jsonrpc": "2.0",
"method": "eth_call",
"params": [
{
"to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"data": "0x70a082310000000000000000000000007a25d0f0ff6a25f36de0a19c3d5f6dc2c6eaed6a"
},
"pending"
],
"id": "getblock.io"
}'import axios from 'axios';
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://shared.eu-central-1.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));Request parameters are missing or malformed





-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://shared.eu-central-1.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://shared.eu-central-1.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
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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' })curl --location --request POST 'https://shared.eu-central-1.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://shared.eu-central-1.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));Request parameters are missing or malformed
-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://shared.eu-central-1.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://shared.eu-central-1.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
import { ethers } from 'ethers';
const provider = new ethers.WebSocketProvider('wss://shared.eu-central-1.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://shared.eu-central-1.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);# WebSocket-only. Use wscat (or similar) to connect first:
wscat -c 'wss://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/'
# Then send:
{"jsonrpc": "2.0", "method": "eth_subscribe", "paramsimport WebSocket from 'ws';
const ws = new WebSocket('wss://shared.eu-central-1.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);
}
});Request parameters are missing or malformed
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
AML Analysis: This shows 18 risk categories with each parameter displayed as No (clean) or Yes (flag detected).
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
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





blockNumber
QUANTITY
TAG
Yes
fullTransactions
boolean
Yes
true for full transaction objects, false for hashes only
curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
import axios from 'axios';
import requests
import json
url = "https://shared.eu-central-1.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://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/")
.header("Content-Type", "application/json")
.json(&payload)
.send()
.await?;
let result: serde_json::Value = response.json().await?;
println!("{:#?}", result);
Ok(())
}result.number
QUANTITY
In-progress block number (the same as the next latest will be)
result.hash
DATA
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
Detecting the current Flashblock index to time downstream operations
403
Forbidden
Missing or invalid <ACCESS-TOKEN>
-32602
Invalid params
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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' }){
"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"
}
}blockNumber
QUANTITY
TAG
Yes
curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
import axios from 'axios';
import requests
import json
url = "https://shared.eu-central-1.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://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/")
.header("Content-Type", "application/json")
.json(&payload)
.send()
.await?;
let result: serde_json::Value = response.json().await?;
println!("{:#?}", result);
Ok(())
}result.blockHash
DATA
0x00...00 (zero hash) for preconfirmed receipts; real block hash for finalized
result.blockNumber
QUANTITY
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
403
Forbidden
Missing or invalid <ACCESS-TOKEN>
-32602
Invalid params
import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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);{
"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"
}Ethereum Mainnet
wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream
BNB Smart Chain
wss://stream.eu-central-1.getblock.io/v1/bsc-mainnet/stream
Polygon Mainnet
To use more than one network, open one connection per network.
A topic decides what kind of event you receive; filters narrow it down. For example:
New block headers
newHeads
none
USDT transfers into one wallet
erc20Transfers
See API Reference → Topics for all 15 topics.
Authenticate with an Authorization: Bearer header, then send getblock_subscribe with one request object.
npm install -g wscat
wscat -c 'wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream' -H 'Authorization: Bearer <API-KEY>'
# Once connected, send:
{"jsonrpc":"2.0","id":1,"method":"getblock_subscribe","params":[{"topic":"erc20Transfers","filters":{"tokenContract":"0xdAC17F958D2ee523a2206206994597C13D831ec7"}}]}// npm install ws
import WebSocket from 'ws';
const USDT = '0xdAC17F958D2ee523a2206206994597C13D831ec7';
const ws = new WebSocket('wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream', {
headers: { Authorization: `Bearer ${process.env.GETBLOCK_API_KEY}` }
});
ws.on('open', () => {
ws.send(JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getblock_subscribe',
params: [{ topic: 'erc20Transfers', filters: { tokenContract: USDT } }]
}));
});
ws.on('message', (raw) => {
const msg = JSON.parse(raw);
// Replies to your requests carry the request id
if (msg.id !== undefined) {
if (msg.error) throw new Error(`${msg.error.code}: ${msg.error.message}`);
console.log('Subscription ID:', msg.result);
return;
}
// Everything else is an event
const { removed, data } = msg.params.result;
const amount = Number(BigInt(data.value)) / 1e6; // USDT has 6 decimals
console.log(`${removed ? 'REVERTED' : 'transfer'} ${amount} USDT ${data.from} → ${data.to}`);
});
ws.on('close', (code) => console.log('closed', code));# pip install "websockets>=14"
import asyncio, json, os, websockets
URL = "wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream"
USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7"
async def main():
headers = {"Authorization": f"Bearer {os.environ['GETBLOCK_API_KEY']}"}
# ping_interval=None: the server sends its own keepalive pings
async with websockets.connect(URL, additional_headers=headers, ping_interval=None) as ws:
await ws.send(json.dumps({
"jsonrpc": "2.0",
"id": 1,
"method": "getblock_subscribe",
"params": [{"topic": "erc20Transfers", "filters": {"tokenContract": USDT}}]
}))
async for message in ws:
msg = json.loads(message)
if "id" in msg:
if "error" in msg:
raise RuntimeError(msg["error"])
print("Subscription ID:", msg["result"])
continue
event = msg["params"]["result"]
data = event["data"]
amount = int(data["value"], 16) / 1e6 # USDT has 6 decimals
label = "REVERTED" if event["removed"] else "transfer"
print(f"{label} {amount} USDT {data['from']} → {data['to']}")
asyncio.run(main())The first message is the subscription ID:
Each event then arrives as a notification. The payload sits in params.result.data:
eventId, removed, and revision are how the stream reports chain reorganizations. If you store events, key them by eventId.
Cancel one subscription and keep the socket open:
Closing the socket ends all its subscriptions.
{ "jsonrpc": "2.0", "id": 1, "result": "0x573e3382e8ea7d534f267b232aae22dd" }{
"jsonrpc": "2.0",
"method": "getblock_subscribe",
"params": {
"subscription": "0x573e3382e8ea7d534f267b232aae22dd",
"result": {
"eventId": "eth:mainnet:receipts:0x19dd…0be2:erc20Transfers:0x19dd…0be2:0x6b36…d2a1:0x3",
"removed": false,
"revision": 116876401,
"data": {
"tokenContract": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"from": "0x4b3dd3690ba06b2a73089e02381d0eba9a7dbca5",
"to": "0xa2050435e59f41300b7787808e976255faa198e5",
"value": "0x6f4b360",
"blockNumber": "0x18d1e1e",
"transactionHash": "0x6b362543c83c1d18b27701235338c05a7e04c2e5098bed46d60afe9a0f17d2a1",
"logIndex": "0x3",
"…": "…"
}
}
}
}{
"jsonrpc": "2.0",
"id": 2,
"method": "getblock_unsubscribe",
"params": [{ "subscription": "0x573e3382e8ea7d534f267b232aae22dd" }]
}Set up your team account on GetBlock, invite and onboard team members with this step-by-step guide.
A team account is a shared workspace where multiple users can collaborate. This setup is ideal for companies and teams using GetBlock services.
Key benefits:
Organized collaboration: Work together on company resources.
Enhanced security: Role-based access limits each member to only the features they need.
Efficient management: Easily switch between personal and team accounts.
A team account user is a regular GetBlock user. When invited to a team, they can work on company resources, manage service plans or team settings, provided the corresponding permissions are granted.
This part covers a step-by-step guide to setting up your team workspace.
Sign in to your GetBlock account. If you don’t have a user account yet, create one following .
Click on the profile icon in the bottom-left corner of the sidebar. Select "Create new team" from the dropdown menu.
A popup window will appear. Assign a team name and click the "Create team" button.
Once the space is created, navigate to Account Settings > Team to manage team settings or add teammates.
The creator of the team account controls who gets invited and manages user roles.
You can invite team members to join your team account using either their email address or GetBlock User ID.
If the teammate has a GetBlock account: You can invite them using their ID. Since they are already registered, they just need to accept the invitation.
If the teammate is not registered on GetBlock: Invite them via email so they can first create an account before joining the team.
Go to Account Settings > Team.
Click "Add team member" in the top-right corner.
Request the User ID from the teammate (they can find it under Account Settings > General).
A team member is marked as when they have successfully accepted the invitation and joined the team.
If the invitation has been sent but not yet accepted, their status remains .
Once the user has joined, the team owner or an admin can update their permissions:
Go to My Team in Account Settings.
Click the three-dot menu (⋮) next to a team member.
Select "Edit access level".
Assign permissions:
This table provides a breakdown of actions team account users can perform based on their role.
To remove a user from your team account:
Navigate to Team in the Account Settings.
Click the three-dot menu (⋮) next to the team member name.
Select "Remove" from the dropdown menu.
If you’ve been invited to a team on GetBlock, follow these steps to accept the invitation and join the team.
When you have a pending team invitation, a notification badge appears on your account icon .
Click your account icon to view an invitation.
Click "Accept" if you're ready to join.
After accepting the invitation, you are given access to your team’s workspace. Your
To switch between your personal account and any team accounts you are part of:
Click the account icon in the left panel.
A dropdown will show all teams & personal accounts.
Switch between them as needed.
The teams list is sorted by recent activity, with the most recently accessed accounts at the top.
Regularly review and audit permissions. Revoke access for users who are no longer active.
Grant admin privileges only to trusted team members.
Give Members only the necessary permissions (e.g., endpoints access or subscriptions management).
Never share login credentials
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.
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:
Base CU cost (chain multiplier) reflecting the network's resource intensity
Method-specific multiplier which varies by API method
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:
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.
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).
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.
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:
CU (Compute Units): Measures the computational effort required to process requests. Different shared node plans include a varying number of CUs that you can use in a month.
RPS (Requests Per Second): Each plan enforces a maximum number of requests you can send every second. While you’re not billed per request, staying within this limit is critical to maintaining optimal service quality.
: Access tokens 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.
Check 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
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! or visit our page for more information.
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
A funded BSC wallet with sufficient BNB for transactions and gas
GetBlock's BSC Accelerated Dedication Node
Set up the project
Create a new file named index.js. This is where you will make your first call.
You can extend this code for a DEX swap by encoding the router call and including it as the second Multicall3 call:
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.
GetBlock users can top up their CU balance or upgrade to higher limits directly from their Dashboard, with a few click.
The current CU balance for Shared Node users is displayed on the Dashboard. This shows how many Compute Units (CUs) are left before running out.
With the "Top Up" feature, users can add more Compute Units to their account or upgrade to higher monthly limits.
Starter, Growth, Advanced, Scale, Pro, Premium & Enterprise users can refill their CU balance or switch to another plan for increased limits:
Click the "Top Up" button on the Dashboard.
Select the number of CUs you’d like to add or choose the recommended plan (if prompted) based on your usage needs.
Confirm and finalize your purchase.
Your account balance will be updated immediately upon successful payment.
Free plan users cannot top up their Compute Units directly. Instead, you have the option to upgrade to one of our monthly paid plans, providing significantly higher limits and extra features.
If you're on the Enterprise plan (our customizable Shared Node plan), you can additionally request higher RPS and Access Token limits. Here’s how:
Click "Change" on the Dashboard next to the Rate Limit section.
Fill out and submit a request form, choosing your desired RPS limit, CU amount, and number of Access Tokens.
Our team will review your request and reach out to you with next steps shortly.
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.
0% (auto)
AML Flag
At least one AML flag detected — score automatically set to 0%
null for Flashblocks (block not yet sealed) — a real hash appears only after seal
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
Request parameters are missing or malformed
-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
null for preconfirmed; block number in hex for finalized
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
Request parameters are missing or malformed
-32603
Internal error
Server-side error while processing the request
429
Too Many Requests
Rate limit exceeded for your plan
wss://stream.eu-central-1.getblock.io/v1/polygon-mainnet/stream
Robinhood Mainnet
wss://stream.eu-central-1.getblock.io/v1/robinhood-mainnet/stream
tokenContract, to
Swap events from one pool, decoded
decodedLogs
abi, address
Failed transactions sent by your wallet
transactionReceipts
status: "failure", from


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.
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
40
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
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
eth_blockNumber
1
20
20
eth_blockNumber
1
20
30
eth_getTransactionByHash
2
"type": "module" in your package.json.Create .env file and add the following:
Add the following code to index.js:
The following example demonstrates a simple BNB transfer with a priority fee:
Run the code using this command:
Sample response
0xcA11bde05977b3631167028862bE2a173976CA11
Multicall3 contract
0x6374Ca2da5646C73Eb444aB99780495d61035f9b
Gateway fee recipient
"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"]
ACCESS_TOKEN=your-accelerated-node-endpoint
RPC_URL=your-normal-bsc-node-endppoint //e.g https
PRIVATE_KEY=your-wallet-private-keyimport 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.jsWallet: 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/61bd625be986bb45e9fb495a5dba7bf39e00fd6871176971663436465311c970mkdir multicall3-example
cd multicall3-example
npm init -y
npm install ws ethers dotenvmkdir multicall3-example
cd multicall3-example
yarn init -y
yarn ws ethersconst 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
}
];The user gets a notification and can accept the invite.
Go to Account Settings > My Team.
Click "Add team member" in the top-right corner.
Enter the teammate's name and email address.
Send the invite.
The user will receive an invitation email with a link to sign up and join the team.
Endpoints: Create and manage node endpoints, access tokens, and view statistics.
Subscriptions & payments: Handle payments and plans.
Admin: Includes all the above permissions, plus the access to manage team settings and member roles.
Save changes.
✅
✅
🔓
Add & remove team members
✅
✅
❌
Edit access levels
✅
✅
❌
Promote to Admin
✅
❌
❌
When someone who is not yet registered on GetBlock receives a team invitation, they must first sign up for an account:
Check your inbox for an email invitation from GetBlock.
Clicking the invitation link redirects you to the sign-up page.
Create a secure password for your new account.
Check the boxes to agree to the Terms of Service and Privacy Policy and complete the registration.
Once registered, you’ll have your personal GetBlock account. Additionally, you gain access to the team’s dashboard and resources based on given by the team owner or admin.
Create & manage access tokens
✅
✅
🔓
Manage subscriptions & payments
2
Starter
$49
90M / mo
250 RPS
30
Growth
$99
185M / mo
300 RPS
45
Advanced
$199
385M / mo
450 RPS
75
Scale
$349
700M / mo
600 RPS
105
Pro
$499
1B / mo
800 RPS
150
Premium
$699
1.6B / mo
800 RPS
225
Enterprise
from $999
Custom
Custom
Custom
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: 250 requests per second (RPS)
Access Tokens: 30
Additional CU packages can be purchased as needed.
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: 300 requests per second (RPS)
Access Tokens: 45
Additional CU packages can be purchased as needed.
Mid-to-upper tier, production-ready plan, suitable for moderate-to-high traffic applications.
CU: 385M per month (~12.8M/day)
Throughput: 450 requests per second (RPS)
Access Tokens: 75
Add extra compute units (CU) to your account balance when needed without switching plans
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: 600 requests per second (RPS)
Access Tokens: 105
Extra CU packages also available
For applications that need significantly higher throughput and increased resource availability compared to lower tier plans.
CU: 1B per month (~33.3M/day)
Throughput: 800 requests per second (RPS)
Access Tokens: 150
Purchase additional CU packages when required
Fully customizable with tailored CU allocations, rate limits, and access tokens to meet exceptionally high call volumes and performance requirements.
CU: Custom monthly allocation based on your demands
Throughput: Custom
Access Tokens: Custom
Additional CU packages can be purchased on demand
Free
$0
50,000 / day

20 RPS
The blockchain network to verify(ETH, BNB,POLY, TRON or BASE)
contract_address
string
Yes
the contract address
curl --location --request POST 'https://services.getblock.io/v1/rug-pull/check
import axios from "axios";
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(())
}Field Path
Type
Example
Description
status
string
"Fraud"
400
Invalid network or missing fields
401
Missing or invalid auth
402
network
string
Yes
{
"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"
}
}Stream every new block header over WebSocket. Complete guide on how to use the newHeads topic in GetBlock EVM Data Stream documentation.
The newHeads topic sends one notification per new block, carrying the block header: number, hash, parent hash, gas, base fee, and state roots, but no transactions. It is the lightest way to follow the chain tip.
newHeads accepts no parameters. Send only the topic name; any other field, including an empty filters object, is rejected.
# WebSocket-only. Connect first:
wscat -c 'wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream
// npm install ws
import WebSocket from 'ws
# pip install "websockets>=14"
import asyncio, json, websockets
URL = "wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream"
HEADERS = {"Authorization": "Bearer <API-KEY>"}
async def main():
# ping_interval=None: the server sends its own keepalive pings (see Connection keepalive)
async with websockets.connect(URL, additional_headers=HEADERS, ping_interval=None) as ws:
await ws.send(json.dumps({
"jsonrpc": "2.0",
"id": 1,
"method": "getblock_subscribe",
"params": [{
"topic": "newHeads"
}]
}))
async for message in ws:
msg = json.loads(message)
# First reply is the subscription ID (or an error)
if "id" in msg:
print(msg.get("error") or f"Subscribed: {msg['result']}")
continue
event = msg["params"]["result"]
removed, data = event["removed"], event["data"]
print('REMOVED' if removed else 'block', int(data['number'], 16), data['hash'])
asyncio.run(main())The first reply is the subscription ID:
{
"jsonrpc": "2.0",
"id": 1,
"result": "0xfd5126364b7ac0fbe8ad9099ce29571c"
}Every later message is an event notification:
The result object contains the event envelope and the payload in data.
Triggering work once per block, such as refreshing balances or re-quoting prices
Monitoring chain liveness and block times
Tracking gas usage and base fee for fee estimation
Detecting reorgs at the header level (Ethereum and Polygon)
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.
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
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
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.
Model verdict. Possible values: "Fraud", "Not Fraud", "Investable", "Not Investable", "Safe".
probabilityFraud
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.
Insufficient balance
502
Provider error
true when a reorg removed this previously delivered event.
revision
number
Event version. For one eventId, a greater revision is newer.
data
object
Block header, in the same shape as eth_getBlockByNumber without transactions, uncles, withdrawals, or size.
data.number
string
Block number, hex-encoded.
data.hash
string
Block hash.
data.parentHash
string
Hash of the parent block.
data.timestamp
string
Block timestamp in Unix seconds, hex-encoded.
data.miner
string
Fee recipient (block producer) address.
data.gasLimit
string
Block gas limit, hex-encoded.
data.gasUsed
string
Gas used by all transactions in the block, hex-encoded.
data.baseFeePerGas
string
EIP-1559 base fee in wei, hex-encoded.
data.stateRoot
string
Root of the state trie after this block.
data.transactionsRoot
string
Root of the transactions trie.
data.receiptsRoot
string
Root of the receipts trie.
data.logsBloom
string
Bloom filter for the logs in the block.
data.extraData
string
Arbitrary data set by the block producer.
data.difficulty
string
Block difficulty. 0x0 on proof-of-stake Ethereum.
data.nonce
string
Proof-of-work nonce. Zero on proof-of-stake Ethereum.
data.mixHash
string
Beacon-chain randomness (prevRandao) on proof-of-stake Ethereum.
data.sha3Uncles
string
Hash of the uncles list.
data.withdrawalsRoot
string
Root of the validator withdrawals list, where the network has withdrawals.
data.blobGasUsed
string
EIP-4844 blob gas used, where supported.
data.excessBlobGas
string
EIP-4844 excess blob gas, where supported.
data.parentBeaconBlockRoot
string
EIP-4788 parent beacon block root, where supported.
data.requestsHash
string
EIP-7685 execution-layer requests hash, where supported.
-32001
subscription limit exceeded
You already have 15 active or pending subscriptions.
eventId
string
Stable event identifier. A reorg correction reuses it.
removed
-32602
invalid newHeads request: json: unknown field "filters"
newHeads takes no parameters, not even an empty filters object.
-32602
invalid newHeads request: json: unknown field "…"
boolean
The request has a field this topic does not accept.
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
simulationParams
object
Yes
Simulation object: blockStateCalls (array of call bundles), traceTransfers (bool), validation (bool)
block
QUANTITY
TAG
Yes
result
array
Simulated block(s) — one entry per block state call bundle
result[].calls
array
403
Forbidden
Missing or invalid <ACCESS-TOKEN>
-32602
Invalid params
curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/' \
--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"
}'Per-call simulation result
Request parameters are missing or malformed
{
"jsonrpc": "2.0",
"method": "getblock_subscribe",
"params": {
"subscription": "0xfd5126364b7ac0fbe8ad9099ce29571c",
"result": {
"eventId": "eth:mainnet:block:0x19ddc6864bd5ec1cdbd493e3d3653b529d79293a677351…",
"removed": false,
"revision": 116876399,
"data": {
"baseFeePerGas": "0x190b7c20",
"blobGasUsed": "0x40000",
"difficulty": "0x0",
"excessBlobGas": "0xbdce5c2",
"extraData": "0xd883011007846765746888676f312e32352e31856c696e7578",
"gasLimit": "0x3938700",
"gasUsed": "0x693610",
"hash": "0x19ddc6864bd5ec1cdbd493e3d3653b529d79293a6773517018153cdff6ac0be2",
"logsBloom": "0x02c800420c4a08832003402000001e00711800280420105000000472c0820204…",
"miner": "0x24d6c74d811cfde65995ed26fd08af445f8aab06",
"mixHash": "0xeefe827e31ba13e7f34e498f2ae3d25cc4313b9179f160e88217d3bae5de056f",
"nonce": "0x0000000000000000",
"number": "0x18d1e1e",
"parentBeaconBlockRoot": "0x5c220c17a3e9f080b1cf47a399f0d2223c128d6faf7c7c3a4ea6e4cfcd0ef407",
"parentHash": "0x31e49d2ea3bce6863b0c09b3aa0b9b5c274349b54387a2ef4e61f2bc01e72f93",
"receiptsRoot": "0x9ec6961f68faefa809ef5f260dd37c8c42e553cfe17da4858b4a61435c3a1be2",
"requestsHash": "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"stateRoot": "0xf2ffbd7a38983140a6719376f64b4d258a35c9dfd176c613c4d9f57a50b27de6",
"timestamp": "0x6ab110c3",
"transactionsRoot": "0xffc6c73100603b7f9406aca781edc8034d25e6f0d288113f7b32a3312ebd75a2",
"withdrawalsRoot": "0x0746d437d65f781208c50939138cf81cecc6bd2922263e892f1e6dd9d865b0f5"
}
}
}
}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://shared.eu-central-1.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://shared.eu-central-1.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://shared.eu-central-1.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": "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp": "0x68f3b85f",
"gasLimit": "0x3938700",
"gasUsed": "0x5208",
"calls": [
{
"status": "0x1",
"gasUsed": "0x5208",
"returnData": "0x0000000000000000000000000000000000000000000000000000000000000001",
"logs": [
{
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
],
"data": "0x00000000000000000000000000000000000000000000000000000000000186a0"
}
]
}
]
}
]
}import { ethers } from 'ethers';
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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);You need broad validator visibility quickly
For MEV-sensitive transactions, see Private Transactions instead.
wss://shared.eu-central-1.getblock.io/<ACCESS_TOKEN>blxr_txnonce
int
Set up the project
mkdir transaction-public-mempool
cd transaction-public-mempool
mkdir transaction-public-mempool
cd transaction-public-mempool
Create a new file named index.js. This is where you will make your first call.
Set the ES module "type": "module" in your package.json.
Create .env file and add the following:
Add the following code to index.js:
Create and Sign Your Transaction
Submit via WebSocket
Response
Standard
3 gwei
Regular transfers
Fast
5 gwei
"nonce too low"
Your nonce is behind the network state. Fetch the latest:
"insufficient funds"
Ensure you have enough BNB for both the transaction value and gas:
"replacement transaction underpriced"
If replacing a pending transaction, increase the gas price by at least 10%:
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
const nonce = await provider.getTransactionCount(wallet.address, 'pending');Required = value + (gasPrice × gasLimit)const newGasPrice = existingGasPrice * 110n / 100n;Filter options object
fromBlock
string
No
Start block number (hex) or "latest", "earliest" or "pending"
curl --location --request POST 'https://shared.eu-central-1.getblock.io/<ACCESS-TOKEN>/
const axios = require('axios'
import requests
# ERC-20 Transfer event signature
transfer_topic = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
response = requests.post(
'https://shared.eu-central-1.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)}')address
string
Contract address that emitted the log
topics
array
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
Historical Analysis: Analyze past contract activity
-32602
Invalid params
Invalid filter object
-32603
Internal error
const { ethers } = require('ethers');
const provider = new ethers.JsonRpcProvider('https://shared.eu-central-1.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://shared.eu-central-1.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();filterObject
object
Yes
{
"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"
}Open an EVM Data Stream subscription over WebSocket. Complete guide on how to use getblock_subscribe in GetBlock EVM Data Stream documentation.
getblock_subscribe opens a streaming subscription to one topic. The service replies with a subscription ID, then pushes a notification for every matching event until you unsubscribe or the socket closes.
params is an array containing exactly one request object. topic is always required; the other fields depend on the topic.
Where each field goes:
Requests are validated strictly:
Unknown fields are rejected, at the top level and inside filters.
params must be an array with exactly one object. Legacy positional params such as ["newHeads"] are rejected.
Historical fields (fromBlock, toBlock
The first reply confirms the subscription and returns its ID:
Every message after that is an event notification. It carries no id; the payload is under params.result:
One socket can carry several subscriptions. Send one getblock_subscribe per stream, map each returned ID to a handler, and route notifications on params.subscription:
Every subscription counts toward the 15-subscription limit, whichever socket it is on.
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
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.
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
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:
toBlock
string
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)
Indexed event parameters (up to 4)
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
Query range too large or node failure
-32005
Query returned more than limit
Too many logs in response
1–16 event ABI definitions used to decode logs.
hashesOnly
boolean
No
newMinedTransactions and newPendingTransactions only: return transaction hashes instead of full objects.
addresses
array
No
newMinedTransactions only: up to 50 { from, to } match rules.
fromAddress, toAddress
string or array
No
newPendingTransactions only: sender and recipient addresses to match.
abi (required), filters.address
erc20Transfers, erc20Allowence
filters.tokenContract, filters.from, filters.to
nftTransfers
filters.tokenContract, filters.operator, filters.from, filters.to, filters.tokenId, filters.standard, filters.transferType
nftApprovals
filters.tokenContract, filters.owner, filters.operator, filters.tokenId, filters.approvalType
nftMetadataUpdates
filters.tokenContract, filters.tokenId
transactionReceipts
filters.status, filters.from, filters.to, filters.contractCreated, filters.transactionType
accountAbstractionOperations
filters.entryPoint, filters.sender, filters.paymaster, filters.userOpHash, filters.eventType, filters.success
newBlockTraces, newMinedTransactionsTraces
filters.transactionHash, filters.fromAddress, filters.toAddress, filters.callType, filters.status
newMinedTransactions
hashesOnly, addresses (top level, not inside filters)
newPendingTransactions
hashesOnly, fromAddress, toAddress (top level, not inside filters)
includeRemovedparams.result.eventId
string
Stable event identifier. Reorg corrections reuse it.
params.result.removed
boolean
true when a reorg removed this previously delivered event.
params.result.revision
number
Event version. For one eventId, apply only a revision greater than the last one you applied.
params.result.data
object or string
Topic payload. See the topic's page.
-32602
unsupported subscription topic "…"
topic is not one of the 15 topics.
-32602
invalid <topic> request: json: unknown field "…"
The request has a field the topic does not accept, such as filters on newHeads, or fromBlock.
-32602
invalid <field>: invalid EVM address "…"
An address filter is not a 20-byte hex address.
-32001
subscription limit exceeded
You already have 15 active or pending subscriptions. Other subscriptions are unaffected.
-32000
—
The backing live source could not create the subscription. Retry with backoff.
-32601
method not found
The method name is wrong, for example eth_subscribe.
topic
string
Yes
The topic to receive. One of the 15 topics.
filters
object
No
Topic-specific filters. Used by the receipt and trace topics (logs, erc20Transfers, newBlockTraces, …).
abi
array
Topic
Accepted fields besides topic
newHeads, newBlocks
None. Any extra field is rejected.
logs
filters.address, filters.topics
result
string
Subscription ID, returned once in reply to the subscribe request. Treat it as opaque.
params.subscription
string
-32602
getblock_subscribe requires exactly one request object
params is empty or holds more than one object.
-32602
invalid subscription request: json: cannot unmarshal string into Go value of type …
For decodedLogs
decodedLogs
The subscription a notification belongs to. Use it to demultiplex the socket.
params holds a string, as in the legacy ["newHeads"] form.
Yes
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
Time-sensitive trades
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();
});# WebSocket-only. Connect first:
wscat -c 'wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream' -H 'Authorization: Bearer <API-KEY>'
# Then send:
{"jsonrpc":"2.0","id":1,"method":"getblock_subscribe","params":[{"topic":"erc20Transfers","filters":{"tokenContract":"0xdAC17F958D2ee523a2206206994597C13D831ec7"}}]}// npm install ws
import WebSocket from 'ws';
const ws = new WebSocket('wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream', {
headers: { Authorization: 'Bearer <API-KEY>' }
});
ws.on('open', () => {
ws.send(JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'getblock_subscribe',
params: [{
topic: 'erc20Transfers',
filters: { tokenContract: '0xdAC17F958D2ee523a2206206994597C13D831ec7' }
}]
}));
});
ws.on('message', (raw) => {
const msg = JSON.parse(raw);
if (msg.id !== undefined) {
if (msg.error) console.error('Subscribe failed:', msg.error);
else console.log('Subscribed:', msg.result);
return;
}
const { eventId, removed, revision, data } = msg.params.result;
console.log(removed ? 'REMOVED' : 'NEW', revision, eventId, data);
});# pip install "websockets>=14"
import asyncio, json, websockets
URL = "wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream"
HEADERS = {"Authorization": "Bearer <API-KEY>"}
async def main():
# ping_interval=None: the server sends its own keepalive pings (see Connection keepalive)
async with websockets.connect(URL, additional_headers=HEADERS, ping_interval=None) as ws:
await ws.send(json.dumps({
"jsonrpc": "2.0",
"id": 1,
"method": "getblock_subscribe",
"params": [{
"topic": "erc20Transfers",
"filters": {"tokenContract": "0xdAC17F958D2ee523a2206206994597C13D831ec7"}
}]
}))
async for message in ws:
msg = json.loads(message)
if "id" in msg:
print("Subscribe failed:" if "error" in msg else "Subscribed:",
msg.get("error") or msg["result"])
continue
event = msg["params"]["result"]
print("REMOVED" if event["removed"] else "NEW",
event["revision"], event["eventId"], event["data"])
asyncio.run(main()){
"jsonrpc": "2.0",
"id": 1,
"result": "0x573e3382e8ea7d534f267b232aae22dd"
}{
"jsonrpc": "2.0",
"method": "getblock_subscribe",
"params": {
"subscription": "0x573e3382e8ea7d534f267b232aae22dd",
"result": {
"eventId": "eth:mainnet:receipts:0x19ddc6864bd5ec1cdbd493e3d3653b529d79293a6773517018153cdff6ac0be2:erc20Transfers:0x19ddc6864bd5ec1cdbd493e3d3653b529d79293a6773517018153cdff6ac0be2:0x6b362543c83c1d18b27701235338c05a7e04c2e5098bed46d60afe9a0f17d2a1:0x3",
"removed": false,
"revision": 116876401,
"data": {
"tokenContract": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"from": "0x4b3dd3690ba06b2a73089e02381d0eba9a7dbca5",
"to": "0xa2050435e59f41300b7787808e976255faa198e5",
"value": "0x6f4b360",
"blockNumber": "0x18d1e1e",
"transactionHash": "0x6b362543c83c1d18b27701235338c05a7e04c2e5098bed46d60afe9a0f17d2a1",
"transactionIndex": "0x3",
"blockHash": "0x19ddc6864bd5ec1cdbd493e3d3653b529d79293a6773517018153cdff6ac0be2",
"blockTimestamp": "0x6ab110c3",
"logIndex": "0x3",
"removed": false
}
}
}
}const pending = new Map(); // request id → handler
const handlers = new Map(); // subscription id → handler
let nextId = 1;
function subscribe(request, handler) {
const id = nextId++;
pending.set(id, handler);
ws.send(JSON.stringify({ jsonrpc: '2.0', id, method: 'getblock_subscribe', params: [request] }));
}
ws.on('message', (raw) => {
const msg = JSON.parse(raw);
if (msg.id !== undefined) {
if (typeof msg.result === 'string') handlers.set(msg.result, pending.get(msg.id));
pending.delete(msg.id);
return;
}
handlers.get(msg.params.subscription)?.(msg.params.result);
});
subscribe({ topic: 'newHeads' }, (event) => console.log('head', event.data.number));
subscribe({ topic: 'erc20Transfers', filters: { to: '0x…' } }, (event) => console.log('payment', event.data));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-addressimport 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/00d4fe2db5c667ce549318cf621913af1bcb130022ec51020cbb6cae2b7eedceimport 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://shared.eu-central-1.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);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://shared.eu-central-1.getblock.io/<ACCESS_TOKEN>transactions
array
Submit bundles using the mev_sendBundle method:
A successful submission returns a bundle hash:
Set up the project
mkdir bundle-example
cd bundle-example
mkdir bundle-example
cd bundle-example
Create a new file named index.js. This is where you will make your first call.
Set the ES module "type": "module" in your package.json.
Create .env file and add the following:
Add the following code to index.js:
The following example demonstrates a simple BNB transfer with a priority fee:
Run the code using this command:
Sample response
Choose the appropriate method based on your use case:
Aspect
bsc_privateTx
mev_sendBundle
Transaction count
Single
Multiple
Atomicity
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:
Time-sensitive arbitrage
2–3
Standard bundles
5
Less urgent operations
Test your transaction logic before submitting a bundle by simulating each transaction:
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
Confirm chain ID
Partial Execution
const nonce = await provider.getTransactionCount(wallet.address);
// Transaction 1: nonce
// Transaction 2: nonce + 1
// Transaction 3: nonce + 2const 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
});Yes
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
400
Invalid network or missing fields
401
Missing or invalid auth
402
network
string
{
"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"
}
]
}
}Meanwhile, Private transactions eliminate this exposure by hiding your transactions until they are included.
Visibility
Everyone sees it
Only builders see it
MEV exposure
Vulnerable
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
wss://shared.eu-central-1.getblock.io/<ACCESS_TOKEN>bsc_private_txtransaction
string
Set up the project
mkdir transaction-private-mempool
cd transaction-private-mempool
npm init -y
npm install ws ethers dotenvmkdir transaction-private-mempool
cd transaction-private-mempool
yarn init -y
yarn ws ethersSet the ES module "type": "module" in your package.json.
Create a file and name it index.js
Create .env file and add the following:
Import the dependencies
Create and Sign Your Transaction
Submit Privately
Response
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, jetbldr, nodereal
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
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
To increase the priority for inclusion in your private transactions, see Private Transactions with Tips.
params: {
transaction: signedTx,
mev_builders: ['48club', 'bloxroute'] // Specific builders only
}Sign up / log in: Create an account at GetBlock.io or log in to your existing account.
Deploy a dedicated Solana node:
Go to your user dashboard, switch the tab to “Dedicated nodes”, and scroll down to “My endpoints”
Choose Solana under “Protocol”, set the network to mainnet.
Click on Get.
Enable the gRPC add-on: In Step 3 (Select API and Add‑ons) of your node setup, check Yellowstone gRPC under Add‑ons.
Once your node is live, you’ll be able to create gRPC endpoints to begin using the add-on.
Return to My endpoints in your Dedicated node dashboard and generate a gRPC Access Token.
The dashboard will generate your new HTTPS‐style gRPC endpoint URL.
The endpoint URL will be used by your gRPC client to authenticate and interact with the Solana network. Regional domain determines which data center you’re talking to (Europe, US, or Asia).
Example endpoint URLs:
When establishing your gRPC channel, the authentication is handled via an access token:
Dragon’s Mouth uses gRPC over HTTP/2 for all communication. Its message schemas are defined in Protocol Buffer (.proto) files, included in the Yellowstone repository, which specify all the RPC methods and data types.
The power of Yellowstone is real‑time streaming: open a single bi‑directional stream, send a SubscribeRequest with your filters, and get back a sequence of SubscribeUpdate messages.
Here are the main subscription targets:
slots
slots: SlotsFilter
Slot numbers as they’re processed by leader
blocks
blocks: BlocksFilter
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.goMake sure the following dependencies are installed:
go get github.com/rpcpool/yellowstone-grpc/examples/golang@latest
go get google.golang.org/grpc@latestGo 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 := "shared.eu-central-1.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/pythonPython Example (python-client/stream.py):
from examples.grpc import new_client
import time
from google.protobuf.json_format import MessageToDict
endpoint = "shared.eu-central-1.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:
cd rust-client
cargo build
cargo runEnsure 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 , , 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.
// Europe (Frankfurt)
https://shared.eu-central-1.getblock.io/<YOUR_ACCESS_TOKEN>/
// USA (New York)
https://shared.us-east-1.getblock.io/<YOUR_ACCESS_TOKEN>/
// Asia (Singapore)
https://shared.ap-southeast-1.getblock.io/<YOUR_ACCESS_TOKEN>/
ENDPOINT = 'https://shared.eu-central-1.getblock.io';
TOKEN = 'YOUR_GETBLOCK_ACCESS_TOKEN';# 1) List services and methods
grpcurl \
-insecure \
-authority shared.eu-central-1.getblock.io \
-H "x-access-token: YOUR_ACCESS_TOKEN" \
shared.eu-central-1.getblock.io:443 \
list
# 2) Subscribe to slots
grpcurl \
-insecure \
-authority shared.eu-central-1.getblock.io \
-H "x-access-token: YOUR_ACCESS_TOKEN" \
shared.eu-central-1.getblock.io:443 \
geyser.Geyser/Subscribe \
-d '{ "slots": { "slots": []{} } }'
npm install @triton-one/yellowstone-grpc
# or
yarn add @triton-one/yellowstone-grpcimport Client, {
SubscribeRequest,
CommitmentLevel,
SubscribeResponse,
} from "@triton-one/yellowstone-grpc";
async function main() {
// Initialize
const ENDPOINT = "https://shared.eu-central-1.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);
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.
Full reference for the GetBlock EVM Data Stream WebSocket API: endpoints, authentication, methods, topics, the event envelope, limits, and errors.
This section documents every method and topic exposed by the EVM Data Stream WebSocket API.
The API has two methods: and . The you subscribe to decides what you receive. Each topic has its own page covering its parameters, a live sample response, and every field it returns.
Subscribe to new block headers on Ethereum Mainnet:
The service replies with a subscription ID, then pushes one notification per event:
Each network has its own WebSocket endpoint. Every topic is available on every network.
"Not Fraud"
ML model verdict. Possible values: "Not Fraud", "Fraud", "New Address".
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.
Insufficient balance
502
Provider error
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.
Block metadata (slot, parent slot, timestamp)
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
getBlocksendTransactionProtected
Inclusion speed
Gas price dependent
Builder dependent
Best for
Speed-competitive scenarios
Value-sensitive trades
Yes
Signed raw transaction hex
mev_builders
array
No
Builders to send to. Default: ["all"]
Verify your API key is valid
Check network connectivity
Try reconnecting after a few seconds

0x13f4EA83D0bd40E75C8222255bc855a974568Dd4
PancakeSwap V3 Router
0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c
WBNB
0x6374Ca2da5646C73Eb444aB99780495d61035f9b
Priority fee recipient
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
Not applicable
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": ""}
10–20
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
0x10ED43C718714eb63d5aA57B78B54704E256024E
{
"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..."
}
}PancakeSwap V2 Router
[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://shared.eu-central-1.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);
}
}{
"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-keyimport WebSocket from 'ws';
import { ethers } from 'ethers';
import 'dotenv/config';
const PRIVATE_KEY = process.env.PRIVATE_KEY;
const RPC_URL = process.env.RPC_URLconst 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://shared.eu-central-1.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/14223ac9adf33b77e4b52e8612dd351517b1bbc5b771567089994a6183f46df2import 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://shared.eu-central-1.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);ACCESS_TOKEN=your-accelerated-node-endpoint
RPC_URL=your-normal-bsc-node-endppoint //e.g https
PRIVATE_KEY=your-wallet-private-keyimport 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.jsconst 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();Ethereum Mainnet
wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream
BNB Smart Chain
wss://stream.eu-central-1.getblock.io/v1/bsc-mainnet/stream
Polygon Mainnet
wss://stream.eu-central-1.getblock.io/v1/polygon-mainnet/stream
Robinhood Mainnet
Every connection needs a GetBlock API key (gb_…). Create one in Settings → API Keys. Pass it in one of two ways:
Browser WebSocket APIs cannot set an Authorization header, so add the key to the URL instead:
wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream?apiKey=<API-KEY>The server rejects authentication failures during the WebSocket handshake:
401
authorization failed
No API key was sent.
401
invalid api key
Open a subscription to one topic. Returns a subscription ID, then streams events.
Cancel one subscription without closing the socket.
Blocks
A block header
A signal every time a block is produced
newHeads
Every transaction in each block, in one message
newBlocks
Incoming token payments to a wallet
Every notification uses the same envelope. The topic-specific payload sits in params.result.data:
params.subscription
string
The subscription this event belongs to. Use it to route events when one socket carries several subscriptions.
params.result.eventId
string
When a block leaves the canonical chain, the stream sends every affected event again on the same subscription with removed: true and a higher revision. There is no separate reorg topic and no option to switch corrections off. Store events by eventId and keep the one with the greatest revision. See Handling chain reorganizations for the full contract and a client reducer.
Numeric values such as block numbers, amounts, gas, token IDs, and indexes are returned as EVM hex quantities ("0x18d1e1e"), the same as the Ethereum JSON-RPC API. Addresses in normalized payloads are lowercase; argument values in decodedLogs keep their EIP-55 checksum casing. Ignore unknown fields so that new ones don't break your client.
The stream carries live events only. Historical ranges (fromBlock, toBlock) and includeRemoved are rejected, and events published while you were disconnected are not replayed. After a reconnect, rebuild state from your own source before relying on the stream again.
Send several getblock_subscribe requests on one connection and route notifications on params.subscription. Event order across different subscriptions is not guaranteed.
The server sends a WebSocket ping about every 30 seconds, and standard clients answer it automatically, so an idle connection with no events stays open.
These per-user limits apply across all networks and topics:
Open WebSocket connections
50
The WebSocket upgrade is rejected with HTTP 429. No socket is opened.
Active or pending subscriptions
15
Every delivered event costs 10 CU, on every network and topic. You are billed for events after filters are applied, so precise filters directly reduce cost. Each subscription is billed separately: the same event delivered to two subscriptions counts twice.
Handshake failures use an HTTP status (see Authentication). Requests on an open socket return standard JSON-RPC error objects:
-32700
The message is not valid JSON
parse error
-32600
Invalid JSON-RPC request
Each topic page lists the -32602 messages specific to its parameters.
# WebSocket-only. Connect first:
wscat -c 'wss://stream.eu-central-1.getblock.io/v1/eth-mainnet/stream' -H 'Authorization: Bearer <API-KEY>'
# Then send:
{
"jsonrpc": "2.0",
"id": 1,
"method": "getblock_subscribe",
"params": [{ "topic": "newHeads" }]
}{
"jsonrpc": "2.0",
"method": "getblock_subscribe",
"params": {
"subscription": "0xfd5126364b7ac0fbe8ad9099ce29571c",
"result": {
"eventId": "eth:mainnet:block:0x19dd…0be2:newHeads:0x19dd…0be2",
"removed": false,
"revision": 116876399,
"data": { "number": "0x18d1e1e", "hash":
}
}
}{
"jsonrpc": "2.0",
"method": "getblock_subscribe",
"params": {
"subscription": "0x573e3382e8ea7d534f267b232aae22dd",
"result": {
"eventId": "eth:mainnet:receipts:0x19dd…0be2:erc20Transfers:0x19dd…0be2:0x6b36…d2a1:0x3",
"removed": false,
"revision": 116876401,
"data": { "…": "topic-specific payload" }
}
}
}The GetBlock AML Risk Taxonomy provides a consistent, customer-facing language for describing the risk context of crypto wallets and transactions.
An AML report does more than return a single score. It explains:
the headline risk of the wallet or transaction;
the types of activity found in screened exposure;
compliance-related context that may require review;
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
wss://stream.eu-central-1.getblock.io/v1/robinhood-mainnet/stream
The API key is not recognized.
404
—
The network in the URL path is not supported.
429
—
You already have 50 open connections.
Blocks
A full block with transaction objects
Logs
One raw receipt log
Logs
One log decoded with the ABI you supply
Tokens
A decoded ERC-20 Transfer event
Tokens
A decoded ERC-20 Approval event
NFTs
A normalized ERC-721 or ERC-1155 transfer, mint, or burn
NFTs
A normalized NFT token or operator approval
NFTs
A decoded ERC-4906 metadata update
Transactions
One raw transaction receipt
Transactions
A decoded ERC-4337 EntryPoint event
Transactions
A mined transaction, or only its hash
Transactions
A mempool transaction, or only its hash
Traces
A block's matching call traces
Traces
One mined transaction's call trace
erc20Transfers with filters.to
Alerts when someone grants a token allowance
erc20Allowence
A contract's events as raw topics and data
logs
A contract's events with named, typed arguments
decodedLogs
NFT mints, burns, and transfers
nftTransfers
Marketplace listing approvals, or setApprovalForAll alerts
nftApprovals
A signal to refresh cached NFT metadata
nftMetadataUpdates
Success or failure of transactions and their gas cost
transactionReceipts
Smart-account (ERC-4337) activity
accountAbstractionOperations
Confirmation that a transaction was included in a block
newMinedTransactions
Transactions before they are mined
newPendingTransactions
Internal calls and contract-to-contract value flow
newMinedTransactionsTraces or newBlockTraces
Stable identifier for this event. A reorg correction for the event carries the same eventId. Treat it as opaque.
params.result.removed
boolean
false for a new event. true when a chain reorganization removed an event you already received.
params.result.revision
number
Monotonic version number. For the same eventId, a higher revision is newer.
params.result.data
object or string
The topic payload. See each topic's page.
Only the new subscribe request fails, with -32001 subscription limit exceeded. The socket and its other subscriptions stay open.
Addresses per transaction filter
50
The subscribe request fails with -32602.
—
-32601
Method is not supported
method not found
-32602
Subscription params failed validation
unsupported subscription topic "nope"
-32000
The backing live source could not create the subscription
—
-32001
Per-user active or pending subscription limit reached
subscription limit exceeded
the types of counterparties or services involved;
the share associated with each exposure category;
direct interactions with flagged counterparties;
ownership and cluster attribution, when available;
asset-specific restrictions;
exposure or flags that could not be assigned to a named public category.
The current customer-facing response schema is identified by:
Activity exposure describes potentially harmful, illicit, abusive, or high-risk activity associated with a wallet, transaction, cluster, or counterparty.
API value: hacking
Interface presentation: Very high
Activity associated with unauthorized access to systems, wallets, smart contracts, protocols, or digital infrastructure.
This may indicate exploitation, unauthorized fund movement, or infrastructure compromise.
Recommended review: Examine transaction timing, counterparties, known incidents, and whether the assets may originate from an exploit.
API value: userAccountCompromise
Interface presentation: Very high
Activity associated with compromised accounts, private keys, devices, credentials, or user access.
This can include phishing-related compromise, malicious software, credential theft, or unauthorized access to a user-controlled wallet.
Recommended review: Confirm wallet ownership and investigate unusual access or transfer patterns.
API value: extortionActivity
Interface presentation: Very high
Activity associated with coercive payment demands, threats, ransom demands, blackmail, or other forms of financial extortion.
Recommended review: Escalate for enhanced due diligence and preserve relevant screening and transaction evidence.
API value: fraudulentSchemes
Interface presentation: Very high
Activity associated with deceptive investment programs, fraudulent services, scams, impersonation, Ponzi-like schemes, or other attempts to obtain funds through misrepresentation.
Recommended review: Verify the counterparty’s identity, business model, transaction purpose, and available fraud reports.
API value: stolenAssets
Interface presentation: Very high
Assets or activity associated with theft, unauthorized transfer, misappropriation, or movement of funds identified as stolen.
Recommended review: Review transaction path, timing, value, proximity, and available incident information.
API value: darknetActivity
Interface presentation: Very high
Activity associated with darknet markets, hidden services, or infrastructure used to facilitate illicit commerce.
Recommended review: Assess the directness of exposure, transaction history, amounts, and applicable prohibited-use policies.
API value: drugTrafficking
Interface presentation: Very high
Activity associated with the illegal production, sale, distribution, financing, or movement of proceeds related to controlled drugs or narcotic substances.
Recommended review: Escalate under the organization’s financial-crime procedures.
API value: weaponsTrafficking
Interface presentation: Very high
Activity associated with the illegal sale, distribution, financing, transfer, or acquisition of weapons.
Recommended review: Treat as a high-priority financial-crime signal.
API value: childAbuse
Interface presentation: Very high
Activity associated with the financing, distribution, or commercial infrastructure of child abuse or exploitation.
Recommended review: Treat as a critical signal and follow applicable escalation and reporting requirements.
API value: humanExploitation
Interface presentation: Very high
Activity associated with human trafficking, forced labour, sexual exploitation, or other forms of organized human abuse.
Recommended review: Escalate for immediate enhanced review.
API value: terrorismFinancing
Interface presentation: Very high
Activity potentially associated with raising, moving, storing, or using funds to support terrorist individuals, organizations, or operations.
Recommended review: Treat as a critical compliance signal and verify applicable legal obligations.
API value: extremistActivity
Interface presentation: High
Activity associated with extremist individuals, organizations, fundraising, propaganda infrastructure, or related financial networks.
Recommended review: Examine the nature and directness of the association.
API value: weaponsProliferationFinancing
Interface presentation: Very high
Activity potentially associated with financing the development, acquisition, transfer, or proliferation of prohibited weapons programs or related materials.
Recommended review: Treat as a critical signal requiring specialist compliance review.
API value: transactionObfuscation
Interface presentation: High
Activity involving services or techniques intended to make the origin, destination, ownership, or movement of assets more difficult to determine.
This may include mixing or other privacy-enhancing transaction patterns.
Recommended review: Examine transaction paths, timing, counterparties, and the business reason for the activity.
API value: gambling
Interface presentation: High
Exposure to betting, wagering, gaming, or gambling-related services.
The regulatory significance depends on licensing, jurisdiction, transaction purpose, and the customer’s profile.
API value: illegalActivity
Interface presentation: Very high
Activity classified as illegal that is not represented more precisely by another named activity category.
Recommended review: Treat as a material signal and examine the complete report and transaction history.
Compliance exposure describes sanctions, jurisdictional, regulatory, legal, and due-diligence context.
API value: sanctionsExposure
Interface presentation: Very high
Potential exposure to a person, entity, organization, address, or activity associated with sanctions-related measures.
When publicly identified, the response can divide the exposure by authority:
United Kingdom
UK
European Union
EU
United Nations
Example:
Recommended review:
Verify the relevant person or entity.
Check the applicable sanctions lists.
Review whether the exposure is direct or indirect.
Consider transaction timing and ownership information.
Escalate according to your sanctions policy.
API value: jurisdictionalRiskContext
Exposure associated with a jurisdiction requiring additional sanctions, AML, or counter-terrorist-financing scrutiny.
This category can contain the following public details:
Sanctions-restricted jurisdiction
sanctionsRestrictedJurisdiction
Very high
The jurisdiction is associated with sanctions-related restrictions.
Example:
The detail shares use the same exposure basis as the parent category and normally reconcile to its share.
API value: limitedComplianceControls
Interface presentation: High
Exposure to a service or counterparty whose compliance controls appear limited, insufficiently transparent, or below the level expected for the relevant activity.
This can indicate additional due-diligence risk involving customer verification, transaction monitoring, sanctions screening, licensing, or operational accountability.
Recommended review: Verify the service, licensing status, jurisdiction, ownership, and compliance practices.
API value: regulatoryAttention
Activity associated with regulatory, legal, judicial, enforcement, or public-office-related attention.
Recommended review: Determine the nature, status, relevance, directness, and recency of the regulatory or legal event.
Counterparty exposure describes the type of service, organization, protocol, or institution associated with screened exposure.
API value: centralizedExchange
Interface presentation: Low/informational
A custodial trading platform or exchange that facilitates the purchase, sale, conversion, or transfer of digital assets.
This category identifies the counterparty type. It is not an endorsement of the exchange.
API value: offExchangeTrading
Interface presentation: Low/informational
Trading activity outside a centralized exchange order book, including over-the-counter and peer-to-peer trading models.
Recommended review: Consider counterparty identity, settlement arrangements, transaction purpose, and relationship transparency.
API value: decentralizedExchange
Interface presentation: Medium
An on-chain or non-custodial service that enables digital-asset exchange through smart contracts or liquidity mechanisms.
The category describes a service type. It does not mean that every transaction passing through the service is illicit.
API value: lendingService
Interface presentation: Low/informational
A service or protocol providing digital-asset lending, borrowing, credit, collateralization, or related financing.
API value: stakingService
Interface presentation: Low/informational
A service or protocol used to stake digital assets, delegate network participation, or earn staking-related rewards.
API value: walletService
Interface presentation: Low/informational
A service providing wallet infrastructure, wallet management, transaction execution, or address management.
This can include hosted, operational, hot-wallet, or cold-wallet infrastructure.
API value: custodyService
Interface presentation: Low/informational
A service that safeguards, administers, or controls digital assets on behalf of customers or organizations.
API value: digitalAssetPayments
Interface presentation: Low/informational
A service facilitating crypto payments, merchant settlement, payment processing, remittances, or value conversion.
API value: digitalMarketplace
Interface presentation: Low/informational
A marketplace where users buy, sell, or exchange goods, services, or digital items using digital assets.
API value: investmentFunding
Interface presentation: Medium
Activity associated with investment vehicles, funds, crowdfunding, capital formation, or other fundraising structures.
API value: charitableActivity
Interface presentation: Medium
Activity associated with donations, nonprofit organizations, charitable fundraising, or humanitarian activity.
The category should be assessed together with beneficiary, jurisdiction, sanctions, and transaction-purpose information.
API value: miningActivity
Interface presentation: Low/informational
Activity associated with cryptocurrency mining, mining pools, hosted mining, or cloud-mining services.
API value: blockchainEntertainment
Interface presentation: Medium
Activity associated with blockchain-based games, entertainment platforms, digital collectibles, or related ecosystems.
API value: tokenFaucet
Interface presentation: Low/informational
A service that distributes small amounts of tokens, commonly for testing, onboarding, participation, or promotional purposes.
API value: smartContract
Interface presentation: Low/informational
An address identified as executable on-chain code rather than a conventional user-controlled wallet.
A smart-contract classification is contextual and does not itself indicate risk.
API value: technologyInfrastructure
Interface presentation: Medium
Infrastructure supporting blockchain or digital-asset services, such as hosting, nodes, routing, development tools, or operational technology.
API value: governanceEntity
Interface presentation: Low/informational
A government, political organization, public authority, or entity involved in governance or public administration.
This describes institutional context and does not itself indicate misconduct.
API value: civicInstitution
Interface presentation: Low/informational
An educational, media, or other public-interest institution.
API value: adultContentService
Interface presentation: High
A service providing adult-oriented content or related commercial activity.
The compliance significance depends on legality, jurisdiction, age controls, payment restrictions, and organizational policy.
A wallet report contains:
schemaVersion
Version of the customer-facing JSON structure.
overallRiskScore
Headline wallet risk score.
breakdown.exposure
{
"schemaVersion": "1.0"
}{
"category": "sanctionsExposure",
"share": 11.5,
"authorities": [
{
"authority": "UK",
"share": 2.5
},
{
"authority": "EU",
"share": 3.5
},
{
"authority": "UN",
"share": 1.5
}
],
}{
"category": "jurisdictionalRiskContext",
"share": 8,
"details": [
{
"category": "sanctionsRestrictedJurisdiction",
"share": 3
},
{
"category": "fatfCallForActionJurisdiction",
"share": 5
}
]
}{
"schemaVersion": "1.0",
"overallRiskScore": 100,
"breakdown": {
"exposure": {
"score": 82.4
},
"externalReports": {
"score": 75
},
"fatf": {
"score": 100
},
"tokenFlags": {
"score": 100
}
},
"attribution": {
"cluster": {
"score": 100
}
},
"reportId": "fa78dfdc-e69d-4bf6-a092-f824bbb24721"
}{
"data": {
"schemaVersion": "1.0",
"overallRiskScore": 100,
"breakdown": {
"exposure": {
"score": 82.4,
"activityExposure": [
{
"category": "hacking",
"share": 12.3
},
{
"category": "userAccountCompromise",
"share": 22.5
},
{
"category": "stolenAssets",
"share": 8.2
}
],
"complianceExposure": [
{
"category": "sanctionsExposure",
"share": 11.5,
"authorities": [
{
"authority": "UK",
"share": 2.5
},
{
"authority": "EU",
"share": 3.5
},
{
"authority": "UN",
"share": 1.5
}
],
"authorityNotProvidedShare": 4
},
{
"category": "jurisdictionalRiskContext",
"share": 8,
"details": [
{
"category": "sanctionsRestrictedJurisdiction",
"share": 3
},
{
"category": "fatfCallForActionJurisdiction",
"share": 5
}
]
},
{
"category": "otherComplianceRisk",
"share": 1.3
}
],
"counterpartyExposure": [
{
"category": "decentralizedExchange",
"share": 19.2
},
{
"category": "centralizedExchange",
"share": 7.2
}
],
},
"externalReports": {
"score": 75,
"activityExposure": [
{
"category": "fraudulentSchemes",
"share": 100
}
]
},
"fatf": {
"score": 100,
"flags": [
{
"flow": "in",
"category": "sanctionsExposure",
"count": 5,
"authorities": ["UN"]
},
{
"flow": "out",
"category": "hacking",
"count": 17
}
]
},
"tokenFlags": {
"score": 100,
"flags": [
{
"category": "assetRestriction",
"count": 1,
"asset": "usdt"
}
]
}
},
"attribution": {
"owners": ["Known service operator"],
"cluster": {
"names": ["Exploit-related cluster"],
"score": 100,
"activityExposure": [
{
"category": "hacking",
"share": 100
}
]
},
"assetRestrictions": [
{
"asset": "usdt"
}
]
},
"reportId": "fa78dfdc-e69d-4bf6-a092-f824bbb24721"
}
}Here, you will be checking if you are connected to streams
wss://shared.eu-central-1.getblock.io/<ACCESS_TOKEN>//npm install ws dotenv
import WebSocket
> bsc-node@1.0.0 start
> node index.js
ConnectedTo subscribe to streams, there are four parameters you can make use of as seen below:
bdnBlocks
New blocks with headers and transactions
Block monitoring, analytics
newTxs
New transactions entering mempool
Subscribe to new blocks as they're produced.
Include Options
header
Block header (number, hash, timestamp, gasUsed, gasLimit)
transactions
Full transaction list
hash
Example: Subscribe to Blocks
import WebSocket from "ws";
import "dotenv/config";
const ws = new WebSocket(`wss://shared.eu-central-1.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
tx_hash
Transaction hash
from
Sender address
to
Filters
Reduce bandwidth by filtering server-side:
to
array
Transaction recipient addresses
from
array
Example: Monitor PancakeSwap Transactions
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://shared.eu-central-1.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://shared.eu-central-1.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
receipt
Full transaction receipt
logs
Event logs emitted
Example:
import WebSocket from 'ws';
import 'dotenv/config';
const ws = new WebSocket(`wss://shared.eu-central-1.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:
import WebSocket from "ws";
import "dotenv/config";
const ws = new WebSocket(`wss://shared.eu-central-1.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 payloadsUse 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'] }
}]Handle Reconnection
Process Messages Asynchronously
Standard
5
1,000/sec
Pro
20
Contact support to upgrade your tier.
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
Submitting transactions to public mempool with accelerated propagation
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));
});
});UN
FATF call-for-action jurisdiction
fatfCallForActionJurisdiction
High
The jurisdiction is identified as high risk and subject to a FATF call for action.
Screened wallet exposure composition and its component score.
breakdown.externalReports
Confirmed external-report signals and their component score.
breakdown.fatf
Reviewed flagged-counterparty classifications and their component score.
breakdown.tokenFlags
Asset-specific flagged interactions and their component score.
attribution.owners
Known owner names, when available.
attribution.cluster
Cluster names, score, and optional exposure composition.
attribution.assetRestrictions
Reviewed asset restrictions.
reportId
Identifier for the screening report, when available.
MEV detection, copy trading
pendingTxs
Pending transactions
Front-running protection
txReceipts
Transaction receipts after confirmation
Trade confirmation
Block hash only
Recipient address
value
Transaction value (hex)
gas_price
Gas price (hex)
input
Transaction calldata
Transaction sender addresses
method_id
array
Function selectors (first 4 bytes of calldata)
10,000/sec
Enterprise
Unlimited
Unlimited
Process messages asynchronously
Increase your message queue buffer
Consider multiple connections for different streams
Connection Drop
Implement automatic reconnection (see example above)
Re-subscribe after each reconnect—subscriptions don't persist
Check your network stability
GetBlock Crypto AML screens cryptocurrency wallets and transactions for money-laundering, sanctions, fraud, and other compliance risks.
Send a wallet address or transaction hash and receive a JSON report containing a 0–100 risk score, supporting risk components, exposure composition, counterparties, and available attribution.
Wallet
Both endpoints:
use bearer authentication;
are billed per successful check from the account’s prepaid balance;
return the report inside a data envelope;
use the public GetBlock AML taxonomy rather than internal data-source labels.
Create an API key in the GetBlock dashboard:
The API key identifies the account whose prepaid balance will be charged.
Include it in every request:
Base URL:
Network values are case-insensitive.
An unsupported network returns HTTP 400:
A wallet check covers the wallet’s overall exposure across every asset available for the selected network.
Use it to screen a counterparty before a transaction, during customer onboarding, or as part of an ongoing compliance review.
The wallet endpoint does not accept an asset or currency-tag parameter.
The version of the customer-facing GetBlock AML response schema.
Use this field when maintaining integrations that may need to support more than one schema version.
The wallet’s headline risk score from 0 to 100.
Higher values indicate greater identified risk. The score should be interpreted together with the supporting breakdown and attribution.
The wallet’s observed exposure profile.
It contains:
score — the risk score associated with the exposure component;
activityExposure — exposure to risky or illicit activity;
complianceExposure — sanctions, jurisdictional, regulatory, or compliance-related exposure;
Risk supported by external reports or identified reports associated with the wallet.
The component has its own score and may include categorized exposure.
Direct compliance-relevant flags associated with wallet interactions.
Each flag may contain:
flow — in or out;
category — the public risk category;
count — the reported amount or occurrence count;
Reviewed restrictions associated with particular assets.
This is not a per-token risk breakdown. It reports specific token-related flags such as an issuer restriction.
Known entities to which the wallet has been attributed.
This field is omitted when no reviewed owner attribution is available.
Information about the wallet cluster:
names — known cluster names;
score — the risk score assigned to the cluster;
exposure arrays — categorized evidence associated with the cluster.
A wallet can have limited activity of its own while still carrying material risk because it belongs to an identified cluster.
Reviewed asset restrictions associated with the wallet.
Only supported and reviewed asset symbols are returned.
The unique identifier of the screening report.
Store it alongside the customer, transaction, or compliance decision for audit and support purposes.
The following fields are returned only when relevant data is available:
exposure category arrays;
unclassifiedExposure;
flags;
owners
Do not assume that every optional array will be present. A missing field means that the report has no public data for that field; it does not change the headline score.
A transaction check evaluates one selected asset transfer within a transaction.
A single blockchain transaction can contain both native-asset and token transfers. These transfers may involve different counterparties and produce different risk results.
For example, an Ethereum transaction may contain both ETH and USDT transfers. Screening eth does not automatically screen its usdt transfer.
Request fields:
The transaction’s headline risk score from 0 to 100.
Addresses involved in the screened asset transfer, grouped by flow:
in — incoming value flow;
out — outgoing value flow.
Each object maps a counterparty address to its risk score.
Transaction exposure is separated into:
activityExposure;
complianceExposure;
counterpartyExposure.
Each entry contains a public category and its share of the transaction’s exposure composition.
The share of exposure not assigned to a named public category.
The share remains visible so that the exposure composition stays complete, but internal or unreviewed classification names are not returned.
Use overallRiskScore for wallet reports and riskScore for transaction reports.
Read the supporting components and attribution before making a decision.
Do not treat an exposure share as a risk score or model weight.
Screens one transferred asset within a transaction, with its senders and receivers.
POST /v1/aml/tx-check
A transaction carries specific transfers — the native coin, a token, or both. Each has its own counterparties and is scored on its own, so asset selects which transfer to score:
Omit asset and the native coin is screened. More tokens are in the pipeline.
Name the asset you're screening — a check on a USDT payment should carry "asset": "usdt", so the report covers the transfer you actually care about.
.
The headline number is 0–100, higher is riskier — overall_risk_score for wallets, risk_score for transactions.
Scores move over time as a wallet keeps transacting. Store the score and the calculation_uid you acted on, so a decision can be reconstructed later.
See also: Using AML via the API · How risk scoring works · Using AML via the UI
Bitcoin
btc
btc
Litecoin
ltc
ltc
Bitcoin Cash
bch
bch
counterpartyExposure — exposure associated with identified entity or service types;
unclassifiedExposure — exposure that could not be assigned to a named public category.
authorities — identified sanctions authorities, when available;
details — reviewed details for grouped compliance categories, when available.
cluster names;
assetRestrictions;
authorities;
details;
reportId.
asset
No
Asset transfer to screen; defaults to the network’s native asset
Do not calculate the headline score by averaging category shares.
A category may represent grouped evidence from several internal sources.
unclassifiedExposure means that exposure exists but is not assigned to a named public category.
Missing optional fields do not mean that the entire check failed.
Store reportId when it is present.
string
yes
See supported networks above.
asset
string
no
Which transferred asset to score. Defaults to the native coin.
Bitcoin
btc
—
Litecoin
ltc
—
Bitcoin Cash
bch
—
POST /v1/aml/wallet-check
Screens the wallet across all supported assets on the selected network
Transaction
POST /v1/aml/tx-check
Screens one selected asset transfer within a transaction
Ethereum
eth
eth, usdt, usdc
TRON
trx
tx
Yes
Transaction hash: 64 hexadecimal characters, optionally prefixed with 0x
network
Yes
tx
string
yes
Transaction hash to screen.
Ethereum
eth
usdt, usdc
TRON
trx
trx, usdt
Blockchain network
network
usdt
Authorization: Bearer YOUR_API_TOKEN
Content-Type: application/jsonhttps://services.getblock.io{
"data": null,
"error": "Supported networks: bch, btc, eth, ltc, trx"
}POST /v1/aml/wallet-checkcurl -X POST "https://services.getblock.io/v1/aml/wallet-check" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"address": "0x8589427373D6D84E98730D7795D8f6f8731FDA16",
"network": "eth"
}'{
"data": {
"schemaVersion": "1.0",
"overallRiskScore": 100,
"breakdown": {
"exposure": {
"score": 82.4,
"activityExposure": [
{
"category": "hacking",
"share": 12.3
},
{
"category": "userAccountCompromise",
"share": 22.5
},
{
"category": "stolenAssets",
"share": 8.2
}
],
"complianceExposure": [
{
"category": "sanctionsExposure",
"share": 11.5,
"authorities": [
{
"authority": "UK",
"share": 2.5
},
{
"authority": "EU",
"share": 3.5
},
{
"authority": "UN",
"share": 1.5
}
],
"authorityNotProvidedShare": 4
},
{
"category": "jurisdictionalRiskContext",
"share": 8,
"details": [
{
"category": "sanctionsRestrictedJurisdiction",
"share": 3
},
{
"category": "fatfCallForActionJurisdiction",
"share": 5
}
]
}
],
"counterpartyExposure": [
{
"category": "decentralizedExchange",
"share": 19.2
},
{
"category": "centralizedExchange",
"share": 7.2
}
],
},
"externalReports": {
"score": 75,
"activityExposure": [
{
"category": "fraudulentSchemes",
"share": 100
}
]
},
"fatf": {
"score": 100,
"flags": [
{
"flow": "in",
"category": "sanctionsExposure",
"count": 5,
"authorities": [
"UN"
]
},
{
"flow": "out",
"category": "hacking",
"count": 17
}
]
},
"tokenFlags": {
"score": 100,
"flags": [
{
"category": "assetRestriction",
"count": 1,
"asset": "usdt"
}
]
}
},
"attribution": {
"owners": [
"Known service operator"
],
"cluster": {
"names": [
"Exploit-related cluster"
],
"score": 100,
"activityExposure": [
{
"category": "hacking",
"share": 100
}
]
},
"assetRestrictions": [
{
"asset": "usdt"
}
]
},
"reportId": "fa78dfdc-e69d-4bf6-a092-f824bbb24721"
}
}POST /v1/aml/tx-checkcurl -X POST "https://services.getblock.io/v1/aml/tx-check" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tx": "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060",
"network": "eth",
"asset": "usdt"
}'{
"data": {
"schemaVersion": "1.0",
"riskScore": 100,
"counterparties": {
"in": {
"0xac4cc4b68ea24bbfaac8fd127b67ed445accce22": 100
},
"out": {
"0xa9d1e08c7793af67e9d92fe308d5697fb81d3e43": 10
}
},
"activityExposure": [
{
"category": "hacking",
"share": 20
},
{
"category": "userAccountCompromise",
"share": 15
}
],
"complianceExposure": [
{
"category": "sanctionsExposure",
"share": 45,
"authorities": [
{
"authority": "UK",
"share": 15
},
{
"authority": "EU",
"share": 10
},
{
"authority": "UN",
"share": 10
}
],
"authorityNotProvidedShare": 10
}
],
"counterpartyExposure": [
{
"category": "decentralizedExchange",
"share": 10
}
],
}curl -X POST "https://services.getblock.io/v1/aml/tx-check" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"tx":"YOUR_TX_HASH","network":"trx","asset":"usdt"}'{
"data": {
"risk_score": 100,
"addresses_in": {
"0x1a2a1c938ce3ec39b6d47113c7955baa9dd454f2": 40,
"0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2": 34.85
},
"addresses_out": {
"0x098b716b8aaf21512996dc57eb0615e2383e2f96": 100,
"0x1a2a1c938ce3ec39b6d47113c7955baa9dd454f2": 40
},
"risk_tags": [
{ "tag": "dex(defi)", "percent": 82.58 },
{ "tag": "exchange", "percent": 9.39 },
{ "tag": "lending", "percent": 4.35 },
{ "tag": "marketplace", "percent": 2.34 },
{ "tag": "hot_wallet", "percent": 0.29 },
{ "tag": "mixer", "percent": 0.15 },
{ "tag": "sanction", "percent": 0.01 }
]
}
}
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.
The blockchain network to verify(ETH, BNB, or BASE)
address
string
Yes
the wallet address
curl --location --request POST 'https://services.getblock.io/v1/wallet-audit/audit
import axios from "axios";
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(())
}Field Path
Type
Example
Description
status
string
400
Invalid network or missing fields
401
Missing or invalid auth
402
network
string
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"
},
"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"
}
]
}
}"Not Fraud"
ML model verdict. Possible values: "Not Fraud", "Fraud", "New Address".
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
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, Prob_Trade, Prob_Yield_Farm.
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.
Insufficient balance
502
Provider error