Size Limits by Format
Transaction v1 is the message format introduced by SIMD-0385. Its main change for senders is size: a v1 transaction can be up to 4096 bytes, where legacy and v0 transactions stay at 1232.
Apex detects the format from the transaction bytes. There is no flag to set and no separate route.
Bundle members are limited to 1232 bytes each, whatever their format.
Serialize v1 with the Canonical Encoder
A v1 transaction must be serialized with the canonical encoder for the format. In Rust that iswincode. The older bincode and serde path produces the right bytes for legacy and v0, but the wrong bytes for v1, and the transaction will be rejected as malformed.
The Rust client exposes the correct encoder as apex_sender_client::serialize_transaction. It is byte-identical to bincode for legacy and v0, and correct for v1. ApexSenderClient::send_transaction uses it internally, so you only call it yourself when you need the bytes, for example for the HTTP routes.
In other languages, use a Solana library version that implements SIMD-0385 serialization. Check that the first byte of your serialized message is the v1 version prefix before you send.
The Tip Rule Is the Same
A v1 transaction needs the same tip: one top-level SystemProgram transfer to a published tip account, funded by a signer, at or above your tier’s floor. One difference is the compute budget. In a v1 message it lives in the message’s ownTransactionConfig, not in ComputeBudget program instructions. Every limit you leave unset in TransactionConfig is 0, including the loaded accounts data size. In our mainnet test on 2026-09-19, a v1 transaction that relied on ComputeBudget instructions landed and then failed on chain with MaxLoadedAccountsDataSizeExceeded.
So set all three: the compute unit limit, the loaded accounts data size limit, and, for priority, the fee. The priority fee is a total in lamports, not a price per compute unit. With that config, v1 transactions of 276, 741, and 1641 bytes landed on mainnet through Apex over QUIC. The 1641 byte one is above the legacy 1232 byte limit.
Rust Example
This program builds a v1 transaction with a 3,000 byte memo-style payload, which would not fit in a legacy transaction, and sends it over QUIC. It needssolana-message = "=4.4.1" in addition to the Quickstart dependencies.
Error::TooLarge before anything reaches the network.
Sending v1 over HTTP
Once you hold correctly serialized v1 bytes, the HTTP routes take them exactly as they take any transaction: base64 forsendTransaction and /send, raw bytes for /send-bin and /send-batch.