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
| Field | Type | Description |
|---|---|---|
assetConfigurationId | UUID | The product to quote. One of this or externalIdentifiers is required |
externalIdentifiers | JSON | Platform ids naming the same single configuration, e.g. {"TCGPLAYER": "123"} |
keyId | UUID | The graded/condition key — together with the configuration this identifies one book. One of this or keyScope is required |
keyScope | JSON | Key vocabulary resolving to exactly one key. Mutually exclusive with keyId |
side | OrderSubmissionDirection! | BUY quotes against resting asks; SELL quotes against resting bids |
quantity | Int! | Units to price |
allInPrice | Int | Fee-inclusive limit, same semantics as createOrderSubmission.allInPrice. Omit for a market-order quote |
timeInForce | OrderSubmissionTimeInForce | Pass what the submission will carry. A FOK fills from a single counterparty, and the quote applies the same rule |
minOrderSize | Int | Same — a minOrderSize order fills from a single counterparty |
marketId | UUID | Pin the quote to one market's book and fee structure. Omitted, the quote walks the unvaulted marketplace book |
enqueueShippingQuote | Boolean | Attach a marketplace shipping preview — see Shipping preview |
originAddressId | UUID | SELL shipping preview: your declared ship-from. Omitted on a physical sell, the decision is definitively not free and nothing is enqueued |
recipientAddressId | UUID | BUY shipping preview: destination override, resolved through the same chain the transfers use |
shouldVault | Boolean | BUY shipping preview: quote shipping to your routed vault instead of a home address, matching a shouldVault submission |
serviceLevelId | UUID | Deprecated 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
| Field | Type | Description |
|---|---|---|
side | OrderSubmissionDirection! | Echo of the requested side |
requestedQuantity | Int! | What you asked to price |
fillableQuantity | Int! | What the book can actually fill right now |
allInPriceCents | Int | Echo of your limit; null on a market-order quote |
subtotalCents | Int! | Base cost (BUY) or base value (SELL) of the crossed levels, before fees |
fees | [QuoteFeeLine!]! | Resolved fee lines — see below |
feeTotalCents | Int! | Sum of the fee lines |
totalCents | Int! | BUY: subtotal + fees, what you pay. SELL: subtotal − fees, your net proceeds |
effectiveUnitPriceCents | Int | totalCents / fillableQuantity; null when nothing is fillable |
worstPriceCents | Int | Deepest base price the fill touches — the slippage bound |
worstAllInPriceCents | Int | Fee-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 |
marketId | UUID | The market whose fee structure priced this quote |
shipping | QuoteShippingDecision | Present 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. PassoriginAddressIdso 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, passexpectingFreeShipping: trueon the submission and the execution re-validates it.BUY(taker pays shipping) — the per-shipment breakdown you acknowledge on the submission. PassrecipientAddressIdorshouldVaultso the quote prices the destination the fill will ship to. The quote echoes the resolved destination back asshipping.recipientAddressId; pin that asrecipientAddressIdon the submission.
QuoteShippingDecision
| Field | Type | Description |
|---|---|---|
freeShipping | Boolean | Tri-state. null while lanes are still quoting |
estimatedShippingCostCents | Int | SELL: sum of the cheapest option per destination. BUY: sum of the buyer-paid shipments |
thresholdCents | Int | SELL: the fee budget the cost was compared against |
originAddressId | UUID | The 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 |
recipientAddressId | UUID | BUY only: the resolved destination — pin it on the submission |
QuoteExpectedShipment
| Field | Type | Description |
|---|---|---|
quantity | Int! | Units in this shipment |
freeShipping | Boolean | Tri-state per shipment |
estimatedCostCents | Int | What 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
| Field | Type | Description |
|---|---|---|
conditionalBidId | UUID! | The bid — pass it as priorityBidId |
buyOrderSubmissionId | UUID! | The buyer's submission behind it |
assetConfigurationId | UUID! | Restate on the take as assetConfigurationIds: [this] |
keyId | UUID! | Restate as keyIds: [this] (or a key graded under it) |
marketId | UUID! | Restate as marketIds: [this] |
serviceLevelId | UUID! | Restate as serviceLevelId |
serviceLevelName | String! | Display label for the tier |
priceCents | Int! | The bid's resting base price per unit |
buyerAllInPriceCents | Int | What the buyer pays per unit, fees in |
quantity | Int! | What you would sell into it for the quoted quantity — at least minQuantity, at most availableQuantity |
availableQuantity | Int | Units the bid still has open |
minQuantity | Int | Smallest take the bid accepts |
sellerFeeCents | Int! | Your fee on the take |
sellerNetCents | Int! | Your proceeds after fee |
inHandAt | DateTime | The buyer's in-hand commitment; null for ship-by-window levels |
shipByAt | DateTime | Your local 5pm cutoff on the ship date, resolved from originAddressId |
expiresAt | DateTime | When the bid leaves the book |
freeShipping | Boolean! | 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.
| Value | Meaning |
|---|---|
IDENTITY | Identity verification is required at this order size on this venue |
PAYOUT_METHOD | A payout method must be on file |
BANK_ACCOUNT | Specifically a bank account, not just any payout method |