All routes require an authenticated Medusa Admin user. Unauthenticated requests return
401.Domain values
GET /admin/subscription-offers
Returns the paginated plan offer list for Admin DataTable views.Query parameters
number
Number of results per page.
number
Zero-based result offset for pagination.
string
Free-text search across name and product/variant titles.
string
Field to sort by. Database-backed:
name, scope, is_enabled, created_at, updated_at. In-memory: status, product_title, variant_title.string
Sort direction. One of
asc or desc.boolean
Filter by enabled/disabled state.
string
Filter by target scope. One of
product or variant.string
Filter by product ID.
string
Filter by variant ID.
string
Filter by frequency interval. One of
week, month, or year.number
Minimum discount value filter.
number
Maximum discount value filter.
Response
object[]
required
Array of plan offer list items.
number
required
Total matching records.
number
required
Page size used.
number
required
Result offset used.
Response example
Errors
GET /admin/subscription-offers/:id
Returns the full detail payload for a single plan offer.Path parameters
string
required
Plan offer ID.
Response
Returns aplan_offer object with all list fields plus:
object
required
Response example
Errors
POST /admin/subscription-offers
Creates a new plan offer, or updates an existing one for the same target (create-or-upsert semantics).Body parameters
string
required
Offer name. Trimmed.
string
required
Target scope. One of
product or variant.string
required
Target product ID.
string
Target variant ID. Required for
variant-scoped offers; must be omitted or null for product-scoped offers.boolean
required
Whether the offer is active.
object[]
required
Array of allowed cadences. Each entry requires
interval (week, month, or year) and a positive integer value. Must contain at least one entry.object[]
Per-frequency discount definitions. Each entry requires
interval, frequency_value, type (percentage or fixed), and value. Optional.object
Rules object with
minimum_cycles, trial_enabled, trial_days, and stacking_policy. Optional.object
Arbitrary metadata. Optional.
Request example
Errors
POST /admin/subscription-offers/:id
Updates an existing plan offer source record. At least one field must be provided.Path parameters
string
required
Plan offer ID.
Body parameters
All fields are optional; omit any field you do not want to change.string
Updated offer name.
boolean
Updated enabled state.
object[]
Replacement list of allowed cadences.
object[]
Replacement list of per-frequency discounts.
object
Updated rules object.
object
Updated metadata.
Request example
Errors
POST /admin/subscription-offers/:id/toggle
Enables or disables a plan offer without modifying any other fields.Path parameters
string
required
Plan offer ID.
Body parameters
boolean
required
Target enabled state.
Request example