Create a discount code
const url = 'https://api-omni.linra.net/api/v1/scent/discount-codes';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"code":"example","discountType":"Percent","value":1,"validFrom":"2026-04-15T12:00:00Z","validTo":"2026-04-15T12:00:00Z","totalUsageCap":1,"perCustomerCap":1,"productScope":"All","scopedVariantIds":["2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"],"minOrderValue":1}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api-omni.linra.net/api/v1/scent/discount-codes \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "code": "example", "discountType": "Percent", "value": 1, "validFrom": "2026-04-15T12:00:00Z", "validTo": "2026-04-15T12:00:00Z", "totalUsageCap": 1, "perCustomerCap": 1, "productScope": "All", "scopedVariantIds": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "minOrderValue": 1 }'The code string is IMMUTABLE once created — there is no rename operation. To retire a
typo’d or campaign-ended code, deactivate it (PATCH .../{id} with isActive: false) and
create a new one instead.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
The code string your end customer enters. Immutable once created.
A percentage (0,100] off, or a flat SAR amount off.
Percentage (0,100] for Percent, or a flat SAR amount for FixedAmount.
Null means open-ended (no start restriction).
Null means the code never expires.
Null means unlimited total redemptions.
Null means no per-customer limit. The only other accepted value is 1 (at most one redemption per customer, ever) — any other positive value is rejected.
Applies to your whole catalog, or to an explicit variant list (see scopedVariantIds).
Required (non-empty) when productScope is VariantList; omit otherwise. Every id must be one of your existing, active variants.
Null means no minimum.
Responses
Section titled “Responses”The created code.
object
object
object
A percentage (0,100] off, or a flat SAR amount off.
Applies to your whole catalog, or to an explicit variant list (see scopedVariantIds).
Running total of successful redemptions.
Example
{ "state": "SUCCESS", "payload": { "discountType": "Percent", "productScope": "All" }}Request validation failed.
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}A code with this string (case-insensitive) already exists for your account.
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_DISCOUNT_CODE_DUPLICATE", "payload": null, "details": { "code": "SAVE10" }}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.