Quickslot

The API

Three calls: read the fee, send the transaction, read the result. Quickslot accepts legacy, v0 and v1 transactions, and it only ever receives them signed.

Read the fee

curl "$QUICKSLOT_URL/v1/fees?accounts=$WRITABLE_ACCOUNTS"

accounts is optional: up to 128 base58 keys, comma separated. Pass the accounts your transaction writes to, because fees are set per account when those accounts are busy.

FieldMeaning
microLamportsPerUnitp50, p75 and p90 of recent prices: the higher of your accounts’ market and the network sample.
recommendedThe price to sign at. Currently p75.
blocksSampledRecent blocks behind the network sample.
slotLatest confirmed slot, or null if not known.

Legacy and v0 transactions set this price with a Compute Budget instruction. A v1 transaction states a total fee in lamports instead, so multiply the price by your compute unit limit and divide by 1,000,000.

Send a transaction

curl $QUICKSLOT_URL/v1/send \
  -H "Authorization: Bearer $QUICKSLOT_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "tx": "'$SIGNED_TX'",
    "maxFeeLamports": '$FEE_CAP',
    "deadlineSeconds": '$DEADLINE'
  }'
FieldMeaning
txA signed transaction, base64. Send this or ladder.
ladderUp to five signed versions of one transaction at different fees, base64.
maxFeeLamportsThe most the network may charge. Anything that could pay more is refused before sending.
deadlineSecondsHow long to keep trying, 1 to 120.
waitOptional. false answers 202 at once; read the result from /v1/deliveries/{id}.
skipSimulationOptional. true skips the check that the transaction would succeed as signed, for one that depends on another still in flight.

Sending the same transaction again on the same key returns the same delivery, so retrying a dropped request is safe.

Ladders

Every version must advance the same durable nonce, which is what stops two versions from both landing. Versions may differ only in their fee settings. Quickslot starts at the lowest version that meets recent prices, moves up as the deadline nears, and never moves back down. Each version has to fit under maxFeeLamports.

Read the result

/v1/send answers when the delivery ends. GET /v1/deliveries/{id} returns the same fields at any time, and GET /v1/deliveries lists recent ones.

FieldMeaning
statuspending, landed, failed (in a block, but failed there) or expired.
signatureThe signature that reached a block, or null.
signaturesEvery signature Quickslot may send for this delivery.
slotThe slot it reached, or null.
feePaidLamportsWhat the network charged, read from the chain. Null if the chain had not reported it yet.
serviceFeeLamportsQuickslot’s fee. Zero unless status is landed.
attemptsTimes it was sent across the routes.
landedInMsTime from accepting the request to seeing it confirmed.
mayStillLandtrue on an expired delivery whose transaction is still valid. Quickslot has stopped sending, but copies already sent can land. Check signatures before you send a replacement.
errorWhy it did not land, or null.

Landed means confirmed commitment. Wait for finalized yourself if your app needs it.

Refusals

A refused request is never sent and never charged. It answers { "error": { "code", "message" } }.

CodeMeaning
invalid_keyMissing or revoked API key.
invalid_transactionThe bytes are not a readable transaction.
invalid_signatureA required signature is missing or wrong.
over_fee_capThis transaction could pay more than maxFeeLamports.
simulation_failedIt would fail as signed. detail holds the error and logs.
ladder_needs_durable_nonceThe versions do not share one durable nonce.
ladder_mismatchThe versions differ in more than their fee, or two share a price.
too_many_in_flightThis key has too many deliveries running. Wait for one to end.
delivery_not_openDelivery routes are not connected yet.

Keys and usage

Create a key in the console or with POST /api/keys. It is shown once and stored only as a hash. GET /v1/usage returns your counts and fee totals.