Docs Live

A block builder for everyone.

Zund builds Ethereum blocks with one set of rules for every sender. No whitelist, no API key, no account. A searcher running a laptop bot gets the same treatment as a fund.

RPChttps://zundbuilder.com
i

Live since 23 September 2026. Zund builds a full block every slot and bids it to the Flashbots, Ultra Sound, Titan, Aestus and Agnostic relays. A new builder wins few blocks until it receives flow: send yours.

What makes Zund different

Usual builderZund
AccessOpen, but priority often comes from private deals and historyOpen. Same rules for every bundle, written on this site
FeedbackBundle trace available minutes laterSimulation result in the same response, in milliseconds
Why it failedStatus codePlain reason: which tx reverts and why, or that it pays nothing
Did it land?Check it yourselfBlock, position and winning builder, updated every block
Your flowTrust usNever sandwiched, never broadcast, blocklist published (empty)

At a glance

ItemValue
Contactcontact@zundbuilder.com
RPC endpointhttps://zundbuilder.com
ProtocolJSON-RPC 2.0 over HTTPS, POST
NetworkEthereum mainnet
Coinbase0x130e5956994e4e9262161c1abb86af739d2f42e2
Block extraDatazund
Rate limit30 requests / second / IP
AuthenticationNone. X-Flashbots-Signature is optional
Get started

Quickstart

Three steps: sign, send, track. No sign-up.

1. Sign your transactions

Build and sign your transactions as usual. A bundle is a list of raw signed transactions, executed in order and all together, or not at all.

Pay the builder the way you prefer: a priority fee, or a direct ETH transfer to block.coinbase inside your transaction.

2. Send the bundle

curl -s https://zundbuilder.com \
  -H 'content-type: application/json' \
  -d '{
  "jsonrpc": "2.0", "id": 1,
  "method": "eth_sendBundle",
  "params": [{
    "txs": ["0x02f8...signed tx 1", "0x02f8...signed tx 2"],
    "blockNumber": "0x18d4a21"
  }]
}'

3. Read the answer

You get the simulation result right away, in the same response. This one is real, from a live mainnet transaction:

Response
{
  "bundleHash": "0x3e8cf25e71af056f873f777d5f269f8f3ef4d1569f9aef98178ff429a02a4cd5",
  "simulation": {
    "ok": true,
    "reason": null,
    "builderPaymentEth": 0.000006368400127368,
    "ms": 9,
    "txs": [{ "hash": "0xe29da8c1…0c3c", "status": "SUCCESS", "gasUsed": 127368, "error": null }]
  }
}

Then call zund_getBundleStats with the bundleHash to see whether it landed, in which block, and at which position.

✓

If simulation.ok is false, reason tells you why in plain words, for example tx 2 (0x9a41c0de) reverts: execution reverted or bundle pays nothing to the builder. Fix it and send again.

Get started

Principles

Ethereum is for everyone, so its blocks should be too. These are the rules Zund follows, published so anyone can hold us to them.

1. No club

No whitelist, no API key, no account, no private priority lane. Every bundle is ranked by what it adds to the block, and by nothing else. Who sent it does not matter.

2. Your flow is yours

  • Zund never front-runs, back-runs or sandwiches the transactions and bundles it receives.
  • Zund does not let others do it either: a bundle that sandwiches another sender's transaction is rejected when it arrives, with the reason in the response.
  • Bundles are never unbundled, broadcast to the public mempool or shown to other searchers.
  • Zund runs no searcher strategies on the flow it receives.

3. No censorship

Zund's transaction blocklist is empty. Any valid transaction that pays for its place can be included.

4. Every sender gets an answer

A bundle that is rejected is never silently dropped. You get the reason in the same response, and you can track the outcome block by block.

5. A thin margin

The builder keeps a small share. Most of the value created by a bundle goes back to the people who create it. The refund rule is public: 90% of the surplus you create comes back to you, the same rule for everyone.

6. Built for the next Ethereum

Zund is designed for the protocol that is coming (ePBS, inclusion lists, encrypted mempools), not the one that is leaving. See Ready for what's next.

Get started

How blocks are built

From your request to a finished block, in four stages.

Your bot bundle / tx Gateway instant simulation Engine 3 algorithms compete End of block final-state pass Relays answer in ms ↩ zund_getBundleStats landed? block, position

1. Gateway: instant simulation

Every eth_sendBundle is decoded and simulated on the latest mainnet state before anything else. The simulation charges the priority fee and follows ETH transfers to the Zund coinbase, so it knows exactly what the bundle pays. You get the result in the response, usually in 5 to 35 ms.

2. Engine: algorithms compete

The bundle then goes to the engine, based on rbuilder running on its own reth node. Three block-building algorithms run at the same time and the most valuable block wins:

AlgorithmHow it orders
max-profitBy the total value each order adds to the block
mev-gas-priceBy value per unit of gas
parallelSplits orders into independent groups, solves them on 16 threads and merges

Orders are re-simulated inside the block they are placed in, so interactions between bundles are taken into account, not only the gas price.

3. End-of-block pass

After the block is filled, bundles sent with eth_sendEndOfBlockBundle are tried on the final state of the block. This is where you back-run what happened inside the block itself. A bundle that reverts or pays nothing is dropped, and the block stays as it was.

4. Relays

Zund submits every block to the Flashbots, Ultra Sound, Titan, Aestus and Agnostic relays, paying the proposer only what is needed to beat the best competing bid.

How much the proposer gets. Zund reads the best competing bid live and offers just above it: bid = min(block value, best other bid + 0.00001 ETH). The proposer gets what it takes to win; the rest of the block value is the surplus that goes back to the senders (see Refunds). Zund never bids more than its block is worth.

API reference

API overview

Standard JSON-RPC 2.0. If you have already sent bundles to any builder, you already know how to use Zund.

POSThttps://zundbuilder.com

Methods

MethodWhat it doesStatus
eth_sendBundleSend an atomic bundle. Returns an instant simulationlive
eth_sendEndOfBlockBundleBundle tried after all other orders, on the final block statelive
eth_sendRawTransactionSend one private transactionlive
zund_getBundleStatsStatus, simulation and landing of a bundlelive
zund_rulesThe rules and limits, as JSONlive
eth_cancelBundleCancel your bundles by replacementUuidlive

Signing (optional)

You can add the standard Flashbots header X-Flashbots-Signature: <address>:<signature>, where the signature is the EIP-191 signature of the keccak256 hash of the request body. If it is valid, your address is shown as signer in zund_getBundleStats. It is required for replacementUuid and eth_cancelBundle.

i

Signing never gives priority at Zund. It only identifies you. It will be used to send refunds to the right address.

Limits and error codes: see Errors & limits.

API reference
POST

eth_sendBundle

Send a list of signed transactions to be included together, in order, in the target block. Nothing is included unless the whole bundle is valid.

Parameters

FieldTypeDescription
txs requiredstring[]Signed raw transactions (hex), in execution order. Must not be empty.
blockNumber optionalhex stringTarget block. Without it, the bundle is valid for the next blocks and tracked for 5 minutes.
revertingTxHashes optionalstring[]Hashes of transactions that are allowed to revert without dropping the bundle.
droppingTxHashes optionalstring[]Hashes of transactions that may be removed from the bundle if they are invalid (for example, already included).
minTimestamp optionalnumberMinimum block timestamp for which the bundle is valid.
maxTimestamp optionalnumberMaximum block timestamp for which the bundle is valid.
replacementUuid optionaluuidMakes the bundle replaceable. A new bundle with the same uuid from the same signer replaces the old one. Requires X-Flashbots-Signature. Also accepted as uuid.
replacementNonce optionalnumberSequence number of the replacement; the highest wins. Also accepted as replacementSeqNumber. If omitted, Zund uses the arrival time.
refundRecipient optionaladdressWhere your refund is paid. Defaults to your identity. See Refunds.
refundPercent optional0–99Share of what your bundle pays that is refunded to you inside the same block. On top, the surplus rule applies to everyone.

Example

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "eth_sendBundle",
  "params": [{
    "txs": ["0x02f8b1…", "0x02f8d3…"],
    "blockNumber": "0x18d4a21",
    "revertingTxHashes": []
  }]
}

Response

200 OK
{
  "jsonrpc": "2.0", "id": 1,
  "result": {
    "bundleHash": "0x3e8cf25e…4cd5",
    "simulation": {
      "ok": true,
      "reason": null,
      "builderPaymentEth": 0.000006368400127368,
      "ms": 9,
      "txs": [
        { "hash": "0xe29da8c1…0c3c", "status": "SUCCESS", "gasUsed": 127368, "error": null }
      ]
    }
  }
}
FieldMeaning
bundleHashkeccak256 of the concatenated transaction hashes. Use it with zund_getBundleStats.
simulation.oktrue if no transaction reverts (except the allowed ones) and the bundle pays the builder something.
simulation.reasonWhy it is not ok, in plain words. null when ok.
simulation.builderPaymentEthWhat the bundle pays the builder: priority fees plus direct ETH transfers to the coinbase.
simulation.txs[]For each transaction: status (SUCCESS / REVERT), gasUsed, error.
simulation.msHow long the simulation took.

Possible reasons

reasonWhat to do
tx N (0x…) reverts: …That transaction fails on the current state. Fix it, or add its hash to revertingTxHashes if the failure is acceptable.
invalid: …Wrong nonce, not enough balance, fee below base fee. The message comes from the node.
bundle pays nothing to the builderAdd a priority fee or an ETH transfer to block.coinbase.
i

The instant simulation runs at the top of the latest block. Inside the real block, the engine simulates again after the orders placed before yours. A bundle that is ok here can still be skipped if another order changes the state first. zund_getBundleStats tells you what happened.

API reference
POST

eth_sendEndOfBlockBundle

A bundle placed after every other order, on the final state of the block. Use it to back-run what happens inside the block itself.

Parameters

FieldTypeDescription
txs requiredstring[]Signed raw transactions, in order.
blockNumber requiredhex stringThe block to append to.
revertingTxHashes optionalstring[]Transactions allowed to revert.
targetPools optionaladdress[]Pools the bundle depends on. Recorded today. Every end-of-block bundle is currently tried, whatever pools it targets.

Example

Request
{
  "jsonrpc": "2.0", "id": 1,
  "method": "eth_sendEndOfBlockBundle",
  "params": [{
    "txs": ["0x02f8…"],
    "blockNumber": "0x18d4a21",
    "targetPools": ["0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640"]
  }]
}
Response
{ "jsonrpc": "2.0", "id": 1,
  "result": { "accepted": true, "note": "will be tried after all other orders, on the final block state" } }

Guarantees

  • Same atomicity as a normal bundle: all transactions or none.
  • If the bundle reverts or pays nothing on the final state, it is dropped and the block does not change.
  • No instant simulation for this method: the state it depends on does not exist yet when you send it.
API reference
POST

eth_sendRawTransaction

Send one signed transaction privately. It is not broadcast to the public mempool.

Parameters

PositionTypeDescription
0 requiredstringThe signed raw transaction (hex).
{ "jsonrpc": "2.0", "id": 1, "method": "eth_sendRawTransaction", "params": ["0x02f8…"] }
API reference
POST

eth_cancelBundle

Withdraw your replaceable bundles. Only the signer who sent them can cancel them.

Parameters

FieldTypeDescription
replacementUuid requireduuidThe uuid you set when sending the bundle.

The request must carry a valid X-Flashbots-Signature. Zund pairs the uuid with the verified signer, so nobody else can cancel or replace your bundles, even if they learn the uuid.

{ "jsonrpc": "2.0", "id": 1, "method": "eth_cancelBundle",
  "params": [{ "replacementUuid": "3b35aab2-e12a-4063-9714-877df1a0f05d" }] }

bundles is how many of your pending bundles were marked CANCELLED. The engine drops them from the next rebuild of the block.

Replace instead of cancel

To update a bundle, send a new eth_sendBundle with the same replacementUuid. The previous one becomes REPLACED in zund_getBundleStats.

i

A cancellation sent in the last moments before a block is submitted may arrive too late for that block.

API reference
POST

zund_getBundleStats

Everything Zund knows about your bundle. Available immediately, updated every block.

Parameters

PositionTypeDescription
0 requiredstring or objectThe bundleHash, or { "bundleHash": "0x…" }.
Request
{ "jsonrpc": "2.0", "id": 1, "method": "zund_getBundleStats",
  "params": ["0x3e8cf25e71af056f873f777d5f269f8f3ef4d1569f9aef98178ff429a02a4cd5"] }
Response · real bundle, 23 Sep 2026
{
  "bundleHash": "0x3e8cf25e…4cd5",
  "status": "FORWARDED",
  "reason": null,
  "targetBlock": 26038817,
  "receivedAt": "2026-09-23T07:53:16.379Z",
  "txCount": 1,
  "signer": null,
  "simulation": { "ok": true, "builderPaymentEth": 0.0000063684, "ms": 9, … },
  "landing": {
    "status": "LANDED",
    "block": 26038817,
    "position": 117,
    "builder": "BuilderNet",
    "complete": true,
    "success": true
  }
}

Fields

FieldMeaning
statusWhat Zund did with it. See Bundle tracing.
signerYour address, if you sent a valid X-Flashbots-Signature.
replacementUuidThe uuid of a replaceable bundle, or null.
landing.statusPENDING, LANDED or NOT_LANDED.
landing.builderWho built the block where your transactions landed, read from the block's extraData.
landing.positionIndex of your first transaction in the block.
landing.completetrue if every transaction of the bundle is in that same block.
landing.successtrue if your first transaction did not revert.

Unknown hashes return { "status": "UNKNOWN" }. Bundles are kept for 6 hours.

API reference
POST

zund_rules

The rules of this builder as JSON, so your bot can read them.

Response
{
  "name": "Zund",
  "phase": "live: Zund bids every slot to Flashbots, Ultra Sound, Titan, Aestus and Agnostic relays",
  "principle": "a builder for everyone: no whitelist, no API key, same rules for every bundle, every sender gets an answer",
  "forbidden": ["sandwiching the flow Zund receives", "censorship (blocklist is empty)"],
  "refunds": "90% of the surplus back to senders by contribution, 10% fee, paid in the same block (starts with bidding)",
  "docs": "https://zundbuilder.com",
  "limits": { "requestsPerSecondPerIp": 30, "maxBodyBytes": 1048576 }
}
API reference

Errors & limits

The same limits for everyone. No paid tier.

Limits

LimitValue
Requests30 per second per IP. Above it: HTTP 429
Request body1 MB
Upstream timeout10 s
Bundle memory6 hours

Error codes

CodeMessageCause
-32700invalid jsonThe body is not valid JSON.
-32601method not supportedThe method is not in the list.
-32602empty bundletxs is missing or empty.
-32602transaction could not be decodedA transaction is not valid signed RLP.
-32602replacementUuid requires a valid X-Flashbots-Signature headerReplaceable bundles and cancellations must be signed.
-32005too many requestsRate limit reached. Wait one second.

A bundle that decodes correctly but fails simulation is not an error: you get a normal result with simulation.ok: false and a reason.

Guides

Bundle tracing

Know what happened to every bundle, while it still matters: the simulation comes in the response, the landing check runs every block.

Lifecycle

RECEIVED→ simulated→ FORWARDED→ LANDED/NOT_LANDED

status

ValueMeaning
RECEIVEDDecoded and recorded.
INVALIDEmpty, or a transaction could not be decoded. Not forwarded.
FORWARDEDSimulated and handed to the engine for block building.
REJECTEDThe engine refused it (for example, a malformed field). reason has the engine's message.
REPLACEDA newer bundle with the same replacementUuid and signer took its place.
CANCELLEDYou cancelled it with eth_cancelBundle.

landing.status

ValueWhen
PENDINGThe target block has not been produced yet.
LANDEDYour first transaction is on chain. Zund adds the block, position and builder.
NOT_LANDEDTwo blocks after the target, it is still not on chain. Without a target block: after 5 minutes.
i

Landing is checked on chain, whoever built the block.

Checklist when a bundle does not land

  1. Look at simulation.reason. Most failures are there.
  2. Check targetBlock. A bundle for a block that has already passed cannot land.
  3. Check the payment. Another bundle touching the same state may simply pay more.
  4. If a transaction may already be on chain, list it in droppingTxHashes.
Guides

Refunds with bidding

When your bundle makes a Zund block more valuable, most of that value comes back to you. One rule, the same for everyone, written here in full.

The rule in one sentence

After paying the proposer, Zund keeps 10% of what is left and gives the other 90% back to the senders, in proportion to how much each one added to the block.

How it is computed

For every block Zund wins:

SymbolMeaning
vValue of the block: everything it pays the Zund coinbase.
cWhat Zund pays the proposer (the winning bid).
S = v − cSurplus: what is left after paying the proposer.
μᵢContribution of sender i: the value of the block with their bundles minus the value of the best block without them, capped at what their bundles pay.
f = 10%Zund's fee. Fixed and public. It only changes with notice on this page.
Refund of sender i
refundᵢ = (1 − f) × min(S, Σⱼ μⱼ) × μᵢ / Σⱼ μⱼ

The builder only keeps f × min(S, Σμ), plus any surplus that no bundle created (for example, from public mempool transactions).

Example

StepValue
Block value v0.100 ETH
Paid to proposer c0.085 ETH
Surplus S0.015 ETH
ContributionsAlice μ = 0.040, Bob μ = 0.020 → Σμ = 0.060
To sharemin(0.015, 0.060) = 0.015 → 90% = 0.0135 ETH
Alice0.0135 × 40/60 = 0.0090 ETH
Bob0.0135 × 20/60 = 0.0045 ETH
Zund keeps0.0015 ETH

Who gets it

  • Identity: the address in your X-Flashbots-Signature header. Without a signature, the sender of the first transaction of the bundle.
  • Where it goes: refundRecipient if you set it, otherwise your identity address.
  • Split identities do not pay more. A group of identities can never receive more in total than their bundles contributed to the block, so splitting your flow across many keys gains nothing.
  • Everyone who sends privately to Zund qualifies: bundles, end-of-block bundles and private transactions. Transactions that were already public in the mempool do not.

When and how it is paid

  • Inside the block, if you set refundPercent (see below).
  • Right after the block for the surplus share. As soon as a Zund block lands, it is computed and paid by transactions from the Zund coinbase, usually within the next few blocks. Anyone can check them on chain against the block.
  • Dust is kept for you, not lost. A refund smaller than the gas needed to send it is added to your balance and paid in a later block, once it is worth sending.
  • Visible. Each bundle's refund will appear in zund_getBundleStats.

Refunds inside the same block: refundPercent

Like Titan, you can also ask for a refund paid inside the same block. Add refundPercent (1–99) to eth_sendBundle: that share of what your bundle pays the builder is sent back to you by a transaction placed right after your bundle, in the same block. Its gas is taken from the refund.

FieldMeaning
refundPercentInteger 1–99. Share of the payment of your bundle refunded in the block.
refundRecipientWhere the refund goes. Default: the sender of the first transaction.
refundTxHashesAt most one hash: the transaction whose payment is refunded. Default: the last one.

Then the surplus rule still applies. What you received inside the block is subtracted from your contribution, and 90% of the remaining surplus is shared as described above. At Titan, what is left after refundPercent stays with the builder; at Zund, 90% of it comes back to the senders.

i

A higher refundPercent means your bundle pays the builder less, so it is ranked lower when the block is built. This is the same trade-off as at every builder.

Guides

Zund Protect live

A private RPC for your wallet. Your transactions never go to the public mempool, so nobody can sandwich them.

Add it to your wallet

FieldValue
Network nameZund Protect
RPC URLhttps://zundbuilder.com/protect
Chain ID1
Currency symbolETH
Block explorerhttps://etherscan.io

What happens to your transaction

  • Private. Zund does not broadcast it to the public mempool.
  • It lands fast. Zund puts it in its own block and also shares it privately with builders that do not sandwich private flow (Titan, Quasar, Flashbots Protect), so it is included whoever wins the slot.
  • No sandwich at Zund. Bundles that sandwich another sender are rejected at the door.
  • Reads are served by Zund's own node: balances, nonces, calls, gas estimates, receipts, logs (up to 1,000 blocks per query).
i

Refunds for Protect users (a share of the value your transaction creates) are planned.

Guides

Builder identity

How to recognise a Zund block, and where Zund will send its blocks.

ItemValue
Coinbase (fee recipient)0x130e5956994e4e9262161c1abb86af739d2f42e2
Block extraDataZund (zundbuilder.com)
Transaction blocklistEmpty
Relays (when bidding)Flashbots, Ultra Sound, Titan Relay, Aestus, Agnostic
BLS submission keys0x8d4eeeaf7a0f9cf05eb3b145c05d0e775b04481749450952f2b319bf4d69b9f16a538db7b30fb4b976e65873a57ced04
Any key not listed here is not Zund.

To pay the builder directly from a contract, transfer ETH to block.coinbase. It always points to the builder of the block your transaction is in.

Guides

Live numbers

Everything Zund does, counted in public. Updated every 5 minutes from the builder's own logs. Raw file: /stats.json.

MetricValue
Loading…

Blocks won are checked on chain (fee recipient = Zund coinbase). "Bids above block value" must always be 0: Zund never pays a proposer more than its block is worth.

Zund

Ready for what's next

Ethereum is changing how blocks are built. Zund is designed for where it is going.

ePBS · EIP-7732Proposer-builder separation moves into the protocol. Builders bid directly, with no trusted relay in the middle. Zund's bidding is being designed for it from day one.
FOCIL · EIP-7805Validators force transactions into blocks with inclusion lists. Zund already builds without a blocklist, so inclusion lists change nothing in how it treats your transactions.
Block access lists · EIP-7928Blocks declare the state they touch, which allows parallel execution. Zund's parallel algorithm already groups orders by the state they touch.
Encrypted mempoolsTransactions stay hidden until their order is fixed, so front-running becomes impossible. A builder that does not look at its flow to profit from it loses nothing here.
Zund

Status & roadmap

What works today, and what comes next. Updated as things ship.

Live

Feature
Full block built every slot, 3 competing algorithmslive
Public HTTPS endpoint, no keylive
Instant simulation in the eth_sendBundle responselive
End-of-block bundles on the final statelive
On-chain landing tracking, every blocklive
Bundle replacement and eth_cancelBundle, bound to the verified signerlive
Sandwich bundles rejected at the door (same sender trading before and after another sender on the same pool)live
Refunds inside the same block with refundPercentlive
Blob transactions (EIP-7594 sidecars), each checked against its versioned hashes before it enters a blocklive
Compressed SSZ submissions to relayslive
Bidding every slot to Flashbots, Ultra Sound, Titan, Aestus and Agnosticlive

Next

Feature
Refunds paid on chain right after the block (rule published, service ready)with bidding
Gas sponsorship: if a sender cannot pay gas, Zund advances it and the bundle repays it in the same block (built and tested, switched on after launch)ready
Regional endpointsplanned

Changelog

DateChange
2026-09-24Public Live numbers page (/stats.json). Blocks now carry Zund (zundbuilder.com) in extraData. BLS submission key published.
2026-09-24Own domain zundbuilder.com. Zund Protect: private RPC for wallets at https://zundbuilder.com/protect.
2026-09-23Zund is live: bids every slot to five relays.
2026-09-23Sandwich bundles rejected. Same-block refunds with refundPercent. Blob transactions back on, with a strict sidecar check. Compressed SSZ submissions. Gas sponsorship built and tested.
2026-09-23Bidding service: pays the proposer only what is needed to win (best competing bid + 0.00001 ETH), never more than the block is worth. Refund service ready, tested on real blocks.
2026-09-23Bundle replacement (replacementUuid) and eth_cancelBundle live. Refund fields from other builders no longer drop a bundle.
2026-09-23Refund rule published: 90% of the surplus back to senders, 10% fee, paid in the same block.
2026-09-23Public endpoint and documentation online. English API responses. Per-IP rate limit.
2026-09-23End-of-block bundles. On-chain landing tracking.
2026-09-23Instant simulation in the eth_sendBundle response.