Price the current cart, optionally locking the prices
const url = 'https://api-omni.linra.net/api/v1/scent/cart/checkout-preview?lock=false';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Optional per-customer cart selector (max 128 chars) — omit for the bare partner-level cart.
Set true to take a price lock (only when the preview reports canCheckout: true).
Responses
Section titled “Responses”The priced preview.
object
object
object
object
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
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.
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.
Derived from currentPrice vs compareAtPrice. Null exactly when compareAtPrice is null. Currency-free (a ratio) — no display-currency equivalent.
True only when every line is ok, the cart is non-empty, AND there is no pending order on this cart.
Populated only when lock=true was passed AND canCheckout was true.
Default TTL is 15 minutes.
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.
The envelope every /api/v1 ERROR response uses. state carries the machine-readable error code (see the Errors guide).
object
Always null on an error response.
object
object
Examples
{ "state": "CONFLICT_PRICE_LOCK_CREATE_RACE", "payload": null, "details": {}}Too many requests — see the Rate limits guide. Retry after the Retry-After header (seconds).
The envelope every /api/v1 ERROR response uses. state carries the machine-readable error code (see the Errors guide).
object
Always null on an error response.
object
object
Example
{ "state": "NOT_FOUND_ORDER", "payload": null}Headers
Section titled “Headers”Seconds to wait before retrying.