List variants
const url = 'https://api-omni.linra.net/api/v1/scent/catalog/variants?page=1&pageSize=20';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/catalog/variants?page=1&pageSize=20' \ --header 'Authorization: Bearer <token>'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”Only return rows changed strictly after this UTC instant. See the Catalog delta sync guide.
Responses
Section titled “Responses”A page of variants. Internal stocking-policy fields (safetyStockBuffer,
effectiveSafetyStockBuffer, lowStockDisplayThreshold) are never populated on this
facade even though the underlying schema is shared with the internal dashboard.
object
object
object
The underlying DTO also carries internal-only stocking-policy fields
(safetyStockBuffer/effectiveSafetyStockBuffer/lowStockDisplayThreshold) and a dormant
account-level override field (partnerCompareAtPrice) for the internal dashboard — they are
always forced to null before this response ever reaches a partner caller, and are omitted
from this schema entirely since a partner integration should never rely on them being present.
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.
object
Example
{ "state": "SUCCESS", "payload": { "items": [ { "baseCurrency": "SAR", "marketing": { "badges": [ "LIMITED" ] } } ] }}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.