/hofund for clients that would rather not build JSON. They accept only sendTransaction, sendBatch, and getHealth; bundles, ideal pairs, and nonces are JSON-RPC only.
Query parameters
method is required exactly once: sendTransaction, sendBatch, or getHealth. A submission may add exactly one lane selector: swqos-only=true or mev-protect=true. getHealth takes neither. Nothing else is accepted: no duplicates, no unknown names, no URL-encoded names, no trailing ?.
/hofund/plain
content-type: text/plain.
/hofund/binary
content-type: application/octet-stream (may be omitted for sendTransaction).
Responses
Success is a compact object withoutjsonrpc or id:
"id": null and the same codes as JSON. X-Hofund-Submission-ID is returned on submissions.
WebSocket /hofund/ws and /hofund/ws/mev-protect
Open ws://<location-host>:4343/<bifrost-key>/hofund/ws (or …/hofund/ws/mev-protect) — the WebSocket form of the route URL shown on Endpoints → Hofund. GET upgrade with no query string, no body, and no subprotocol; the Bifrost key goes in the path or in Authorization: Bearer. /hofund/ws is the fast lane; /hofund/ws/mev-protect is the protected lane, delivered only as a Jito bundle. Neither falls back to the other.
- Every application message is one binary frame containing one raw, fully signed transaction, at most 1232 bytes. Text frames close the socket with
1003. - The same tip rules apply as on the JSON routes: a Thor tip on every transaction, plus a Jito tip on
/hofund/ws/mev-protect. - Nothing is sent back. There is no acknowledgement and no submission id. Reconcile each signature through ThorEdge RPC.
- Frames over your tier’s rate are dropped without notice — see Rate limits and pace your sends.
- The server pings every 25 s and closes on a missed pong after 30 s, or after 5 minutes without a data message.
- Per key: at most 10 concurrent connections and 16 in-flight admissions per connection. Over the limit, the handshake fails with
502{"error":"HOFUND WebSocket upstream is unavailable"}; close a connection and retry.
Handshake failures return
{"error":"…"} with 400 (query or body present, bad Origin, invalid upgrade), 405 (not GET), 503 (lane unavailable), or 502 (upstream unreachable).