Block-builder direct RPC — Ethereum REST API
Send a bundle straight to a named Ethereum block builder over JSON-RPC, bypassing the public mempool.
https://triport.io/rpc/eth-builder/beaverbuild- Network
- Ethereum
- Scope
- mev.builder_direct feature (Scale tier)
- Auth
- x-token: $TRIPORT_API_KEY (or Authorization: Bearer)
- Rate limit
- Scale tier only; RPS-per-tier with burst (no daily cap)
Endpoint and plans: Ethereum RPC endpoint.
/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
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://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);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.