Order to confirmation

Timed from order submit to the order appearing on the venue's own account feed, not to an acknowledgement of receipt: confirmation is the point the order is live in the book and can be filled.

Order → Confirmation

Updated

3-day windowLower is better

Each mark = one measured order20× slow motion

Order-to-confirmation latency by endpoint: median and number of measured orders.
EndpointMedian latencyOrders measured
Bullet (direct)7.7ms mediann=4,283
Lighter10.2ms mediann=4,318
Nado14.4ms mediann=4,313
Pacifica18.6ms mediann=4,317
Bullet (via Cloudflare)33.9ms mediann=4,206
Aster101ms mediann=4,321
Hyperliquid445ms mediann=4,317

Tail latency

Median To p99 To p99.9 Slowest order 100 ms
Endpointp99Slowest
  1. Bullet (direct)34.2 ms83.8 msBullet (direct): median 7.7 ms, p99 34.2 ms, p99.9 83.0 ms, slowest 83.8 ms.
  2. Lighter75.8 ms1,045 msLighter: median 10.2 ms, p99 75.8 ms, p99.9 308 ms, slowest 1,045 ms.
  3. Nado3,624 ms8,925 msNado: median 14.4 ms, p99 3,624 ms, p99.9 6,021 ms, slowest 8,925 ms.
  4. Pacifica35.1 ms68.3 msPacifica: median 18.6 ms, p99 35.1 ms, p99.9 47.9 ms, slowest 68.3 ms.
  5. Bullet (via Cloudflare)274 ms1,199 msBullet (via Cloudflare): median 33.9 ms, p99 274 ms, p99.9 486 ms, slowest 1,199 ms.
  6. Aster150 ms315 msAster: median 101 ms, p99 150 ms, p99.9 254 ms, slowest 315 ms.
  7. Hyperliquid947 ms8,299 msHyperliquid: median 445 ms, p99 947 ms, p99.9 2,327 ms, slowest 8,299 ms.

Log scale. Lower is better.

Tail latency by endpoint: measured orders, median, 99th percentile, 99.9th percentile, slowest measured order, and the number of orders slower than 100, 250, 500 milliseconds.
EndpointOrdersp50p99p99.9SlowestOver 100 msOver 250 msOver 500 ms
Bullet (direct)4,2837.7 ms34.2 ms83.0 ms83.8 ms000
Lighter4,31810.2 ms75.8 ms308 ms1,045 ms2592
Nado4,31314.4 ms3,624 ms6,021 ms8,925 ms759514387
Pacifica4,31718.6 ms35.1 ms47.9 ms68.3 ms000
Bullet (via Cloudflare)4,20633.9 ms274 ms486 ms1,199 ms1,1801101
Aster4,321101 ms150 ms254 ms315 ms2,28270
Hyperliquid4,317445 ms947 ms2,327 ms8,299 ms4,3174,3171,153

Quoting means cancelling: every time the price moves, the order resting at the old one has to go. Cancels carry the same tail as orders, so one cancel in a hundred takes at least your p99 to land. Until it lands, your stale quote is still resting where the fastest taker on the other side can lift it. That is latency arbitrage, and it is paid out of your PnL.

The length of each exposure is set by p99, not p50. The frequency is set by your quote rate. Per $1M quoted, one basis point of adverse selection is $100. At 100 orders a second you settle that bill once a second.

Window
72 hours to 2026-10-22 21:22 UTC · 30,075 orders · 7 endpoints
Timed
One interval per order: submit to account-feed confirmation. The cancel that follows is not in it, and neither is signing. No network-floor subtraction, no speed-bump adjustment.
Harness
One m8gd.2xlarge in ap-northeast-1d. One client, one clock, identical for every endpoint.
Orders
One order per measurement, one measurement a minute per endpoint, submitted singly and cancelled once it confirms. Post-only, so it rests or is rejected and never trades. Batch submissions are excluded.
Transport
One WebSocket per endpoint, held open across measurements. No order opens a connection, so no figure here includes a TCP or TLS handshake. What is timed is the venue and the round trip.
Endpoints
Bullet (direct) hits our trading API load balancer with nothing in front of it. Bullet (via Cloudflare) is the same engine behind Cloudflare, which is there to absorb abuse and charges latency and a good deal of jitter for it, so market makers take the direct path.
Volleys
A display grouping on the track. Orders do not arrive synchronised across venues.
Cancels
Measured separately by the same collector and not shown here: a long order tail means a long cancel tail.
Prior art
Inspired by Check the Chain's benchmark. Ours is written from scratch in Rust, so no garbage collector can pause the harness in the middle of a measurement.