- Feeds — subscribe to MoQT feed tracks with the raw MoQT client,
@clutchcall/sdk/moqt(MoqtClient). - Transactions — deliver a signed tx to the BDN over the HTTP/3 submit
API (
/bdn/submitand/tpu). Any HTTP/3 client can call it.
A typed
Crypto class that wraps both surfaces is a Preview — see
Preview: the typed Crypto surface at the
bottom. Do not build against it as a shipping API.Subscribe to feeds with the MoQT client
A feed is an ordinary MoQT frame track. Thus you subscribe with the sameMoqtClient that the rest of the platform uses. Import it from the moqt
subpath.
- TypeScript
- Python
connect returns immediately and dials in the background. The client
reconnects automatically with capped backoff. It replays every
subscription on reconnect. Thus a feed consumer survives a relay flap without
a new subscribe.
MoqtClient.connect
string
required
The feed relay, e.g.
quic://feeds.clutchcall.dev. The client discovers the
QUIC port from the host’s DNS HTTPS record.string
Bearer token for the feed scope. Private (
sol/feed/<orgId>/…) tracks
require it. The public mainnet feed can be open.(state, reason?) => void
Lifecycle callback.
ConnectionState is one of Connecting, Connected,
Reconnecting, Closed, Failed.MoqtConnectOptions
{ token?, serverCertificateHash?, webTransport? }. Pass
serverCertificateHash when you pin a self-signed dev cert.Promise<MoqtClient>. The promise resolves when the first session
is up.
client.subscribeFrame(ns, name, onFrame)
Subscribe to a feed track. The namespace and name together address the track
(sol/feed/mainnet + slots).
string
required
Track namespace, e.g.
sol/feed/mainnet (public) or sol/feed/<orgId>
(private).string
required
Track name within the namespace:
slots, blockhash, or priorityFee.(timestampUs: bigint, priority: number, data: Uint8Array) => void
required
The client calls this for every object that the relay fans out.
data is the
raw frame payload. Decode it as the feed’s JSON or binary schema.number
Optional MoQT filter. The default is “largest object” (live tail). Pass a
start/end window to replay from a point in the durable origin.
FrameSubscription. Call .close() to unsubscribe.
- TypeScript
- Python
Other MoqtClient members you’ll use here
publishFrame also exists on MoqtClient, but you do not publish feed
tracks. The BDN ingest publishes them. You set your ingest endpoint (public
RPC or your own gossip/Geyser) on the server side. You only subscribe.Deliver a transaction (HTTP/3 submit API)
There is no typed submit method yet. Deliver the signed tx over HTTP/3 with the raw bytes as the body. Both routes acceptapplication/octet-stream.
octet-stream body
Fan-out. Query
leader=auto (resolves the schedule) or
leader=<host>:<port>. The route ingests once, dedups on the 64-byte
signature, and fans across all edges. Each edge lands on its nearby leaders.
On success, it returns the signature.octet-stream body
Direct. Query
host=auto or host=<validator-host>&port=<quic-port>.
The route sends the tx straight to the current + next leader TPU from this
node. There is no fan-out.Submit query parameters
string (/bdn/submit)
default:"auto"
auto resolves the leader schedule. Pass <host>:<port> to pin a validator
TPU.string (/tpu)
default:"auto"
auto resolves the leader schedule. You can also pass an explicit validator
host. If you pass an explicit host, also pass port=<quic-port>.ALPN solana-tpu) with an ephemeral ed25519 client identity per connection.
Events & lifecycle
The feed surface is event-driven through the MoQT callbacks:Preview: the typed Crypto surface
A typedCrypto client would wrap feed subscription and tx delivery behind one
handle. You would not write subscribeFrame calls or fetch bodies by hand:

