Real-time orderbook and ticker data from 9+ major exchanges, normalized to a single contract and streamed via ZMQ. Catch cross-exchange and triangular arbitrage opportunities before everyone else. Built on Zig — no garbage collector, no jitter, no compromises.
zmq-sub tcp://free_api.arbstream.net:6001
Simulated feed · forward latency <1ms
Two purpose-built ZMQ streams: orderbook depth on port 6001, ticker data on port 6002. No managing individual WebSocket feeds — subscribe to what you need, nothing more.
All exchange data normalized to a single, consistent JSON schema. No more translating between API quirks — Binance, OKX, Kraken all speak the same language.
Full depth market data aggregated in real-time across all connected exchanges. Detect cross-exchange and triangular arbitrage — BTC→ETH→USDT and back — the moment a spread opens, not after it's gone.
The data pipeline runs on Zig — no garbage collector means no GC pauses, no jitter. Deterministic latency that garbage-collected runtimes simply cannot match.
Start free with 2 exchanges — no credit card, no setup time. Upgrade to full access for all major exchanges at a flat monthly rate.
Point a ZMQ SUB socket at our endpoint. Works with any language that supports ZeroMQ — Python, Go, Zig, Rust, Node, C++.
Receive normalized, real-time data and act on arbitrage opportunities the moment they appear. No lag, no inconsistencies.
Two dedicated ZMQ streams. Orderbook data on port 6001, ticker data on port 6002. Works with any language.
const zmq = require("zeromq"); const sock = new zmq.Dealer(); sock.routingId = "my-client:DLEflKfiKZdZxGKa"; // unique-id:token — change "my-client" to anything unique async function run() { sock.connect("tcp://free_api.arbstream.net:6001"); // orderbook stream await sock.send(""); // register with the server for await (const [msg] of sock) { try { console.log(JSON.parse(msg.toString())); } catch (err) { console.log("failed parsing json: ", err); process.exit(1); } } } run();
import zmq ctx = zmq.Context() sock = ctx.socket(zmq.DEALER) sock.setsockopt(zmq.ROUTING_ID, b"my-client:DLEflKfiKZdZxGKa") # unique-id:token — change "my-client" to anything unique sock.connect("tcp://free_api.arbstream.net:6001") # orderbook stream; ticker on 6002 sock.send(b"") # register with the server while True: print(sock.recv_string())
// brew install zeromq czmq libsodium pkg-config // go get gopkg.in/zeromq/goczmq.v4 package main import ( "fmt" "log" "github.com/zeromq/goczmq" ) func main() { dealer := goczmq.NewSock(goczmq.Dealer) defer dealer.Destroy() dealer.SetIdentity("my-client:DLEflKfiKZdZxGKa") // unique-id:token — change "my-client" to anything unique // orderbook stream; ticker stream available on port 6002 if err := dealer.Connect("tcp://free_api.arbstream.net:6001"); err != nil { log.Fatal(err) } dealer.SendFrame([]byte{}, goczmq.FlagNone) // register with the server for { msg, _, err := dealer.RecvFrame() if err != nil { log.Fatal(err) } fmt.Println(string(msg)) } }
// build.zig.zon: zig fetch --save git+https://github.com/uyha/zimq.git const std = @import("std"); const zimq = @import("zimq"); pub fn main() !void { var ctx = try zimq.Context.init(); defer ctx.deinit(); // create DEALER socket var dealer = try zimq.Socket.init(ctx, .dealer); defer dealer.deinit(); // set routing ID before connecting try dealer.set(.routing_id, "my-client:DLEflKfiKZdZxGKa"); // unique-id:token — change "my-client" to anything unique // orderbook stream; ticker stream available on port 6002 try dealer.connect("tcp://free_api.arbstream.net:6001"); try dealer.sendSlice("", .{}); // register with the server while (true) { var msg = zimq.Message.empty(); defer msg.deinit(); _ = try dealer.recvMsg(&msg, .{}); std.log.info("{s}\n", .{msg.slice()}); } }
{
"src": "kucoin",
"type": "orderbook",
"pair": "ETH:USDT",
"ts": 1771228848200,
"bids": [["3421.5","1.234"], ...],
"asks": [["3421.6","2.567"], ...]
}
{
"src": "kucoin",
"type": "ticker",
"pair": "ETH:USDT",
"ts": 1771228848200,
"lastPrice": 3421.5,
"highPrice24h": 3550.2,
"lowPrice24h": 3398.1,
"price24hPcnt": 0.015,
"volume24h": 45821.34
}
All data normalized to a consistent JSON schema across all exchanges.
Start free. Upgrade when you need the full picture.
Locked in forever at early bird pricing
Sign up to join the waitlist. Early adopters receive special pricing locked in forever and priority support.