Private Transaction Relay
What it does
Some transactions are too valuable to broadcast. The moment a profitable or sensitive tx hits the public mempool, generalised front-runners copy its calldata, bid higher gas and beat you to the block — claiming a bounty/CTF prize you solved, sniping a mint, or sandwiching your swap.
This relay closes that window. You sign the transaction locally
and send us only the signed bytes; we forward them only to block
builders (Flashbots, Titan + our own rbuilder) and
never to the public mempool. There is nothing for a
front-runner to see. You keep custody throughout — we can't alter the tx
(any change breaks the signature) and never see your key.
Try it — validate a signed tx (free)
Paste a locally-signed raw transaction (0x…).
We decode it, recover the sender, and show exactly which private builders
it would be relayed to — without relaying it and
without charge. Confirm the bytes are right before you pay to relay.
How to claim privately
- Sign locally. Build & sign your tx offline with your own wallet (viem, ethers,
cast mktx…). Your key never leaves your machine. - Validate (free).
GET /v1/private-relay/inspect?raw_tx=0x…— or use the box on the left — to confirm sender/nonce/target. - Relay (paid).
POST /v1/premium/private-relaywith an x402 payment and{ raw_tx }. We fan it out privately. - Watch. We return the tx hash + which builders accepted it. It lands when one of them wins a block — no mempool exposure in between.
Where your tx goes
Live builder set (from /v1/private-relay/info). Our own rbuilder is marked ours; the rest are major private-order-flow builders.
It is never sent to a public node's eth_sendRawTransaction, so it cannot appear in the public mempool.
Price
Pay-per-use over the x402 protocol — one micropayment per private submission. Compatible clients (@x402/fetch) sign + retry automatically.
Relay with x402 (JS)
import { wrapFetchWithPayment } from '@x402/fetch';
import { createWalletClient, http } from 'viem';
// 1. sign LOCALLY — your key never leaves here
const rawTx = await wallet.signTransaction(txRequest);
// 2. (optional) validate for free
await fetch(
'https://api.seneschal.space/v1/private-relay/inspect'
+ '?raw_tx=' + rawTx
).then(r => r.json());
// 3. relay privately (x402 pays $0.50)
const f = wrapFetchWithPayment(fetch, payWallet);
const res = await f(
'https://api.seneschal.space/v1/premium/private-relay',
{ method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ raw_tx: rawTx }) }
);
const { tx_hash, accepted, public_mempool } = await res.json();
// public_mempool === false, always
Or from the shell
# sign locally with foundry's cast
RAW=$(cast mktx 0xTARGET "claim(bytes)" 0x… \
--private-key $KEY --rpc-url $RPC)
# validate (free)
curl "https://api.seneschal.space/v1/private-relay/inspect?raw_tx=$RAW"
# relay (needs an x402-capable client to satisfy the 402)
curl -X POST https://api.seneschal.space/v1/premium/private-relay \
-H 'content-type: application/json' \
-d "{\"raw_tx\":\"$RAW\"}"
MCP (agents): seneschal_private_relay — { "view": "inspect", "raw_tx": "0x…" } to preview for free; relay itself is the paid REST endpoint.
Who uses it & why
- Puzzle / CTF / bounty solvers — claim a frontrun_bait bounty without handing your solution to a mempool sniper. (This is the relay the puzzle-risk feed points to.)
- Anyone revoking approvals or rescuing funds — a wallet drainer watches the mempool for your rescue tx and races it; relay privately and it can't.
- Minters & first-touchers — guaranteed-private submission for time-sensitive, copyable transactions.
- Searchers without their own builder relationships — borrow ours: one POST, fanned out to multiple builders, pay-per-use, no infra.
We relay your transaction as signed — we do not simulate or endorse it. Inclusion is best-effort: a private tx only lands if one of the builders above wins the block. It is never broadcast publicly regardless.