StreamBuilderFills - Stream Builder Fills
Subscribe to live Hyperliquid fills attributed to one builder, optionally scoped by coin, over the V3 gRPC API.
Hyperliquid RPC endpoint: endpoint URLs, plans and pricing.
StreamBuilderFills sends live fills whose nested builder.address equals the requested builder. Fills without builder attribution never match.
Request and live-only behavior
builder is a required 0x-prefixed address and matches case-insensitively. The zero address has no special meaning. Empty coins selects every coin; supplied coin names match exactly and unknown names simply never match.
The stream has no opening snapshot or backfill. A source block can still emit an empty fills list after filtering so that sequence remains contiguous.
package main
import (
"context"
"crypto/tls"
"log"
"os"
pb "example.com/hyperliquid-v3-client/gen/v3"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/metadata"
)
func main() {
endpoint, apiKey := os.Getenv("HYPERLIQUID_GRPC_ENDPOINT"), os.Getenv("DWELLIR_API_KEY")
if endpoint == "" || apiKey == "" {
log.Fatal("set HYPERLIQUID_GRPC_ENDPOINT and DWELLIR_API_KEY")
}
conn, err := grpc.NewClient(endpoint, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{MinVersion: tls.VersionTLS12})))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
ctx := metadata.AppendToOutgoingContext(context.Background(), "x-api-key", apiKey)
stream, err := pb.NewMarketStreamingClient(conn).StreamBuilderFills(ctx, &pb.BuilderFillsRequest{
Builder: "0x2222222222222222222222222222222222222222",
Coins: []string{"BTC", "ETH"},
})
if err != nil {
log.Fatal(err)
}
var last uint64
for {
update, err := stream.Recv()
if err != nil {
log.Fatal(err)
}
if update.GetSequence() != last+1 {
log.Fatalf("sequence gap: got=%d expected=%d", update.GetSequence(), last+1)
}
last = update.GetSequence()
log.Printf("block=%d sequence=%d fills=%d", update.GetBlockNumber(), update.GetSequence(), len(update.GetFills()))
}
}Sequencing and recovery
Require contiguous sequence values. A gap or ABORTED means live frames were lost; reconnect and use StreamFills or historical data for the missing interval. See the gRPC overview for shared errors.
Related references: StreamAllFills and StreamUserFills.
StreamUserFills - Stream User Fills
Subscribe to live Hyperliquid fills whose owning account matches one user, optionally scoped by coin, over V3 gRPC.
StreamLiquidationFills - Stream Liquidation Fills
Subscribe to live Hyperliquid liquidation fills and optionally filter by coin or liquidated account over V3 gRPC.