Documentation
Zeminus is a block builder for BNB Smart Chain. Searchers send bundles to a public RPC; validators receive our block bids through the standard BSC builder API.
#Quickstart
Send a bundle with no account and no API key:
curl -s https://rpc.bsc.zeminus.com \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_sendBundle","params":[{"txs":["0x<signed raw tx>"]}]}'
Optionally sign the request to identify yourself and raise your rate limits (Flashbots-style header, any Ethereum key — it does not need funds):
import { Wallet, id } from "ethers"; // ethers v6
const signer = new Wallet(process.env.SIGNING_KEY);
const body = JSON.stringify({
jsonrpc: "2.0", id: 1, method: "eth_sendBundle",
params: [{ txs: [signedTx1, signedTx2] }],
});
const signature = await signer.signMessage(id(body)); // EIP-191 over keccak256(body) as hex
const res = await fetch("https://rpc.bsc.zeminus.com", {
method: "POST",
headers: {
"content-type": "application/json",
"X-Flashbots-Signature": `${signer.address}:${signature}`,
},
body,
});
console.log(await res.json()); // { result: "0x<bundle hash>" }
#Orderflow
Zeminus accepts searcher bundles and validator integration on BNB Smart Chain (BSC).
- Bundles are never unbundled or broadcast to the public mempool. Their transactions are shared only with the in-turn validator, as part of our block bid.
- We do not front-run, sandwich, or otherwise trade against submitted orderflow. Sandwich bundles are dropped, as standard on BSC (filter source: zeminus/bsc-sandwich-filter, MIT; bundle-level buy-buy-sell / sell-sell-buy on the same pool across Uniswap/Pancake V2, V3, V4, DODO, FourMeme).
- Per-source endpoints for wallets and integrators are available on request. They run on the same infrastructure and keep your flow attributable.
#Bundles
A bundle is an ordered list of signed transactions that either all execute, in the listed order, within one block — or are not included.
- Transactions not seen in the public mempool are private transactions. A bundle's effective gas price is calculated over its private transactions only.
- Minimum effective gas price: 0.05 gwei, averaged over a bundle's private transactions.
- Priority:
sum(private tx gas fees) × 0.9 + BNB transferred directly to the payment address.
Payment address:0x8D966220432639a6f82F3b139d05fF6E4Bb3A341 - Bundles may be merged with other bundles to raise block value, unless
noMergeis set. - Only hashes listed in
revertingTxHashesmay revert. Any other revert drops the whole bundle.
#RPC Endpoints
| Endpoint | Protocol |
|---|---|
https://rpc.bsc.zeminus.com | JSON-RPC over HTTPS (HTTP/2) |
wss://rpc.bsc.zeminus.com/ws | JSON-RPC over WebSocket |
- Reuse one long-lived connection (HTTP/2, or HTTP/1.1 keep-alive). A new TLS connection per request adds avoidable latency.
- Only the methods listed under API are served. General Ethereum RPC methods are not available on this endpoint.
Authentication and rate limits
There is no account and no API key. Signing a request is optional; it identifies you and raises your limits.
| Tier | Bundles per 9 s | Transactions per bundle |
|---|---|---|
| Unsigned (per IP) | 50 | 5 |
| Signed (per signing address) | 100 | 10 |
- To sign, add the header
X-Flashbots-Signature: <address>:<signature>, where<signature>is an EIP-191 signature of the keccak256 hash of the request body (as a hex string), made with any Ethereum key. This is the Flashbots / BuilderNet scheme, so existing tooling works. - Higher limits for signing addresses with a consistent inclusion record are available on request.
- Over the limit, requests return
-38000 rate limited. On WebSocket, each frame is verified on its own.
#API
eth_sendBundle
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_sendBundle",
"params": [{
"txs": ["0x…", "0x…"],
"revertingTxHashes": ["0x…"],
"noMerge": false
}]
}
| Field | Required | Description |
|---|---|---|
txs | yes | Signed raw transactions, in execution order |
maxBlockNumber | no | Last block the bundle is valid for. Default: current block + 100 |
maxTimestamp | no | Last Unix timestamp (seconds) the bundle is valid for |
revertingTxHashes | no | Transaction hashes allowed to revert |
noMerge | no | Do not merge with other bundles. Default false |
Response: {"jsonrpc":"2.0","id":1,"result":"0x<bundle hash>"}
- The bundle hash confirms receipt only, not inclusion. To see whether a bundle was simulated, dropped
(and why), or included, call
zeminus_getBundleStatuswith the hash. Status is kept for 24 hours. - Sending the same bundle again returns the same hash.
- Not supported on this endpoint:
backrunTarget, blob transactions, JSON-RPC batch requests.
zeminus_getBundleStatus
{"jsonrpc":"2.0","id":1,"method":"zeminus_getBundleStatus","params":["0x<bundle hash>"]}
Takes exactly one bundle hash, as returned by eth_sendBundle. No signature is needed. Available on
HTTPS and WebSocket; rate-limited to 10 calls per second per IP, separate from bundle limits
(-38000 when exceeded, -32602 for an invalid hash).
{"hash":"0x…","receivedAt":"2026-10-29T01:00:00Z","targetBlock":…,"maxBlock":…,"state":"failed",
"failure":{"reason":"reverted","txIndex":1,"txHash":"0x…","detail":"…"}}
| Field | Description |
|---|---|
state | pending · failed · expired · included · not_found (unknown, or older than the retention window) |
receivedAt, targetBlock, maxBlock, maxTimestamp | First receipt time (UTC) and the latest accepted block range |
failure | Latest failed attempt: reason, zero-based txIndex and txHash (absent for bundle-wide errors), and detail (up to 512 bytes) |
firstFailure | The first failure, kept after later attempts succeed |
shadow | The bundle was placed in one of our assembled candidate blocks (block, pass, fees). This is not inclusion. |
onchain | All bundle transactions were observed, in order, in a canonical block (block, blockHash, txIndex). Not finality, and not proof that our bid won; cleared if the block is reorged. |
- Failure reasons:
reverted·simulation_error·gas_price_below_minimum·sandwich·commit_failed·pool_full·rate_limited, or an admission error (the-38000message, with underscores). failedreflects the latest attempt and may change while the bundle is still in range.- Status is kept for 24 hours from first receipt. Raw transactions and submitter IP or address are never returned.
Errors
| Code | Meaning |
|---|---|
-38000 | Bundle rejected — the message gives the reason (below) |
-32601 | Method not available on this endpoint |
-32603 | invalid signature |
-38000 reasons: empty bundle · bundle missing txs · too many txs in bundle ·
bundle exceeds 50 txs · gas price below minimum · rate limited · bundle pool full ·
duplicate transaction · invalid transaction · invalid transaction chain ·
blob transactions are not supported · backrunTarget is not supported on public ingress ·
revertingTxHashes contains unknown transaction · bundle target block already passed ·
bundle target block too far ahead · maxBlockNumber < target block ·
maxBlockNumber too far ahead · maxTimestamp already passed · invalid timestamp range ·
invalid bundle fields
#For validators
Zeminus submits block bids through the standard BSC builder API. To receive them, add Zeminus to your builder list with the values below.
- Builder URL for registration:
https://rpc.bsc.zeminus.com - Builder (bid signing) address:
0x871886CEce0b1B3c250537EbdC51C8933B660786 - Validator-to-builder methods (
mev_reportIssue) are open to any address, rate-limited to 30 requests per minute per IP, and logged. No IP registration is needed. - To register as a validator, or for anything else, email builders@zeminus.com or message @zeminusxyz on Telegram.
#Block Building
Zeminus builds BSC blocks and submits its block bids to registered validators through the standard BSC builder API (BidBlock).
- Bundles are ranked by the priority formula above and placed first.
- Remaining space is filled with public mempool transactions by effective gas price (per-sender nonce order), minimum 0.05 gwei.
- We never insert transactions that sandwich or front-run users.
- Bundles are simulated against current state before inclusion; bundles that fail simulation are dropped.
#Glossary
- Bundle — an ordered list of signed transactions that execute together, in order, within one block, or not at all.
- Private transaction — a transaction not seen in the public mempool.
- Effective gas price — the gas fee a transaction pays per unit of gas used.
- In-turn validator — the validator scheduled to produce the next block.
- Block bid — a block a builder offers to the in-turn validator through the BSC builder API (BidBlock).
#Changelog
| Date (UTC) | Change |
|---|---|
| 2026-10-29 | Homepage and docs refocused on the BSC builder; quickstart and validators section added. Homepage lists the bundle status query as a principle; sandwich filtering is noted as standard on BSC. |
| 2026-10-28 | zeminus_getBundleStatus (bundle status query) available on HTTPS and WebSocket. |
| 2026-10-28 | Sandwich filter published as open source (MIT): zeminus/bsc-sandwich-filter. |
| 2026-10-25 | mev_reportIssue opened to any address (rate-limited, logged). IP registration is no longer needed. |
| 2026-10-24 | BSC builder documentation published: orderflow, bundles, RPC endpoints, block building, API. |
#Security
To report a vulnerability, email security@zeminus.com. Contact details and policy are in security.txt.
#Official channels
These are the only official Zeminus channels. Anything else claiming to be Zeminus is not us.
- Website —
zeminus.com(zeminus.xyzandzeminus.ioredirect here) - Builder & validator contact — builders@zeminus.com
- Telegram — @zeminusxyz (Zeminus Team) · channel t.me/zeminus
- X — @Zeminusxyz
- GitHub — github.com/zeminus
We never ask for a private key or seed phrase, and never ask you to sign a transaction or approval to
"verify" anything. Partnership contact from Zeminus comes only from @zeminusxyz on Telegram or an
@zeminus.com address. Any Zeminus endpoint lives under *.zeminus.com.
To report a security issue or an impersonation, see security.txt.
#License
The sandwich filter is open source under the MIT License: github.com/zeminus/bsc-sandwich-filter.
Other Zeminus source is planned for release under the Business Source License 1.1 (BUSL-1.1):
source-available, with production use restricted until the change date, after which it converts to an open-source license.
#FAQ
Is Zeminus live? The endpoint is live and accepts bundles. Validator onboarding is in progress; until the first validator registers Zeminus, bundles are simulated but not included in blocks. Endpoint status is under RPC Endpoints.
What chains? BNB Smart Chain first. Ethereum is next.