Partially update an in-store offer promotion. Omitted keys preserve existing values; metadata follows Stripe semantics (empty string deletes a key, null clears all). offer_id is not updatable — delete and recreate to move a promotion. Returns 404 when the promotion does not exist or the caller lacks MANAGE_OFFERS on the parent offer’s owning organization.
Documentation Index
Fetch the complete documentation index at: https://docs.closient.com/llms.txt
Use this file to discover all available pages before exploring further.
UUID of the in-store promotion to update.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Partial update payload for an in-store offer promotion.
Every field is optional. Omitted keys preserve existing values (PATCH semantics
on a PUT endpoint, kept for backward compatibility). offer_id is not updatable
— delete and recreate to move a promotion to a different offer.
Developer-attached key/value data. Send {} or null to clear. Empty-string values delete that key. Omitted keys are preserved.
Time-windowed override for the offer's regular price in the parent store's currency. Must be non-negative. When multiple promotions overlap on the same offer the cheapest active one wins; $0 is allowed and intentional for free-with-purchase BOGO arms (it is not a sentinel for 'unknown').
x >= 0Timestamp at which this promotion becomes effective (inclusive). Must be strictly before end_date — the database enforces end_date > start_date.
Timestamp at which this promotion stops being effective (inclusive). A daily Celery beat task flips is_active to false once this passes; the row is kept for historical pricing rather than deleted.
Merchandising context — display-only, does not change resolution semantics. Use SEASONAL for time-of-year promotions (Black Friday, holiday), CLEARANCE for end-of-life inventory, BOGO for buy-one-get-one arms (often at promotional_price=0), BUNDLE for discounts that apply when buying with another product, INTRODUCTORY for launch pricing, LOYALTY for member-only prices, and SALE (the default) for everything else.
SALE, CLEARANCE, BOGO, BUNDLE, SEASONAL, INTRODUCTORY, LOYALTY Optional human-readable label shown alongside the promoted price (e.g. 'Black Friday weekend', 'Member appreciation week'). Free-form, up to 255 characters. Empty string when no label is needed.
255Soft-deactivate flag. true means the promotion is eligible for cheapest-active resolution within its date window; false excludes it (the daily beat task auto-flips this to false once end_date passes). Use the update endpoint to set this to false rather than deleting if you want to preserve the historical pricing row.
OK
A time-windowed promotional price on an :class:InStoreOffer.
Mirrors :class:apps.retailers.models.InStoreOfferPromotion. Currency
is read-through from the parent PhysicalStore — the row itself only
stores the bare decimal promotional_price.
Stable UUID primary key of the promotion. Use this for cross-references.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$URL-safe shortuuid (base57) encoding of id. Up to 22 characters; preferred over id in human-shareable URLs and log lines.
22UUID of the parent InStoreOffer this promotion applies to. The offer must already exist; create it via the in-store offers API before attaching promotions. Immutable after creation — moving a promotion to a different offer means deleting and recreating.
22^[23456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{22}$Time-windowed override for the offer's regular price in the parent store's currency. Must be non-negative. When multiple promotions overlap on the same offer the cheapest active one wins; $0 is allowed and intentional for free-with-purchase BOGO arms (it is not a sentinel for 'unknown').
^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$Timestamp at which this promotion becomes effective (inclusive). Must be strictly before end_date — the database enforces end_date > start_date.
Timestamp at which this promotion stops being effective (inclusive). A daily Celery beat task flips is_active to false once this passes; the row is kept for historical pricing rather than deleted.
Developer-attached key/value data attached to this object. Up to 50 keys; key max 40 chars, value max 500 chars.
ISO 4217 currency code lifted from the parent PhysicalStore.currency at read time. Read-only here — there is no per-promotion currency override; the store decides.
3Merchandising context — display-only, does not change resolution semantics. Use SEASONAL for time-of-year promotions (Black Friday, holiday), CLEARANCE for end-of-life inventory, BOGO for buy-one-get-one arms (often at promotional_price=0), BUNDLE for discounts that apply when buying with another product, INTRODUCTORY for launch pricing, LOYALTY for member-only prices, and SALE (the default) for everything else.
SALE, CLEARANCE, BOGO, BUNDLE, SEASONAL, INTRODUCTORY, LOYALTY Optional human-readable label shown alongside the promoted price (e.g. 'Black Friday weekend', 'Member appreciation week'). Free-form, up to 255 characters. Empty string when no label is needed.
255Soft-deactivate flag. true means the promotion is eligible for cheapest-active resolution within its date window; false excludes it (the daily beat task auto-flips this to false once end_date passes). Use the update endpoint to set this to false rather than deleting if you want to preserve the historical pricing row.