Supercommerce API Docs
Store API

Discount Module — Storefront

Storefront surface for the discount plugin — the coupons a product page can advertise. Coupon apply/remove and the cart's browsable coupon list live on the cart routes.

Storefront surface for the discount plugin — the coupons a product page can advertise. Coupon apply/remove and the cart's browsable coupon list live on the cart routes, not here.

Source: api-modules/discount/src/controllers/store-discount.controller.ts.

The discount module is optional. Removing DiscountModule.forRoot() from the API's app.module.ts removes this route from OpenAPI along with the admin surface, and collapses DISCOUNT_PORT so the cart stops evaluating coupons entirely.


Conventions

AuthOptional. A customer session narrows the result to coupons that customer can still use.
x-platform headerWEB or APP; anything else reads as WEB. Platform-scoped coupons are filtered against it.
MoneyInteger subunits (paise).

GET /store/discounts/applicable — Coupons advertisable on a product

Returns the showOnCart coupons that could apply to one product, for the PDP's "offers on this item" block.

Query

ParamTypeNotes
productIdstringRequired.
platformWEB | APP | BOTHOptional; overrides the x-platform header.

Response 200 — an array of coupon cards, the same shape GET /store/cart/coupons/eligible returns, so one component renders both surfaces.

{
  "data": [
    {
      "discountId": "01J9...",
      "code": "FESTIVE25",
      "name": "Q4 Festive",
      "discountType": "FIXED",
      "value": 25000,
      "freeShipping": false,
      "individualUse": false,
      "requireCustomerLogin": false,
      "platform": "BOTH",
      "criteriaScope": "CART_SUBTOTAL",
      "minAmount": 150000,
      "maxAmount": null,
      "minQuantity": null,
      "minProductCount": null,
      "startsAt": null,
      "endsAt": "2026-09-30T00:00:00.000Z"
    }
  ]
}

Errors

StatusCodeWhen
404NOT_FOUNDProduct does not exist or is soft-deleted

What is and is not decided here

A product page has no cart, so this endpoint answers "could this coupon ever apply to this item", not "will it apply right now". It applies everything knowable up front and returns the rest as conditions on the card:

  • Applied — lifecycle (active, not archived/deleted, inside startsAt/endsAt), platform, the include/exclude filters across variant, category, brand, tag, ingredient and vendor, sale-item exclusions (excludeSaleItems / excludeSaleItemsOverPercent), exhausted totalUsageLimit, exhausted usageLimitPerCustomer for a signed-in customer, and customerScope. A coupon that fails any of these is never advertised.
  • Returned as conditions, not verdictsminAmount, maxAmount, minQuantity and minProductCount. These measure against a cart total that does not exist yet, so render them as "on orders above ₹1,500" rather than filtering on them.

A coupon matches if any one of the product's variants passes the filters — a coupon scoped to a single SKU still advertises on that SKU's product page.

Ordering — easiest threshold first (minAmount ascending, ties broken on code), so the first tile is the one the shopper is most likely to qualify for. The order is stable across requests.

requireCustomerLogin coupons are returned to anonymous callers, carrying the flag — the PDP can render them behind a "sign in to use" affordance rather than hiding an offer that would convert.


Admin & cart surfaces

On this page