> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reorderjs.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Subscription Offers

> Resolve the effective subscription offer for a product or variant — used to power PDP frequency selectors, savings displays, and checkout validation.

Returns the effective subscription offer for a product, optionally scoped to a specific variant. Variant-level offers take precedence over product-level offers. Returns `is_subscription_available: false` when no active offer exists.

***

## GET /store/products/:id/subscription-offer

### Path parameters

<ParamField path="id" type="string" required>
  Product ID.
</ParamField>

### Query parameters

<ParamField query="variant_id" type="string">
  Optional variant ID. When provided, the response reflects the variant-level offer if one exists.
</ParamField>

### Response

<ResponseField name="subscription_offer" type="object" required>
  <Expandable title="offer fields">
    <ResponseField name="is_subscription_available" type="boolean">Whether a subscription offer is available for this product or variant.</ResponseField>
    <ResponseField name="product_id" type="string">Resolved product ID.</ResponseField>
    <ResponseField name="variant_id" type="string | null">Resolved variant ID, or `null` when the offer applies at product level.</ResponseField>
    <ResponseField name="source_offer_id" type="string">ID of the Plans & Offers record that sourced this offer.</ResponseField>
    <ResponseField name="source_scope" type="string">Scope of the source offer: `product` or `variant`.</ResponseField>
    <ResponseField name="allowed_frequencies" type="object[]">Cadences the customer can choose. Each item contains `frequency_interval`, `frequency_value`, `label`, and a `discount` object with `type` and `value`.</ResponseField>
    <ResponseField name="discount_semantics" type="object | null">Global discount presentation rules for the offer, or `null`.</ResponseField>
    <ResponseField name="minimum_cycles" type="number | null">Minimum number of billing cycles required, or `null`.</ResponseField>
    <ResponseField name="trial" type="object | null">Trial configuration with duration and terms, or `null` when no trial applies.</ResponseField>
  </Expandable>
</ResponseField>

```json Response example — offer available theme={null}
{
  "subscription_offer": {
    "is_subscription_available": true,
    "product_id": "prod_123",
    "variant_id": "variant_123",
    "source_offer_id": "offer_456",
    "source_scope": "variant",
    "allowed_frequencies": [
      {
        "frequency_interval": "month",
        "frequency_value": 1,
        "label": "Every month",
        "discount": {
          "type": "percentage",
          "value": 10
        }
      },
      {
        "frequency_interval": "month",
        "frequency_value": 2,
        "label": "Every 2 months",
        "discount": {
          "type": "percentage",
          "value": 5
        }
      }
    ],
    "discount_semantics": null,
    "minimum_cycles": null,
    "trial": null
  }
}
```

```json Response example — no offer theme={null}
{
  "subscription_offer": {
    "is_subscription_available": false,
    "product_id": "prod_789",
    "variant_id": null,
    "source_offer_id": null,
    "source_scope": null,
    "allowed_frequencies": [],
    "discount_semantics": null,
    "minimum_cycles": null,
    "trial": null
  }
}
```
