Block-builder direct RPC
https://api.triport.io/rpc/eth-builder/beaverbuildSend a bundle straight to a named Ethereum block builder over JSON-RPC, bypassing the public mempool.
/rpc/eth-builder/ is a direct, write-only JSON-RPC channel to the
block-builder pool. Each request targets one builder by appending its short
id to the path (/rpc/eth-builder/beaverbuild), and the body is forwarded
verbatim to that builder's RPC endpoint. Use it when you need
builder-specific bundle submission — sending or simulating a bundle against a
single builder rather than fanning out through the private RPC
forwarder.
The endpoint is method-whitelisted: only the bundle-dispatch methods
eth_sendBundle, eth_callBundle, and mev_sendBundle are accepted. Any
read method (eth_getBalance, eth_call, etc.) is rejected with
method_not_allowed_on_builder — this is a write canal, not a general-purpose
RPC. Both single requests and JSON-RPC batch arrays are supported; in a batch,
every element must use an allowed method or the whole request is rejected.
Access is tier-gated to the Scale plan via the mev.builder_direct
feature. Requests on any lower plan return 403 tier_locked. The request body
is capped at 2 MiB, and the upstream call uses a configurable timeout (default
10 s) — a slow or unreachable builder surfaces as a 502.
Parameters
Path parameters
builder_idstringrequiredbeaverbuild, titanbuilder, rsync). Must be a single path segment — a trailing slash, an empty id, or extra path segments return 404 invalid_path. Unknown ids return 404 builder_not_found.Request bodyobjectjsonrpcstringrequired"2.0".idnumber | stringrequiredmethodstringrequiredeth_sendBundle, eth_callBundle, mev_sendBundle.paramsarrayrequiredResponse
The builder's JSON-RPC response is passed through unchanged, with its original status code preserved:
jsonrpcstring"2.0".idnumber | stringid.resultobjecteth_sendBundle / mev_sendBundle this typically contains the accepted bundleHash; for eth_callBundle it is the simulation result.errorobjectresult when the builder rejects the bundle (standard JSON-RPC error object).Errors
Errors raised by the proxy use the shared envelope
{"error": "<code>", "code": <http_status>}. See errors.md
for the full envelope.
| Code | Meaning | When it happens |
|---|---|---|
400 | body_read_error | The request body could not be read. |
401 | — | Missing or invalid Authorization bearer key. |
403 | tier_locked | The API key's plan does not include mev.builder_direct (anything below Scale). |
404 | invalid_path | No builder id segment, an empty id, or extra path segments after the id. |
404 | builder_not_found | The builder id is not present in the configured builder pool. |
405 | method_not_allowed | The HTTP method is not POST. |
405 | method_not_allowed_on_builder | A non-whitelisted JSON-RPC method was used (only eth_sendBundle / eth_callBundle / mev_sendBundle are allowed). |
429 | — | Per-tier RPS limit exceeded (burst-limited; there is no daily quota). |
502 | builder_unavailable | The upstream builder did not respond (connection failure or timeout). |
502 | builder_read_error | The builder responded but its body could not be read. |
Examples
JavaScript (fetch)
const res = await fetch(
"https://api.triport.io/rpc/eth-builder/beaverbuild",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.TRIPORT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
jsonrpc: "2.0",
id: 1,
method: "eth_sendBundle",
params: [{ txs: ["0x02f8..."], blockNumber: "0x1310f30" }],
}),
},
);
const data = await res.json();
console.log(data.result?.bundleHash);TypeScript SDK (@triport/sdk)
import { Triport } from "@triport/sdk";
const triport = new Triport({ apiKey: process.env.TRIPORT_API_KEY! });
const result = await triport.ethereum.mev.builder.send("beaverbuild", {
method: "eth_sendBundle",
params: [{ txs: ["0x02f8..."], blockNumber: "0x1310f30" }],
});
console.log(result.bundleHash);Python (triport-sdk)
import os
from triport import Triport
triport = Triport(api_key=os.environ["TRIPORT_API_KEY"])
result = triport.ethereum.mev.builder.send(
"beaverbuild",
method="eth_sendBundle",
params=[{"txs": ["0x02f8..."], "blockNumber": "0x1310f30"}],
)
print(result["bundleHash"])Notes
- Write-only by design. Only
eth_sendBundle,eth_callBundle, andmev_sendBundlereach the builder. Useeth_callBundleto simulate a bundle before submitting it witheth_sendBundle. - One builder per call. The path selects a single builder. To dispatch to multiple builders, send to each id, or use the private RPC forwarder which spreads a bundle across the configured set.
- Batch atomicity is per-method only. A batch array is accepted as a whole;
if any element uses a disallowed method the entire request returns
method_not_allowed_on_builder. There is no partial acceptance. - Body limit: 2 MiB. Larger payloads are truncated at read and will fail validation.
- Timeout: the upstream call uses a configurable timeout (default 10 s);
exceeding it returns
502 builder_unavailable. - Related: Private RPC forwarder, Relay Data API, mev-share hint stream.