Skip to content

Price the current cart, optionally locking the prices

GET
/api/v1/scent/cart/checkout-preview
curl --request GET \
--url 'https://api-omni.linra.net/api/v1/scent/cart/checkout-preview?lock=false' \
--header 'Authorization: Bearer <token>'

ALWAYS call this before POST /api/v1/orders/scent — it validates every line’s pricing, availability, and margin floor, and reports a per-line issue code when something is wrong. Pass lock=true to freeze the CURRENTLY-VALID lines’ prices for lockExpiresAt - now (15 minutes by default); the returned lockId may then be passed as lockId on the order-create call. See the price-locks guide for the full mechanics.

customerRef
string
<= 128 characters

Optional per-customer cart selector (max 128 chars) — omit for the bare partner-level cart.

lock
boolean

Set true to take a price lock (only when the preview reports canCheckout: true).

The priced preview.

Media typeapplication/json
object
state
required
string
payload
required
details
object
payload
required
object
cartId
string format: uuid
partnerId
string format: uuid
customerRef
string
nullable
lines
Array<object>
object
variantId
string format: uuid
quantity
integer
ok
boolean
issue
string
nullable
Allowed values: UNAVAILABLE INSUFFICIENT_STOCK PRICE_BELOW_FLOOR NOT_PRICED
sku
string
nullable
listPrice
number
nullable
baseCurrency
string
nullable
lineGoodsVatAmount
number
nullable
lineTotalWithVat
number
nullable
availability
string
Allowed values: Available Limited Unavailable
availableQuantity
integer
nullable
lineCommission
number
nullable
lineCommissionVatAmount
number
nullable
lineNetAfterCommission
number
nullable
marketing

Additive, purely presentational marketing data — never affects what you pay or what settlement computes. Appears ONLY when your account has the marketing-block feature enabled (ask your account manager if you don’t see it); when it’s off, the marketing key is entirely absent from the response, not merely present with empty fields.

object
currentPrice

The catalog’s current resolved price for this variant — for display alongside compareAtPrice, not necessarily identical to the partner-specific price shown elsewhere in this response.

number format: decimal
compareAtPrice

A “was” price to show as a strike-through, populated ONLY when there is a genuine reason to show one (a real historical price drop, or an account-level override) — never a fake or stale discount. Null means show no strike-through at all.

number format: decimal
nullable
discountPercent

Derived from currentPrice vs compareAtPrice. Null exactly when compareAtPrice is null. Currency-free (a ratio) — no display-currency equivalent.

number format: decimal
nullable
badges
Array<string>
Allowed values: LIMITED BACK_IN_STOCK NEW_ARRIVAL BEST_SELLER SAMPLE_AVAILABLE
currentPriceDisplay
number
nullable
compareAtPriceDisplay
number
nullable
canCheckout

True only when every line is ok, the cart is non-empty, AND there is no pending order on this cart.

boolean
cartIssue
string
nullable
Allowed values: CART_HAS_PENDING_ORDER
pendingOrderReference
string
nullable
pricedAt
string format: date-time
lockId

Populated only when lock=true was passed AND canCheckout was true.

string format: uuid
nullable
lockExpiresAt

Default TTL is 15 minutes.

string format: date-time
nullable
chargedWithVat
number format: decimal
commissionWithVat
number format: decimal
netAfterCommission
number format: decimal
displayCurrency
string
nullable
rate
number
nullable
chargedWithVatDisplay
number
nullable
commissionWithVatDisplay
number
nullable
netAfterCommissionDisplay
number
nullable
Example
{
"state": "SUCCESS",
"payload": {
"lines": [
{
"issue": "UNAVAILABLE",
"availability": "Available",
"marketing": {
"badges": [
"LIMITED"
]
}
}
],
"cartIssue": "CART_HAS_PENDING_ORDER"
}
}

A concurrent lock request on the same cart exhausted its retry budget.

Media typeapplication/json

The envelope every /api/v1 ERROR response uses. state carries the machine-readable error code (see the Errors guide).

object
state
required
string
payload
required

Always null on an error response.

object
details
object
Examples
ExamplelockRace
{
"state": "CONFLICT_PRICE_LOCK_CREATE_RACE",
"payload": null,
"details": {}
}

Too many requests — see the Rate limits guide. Retry after the Retry-After header (seconds).

Media typeapplication/json

The envelope every /api/v1 ERROR response uses. state carries the machine-readable error code (see the Errors guide).

object
state
required
string
payload
required

Always null on an error response.

object
details
object
Example
{
"state": "NOT_FOUND_ORDER",
"payload": null
}
Retry-After
integer

Seconds to wait before retrying.