Skip to content

Get a variant by ID

GET
/api/v1/scent/catalog/variants/{id}
curl --request GET \
--url https://api-omni.linra.net/api/v1/scent/catalog/variants/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0 \
--header 'Authorization: Bearer <token>'
id
required
string format: uuid

The variant.

Media typeapplication/json
object
state
required
string
payload
required
details
object
payload
required

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
id
string format: uuid
scentId
string format: uuid
sku
string
sizeMl
integer
price
number format: decimal
rrp
number format: decimal
nullable
baseCurrency
string
isActive
boolean
createdDate
string format: date-time
lastModifiedDate
string format: date-time
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
Example
{
"state": "SUCCESS",
"payload": {
"baseCurrency": "SAR",
"marketing": {
"badges": [
"LIMITED"
]
}
}
}

Unknown variant.

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
ExamplenotFound
{
"state": "NOT_FOUND_VARIANT",
"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.