Submission Methods

Types of Submissions

Bundles and Kairos (Top of Block) Fastbids can be submitted to the FastLane Relay RPC endpoint using JSON-RPC 2.0 over HTTPS and Websocket.

Searchers can send their submissions to the FastLane Relay API by calling the methods pfl_addSearcherBundle for Bundles or pfl_addSearcherFastBid for Kairos (Top of Block) Fastbids.

More information on the FastLane Relay API and API calls can be found here:


Rate limits (for both HTTP and websocket):

Request/message limit per second: 2

Burst limit: 32

Repeatedly going over the rate limit will result in temporary IP ban, ranging from 3 minutes to 24 hours.


It's recommended that you use HTTP Keep-Alive connections to connect to the RPC endpoint to minimize TLS connection establishment times as it significantly reduces request latency when sending a bundle if the TLS handshake is already complete.

The /ping endpoint is available for establishing a session, you can have a maximum of 2 sessions per IP address, and sessions will persist for a maximum of 15 minutes.


// node LTS (v18.12.1)
// consider node-fetch to replace native fetch for lower

const https = require("https");

const RELAY = "";

const pfl_bundle =  createBundle(); // See submitFlashBid js doc

const postData = {
  jsonrpc: "2.0",
  method: "pfl_addSearcherBundle",
  params: [pfl_bundle],
  id: 1,

const agent = new https.Agent({
  keepAlive: true,

const ping = () => fetch(`${RELAY}/ping`, { agent }).then(r => console.log(`PONG : ${r.statusText}`));

const sendBundle = postData => fetch(RELAY, {
    method: "POST", // or 'PUT',
    headers: {
      "Content-Type": "application/json",
    body: JSON.stringify(postData),

const keepWarm = async() => {
    setInterval(ping, 1000*60*10);
    return ping();

async function main() {
  // Warm it up.
  await keepWarm();

  // Whenever needed. Fire a bundle.
  await sendBundle(postData)
    // See 
    // as response can still have a .error field
    .then(async(response) => {
      console.log("Success:", response.statusText);

      const json = await response.json();

      if (json.error) throw json.error.message;
    .catch((error) => {
      console.error("Error:", error);

main().catch(err => console.error(err));

// Additional ressources:
// -
// -


Ping messages will be sent to your connection every 60 seconds. A pong response must be sent to avoid disconnection. Alternatively, you can send ping messages yourself to the server every minutes and get pong responses.

To keep a websocket connection open and stable on a long term, we highly recommend to send ping messages to the server every minutes, and to answer pong every time the server sends a ping message.

To better track responses (e.g. when sending multiple concurrent requests), it is highly advised to specify a unique id for each new requests, see example below.


import WebSocket from 'ws';

const pflBundle = createBundle(); // See submitFlashBid js doc
const rpcData = {
    id: 25,
    jsonrpc: "2.0",
    method: "pfl_addSearcherBundle",
    params: [pflBundle],

let ws = new WebSocket("wss://");
ws.on('open', function open() {
    console.log('websocket connected');
ws.on('message', function message(data) {
    console.log('Received:', data.toString());
    // output:
    // Received: {"id": 25, "jsonrpc": "2.0", "result": "..."}
    //                  ^ "id" matches the one we specified in the request


Last updated