TriportRPC

Block-builder direct RPC

POSThttps://api.triport.io/rpc/eth-builder/beaverbuild

Send a bundle straight to a named Ethereum block builder over JSON-RPC, bypassing the public mempool.

Ethereummev.builder_direct feature (Scale tier)Scale tier only; RPS-per-tier with burst (no daily cap)

/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_idstringrequired
Short id of the target block builder (e.g. beaverbuild, 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 bodyobject
jsonrpcstringrequired
JSON-RPC version, "2.0".
idnumber | stringrequired
Client request id, echoed in the response.
methodstringrequired
One of eth_sendBundle, eth_callBundle, mev_sendBundle.
paramsarrayrequired
Method-specific parameters (e.g. the bundle object). Forwarded unchanged to the builder.

Response

The builder's JSON-RPC response is passed through unchanged, with its original status code preserved:

jsonrpcstring
JSON-RPC version, "2.0".
idnumber | string
Echoes the request id.
resultobject
Builder-defined result. For eth_sendBundle / mev_sendBundle this typically contains the accepted bundleHash; for eth_callBundle it is the simulation result.
errorobject
Present instead of result 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.

CodeMeaningWhen it happens
400body_read_errorThe request body could not be read.
401Missing or invalid Authorization bearer key.
403tier_lockedThe API key's plan does not include mev.builder_direct (anything below Scale).
404invalid_pathNo builder id segment, an empty id, or extra path segments after the id.
404builder_not_foundThe builder id is not present in the configured builder pool.
405method_not_allowedThe HTTP method is not POST.
405method_not_allowed_on_builderA non-whitelisted JSON-RPC method was used (only eth_sendBundle / eth_callBundle / mev_sendBundle are allowed).
429Per-tier RPS limit exceeded (burst-limited; there is no daily quota).
502builder_unavailableThe upstream builder did not respond (connection failure or timeout).
502builder_read_errorThe 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, and mev_sendBundle reach the builder. Use eth_callBundle to simulate a bundle before submitting it with eth_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.