Skip to main content

Quotes

getOrderQuote prices a prospective submission without creating anything: what would this order cost (or return) all-in, right now, against current liquidity?

Quote first, then submit. The quote walks the same book the matcher crosses, so the number you show a user is the number the book honors at that instant. It is advisory, not a reservation — the book can move between quote and submission, and settlement re-validates under lock.

Name the instrument with assetConfigurationId or externalIdentifiers. A quote prices one instrument, so external ids must resolve to a single configuration: AMBIGUOUS_EXTERNAL_IDENTIFIERS if they disagree, EXTERNAL_IDENTIFIER_CONFLICT if they contradict an explicit assetConfigurationId, MISSING_ASSET_CONFIGURATION if you pass neither. The key works the same way: keyId or keyScope resolving to exactly one key (AMBIGUOUS_KEY_SCOPE, MISSING_KEY, MUTUALLY_EXCLUSIVE_KEY_TARGETING when both are passed).

Quotes are open to anonymous callers. An unauthenticated quote skips the account-scoped access and inventory gates and prices fees at platform defaults, so the number can differ from what the same account sees once signed in. featuredOrders and verificationRequirements are always empty on an anonymous quote. Submitting still requires auth.

Request

query {
getOrderQuote(input: {
assetConfigurationId: "315bc6db-3f16-49ec-b649-8be3b8753fb7"
keyId: "4a9a2cca-c05f-5474-9979-428dc6f41107"
side: BUY
quantity: 2
}) {
quote {
side
requestedQuantity
fillableQuantity
subtotalCents
fees { feeType source basisPoints amountCents }
feeTotalCents
totalCents
effectiveUnitPriceCents
worstPriceCents
worstAllInPriceCents
levels { priceCents quantity allInPriceCents }
marketId
}
error { message }
}
}

GetOrderQuoteInput

FieldTypeDescription
assetConfigurationIdUUIDThe product to quote. One of this or externalIdentifiers is required
externalIdentifiersJSONPlatform ids naming the same single configuration, e.g. {"TCGPLAYER": "123"}
keyIdUUIDThe graded/condition key — together with the configuration this identifies one book. One of this or keyScope is required
keyScopeJSONKey vocabulary resolving to exactly one key. Mutually exclusive with keyId
sideOrderSubmissionDirection!BUY quotes against resting asks; SELL quotes against resting bids
quantityInt!Units to price
allInPriceIntFee-inclusive limit, same semantics as createOrderSubmission.allInPrice. Omit for a market-order quote
timeInForceOrderSubmissionTimeInForcePass what the submission will carry. A FOK fills from a single counterparty, and the quote applies the same rule
minOrderSizeIntSame — a minOrderSize order fills from a single counterparty
marketIdUUIDPin the quote to one market's book and fee structure. Omitted, the quote walks the unvaulted marketplace book
enqueueShippingQuoteBooleanAttach a marketplace shipping preview — see Shipping preview
originAddressIdUUIDSELL shipping preview: your declared ship-from. Omitted on a physical sell, the decision is definitively not free and nothing is enqueued
recipientAddressIdUUIDBUY shipping preview: destination override, resolved through the same chain the transfers use
shouldVaultBooleanBUY shipping preview: quote shipping to your routed vault instead of a home address, matching a shouldVault submission
serviceLevelIdUUIDDeprecated and ignored. Priority pricing is quoted per bid under featuredOrders

Response

A BUY for two units against a book with two units asked at 1000¢, on a market charging a 250 bps buyer fee:

{
"quote": {
"side": "BUY",
"requestedQuantity": 2,
"fillableQuantity": 2,
"subtotalCents": 2000,
"fees": [
{ "feeType": "MARKET_BUYER", "source": "MARKET_CONFIG", "basisPoints": 250, "amountCents": 50 }
],
"feeTotalCents": 50,
"totalCents": 2050,
"effectiveUnitPriceCents": 1025,
"worstPriceCents": 1000,
"worstAllInPriceCents": 1025,
"levels": [
{ "priceCents": 1000, "quantity": 2, "allInPriceCents": 1025 }
],
"marketId": "2406c582-64f0-4192-a7f2-f2cb70e5d652"
}
}

OrderQuote

FieldTypeDescription
sideOrderSubmissionDirection!Echo of the requested side
requestedQuantityInt!What you asked to price
fillableQuantityInt!What the book can actually fill right now
allInPriceCentsIntEcho of your limit; null on a market-order quote
subtotalCentsInt!Base cost (BUY) or base value (SELL) of the crossed levels, before fees
fees[QuoteFeeLine!]!Resolved fee lines — see below
feeTotalCentsInt!Sum of the fee lines
totalCentsInt!BUY: subtotal + fees, what you pay. SELL: subtotal − fees, your net proceeds
effectiveUnitPriceCentsInttotalCents / fillableQuantity; null when nothing is fillable
worstPriceCentsIntDeepest base price the fill touches — the slippage bound
worstAllInPriceCentsIntFee-adjusted worst touch — the allInPrice a LIMIT submission needs to cross every quoted level
levels[QuoteLevel!]!The price levels the fill walks, each with its fee-adjusted per-unit price
marketIdUUIDThe market whose fee structure priced this quote
shippingQuoteShippingDecisionPresent only when enqueueShippingQuote was set — see Shipping preview
featuredOrders[FeaturedOrder!]!SELL only: priority bids you could take instead of the standard fill — see Priority bids
verificationRequirements[TradeVerificationRequirement!]!What your account must add before this submission clears the venue's verification rules — see Verification requirements

Fees

Fees are resolved per fee type at quote time. source tells you where each rate came from — precedence is FEE_RULE (a scoped override), then MARKET_CONFIG (the venue's fee model), then BUYER_LAYER (your account's buyer configuration). There is no platform default: a fee that resolves nowhere is an error, not a zero. The same FeeSource provenance is stamped on settlement, so the quote and the fill agree on where a rate came from.

Per-unit fee adjustment runs in opposite directions by side: a BUY's allInPriceCents is the base price grossed up for fees (you pay 1025¢ on a 1000¢ ask at 250 bps), a SELL's is netted down (a bid whose buyer pays 1557¢ all-in nets the seller 1372¢). Sellers quote and receive net; buyers quote and pay gross.

Partial liquidity

fillableQuantity is the honest answer, and it can be less than you asked for. Requesting three units when one is biddable:

{
"quote": {
"side": "SELL",
"requestedQuantity": 3,
"fillableQuantity": 1,
"subtotalCents": 1372,
"feeTotalCents": 0,
"totalCents": 1372,
"levels": [
{ "priceCents": 1372, "quantity": 1, "allInPriceCents": 1372 }
]
}
}

All money fields cover only the fillable portion — never scale them up to the requested quantity.

With an allInPrice limit, levels beyond your limit are excluded entirely. If nothing on the book satisfies it, the quote comes back with fillableQuantity: 0, zeroed totals, empty levels, and null unit/worst prices — not an error. The same shape comes back when the only liquidity is your own: a quote never counts your resting orders as fillable, because you are never matched against yourself. A null quote with a populated error only occurs when the request itself is invalid.

Staleness

A quote is a point-in-time read of the book, not a hold on liquidity. Resting orders can fill, cancel, or reprice between your quote and your submission. To bound that risk on a market order, use the quote's worstAllInPriceCents as the allInPrice on a LIMIT submission — it crosses every level you were quoted and nothing worse.

Shipping preview

Set enqueueShippingQuote: true and the quote enqueues marketplace shipping quotes for the expected crosses and attaches a shipping decision. Lanes quote asynchronously, so freeShipping is tri-state: null while any lane is still quoting, then true/false once every lane resolved. Poll the quote until it settles.

The two sides read it differently:

  • SELL — the seller's free-shipping preview. Pass originAddressId so the decision is computed for your real ship-from; omitted on a physical sell, the decision is definitively not free and nothing is enqueued. If the quote says free, pass expectingFreeShipping: true on the submission and the execution re-validates it.
  • BUY (taker pays shipping) — the per-shipment breakdown you acknowledge on the submission. Pass recipientAddressId or shouldVault so the quote prices the destination the fill will ship to. The quote echoes the resolved destination back as shipping.recipientAddressId; pin that as recipientAddressId on the submission.

QuoteShippingDecision

FieldTypeDescription
freeShippingBooleanTri-state. null while lanes are still quoting
estimatedShippingCostCentsIntSELL: sum of the cheapest option per destination. BUY: sum of the buyer-paid shipments
thresholdCentsIntSELL: the fee budget the cost was compared against
originAddressIdUUIDThe declared ship-from the decision was computed for; null when none was declared
expectedShipments[QuoteExpectedShipment!]!BUY only: one row per (seller, declared origin) among the crossable asks
recipientAddressIdUUIDBUY only: the resolved destination — pin it on the submission

QuoteExpectedShipment

FieldTypeDescription
quantityInt!Units in this shipment
freeShippingBooleanTri-state per shipment
estimatedCostCentsIntWhat you would be charged for it; zero when free

Derive maxShippingAndHandlingCostsCents on a BUY submission from exactly these rows — one ceiling per buyer-paid shipment. See taker-pays shipping.

Priority bids

On a SELL quote for an authenticated account, featuredOrders lists priority bids you could take right now instead of — never alongside — the standard fill above. Each entry is one bid, taken whole via createOrderSubmission.priorityBidId, with free shipping and a ship-by commitment under the bid's service level. Bids you cannot take (short inventory, the buyer's layer or exposure, your local ship cutoff already passed) are not listed. Empty on BUY quotes and on anonymous quotes.

FeaturedOrder

FieldTypeDescription
conditionalBidIdUUID!The bid — pass it as priorityBidId
buyOrderSubmissionIdUUID!The buyer's submission behind it
assetConfigurationIdUUID!Restate on the take as assetConfigurationIds: [this]
keyIdUUID!Restate as keyIds: [this] (or a key graded under it)
marketIdUUID!Restate as marketIds: [this]
serviceLevelIdUUID!Restate as serviceLevelId
serviceLevelNameString!Display label for the tier
priceCentsInt!The bid's resting base price per unit
buyerAllInPriceCentsIntWhat the buyer pays per unit, fees in
quantityInt!What you would sell into it for the quoted quantity — at least minQuantity, at most availableQuantity
availableQuantityIntUnits the bid still has open
minQuantityIntSmallest take the bid accepts
sellerFeeCentsInt!Your fee on the take
sellerNetCentsInt!Your proceeds after fee
inHandAtDateTimeThe buyer's in-hand commitment; null for ship-by-window levels
shipByAtDateTimeYour local 5pm cutoff on the ship date, resolved from originAddressId
expiresAtDateTimeWhen the bid leaves the book
freeShippingBoolean!Always true for a priority take

To take one, submit a SELL with priorityBidId and state assetConfigurationIds, keyIds, marketIds, and serviceLevelId exactly as shown — the server checks each against the bid and fills none in. See Taking a priority bid.

Verification requirements

verificationRequirements is what your account must add before submitting this order clears the venue's verification rules, in the order to resolve them. Empty when the submission would clear as it stands. The quote never withholds a price for these — it prices first and tells you what stands between you and submitting.

ValueMeaning
IDENTITYIdentity verification is required at this order size on this venue
PAYOUT_METHODA payout method must be on file
BANK_ACCOUNTSpecifically a bank account, not just any payout method