Skip to content
Oclavex is in private preview, available to selected users. Public signup is blocked. Request access at [email protected].

Sets or replaces the offer's promotion: a plan for a limited time, optionally under a campaign. Nothing on the offer itself changes.

PUT
/api/v1/provision/admin/entitlements/offers/{offerId}/promotion
curl --request PUT \
--url https://example.com/api/v1/provision/admin/entitlements/offers/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/promotion \
--header 'Content-Type: application/json' \
--data '{ "planSetId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "planName": "example", "startsAt": "2026-04-15T12:00:00Z", "endsAt": "2026-04-15T12:00:00Z", "campaignId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "reason": "example" }'

While it runs, each new order from the offer gets it as a temporary plan override that ends on its end date, with a plan-override touch of its campaign. The entitlements already made from the offer get it from a push that sets includePromotion. An order that will start on a trial plan, an anonymous try, an entitlement a billing provider’s subscription makes and the platform’s own subscriptions do not get it. Refused for an archived offer, for a plan set that is not published or belongs to another suite, for the offer’s own plan, and for a reason the platform keeps for its own overrides.

offerId
required
string format: uuid

The offer.

The promotion’s plan, window, campaign and reason.

Sets or replaces an offer’s promotion.

object
planSetId
string format: uuid
planName
string
startsAt

When it starts; null starts it now. A promotion that starts later reaches orders from then on.

null | string format: date-time
endsAt

When it ends, on the offer and on every entitlement given it. Must be in the future.

string format: date-time
campaignId

The campaign it runs under, if any.

null | string format: uuid
reason

Recorded as the reason of each temporary override it becomes.

null | string
Examplegenerated
{
"planSetId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"planName": "example",
"startsAt": "2026-04-15T12:00:00Z",
"endsAt": "2026-04-15T12:00:00Z",
"campaignId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"reason": "example"
}

OK

An offer’s promotion: a plan it gives for a limited time, optionally under a campaign. While it runs, each new order from the offer gets it as a temporary plan override that ends on DateTimeOffset OfferPromotionDto.EndsAt, and a push that includes it gives it to the entitlements made from the offer.

object
planSetId
string format: uuid
planName
string
startsAt
string format: date-time
endsAt
string format: date-time
campaignId

The campaign it runs under; each entitlement given it counts as a plan-override touch of the campaign.

null | string format: uuid
reason

Recorded as the reason of each temporary override it becomes.

null | string

Bad Request

object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string

Not Found

object
type
null | string
title
null | string
status
null | integer | string format: int32
/^-?(?:0|[1-9]\d*)$/
detail
null | string
instance
null | string