Update unified promotion

This endpoint updates an existing unified promotion using its unique ID. You must provide the complete promotion object in the request body, including all fields you wish to keep, as this operation typically replaces the existing promotion data with the data provided.

Example request

curl --location --request PUT 'https://{Host}/api_gateway/v1/promotions/{promotion_id}' \
--header 'Content-Type: application/json' \
--header 'X-CAP-API-AUTH-ORG-ID: 100232' \
--header 'user-agent: pyapps_auto_Promotion_Engine_Eucrm_Smoke' \
--header 'Authorization: Basic bmFtYMWJmYjM5OGM5ZmM2YjZlY2I2MmEy' \
--data '{
    "name": "CODE_Promotion_Test_17573886",
    "orgId": 100027,
    "priority": 0,
    "active": true,
    "messageLabel": "test!!",
    "type": "CODE",
    "condition": {
      "type": "CART",
      "cartCondition": {
        "kpi": "SUBTOTAL",
        "operator": "EQUALS",
        "value": 250.0
      }
    },
    "action": {
      "type": "CART_BASED",
      "cartBasedAction": {
        "type": "ABSOLUTE",
        "value": 25.0
      }
    },
    "createdBy": 70707,
    "createdOn": 0,
    "lastUpdatedBy": 70707,
    "startDate": "1857388651000",
    "endDate": "1857475051000",
    "campaignId": 39077,
    "mode": "DISCOUNT",
    "promotionRestrictions": {
      "Code": [
        {
          "kpi": "REDEMPTION",
          "limit": 1
        }
      ]
    },
    "isStackable": false
  }'

Prerequisites

  • Authentication: Basic or OAuth authentication.
  • Default access group

Rate limit

  • Demo and Testing Clusters: 1,000 requests per minute per API key
  • Other Organizations: The rate limit is brand-specific.

To modify the limit, create a ticket with the Capillary Product support team.

Body Parameters

TypeFieldRequiredDescription
ObjectmetadataYesContains all core promotion settings. See The metadata Object table below.
ObjectcustomerEnrolmentYesDefines who is initially eligible. See Customer Enrollment & Workflows table below.
Array of ObjectactivitiesYesDefines the triggers and rewards. See The activities Object table below.
ObjectworkflowMetadataOptionalDefines dynamic opt-in or enrollment rules. See Customer Enrollment & Workflows table below.
Array of ObjectlimitsOptionalSets usage limits. See The limits Object table below.
Array of ObjectliabilityOwnerSplitInfoOptionalDefines cost splitting. See The liabilityOwnerSplitInfo Object table below.
stringcommentsOptionalInternal comments for the promotion. Example: "Initial draft for review"
stringparentIdOptionalParent promotion ID, if cloning. Example: "68f708709c1b226be345abcd"

Metadata object table

Specifies the essential configuration details for the promotion. This object holds the core identifiers and timing of a promotion.

Field

Type

Required

Description

name

string

Yes

Specifies the unique name of the promotion, used for identification. Supported Values: String (max length 200).
Example: "Q3 Bonus Points for Gold Tier"

orgId

integer

Yes

Indicates the unique organization identifier the promotion belongs to. This ensures the promotion runs under the correct business account. Supported Values: Valid Organization ID (integer).
Example: 100730

startDate

string

Yes

Specifies the active start date and time when the promotion becomes effective. This marks the exact moment customers can start qualifying for the "Weekend Double Points".
Time format: ISO 8601 date-time string.
Example: "2025-11-01T00:00:00Z"

endDate

string

Yes

Specifies the active end date and time when the promotion stops being effective. This is the cut-off time for earning double points in the weekend offer.
Time format: ISO 8601 date-time string.
Example: "2025-11-30T23:59:59Z"

promotionType

string

Yes

Indicates the nature of the reward or promotion type, used for categorization.
Supported values : GENERIC

status

enum

Yes

Specifies the initial status upon creation, determining its visibility and execution state.

Supported Values:

DRAFT: Saved but not active.
ACTIVE: Live and evaluating.
PENDING_APPROVAL: Awaiting approval.
LIVE: Actively running. UPCOMING: Scheduled to start.

description

string

Optional

Indicates a brief description of the promotion's purpose for internal reference. E.g., "Standard weekend points multiplier campaign".

programId

string

Optional

Specifies the loyalty program unique identifier to which the promotion is associated with, linking it to that program's points system.

Program ID. Example: "2607" or "MAIN_REWARDS"

timezoneName

string

Optional

Defines the timezone for interpreting the start and end dates, ensuring the "Weekend Double Points" offer starts and ends correctly in the target region. Supported Values: Valid IANA Time Zone Database name.

Example: "Asia/Kolkata" or "America/New_York"

promoIdentifer

string

Optional

Specifies a unique string identifier for the promotion.

loyaltyEarningType

enum

Optional

Defines how rewards are issued. DIRECT_EARN : Adds points OR rewards directly upon qualification
Eg. points added immediately after purchase.
ISSUE_AND_EARN : First issues a promotion which require a separate step to be earned.
Eg. Issue a "pending" reward of 20% discount for one action like booking a flight that only becomes earned and usable after you complete a second step like boarding the flight.

loyaltyConfigMetaData

Object

Optional

Defines complex rules for promotion interaction. You can use this to prevent the "Weekend Double Points" from applying if an employee discount is used. Supported Values: A valid LoyaltyConfigMetaDto object. Example: { "isStackable": false, "isExclusive": true }

Refer "loyaltyConfigMetaData" table below for the full structure

promotionMetadata

Array (Object)

Optional

Defines a list of custom key-value pairs for additional metadata, often for reporting or integration purposes. You can tag the "Weekend Double Points" offer with {"key": "CampaignTheme", "value": "Seasonal"}. Supported Values: Array of PromotionMetadata objects. Example: [ { "key": "CampaignCode", "value": "FALL25" } ]

Refer "promotionMetadata" table below for the full structure

Nested: loyaltyConfigMetaData Object

Field

Type

Required

Description

isStackable

boolean

Optional

Indicates if this promotion can be combined with others. false means the "Weekend Double Points" cannot be combined with a "10% Off" coupon in the same transaction.
Supported Values: true, false.

isExclusive

boolean

Optional

Indicates if this promotion cancels out all other non-stackable promotions when applied. If true, applying this bonus prevents any other offer, even stackable ones. Supported Values: true, false.

isAlwaysApply

boolean

Optional

Indicates if the promotion should always be applied automatically when conditions are met. true ensures "Weekend Double Points" apply without needing a code or manual selection. Supported Values: true, false. Example: true

isConsideredForRanking

boolean

Optional

Indicates if earnings from this promotion should contribute to customer tier ranking calculations. true means the extra points from "Weekend Double Points" help customers reach the next loyalty tier faster. Supported Values: true, false. Example: true

skipEarnedDateCheckOnRedeem

boolean

Optional

Specifies to skip validation of the reward's earned date during redemption, allowing redemption before official earning time. false ensures points from "Weekend Double Points" can only be used after they're properly awarded.
Supported Values: true, false.

Nested: promotionMetadata Object

Field

Type

Required

Description

isBrandDefined

string

Optional

Indicates if the metadata key is custom (true) or system-defined (false). For a custom "CampaignTheme" tag, this value is true.

key

string

Optional

Specifies the metadata key name.This key is used for tracking internal campaigns.
Supported Values: String. Example: "CampaignCode"

value

string

Optional

Specifies the metadata key value.This value is used for the specific code for the campaign. Supported Values: String. Example: "FALL25"

Requirement 1: Comprehensive Loyalty Config & Metadata TagsStyleSavvy Boutique has configured a promotion named "StyleSavvy VIP Early Access-lock," active from November 10th to November 15th, 2025. The condition is: if any customer makes a transaction during this period, the system will automatically apply this promotion. As a result, points awarded will count towards the customer's tier ranking, and any associated rewards can be redeemed immediately. The promotion itself cannot be stacked or combined with other offers, and the primary action triggered is the awarding of points based on predefined strategies.
curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "StyleSavvy VIP Early Access-lock",

        "description": "Always-apply, counts for rank, immediate redeem. VIP Early Bird tags.",

        "orgId": 100737,

        "programId": 2607,

        "startDate": "2025-11-10T00:00:00+05:30",

        "endDate": "2025-11-15T23:59:59+05:30",

        "promotionType": "GENERIC",

        "status": "DRAFT",

        "timezoneName": "Asia/Kolkata",

        "promoIdentifer": "SS_VIP_EARLY_NOV25_UI",

        "loyaltyEarningType": null,

        "loyaltyConfigMetaData": {

            "isStackable": false,

            "isExclusive": false,

            "isAlwaysApply": true,

            "isConsideredForRanking": true,

            "skipEarnedDateCheckOnRedeem": true

        },

        "promotionMetadata": [

            {

                "isBrandDefined": "true",

                "key": "Access",

                "value": "VIP"

            },

            {

                "isBrandDefined": "true",

                "key": "Event",

                "value": "EarlyBird"

            }

        ]

    },

    "customerEnrolment": {

        "enrolmentMethod": "TRANSACTION",

        "audienceGroups": []

    },

    "activities": [

        {

            "id": "activity_1761xxxxxx01", "type": "SINGLE", "name": "VIP Activity", "event": "TransactionAdd",

            "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

            "commonCycleActionMapping": [{

                "cycle": "Cycle_1", "startDate": "2025-11-10", "endDate": "2025-11-15",

                "actions": [{

                    "id":"temp_action_vip", "actionName": "AWARD_POINTS_ACTION",

                    "actionClass":"com.capillary.shopbook.pointsengine.endpoint.impl.action.AwardPointsActionImpl",

                    "description":"Award VIP Points",

                    "mandatoryPropertiesValues": {"AwardStrategy":"109010","ExpiryStrategy":"109006"},

                    "mandatoryComplexPropertiesValues": {}, "embeddedStrategies": []

                }]

            }],

            "milestones": [], "cycles": [], "activityCycles": []

        }

    ],

    "limits": [], "liabilityOwnerSplitInfo": [],

    "workflowMetadata": { "optin": { "activities": [], "audienceMapping": [] }, "enrolment": { "activities": [], "audienceMapping": [] } }

}'
Requirement 2: Generic Promo + ISSUE_AND_EARNBrand Requirement: Adventure Quest Outfitters has set up a promotion called the "Gear Up Challenge," running from December 1st to December 31st. This promotion is configured as a "Generic" type, meaning its reward might be something other than standard loyalty points, like a digital badge. The key condition is how rewards are given: when a customer qualifies, the reward is first issued (like receiving a pending notification or item), but it isn't fully earned or usable until potentially later, perhaps after meeting another condition or after a delay. This promotion follows standard interaction rules, meaning it won't automatically combine with other offers or block them unless specifically configured elsewhere. The main action triggered is the awarding of a badge.
curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "Adventure Quest Gear Up Challenge-UI",

        "description": "Generic promo for Gear Up Challenge. Issue and Earn.",

        "orgId": 100737,

        "programId": 2607,

        "startDate": "2025-12-01T00:00:00+05:30",

        "endDate": "2025-12-31T23:59:59+05:30",

        "promotionType": "GENERIC",

        "status": "DRAFT",

        "timezoneName": "Asia/Kolkata",

        "promoIdentifer": "AQ_GEARUP_DEC25_UI",

        "loyaltyEarningType": "ISSUE_AND_EARN",

        "loyaltyConfigMetaData": {

            "isStackable": false, "isExclusive": false, "isAlwaysApply": false, "isConsideredForRanking": false, "skipEarnedDateCheckOnRedeem": null

        },

        "promotionMetadata": []

    },

    "customerEnrolment": { "enrolmentMethod": "TRANSACTION", "audienceGroups": [] },

    "activities": [

        {

            "id": "activity_1761xxxxxx02", "type": "SINGLE", "name": "Challenge Activity", "event": "CustomEvent",

            "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

            "commonCycleActionMapping": [{

                "cycle": "Cycle_1", "startDate": "2025-12-01", "endDate": "2025-12-31",

                "actions": [{

                    "id":"temp_action_badge", "actionName": "AWARD_BADGE", "actionClass":"...",

                    "description":"Award Gear Up Badge",

                    "mandatoryPropertiesValues": {"badgeId": "GEAR_UP_DEC25"},

                    "mandatoryComplexPropertiesValues": {}, "embeddedStrategies": []

                }]

            }],

            "milestones": [], "cycles": [], "activityCycles": []

        }

    ],

    "limits": [], "liabilityOwnerSplitInfo": [],

    "workflowMetadata": { "optin": { "activities": [], "audienceMapping": [] }, "enrolment": { "activities": [], "audienceMapping": [] } }

}'

Customer enrollment and workflows object table

These objects define who is eligible for the promotion and how they get in, both at the start (customerEnrolment) and dynamically during the promotion (workflowMetadata).

customerEnrolment object table

Defines the initial set of customers eligible for the promotion.

Field

Type

Required

Description

enrolmentMethod

enum

Optional

Defines the primary enrollment type. TRANSACTION: Auto-enrolls on action.

Example: A cafe's "Holiday Bonus" promo. Any customer who makes any purchase during December is automatically enrolled and starts earning.

IMPORT: Manually enrolls a specific list.

Example: A brand wants to reward 50 specific contest winners. A manager uploads a CSV file containing only those 50 customer IDs. Only those 50 people are enrolled.

AUDIENCE_FILTER: Pre-enrolls an existing group.

Example: A "VIP Exclusive Sale." Before the sale starts, the system checks its database and pre-enrolls everyone who is already in the "Gold Tier" customer segment. If you are not in the "Gold Tier" group before it starts, you are not included.

audienceGroups

Array (Object)

Conditional

List of audience segments to pre-enroll.
Required if enrolmentMethod is AUDIENCE_FILTER

..audienceGroupId

integer

Yes

The ID of the target audience group. Example: 12345

..audienceGroupName

string

Optional

Informational name of the audience group. Example: "Gold Tier"

..description

string

Optional

Informational description of the audience group. Example: "High spending customers"

workflowMetadata Object

Defines dynamic (post-start) enrollment or opt-in rules.

Field

Type

Required

Description

enrolment

Object

Optional

Specifies rules for automatic dynamic enrollment.

See Nested: enrolment and optin Object table below.

optin

Object

Optional

Specifies rules for customer-managed opt-in.

See Nested: enrolment and optin Object table below.

Nested: enrolment and optin Object

The structure for enrolment and optin objects is identical.

Field

Type

Required

Description

basedOn

enum

Optional

Trigger type.
ACTIVITY: Customer action.
AUDIENCE: Joining a segment.

activities

Array (Object)

Conditional

A list of Activity Objects that trigger the enrollment or opt-in.
Required if basedOn is ACTIVITY.

audienceMapping

Array (Object)

Conditional

List of audience groups that trigger the enrollment or opt-in.
Required if basedOn is AUDIENCE.

..groupId

integer

Optional

The ID of the audience group. Example: 12345

..groupName

string

Optional

Informational name of the audience group. Example: "Gold Tier"

restrictions

Object

Optional

Applies limits specifically to this workflow. See Nested: Promotion Restrictions Object table below.

Nested: promotion restrictions object

Defines limits for the enrolment or optin workflow.

Field

Type

Required

Description

optinExpiryBasedOn

Object

Optional

Defines expiry for the user's opt-in status.

..type

enum

Optional

Expiry method. Supported Values:
PROMOTION: Expires with the promo.

Example: A "Weekend Sale" runs from Friday to Sunday. You opt-in on Friday. Your opt-in status is active until the promotion itself ends on Sunday night.

CUSTOM: Expires after a personal timer.

Example: A "7-Day Free Trial." You opt-in by signing up on a Tuesday. Your trial (your opt-in status) lasts for exactly 7 days, expiring next Tuesday. If your friend signs up on Friday, their trial expires next Friday.

FIXED_DATE:Expires on a specific calendar date for everyone.

Example: A "Summer Contest" where you can opt-in anytime. The rules state all entries and opt-in statuses expire on December 31st. If you opt-in on July 1st or December 30th, your status still ends on December 31st.

..value

integer

Optional

Duration until when the opt-in lasts. Example: 30 , which defines the opt-in expiry as 30 days. Required if type is CUSTOM

..expiryDate

string

Optional

The exact date and time opt-in expires. Example: "2026-12-31T23:59:59Z"
Required if type is FIXED_DATE.

enrolmentExpiryBasedOn

Object

Optional

Defines expiry for the user's enrollment status which was gained through this workflow.

..type

enum

Optional

Expiry method. Supported Values:
PROMOTION: Expires with the promo.

Example: A "Weekend Sale" runs from Friday to Sunday. You opt-in on Friday. Your opt-in status is active until the promotion itself ends on Sunday night.

CUSTOM: Expires after a personal timer.

Example: A "7-Day Free Trial." You opt-in by signing up on a Tuesday. Your trial (your opt-in status) lasts for exactly 7 days, expiring next Tuesday. If your friend signs up on Friday, their trial expires next Friday.

FIXED_DATE:Expires on a specific calendar date for everyone.

Example: A "Summer Contest" where you can opt-in anytime. The rules state all entries and opt-in statuses expire on December 31st. If you opt-in on July 1st or December 30th, your status still ends on December 31st.

..value

integer

Optional

Duration until when the enrollment will be active.
Example: 7
Required if type is CUSTOM

..expiryDate

string

Optional

The exact date and time enrollment expires. Example: "2025-12-31T23:59:59Z"
Required if type is FIXED_DATE.

optinLimitPerCustomer

Object

Optional

Limits how many times a customer can opt-in.

..type

enum

Optional

Defines how the limit is set

Supported values:

NON_PERIOD_BASED: The limit applies once for the entire promotion. It never resets. Example: "Limit 1 free gift per customer." Once you get the gift, you can't get another.


PERIOD_BASED: The limit resets after a set timeframe (like daily or weekly), allowing the customer to qualify again. Example: "Limit 1 free coffee per day." You can get one on Monday, another on Tuesday, and so on.

..value

integer

Optional

The maximum number of times. Example: 1

..periodType

enum

Conditional

Defines the Window type. Supported Values: MOVING_WINDOW: The limit is based on a rolling timeframe that looks backward from the current moment.

Example: If the limit is "1" per "7" days and you get one on a Wednesday, you can't get another one until the following Wednesday. It's not tied to a calendar week.

Required if type is PERIOD_BASED.

..periodUnit

enum

Conditional

Specifies the interval at which the limit resets. Supported Values:

DAILY: The limit resets every day. Example: "Get a free coffee with any purchase, limit 1 per day.You can get one on Monday, one on Tuesday and so on.

WEEKLY: The limit resets every week. Example: "Earn 100 bonus points on your next purchase, limit 1 per week." If you earn it on Tuesday, you can't earn it again until the next week starts.

MONTHLY: The limit resets every month. Example: "Get 20% off one bill, limit 1 per month." You can use it once in October, once in November and so on.

maxRedemptionsPerEarnPerCustomer

Object

Optional

Specifies the maximum number of times a customer can redeem rewards that they earn after joining the promotion through this specific workflow.

..type

enum

Optional

Defines if the redemption limit resets based on a set period.

NON_PERIOD_BASED: The redemption limit applies once for the entire promotion and never resets.

Example: "Limit 1 free welcome gift per customer." Once you get it, you can't get another one, even if you qualify again.

PERIOD_BASED: The redemption limit resets on a regular schedule (like daily or weekly), allowing the customer to qualify repeatedly.

Example: "Limit 1 free coffee per day." You can get one on Monday, the limit resets, and you can get another one on Tuesday.

..value

integer

Optional

The maximum number of redemptions.

..periodType

enum

Conditional

Defines the type of period at which the redemption limit resets. Supported Values: MOVING_WINDOW.
Required if type is PERIOD_BASED.

..periodUnit

enum

Conditional

Specifies the interval at which the customer can redeem rewards. Supported Values:

DAILY: The redemption limit resets every day. Example: "Get a free coffee with any purchase, limit 1 per day.You can get one on Monday, one on Tuesday and so on.

WEEKLY: The redemption limit resets every week. Example: "Earn 100 bonus points on your next purchase, limit 1 per week." If you earn it on Tuesday, you can't earn it again until the next week starts.

MONTHLY: The redemption limit resets every month. Example: "Get 20% off one bill, limit 1 per month." You can use it once in October, once in November and so on.

Required if type is PERIOD_BASED.

enrolmentLimitPerPromotion

Object

Optional

Defines the overall limit on total enrollments or opt-ins possible through this workflow.

..type

enum

Optional

Defines if the enrollment limit per promotion resets based on set intervals.

NON_PERIOD_BASED: The limit applies once for the entire promotion and never resets.

Example: "Limit 1 free welcome gift per customer." Once you get the gift, you can't get another one, even if you qualify again.

PERIOD_BASED: The limit resets on a regular schedule (like daily or weekly), allowing the customer to qualify repeatedly.

Example: "Limit 1 free coffee per day." You can get one on Monday, the limit resets, and you can get another one on Tuesday.

..value

integer

Optional

Specifies the maximum enrollment limit per promotion.

..periodType

enum

Conditional

Defines how the overall limit per promotion is calculated.

MOVING_WINDOW: The limit is based on a rolling timeframe that looks backward from the current moment, not a fixed calendar block.

Example: Imagine the global enrollment limit is 1000, type is PERIOD_BASED, and the period is a 7-day MOVING_WINDOW If 1000 customers enroll in total between Monday (Day 1) and Wednesday (Day 3), the promotion is full. No one else can enroll until the following Monday (Day 8). At that point, the enrollments from the previous Monday (Day 1) "fall off" the 7-day window, freeing up capacity for new customers to enroll.

..periodUnit

enum

Conditional

Defines the specific time an overall enrollment limit resets per promotion:

DAILY: The total enrollment cap resets every day.

Example: If the limit is "1,000 enrollments per Day," the system will allow a total of 1,000 customers (from all customers) to enroll on Monday. On Tuesday, the counter resets, and a new 1,000 total enrollments are allowed.

WEEKLY: The total enrollment cap resets every week.

Example: If the limit is "1,000 enrollments per Week," the system allows 1,000 total customers to enroll between Sunday and Saturday. The counter then resets for the next week.

MONTHLY: The total enrollment cap resets every month.

Example: If the limit is "1,000 enrollments per Month," a total of 1,000 customers can enroll during all of November. The counter then resets on December 1st. Required if type is PERIOD_BASED.

enrolmentLimitPerCustomer

Object

Optional

Limits how many times one customer can enroll via this workflow.

..type

enum

Optional

Defines how the limit is applied to a single customer:

NON_PERIOD_BASED: The limit applies once for the entire promotion. It never resets.

Example: A "Welcome Offer." You can enroll only one time. Even if you leave the program and come back, you can't enroll in this promotion again.

PERIOD_BASED: The limit resets after a set timeframe (like daily or monthly).

Example: A "Monthly Pass" promotion. The limit is "1 enrollment per Month." You can enroll in January, and then after the limit resets, you can enroll again in February.

..value

integer

Optional

The maximum number of times a customer can enroll. Example: 1

..periodType

enum

Conditional

This defines how the time-based limit is calculated for that specific customer.

MOVING_WINDOW: The limit is based on a rolling timeframe that starts from the moment the customer enrolls. It is not tied to a fixed calendar (like "every Monday" or "the 1st of the month").

Example: If the limit is "1 enrollment per WEEKLY period" and a customer enrolls on a Tuesday, their 7-day "moving window" starts. They cannot enroll again until the following Tuesday.

..periodUnit

enum

Conditional

Defines the specific time unit for the PERIOD_BASED limit.

Supported values:

DAILY: The limit for the customer resets every day.

Example: A limit of "1 enrollment per Day." A customer can enroll on Monday, and then the limit resets, allowing them to enroll again on Tuesday.

WEEKLY: The limit for the customer resets every week.

Example: A limit of "1 enrollment per Week." A customer enrolls on Tuesday. They cannot enroll again until the next week (how the week is defined, e.g., Sun-Sat or a rolling 7 days, depends on the periodType).

MONTHLY: The limit for the customer resets every month.

Example: A limit of "1 enrollment per Month." A customer enrolls in November. They cannot enroll again until the limit resets in December.

maxPointsPerEarnPerCustomer

Object

Optional

Defines the maximum points a customer can earn from a single reward activity, after they have enrolled or opted-in through this workflow

..type

enum

Optional

Defines how often the points limit is applied.


NON_PERIOD_BASED: The cap applies to every single reward activity, individually.


Example: The limit is 500 points.
-On Monday, you make a purchase and earn 300 points (OK, < 500).

-On Tuesday, you make another purchase and earn 700 points. This single action is capped, so you only get 500 points.

-On Wednesday, you make a third purchase and earn 400 points (OK, < 500).

This limit applies per-action, not over time.


PERIOD_BASED: The cap applies to the total points earned over a set time period.

Example: The limit is 500 points per DAILY period.

-On Monday morning, you earn 300 points (OK).

-On Monday afternoon, you earn 400 points. The system checks your total for the day (300 + 400 = 700). Since this exceeds 500, it will only award you the remaining 200 points for this second action.

-On Tuesday, the limit resets, and you can earn up to 500 points again.

..value

integer

Optional

The maximum points that can be earned.
Example: 100

..periodType

enum

Conditional

Defines how the time-based points limit is calculated.

MOVING_WINDOW: The limit is based on a rolling timeframe (e.g., "the last 7 days" or "the last 30 days") that looks backward from the exact moment of the transaction. It is not tied to a fixed calendar (like "this week" or "this month").

Example: The limit is 1000 points per WEEKLY (periodUnit) MOVING_WINDOW.
-On Monday, Jan 5th, you earn 600 points. Your total for the last 7 days is 600.

-On Wednesday, Jan 7th, you try to earn 500 points.

-The system checks the last 7 days (Jan 1st - Jan 7th), sees you already earned 600, so this new action is capped at 400 points (to reach the 1000-point limit).

You must wait until Monday, Jan 12th (when the 600 points from Jan 5th "fall off" the 7-day window) to earn more.

..periodUnit

enum

Conditional

Defines the specific interval for a PERIOD_BASED limit.

DAILY: The limit resets every day.

Example: A limit of "1 reward per Day." A customer can get the reward on Monday, and then the limit resets, allowing them to get it again on Tuesday.

WEEKLY: The limit resets every week.

Example: A limit of "1 reward per Week." A customer gets the reward on Tuesday. They cannot get it again until the following week (e.g., the next Sunday or Monday, depending on settings).

MONTHLY: The limit resets every month.

Example: A limit of "1 reward per Month." A customer gets the reward on November 5th. They cannot get it again until the limit resets on December 1st.

Requirement 1: Audience Filter + Activity Opt-In

Healthy Habits Cafe is running a "Wellness Week Opt-In" promotion from November 17th to 23rd, but only for a specific group of pre-selected customers. To participate, these customers must first "opt-in" by making any purchase during that week. After they have opted-in, the reward is earning 100 points on their future purchases. The promotion has several limits, such as capping the total number of customers who can opt-in at 500 and limiting the points earned from a single activity to 200.

curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "Healthy Habits Wellness Week Opt-In-UI", "description": "Audience enroll (ID 612174375), activity opt-in w/ ALL restrictions.",

        "orgId": 100737, "programId": 2607, "startDate": "2025-11-17T00:00:00+05:30", "endDate": "2025-11-23T23:59:59+05:30",

        "promotionType": "GENERIC", "status": "DRAFT", "timezoneName": "Asia/Kolkata", "promoIdentifer": "HH_WELLNESS_OPTIN_NOV25_UI",

        "loyaltyConfigMetaData": { }, "loyaltyEarningType": null, "promotionMetadata": []

    },

    "customerEnrolment": {

        "enrolmentMethod": "AUDIENCE_FILTER",

        "audienceGroups": [

            { "audienceGroupId": 612174375, "audienceGroupName": "Registered", "description": "All registered users" }

        ]

    },

    "workflowMetadata": {

        "optin": {

            "basedOn": "ACTIVITY",

            "activities": [

                {

                    "id": "activity_1761xxxxxx03", "type": "SINGLE", "name": "Opt-in via Purchase", "event": "TransactionAdd",

                    "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

                    "commonCycleActionMapping": [{

                        "cycle":"Cycle_1", "startDate": "2025-11-17", "endDate": "2025-11-23",

                        "actions":[{

                            "id":"temp_action_optin_aaa", "actionName": "EARN_PROMOTION_ACTION",

                            "actionClass":"com.capillary.shopbook.pointsengine.endpoint.impl.action.CommunicationDecoratorActionImpl",

                            "description": "Perform Opt-In",

                            "mandatoryPropertiesValues": {

                                "promotionIdentifier": "HH_WELLNESS_OPTIN_NOV25_UI",

                                "activityName": "Opt-in via Purchase",

                                "delegateActionClass": "com.capillary.shopbook.pointsengine.endpoint.impl.action.EarnPromotionActionImpl"

                            },

                            "mandatoryComplexPropertiesValues": {}, "embeddedStrategies": []

                        }]

                    }],

                    "milestones": [], "cycles": [], "activityCycles": []

                }

            ],

            "audienceMapping": [],

            "restrictions": {

                "optinExpiryBasedOn": { "type": "PROMOTION", "value": "" },

                "enrolmentExpiryBasedOn": { "type": "CUSTOM", "value": 30 },

                "optinLimitPerCustomer": { "value": "1", "type": "PERIOD_BASED", "periodType": "MOVING_WINDOW", "periodUnit": "DAILY" },

                "maxRedemptionsPerEarnPerCustomer": { "value": "5", "type": "NON_PERIOD_BASED" },

                "enrolmentLimitPerPromotion": { "value": "500" },

                "enrolmentLimitPerCustomer": { "value": "1" },

                "maxPointsPerEarnPerCustomer": { "value": 200, "type": "NON_PERIOD_BASED" }

            }

        },

        "enrolment": { "activities": [], "audienceMapping": [] }

    },

    "activities": [

        {

            "id": "activity_1761xxxxxx04", "type": "SINGLE", "name": "Wellness Reward", "event": "TransactionAdd",

            "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

            "commonCycleActionMapping": [{

                "cycle": "Cycle_1", "startDate": "2025-11-17", "endDate": "2025-11-23",

                "actions": [{"id":"temp_action_wellness", "actionName":"AWARD_POINTS_ACTION", "actionClass":"...", "mandatoryPropertiesValues":{"AwardStrategy":"109010"}, "embeddedStrategies":[]}]

            }],

            "milestones": [], "cycles": [], "activityCycles": []

        }

    ],

    "limits": [], "liabilityOwnerSplitInfo": []

}'

Requirement 2: Import Enrollment + Audience Enrollment Gadget Galaxy is running a "Beta Tester Program" for the first quarter of the year. A specific list of customers is manually enrolled into this program. Additionally, any customer who joins the "PreOrder List" (a specific audience group) is automatically enrolled as well. Once enrolled, these members can earn a reward: when they perform the "FeedbackSubmitted" action, they will receive 100 points. This promotion has several restrictions, such as limiting automatic enrollment to 1,000 customers total and capping the points earned from a single activity at 500.

curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "Gadget Galaxy Beta Tester Program Q1-UI", "description": "Import enroll, audience dynamic enroll (ID 612174375) w/ ALL restrictions.",

        "orgId": 100737, "programId": 2607, "startDate": "2026-01-01T00:00:00+05:30", "endDate": "2026-03-31T23:59:59+05:30",

        "promotionType": "GENERIC", "status": "DRAFT", "timezoneName": "Asia/Kolkata", "promoIdentifer": "GG_BETA_Q126_UI",

        "loyaltyConfigMetaData": { }, "loyaltyEarningType": null, "promotionMetadata": []

    },

    "customerEnrolment": {

        "enrolmentMethod": "IMPORT",

        "audienceGroups": []

    },

    "workflowMetadata": {

        "optin": { "activities": [], "audienceMapping": [] },

        "enrolment": {

            "basedOn": "AUDIENCE",

            "activities": [],

            "audienceMapping": [

                { "groupId": 612174375, "groupName": "PreOrder List" }

            ],

            "restrictions": {

                "optinExpiryBasedOn": { "type": "CUSTOM", "value": 90 },

                "enrolmentExpiryBasedOn": { "type": "FIXED_DATE", "expiryDate":"2026-03-31T23:59:59Z" },

                "optinLimitPerCustomer": { "value": "1" },

                "maxRedemptionsPerEarnPerCustomer": { "value": "2", "type": "NON_PERIOD_BASED" },

                "enrolmentLimitPerPromotion": { "value": "1000" },

                "enrolmentLimitPerCustomer": { "value": "1", "type": "PERIOD_BASED", "periodType": "MOVING_WINDOW", "periodUnit": "MONTHLY" },

                "maxPointsPerEarnPerCustomer": { "value": 500, "type": "NON_PERIOD_BASED" }

            }

        }

    },

    "activities": [

        {

            "id": "activity_1761xxxxxx05", "type": "SINGLE", "name": "Beta Reward", "event": "FeedbackSubmitted",

            "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

            "commonCycleActionMapping": [{

                "cycle": "Cycle_1", "startDate": "2026-01-01", "endDate": "2026-03-31",

                "actions": [{"id":"temp_action_beta_pts", "actionName":"AWARD_POINTS_ACTION", "actionClass":"...", "mandatoryPropertiesValues":{"AwardStrategy":"109010", "ExpiryStrategy": "109006"}, "embeddedStrategies":[]}]

            }],

            "milestones": [], "cycles": [], "activityCycles": []

        }

    ],

    "limits": [], "liabilityOwnerSplitInfo": []

}'

The activities Object

Defines the core logic of the promotion: the triggers (events and conditions) and the resulting actions (rewards). This is an array, so you can have multiple activity objects.

activities (Common Fields)

These fields are present on all activity objects, whether SINGLE or GROUP.

FieldTypeRequiredDescription
idstringOptionalUnique identifier for the activity. Example: "activity_1761023957829"
typeenumYesSINGLE: A single trigger. GROUP: A combination of triggers. Supported Values: SINGLE, GROUP.
namestringOptionalName for identification. Example: "Main Purchase Activity"
refIdstringOptionalExternal reference ID. Example: "REF001"
parentIdstringOptionalID of the parent if this is a nested activity inside a GROUP. Example: "activity_group_parent"
rulesetIdstringOptionalLinks to a complex external rule set. Example: "ruleset_abc"
cyclesArray (Object)OptionalDefines general time windows (cycles) for this activity.
..idstringOptionalCycle ID. Example: "c1"
..namestringOptionalCycle name. Example: "Nov Cycle"
..startDatestringOptionalCycle start date/time (ISO 8601).
..endDatestringOptionalCycle end date/time (ISO 8601).
commonCycleActionMappingArray (Object)OptionalDefines the reward(s) for this activity. Links actions to cycles.
..cyclestringOptionalID of the cycle this action applies to. Example: "main_cycle"
..defaultValuenumberOptionalA default value (e.g., a target amount) used in action calculations. Example: 10.0
..startDatestringOptionalSpecific start date for this action mapping (overrides cycle).
..endDatestringOptionalSpecific end date for this action mapping (overrides cycle).
..rulesetIdstringOptionalSpecific ruleset just for this action mapping.
..actionsArray (Object)OptionalThe list of rewards to issue. See Nested: Action Object table below.

Nested: Action Object (fields inside actions array)

FieldTypeRequiredDescription
idstringOptionalUnique ID for the action. Example: "action_award_points_1"
actionNamestringYesThe type of reward. Example: "AWARD_CURRENCY", "ISSUE_COUPON", "MANAGE_TIER_ACTION".
actionClassstringYesThe backend Java class implementing the action. Example: "com.capillary...AwardCurrency"
descriptionstringOptionalInformational description. Example: "Award 10 base points"
mandatoryPropertiesValuesObjectConditionalRequired properties for the action. Values are strings. Example: {"POINTS_TO_AWARD": "10"}
mandatoryComplexPropertiesValuesObjectOptionalComplex properties where values are JSON objects. Example: { "customConfig": { "nested": true } }
embeddedStrategiesArray (Object)OptionalDefines strategies (like custom expiry) just for this action.

Fields for "SINGLE" Activities

FieldTypeRequiredDescription
eventstringYesSpecifies the exact event name that triggers this activity. Supported Values: String representing a valid event name (e.g., "TransactionAdd", "CustomerRegistration", "PageView", or a custom event name). Example: "TransactionAdd"
ruleExpressionstringOptionalSpecifies the rule expression string (DSL) to filter the triggering event. Supported Values: String conforming to the rule grammar. Example: "transaction.amount > 100 AND transaction.storeId == 10"
expJSONstringOptionalSpecifies the JSON representation of the ruleExpression. Supported Values: Valid JSON rule structure string. Example: "{ "operator": ">", "field": "transaction.amount", "value": 100 }"
frequencyTypestringOptionalSpecifies the time unit for milestone evaluation, often used with targetEvaluationType: CYCLIC_WINDOW. - DAILY: The milestone tracks progress in daily blocks (e.g., "visit 3 days this month"). - WEEKLY: The milestone tracks progress in weekly blocks (e.g., "spend $50 for 2 weeks"). - MONTHLY: The milestone tracks progress in monthly blocks (e.g., "earn 1000 points for 3 months"). Supported Values: "DAILY", "WEEKLY", "MONTHLY". Example: "DAILY"
targetEvaluationTypeenumOptionalSpecifies the evaluation logic window for milestones. - FIXED_CALENDAR_WINDOW: Uses defined start/end dates for the entire milestone. - CYCLIC_WINDOW: Resets progress based on cycles defined in activityCycles or milestones.periods (used for streaks/weekly goals). - PERIOD_AGNOSTIC_WINDOW: Evaluates over the entire promotion duration without any resets. - CALENDAR_CYCLIC_WINDOW: Combines calendar and cyclic logic. Supported Values: FIXED_CALENDAR_WINDOW, CYCLIC_WINDOW, PERIOD_AGNOSTIC_WINDOW, CALENDAR_CYCLIC_WINDOW. Example: "CYCLIC_WINDOW"
targetCycleStartDatestring (date-time)OptionalSpecifies the start date of the overall target evaluation cycle (used if targetEvaluationType is set). Supported Values: ISO 8601 date-time string. Example: "2025-11-01T00:00:00Z"
targetCycleEndDatestring (date-time)OptionalSpecifies the end date of the overall target evaluation cycle (used if targetEvaluationType is set). Supported Values: ISO 8601 date-time string. Example: "2025-11-30T23:59:59Z"
activityCyclesArray (Object)OptionalDefines specific, named time periods (cycles) used by a milestone (e.g., "Week 1", "Week 2"). Supported Values: Array of ActivityCycle objects. Example: [ { "id": "ac1", "name": "Weekly Cycle"} ]
..idstringOptionalSpecifies the activity cycle ID. Supported Values: String ID. Example: "ac1"
..namestringOptionalSpecifies the activity cycle name. Supported Values: String. Example: "Weekly Cycle"
..startDatestringOptionalSpecifies the activity cycle start date. Supported Values: String (Date or DateTime format). Example: "2025-11-03"
..endDatestringOptionalSpecifies the activity cycle end date. Supported Values: String (Date or DateTime format). Example: "2025-11-09"
..refCodestringOptionalSpecifies the activity cycle reference code. Supported Values: String. Example: "WEEK45"
..isActivebooleanOptionalIndicates if the activity cycle is active. Supported Values: true, false. Example: true
milestonesArray (Object)OptionalDefines a list of target milestones within this activity (Max 1 allowed). Supported Values: Array containing max one Milestone object. Example: [ { "name": "Tier 1", ... } ]
..namestringOptionalSpecifies the milestone name. Supported Values: String. Example: "Tier 1: Spend $100"
..sameActionsForEveryCyclebooleanOptionalIndicates if the same actions apply across all cycles defined for this milestone. Supported Values: true, false. Example: true
..differentTargetsForEveryCyclebooleanOptionalIndicates if target values differ across cycles. Supported Values: true, false. Example: false
..descriptionstringOptionalIndicates the milestone description. Supported Values: String. Example: "Reward for reaching the first spending level"
..trackingTypestringOptionalSpecifies how the milestone is tracked. Supported Values: String representing tracking type (e.g., "DEFAULT", "STREAKS"). Example: "DEFAULT"
..targetTypeenumYesDefines the KPI to track for the milestone. Supported Values: QUANTITY, SALES, COUNT, VISIT, GROSS_SALES, REGULAR_POINTS, PROMOTIONAL_POINTS, ALL_POINTS, EXTENDED_FIELD, EVENT_ATTRIBUTE, REGULAR, PROMOTIONAL, ALL. Example: "SALES"
..targetEntityenumYesSpecifies the entity to track the targetType against. Supported Values: TRANSACTION, LINEITEM, POINTS, EVENT, ALTERNATE_CURRENCIES. Example: "TRANSACTION"
..defaultValuestringOptionalSpecifies the target value threshold for achieving the milestone. Supported Values: String representing a number. Example: "100"
..targetValuestringOptionalSpecifies the target value to achieve the milestone (often same as defaultValue). Supported Values: String representing a number. Example: "100"
..preferredTillIdinteger (int64)OptionalIndicates a preferred till ID if tracking is specific to certain POS terminals. Supported Values: Integer till ID. Example: 9876
..frequencyTypestringOptionalSpecifies the time unit for milestone evaluation, often used with targetEvaluationType: CYCLIC_WINDOW. - DAILY: The milestone tracks progress in daily blocks (e.g., "visit 3 days this month"). - WEEKLY: The milestone tracks progress in weekly blocks (e.g., "spend $50 for 2 weeks"). - MONTHLY: The milestone tracks progress in monthly blocks (e.g., "earn 1000 points for 3 months"). - PROMOTION_DURATION: The milestone tracks progress over the entire promotion duration. Example: "PROMOTION_DURATION"
..targetEvaluationTypeenumOptionalSpecifies the evaluation logic window for milestones. - FIXED_CALENDAR_WINDOW: Uses defined start/end dates for the entire milestone. - CYCLIC_WINDOW: Resets progress based on cycles defined in activityCycles or milestones.periods (used for streaks/weekly goals). - PERIOD_AGNOSTIC_WINDOW: Evaluates over the entire promotion duration without any resets. - CALENDAR_CYCLIC_WINDOW: Combines calendar and cyclic logic. Supported Values: FIXED_CALENDAR_WINDOW, CYCLIC_WINDOW, PERIOD_AGNOSTIC_WINDOW, CALENDAR_CYCLIC_WINDOW. Example: "FIXED_CALENDAR_WINDOW"
..recurringCyclesinteger (int32)OptionalSpecifies the number of recurring cycles for milestone evaluation. Supported Values: Integer. Example: 1
..targetGroupIdinteger (int64)OptionalIndicates the target group ID associated with this milestone's tracking logic. Supported Values: Integer target group ID. Example: 112233
..leaderboardEnabledbooleanOptionalIndicates if a leaderboard competition is enabled for this milestone. Supported Values: true, false. Example: false
..cycleActionMappingArray (Object)OptionalDefines the reward(s) for achieving the milestone. (Same structure as commonCycleActionMapping).
..streaksArray (Object)OptionalDefines streak configuration if trackingType is STREAKS. Example: [ { "name": "3 Visits", ... } ]
....namestringOptionalSpecifies the streak name. Supported Values: String. Example: "3 Consecutive Visits"
....targetCountOfSequenceinteger (int32)OptionalSpecifies the required count within each period (e.g., 1 visit per day). Supported Values: Integer. Example: 1
....consecutivebooleanOptionaltrue means the streak must be unbroken. false allows for non-consecutive days. Supported Values: true, false. Example: true
..aggregateFunctionstringOptionalSpecifies the function to aggregate values. SUM (for SALES) or COUNT (for VISIT/COUNT). Supported Values: "SUM", "COUNT". Example: "SUM"
..cyclesArray (Object)OptionalDefines the evaluation cycles specific to this milestone (alternative to activityCycles).
....idstringOptionalSpecifies the cycle ID. Supported Values: String ID. Example: "m_cycle_1"
....namestringOptionalSpecifies the cycle name. Supported Values: String. Example: "Milestone Nov Cycle"
....startDatestring (date-time)OptionalSpecifies the cycle start date. Supported Values: ISO 8601 date-time string.
....endDatestring (date-time)OptionalSpecifies the cycle end date. Supported Values: ISO 8601 date-time string.
..periodsArray (Object)OptionalDefines the evaluation periods for the milestone (often used for streaks).
....idstringOptionalSpecifies the period ID. Supported Values: String ID. Example: "m_period_1"
....namestringOptionalSpecifies the period name. Supported Values: String. Example: "Milestone Nov Period"
....startDatestringOptionalSpecifies the period start date. Supported Values: String (Date or DateTime format).
....endDatestringOptionalSpecifies the period end date. Supported Values: String (Date or DateTime format).
....refCodestringOptionalSpecifies the period reference code. Supported Values: String.
....isActivebooleanOptionalIndicates if the period is active. Supported Values: true, false.
..targetRuleIdsArray (integer int64)OptionalIndicates associated target rule IDs, potentially linking to more complex backend rules. Supported Values: Array of integer target rule IDs. Example: [ 456, 789 ]
..individualMilestoneFileDetailsArray (Object)OptionalDetails related to any uploaded files providing individual targets for this milestone.
....uploadFileNamestringOptionalThe original name of the uploaded file. Example: "targets.csv"
....fileUrlstringOptionalThe system URL where the file is stored. Example: "https://storage.cap/targets.csv"
....statusstringOptionalThe processing status of the file. Example: "PROCESSED"
....totalRecordsintegerOptionalThe total number of records found in the file. Example: 10
....successRecordsintegerOptionalThe number of records successfully processed. Example: 10
....failureCountintegerOptionalThe number of records that failed to process. Example: 0
FieldTypeRequiredDescription
eventstringYesSpecifies the exact event name that triggers this activity. Supported Values: String representing a valid event name (e.g., "TransactionAdd", "CustomerRegistration", "PageView", or a custom event name). Example: "TransactionAdd"
ruleExpressionstringOptionalSpecifies the rule expression string (DSL) to filter the triggering event. Supported Values: String conforming to the rule grammar. Example: "transaction.amount > 100"
expJSONstringOptionalSpecifies the JSON representation of the ruleExpression. Supported Values: Valid JSON rule structure string. Example: "{ "operator": ">", "field": "transaction.amount", "value": 100 }"
frequencyTypestringOptionalSpecifies the time unit for milestone evaluation, often used with targetEvaluationType: CYCLIC_WINDOW.<br />- DAILY: The milestone tracks progress in daily blocks (e.g., "visit 3 days this month").<br />- WEEKLY: The milestone tracks progress in weekly blocks (e.g., "spend $50 for 2 weeks").<br />- MONTHLY: The milestone tracks progress in monthly blocks (e.g., "earn 1000 points for 3 months").<br />Example: "DAILY"
targetEvaluationTypeenumOptionalSpecifies the evaluation logic window for milestones.<br />- FIXED_CALENDAR_WINDOW: Uses defined start/end dates for the entire milestone.<br />- CYCLIC_WINDOW: Resets progress based on cycles defined in activityCycles or milestones.periods (used for streaks/weekly goals).<br />- PERIOD_AGNOSTIC_WINDOW: Evaluates over the entire promotion duration without any resets.<br />- CALENDAR_CYCLIC_WINDOW: Combines calendar and cyclic logic.<br />Example: "CYCLIC_WINDOW"
targetCycleStartDatestring (date-time)OptionalSpecifies the start date of the overall target evaluation cycle (used if targetEvaluationType is set). Supported Values: ISO 8601 date-time string. Example: "2025-11-01T00:00:00Z"
targetCycleEndDatestring (date-time)OptionalSpecifies the end date of the overall target evaluation cycle (used if targetEvaluationType is set). Supported Values: ISO 8601 date-time string. Example: "2025-11-30T23:59:59Z"
activityCyclesArray (Object)OptionalDefines cycles specific to this single activity, potentially overriding general cycles (ActivityCycle). Supported Values: Array of ActivityCycle objects. Example: [ { "id": "ac1", "name": "Weekly Cycle"} ]
..idstringOptionalSpecifies the activity cycle ID. Supported Values: String ID. Example: "ac1"
..namestringOptionalSpecifies the activity cycle name. Supported Values: String. Example: "Weekly Cycle"
..startDatestringOptionalSpecifies the activity cycle start date. Supported Values: String (Date or DateTime format). Example: "2025-11-03"
..endDatestringOptionalSpecifies the activity cycle end date. Supported Values: String (Date or DateTime format). Example: "2025-11-09"
..refCodestringOptionalSpecifies the activity cycle reference code. Supported Values: String. Example: "WEEK45"
..isActivebooleanOptionalIndicates if the activity cycle is active. Supported Values: true, false. Example: true
milestonesArray (Object)OptionalDefines a list of target milestones within this activity (Max 1 allowed). See Nested: Milestone Object table below. Example: [ { "name": "Tier 1", "targetType": "SALES", ... } ]

Fields for "GROUP" Activities

FieldTypeRequiredDescription
combinationTypeenumYesLogic to combine children. Supported Values: ANY, ALL.
childrenArray (Object)YesList of nested Activity Objects.
eventstringOptionalEvent that applies to the group as a whole.
ruleExpressionstringOptionalRule expression that applies to the group result.
expJSONstringOptionalJSON representation of the group's rule expression.

Nested: Milestone Object (fields inside milestones array)

FieldTypeRequiredDescription
namestringOptionalSpecifies the milestone name. Supported Values: String. Example: "Tier 1: Spend $100"
sameActionsForEveryCyclebooleanOptionalIndicates if the same actions apply across all cycles defined for this milestone. Supported Values: true, false. Example: true
differentTargetsForEveryCyclebooleanOptionalIndicates if target values differ across cycles. Supported Values: true, false. Example: false
descriptionstringOptionalIndicates the milestone description. Supported Values: String. Example: "Reward for reaching the first spending level"
trackingTypestringOptionalSpecifies how the milestone is tracked. Supported Values: String representing tracking type (e.g., "DEFAULT", "STREAKS"). Example: "DEFAULT"
targetTypeenumYesDefines the KPI to track for the milestone. Supported Values: QUANTITY, SALES, COUNT, VISIT, GROSS_SALES, REGULAR_POINTS, PROMOTIONAL_POINTS, ALL_POINTS, EXTENDED_FIELD, EVENT_ATTRIBUTE, REGULAR, PROMOTIONAL, ALL. Example: "SALES"
targetEntityenumYesSpecifies the entity to track the targetType against. Supported Values: TRANSACTION, LINEITEM, POINTS, EVENT, ALTERNATE_CURRENCIES. Example: "TRANSACTION"
defaultValuestringOptionalSpecifies the target value threshold for achieving the milestone. Supported Values: String representing a number. Example: "100"
targetValuestringOptionalSpecifies the target value to achieve the milestone (often same as defaultValue). Supported Values: String representing a number. Example: "100"
preferredTillIdintegerOptionalIndicates a preferred till ID if tracking is specific to certain POS terminals. Supported Values: Integer till ID. Example: 9876
frequencyTypestringOptionalSpecifies the frequency type for milestone evaluation. Supported Values: String representing frequency (e.g., "PROMOTION_DURATION", "DAILY", "WEEKLY"). Example: "PROMOTION_DURATION"
targetEvaluationTypeenumOptionalSpecifies the evaluation logic window. Supported Values: FIXED_CALENDAR_WINDOW, CYCLIC_WINDOW, PERIOD_AGNOSTIC_WINDOW, CALENDAR_CYCLIC_WINDOW. Example: "FIXED_CALENDAR_WINDOW"
recurringCyclesintegerOptionalSpecifies the number of recurring cycles for milestone evaluation. Supported Values: Integer. Example: 1
targetGroupIdintegerOptionalIndicates the target group ID associated with this milestone's tracking logic. Supported Values: Integer target group ID. Example: 112233
leaderboardEnabledbooleanOptionalIndicates if a leaderboard competition is enabled for this milestone. Supported Values: true, false. Example: false
cycleActionMappingArray (Object)OptionalDefines the reward(s) for achieving the milestone. (Same structure as commonCycleActionMapping).
streaksArray (Object)OptionalDefines streak configuration if trackingType is STREAKS. Example: [ { "name": "3 Visits", ... } ]
..namestringOptionalSpecifies the streak name. Supported Values: String. Example: "3 Consecutive Visits"
..targetCountOfSequenceintegerOptionalSpecifies the required count within each period (e.g., 1 visit per day). Supported Values: Integer. Example: 1
..consecutivebooleanOptionaltrue means the streak must be unbroken. false allows for non-consecutive days. Supported Values: true, false. Example: true
aggregateFunctionstringOptionalSpecifies the function to aggregate values. SUM (for SALES) or COUNT (for VISIT/COUNT). Supported Values: "SUM", "COUNT". Example: "SUM"
cyclesArray (Object)OptionalDefines the evaluation cycles specific to this milestone (alternative to activityCycles).
..idstringOptionalSpecifies the cycle ID. Supported Values: String ID. Example: "m_cycle_1"
..namestringOptionalSpecifies the cycle name. Supported Values: String. Example: "Milestone Nov Cycle"
..startDatestring (date-time)OptionalSpecifies the cycle start date. Supported Values: ISO 8601 date-time string.
..endDatestring (date-time)OptionalSpecifies the cycle end date. Supported Values: ISO 8601 date-time string.
periodsArray (Object)OptionalDefines the evaluation periods for the milestone (often used for streaks).
..idstringOptionalSpecifies the period ID. Supported Values: String ID. Example: "m_period_1"
..namestringOptionalSpecifies the period name. Supported Values: String. Example: "Milestone Nov Period"
..startDatestringOptionalSpecifies the period start date. Supported Values: String (Date or DateTime format).
..endDatestringOptionalSpecifies the period end date. Supported Values: String (Date or DateTime format).
..refCodestringOptionalSpecifies the period reference code. Supported Values: String.
..isActivebooleanOptionalIndicates if the period is active. Supported Values: true, false.
individualMilestoneFileDetailsArray (Object)OptionalDetails related to any uploaded files providing individual targets for this milestone.
..uploadFileNamestringOptionalThe original name of the uploaded file. Example: "targets.csv"
..fileUrlstringOptionalThe system URL where the file is stored. Example: "https://storage.cap/targets.csv"
..statusstringOptionalThe processing status of the file. Example: "PROCESSED"
..totalRecordsintegerOptionalThe total number of records found in the file. Example: 10
..successRecordsintegerOptionalThe number of records successfully processed. Example: 10
..failureCountintegerOptionalThe number of records that failed to process. Example: 0

Requirement 1: Milestone + Rule Expression + Activity Cycles

FitNation Gym is running a "Workout Warrior" challenge for all of November, but it only counts visits at their Location 101 gym. The system will count every check-in event at that specific location, tracking progress week by week. A leaderboard will be active so members can compete and see who is checking in the most. The main goal for customers is to complete 15 separate check-ins at Location 101 before the end of the month. As soon as a member hits their 15th visit, they win the challenge and are automatically upgraded to Tier 2 in the gym's loyalty program.

curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "FitNation Workout Warrior - Nov-UI", "description": "Milestone: 15 Gym Check-ins in Nov at Loc 101. Reward: Tier Upgrade.",

        "orgId": 100737, "programId": 2607, "startDate": "2025-11-01T00:00:00+05:30", "endDate": "2025-11-30T23:59:59+05:30",

        "promotionType": "GENERIC", "status": "DRAFT", "timezoneName": "Asia/Kolkata", "promoIdentifer": "FN_WARRIOR_NOV25_UI",

        "loyaltyConfigMetaData": { }, "loyaltyEarningType": null, "promotionMetadata": []

    },

    "customerEnrolment": { "enrolmentMethod": "TRANSACTION", "audienceGroups": [] },

    "activities": [

        {

            "id": "activity_1761xxxxxx06", "type": "SINGLE", "name": "Track Gym CheckIns", "event": "GymCheckIn",

            "ruleExpression": "event.locationId == 101",

            "frequencyType": "WEEKLY",

            "targetEvaluationType": "CYCLIC_WINDOW",

            "activityCycles": [

                {"id": "ac_w1", "name": "Nov Week 1", "startDate": "2025-11-01", "endDate": "2025-11-09", "refCode":"W1", "isActive": true},

                {"id": "ac_w2", "name": "Nov Week 2", "startDate": "2025-11-10", "endDate": "2025-11-16", "refCode":"W2", "isActive": true},

                {"id": "ac_w3", "name": "Nov Week 3", "startDate": "2025-11-17", "endDate": "2025-11-23", "refCode":"W3", "isActive": true},

                {"id": "ac_w4", "name": "Nov Week 4", "startDate": "2025-11-24", "endDate": "2025-11-30", "refCode":"W4", "isActive": true}

            ],

            "milestones": [

                {

                    "name": "Achieve 15 Check-Ins",

                    "description": "Complete 15 Gym Check-ins at Location 101 during November.",

                    "trackingType": "DEFAULT",

                    "targetType": "VISIT",

                    "targetEntity": "EVENT",

                    "defaultValue": "15",

                    "targetValue": "15",

                    "preferredTillId": null,

                    "frequencyType": "PROMOTION_DURATION",

                    "targetEvaluationType": "CYCLIC_WINDOW",

                    "recurringCycles": 1,

                    "targetGroupId": 112233,

                    "leaderboardEnabled": true,

                    "aggregateFunction": "COUNT",

                    "cycleActionMapping": [

                        {

                            "cycle": "Cycle_1",

                            "startDate": "2025-11-01",

                            "endDate": "2025-11-30",

                            "defaultValue": "15",

                            "actions": [

                                {

                                    "id": "temp_action_tierup",

                                    "actionName": "UPGRADE_SLAB_ACTION_SLAB",

                                    "actionClass": "com.capillary.shopbook.pointsengine.endpoint.impl.action.UpgradeSlabActionImpl",

                                    "description": "Upgrade to Tier 2",

                                    "mandatoryComplexPropertiesValues": {},

                                    "mandatoryPropertiesValues": {

                                        "EvaluatedEntity": "USER",

                                        "ToSlabSerialNumber": "2",

                                        "TierBasedExpiry": "0"

                                    },

                                    "embeddedStrategies": []

                                }

                            ]

                        }

                    ],

                    "streaks": [], "cycles": [],

                    "periods": [],

                    "targetRuleIds": [], "individualMilestoneFileDetails": []

                }

            ],

            "commonCycleActionMapping": [],

            "cycles": []

        }

    ],

    "limits": [], "liabilityOwnerSplitInfo": [],

    "workflowMetadata": { "optin": { "activities": [], "audienceMapping": [] }, "enrolment": { "activities": [], "audienceMapping": [] } }

}'
Requirement 2: Group (ANY) + Nested Group (ALL) + Ruleset + Cycles

Gourmet Galaxy Foods has a "Dinner Special" promotion that awards points, but it's only active during specific dinner hours. To get the points, a customer must meet one of two conditions: they can either just buy a 'Premium Steak', OR they must buy an 'Organic Salad', an 'Artisan Bread', and have their total transaction be over $30, all in the same purchase. The system uses special internal rules (rulesets) to validate this bundle and to apply the reward only during the specified dinner-hour cycle.

curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "Gourmet Galaxy Dinner Special-UI", "description": "Points for Steak OR (Salad AND Bread AND >$30), dinner hours only.",

        "orgId": 100737, "programId": 2607, "startDate": "2025-11-01T00:00:00+05:30", "endDate": "2025-11-30T23:59:59+05:30",

        "promotionType": "LOYALTY_EARNING", "status": "DRAFT", "timezoneName": "Asia/Kolkata", "promoIdentifer": "GG_DINNER_NOV25_UI",

        "loyaltyConfigMetaData": { }, "loyaltyEarningType": "DIRECT_EARN", "promotionMetadata": []

    },

    "customerEnrolment": { "enrolmentMethod": "TRANSACTION", "audienceGroups": [] },

    "activities": [

        {

            "id": "group_1761xxxxxx07", "type": "GROUP", "name": "Dinner Special Check (ANY)", "combinationType": "ANY", "event": "TransactionAdd",

            "cycles": [

                {"id":"c_dinner", "name":"Dinner Hours", "startDate":"2025-11-01T18:00:00+05:30", "endDate":"2025-11-30T22:00:00+05:30"}

            ],

            "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

            "children": [

                {

                    "id": "sub_activity_1761xxxxxx08", "parentId": "group_1761xxxxxx07",

                    "name": "Bought Premium Steak", "type": "SINGLE",

                    "expJSON": "{ \"arity\": \"binary_operation\", ... \"value\": \"GG-STK-01\" }",

                    "milestones": [ { "name": "Default Milestone Steak", "trackingType": "DEFAULT", "leaderboardEnabled": false } ],

                    "cycles": [], "activityCycles": [], "commonCycleActionMapping": []

                },

                {

                    "id": "sub_group_1761xxxxxx09", "parentId": "group_1761xxxxxx07",

                    "name": "Side Bundle Check (ALL)", "type": "GROUP", "combinationType": "ALL",

                    "rulesetId": "SIDE_BUNDLE",

                    "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

                    "children": [

                        {

                            "id": "sub_sub_activity_10", "parentId": "sub_group_1761xxxxxx09", "name": "Bought Organic Salad", "type": "SINGLE",

                            "expJSON": "{ \"arity\": \"binary_operation\", ..., \"value\": \"Salad\" }",

                            "milestones": [ { "name": "Default Milestone Salad", "trackingType": "DEFAULT", "leaderboardEnabled": false } ],

                            "cycles": [], "activityCycles": [], "commonCycleActionMapping": []

                        },

                        {

                            "id": "sub_sub_activity_11", "parentId": "sub_group_1761xxxxxx09", "name": "Bought Artisan Bread", "type": "SINGLE",

                            "expJSON": "{ \"arity\": \"binary_operation\", ..., \"value\": \"Bread\" }",

                            "milestones": [ { "name": "Default Milestone Bread", "trackingType": "DEFAULT", "leaderboardEnabled": false } ],

                            "cycles": [], "activityCycles": [], "commonCycleActionMapping": []

                        },

                        {

                            "id": "sub_sub_activity_12", "parentId": "sub_group_1761xxxxxx09", "name": "Transaction > $30", "type": "SINGLE",

                            "expJSON": "{ \"arity\": \"binary_operation\", ..., \"value\": \">\", ... \"value\": \"30\" }",

                            "milestones": [ { "name": "Default Milestone Amount", "trackingType": "DEFAULT", "leaderboardEnabled": false } ],

                            "cycles": [], "activityCycles": [], "commonCycleActionMapping": []

                        }

                    ],

                    "cycles": [], "commonCycleActionMapping": []

                }

            ],

            "commonCycleActionMapping": [

                {

                    "cycle": "c_dinner",

                    "startDate": "2025-11-01T18:00:00+05:30",

                    "endDate": "2025-11-30T22:00:00+05:30",

                    "rulesetId": "DINNER_REWARD_RULES",

                    "actions": [

                        {

                            "id": "temp_action_dinnerpts", "actionName": "AWARD_POINTS_ACTION", "actionClass":"...",

                            "description":"Award 150 Dinner Special Points",

                            "mandatoryPropertiesValues": {"AwardStrategy":"111728","ExpiryStrategy":"121544"},

                            "mandatoryComplexPropertiesValues": {}, "embeddedStrategies": []

                        }

                    ]

                }

            ]

        }

    ],

    "limits": [], "liabilityOwnerSplitInfo": [],

    "workflowMetadata": { "optin": { "activities": [], "audienceMapping": [] }, "enrolment": { "activities": [], "audienceMapping": [] } }

}'

Limits Object

Specifies system-enforced limits for issuance and redemption. This is an array, so you can define multiple limit objects.

Field

Type

Required

Description

entityScope

enum

Optional

Specifies the scope of the limit.

Supported values:

PROMOTION: The limit applies only to rewards generated by this specific promotion.
PROGRAM: The limit applies across the entire loyalty program affecting rewards from all promotions sharing this program ID

Default Values: PROMOTION.

granularity

enum

Optional

Specifies the tracking level for the limit.

Supported values:

  • OVERALL: Limits the total count/sum across all customers combined.
  • USER: Limits the count/sum per individual customer.
  • PER_ACTIVITY: Limits the count/sum based on each individual triggering activity instance.

actionType

enum

Optional

Specifies the action type being limited. This restricts the limit to only apply when a specific type of action occurs.

Supported values :

AWARD_POINTS_ACTION: Gives a specific amount of points to the customer.


PE_ISSUE_VOUCHER_ACTION: Issues a digital coupon (voucher) to the customer.


ADVANCE_CURRENCY_ALLOCATION_ACTION:
A more complex way to give points, often based
on rules like percentages or fixed values.


MANAGE_TIER_ACTION: Manages a customer's loyalty tier (e.g., "Upgrade to Gold",
"Renew current tier").


UPGRADE_SLAB_ACTION_SLAB: A specific action to upgrade a customer to a new loyalty tier (slab).


AWARD_BADGE: Gives a digital badge or achievement to the customer.


INITIATE_SUPPLEMENTARY_MEMBERSHIP: Enrolls the customer into a separate, secondary program or subscription.


ENROLL_IN_PROMOTION : Enrolls the customer into another specified promotion.


EARN_PROMOTION_ACTION: Marks the customer as "opted-in" for the current promotion.


CONVERT_POINTS_TO_REWARD_ACTION: Converts a customer's points into a specific item from the reward catalog.

actionSubTypeId

string

Optional

Specifies thelimit to a specific sub-type.
-If actionType is AWARD_CURRENCY, this could be the currency name like "Points" or "Miles".
-If actionType is ISSUE_COUPON, this could be the coupon series ID like "FALLSALE25".

limitType

enum

Optional

Specifies the measure used for limiting.
Supported values:

  • SUM: Limits the total value accumulated
    Eg. maximum 1000 points total.
  • COUNT: Limits the total number of times an action can occur
    Eg. maximum 1 redemption.

limitValue

number

Optional

Specifies the maximum allowable value for the limit.

  • If limitType is COUNT, this is the max number of times.
  • If limitType is SUM, this is the max total value.

period

Object

Conditional

Defines the reset window.
Required if you need to set a reset interval for limits.

See Nested: period Object table below for full stucture.

Nested: period Object

Defines the time window and reset logic for a limit.

Field

Type

Required

Description

periodType

enum

Optional

Defines the reset style for the limit.

  • NON_PERIOD_BASED: The limit applies once for the entire promotion duration and never resets.
  • MOVING_WINDOW: Uses a rolling duration
    Eg., "last 7 days".
  • FIXED_CALENDAR_WINDOW: Resets based on calendar units
    Eg., "every Monday" or "1st of the month".
  • FIXED_WINDOW: The limit is only active during the specific startDate and endDate defined below.

periodUnit

enum

Optional

Specifies the unit of time if periodType is MOVING_WINDOW or FIXED_CALENDAR_WINDOW.

DAYS: Resets daily.
WEEKS: Resets weekly.
MONTHS: Resets monthly.

periodValue

integer

Optional

Specifies the numerical value for the periodUnit
Eg. 1 when periodUnit is MONTHS for a monthly reset.

periodStartDay

enum

Optional

Specifies which day the calendar week starts on. Supported Values: SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY. Required if periodUnit is WEEKS and periodType is FIXED_CALENDAR_WINDOW.

startDate

string (date-time)

Optional

The exact date/time this limit becomes active.
Time format : ISO 8601 date-time string. Required if periodType is FIXED_WINDOW.
Example: "2025-01-01T00:00:00Z"

endDate

string (date-time)

Optional

The exact date and time when this limit becomes inactive.
Supported Values: ISO 8601 date-time string. Example: "2025-12-31T23:59:59Z"
Required if periodType is FIXED_WINDOW.

Requirement 1: User Limit (Count, Calendar Week)

Fresh Juice Bar has configured a promotion for their B5G1_JUICE coupon. To manage its distribution, they have set a rule limiting how many coupons a single customer can earn: each customer is limited to receiving a maximum of 2 coupons. This limit resets every calendar week, which the brand has defined as starting on a Sunday.

curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "Fresh Juice Weekly Coupon Limit-UI", "description": "Limit B5G1_JUICE coupon to 2 per user per week (Sun-Sat).",

        "orgId": 100737, "programId": 2607, "startDate": "2025-12-01T00:00:00+05:30", "endDate": "2025-12-31T23:59:59+05:30",

        "promotionType": "GENERIC", "status": "DRAFT", "timezoneName": "Asia/Kolkata", "promoIdentifer": "JUICE_LIMIT_DEC25_UI",

        "loyaltyConfigMetaData": { }, "loyaltyEarningType": null, "promotionMetadata": []

    },

    "customerEnrolment": { "enrolmentMethod": "TRANSACTION", "audienceGroups": [] },

    "activities": [

        {

            "id": "activity_1761xxxxxxa1", "type": "SINGLE", "name": "Issue B5G1 Coupon", "event": "TransactionAdd",

            "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

            "commonCycleActionMapping": [{

                "cycle": "Cycle_1", "startDate": "2025-12-01", "endDate": "2025-12-31",

                "actions": [{

                    "id": "temp_action_b5g1", "actionName": "PE_ISSUE_VOUCHER_ACTION", "actionClass":"...",

                    "mandatoryPropertiesValues": {"VoucherSeriesId": "B5G1_JUICE"}, "embeddedStrategies": []

                }]

            }],

            "milestones": [], "cycles": [], "activityCycles": []

        }

    ],

    "limits": [

        {

            "granularity": "USER",

            "actionType": "PE_ISSUE_VOUCHER_ACTION",

            "actionSubTypeId": "B5G1_JUICE",

            "limitType": "COUNT",

            "limitValue": 2,

            "period": {

                "periodType": "FIXED_CALENDAR_WINDOW",

                "periodUnit": "WEEKS",

                "periodValue": 1,

                "periodStartDay": "SUNDAY"

            }

        }

    ],

    "liabilityOwnerSplitInfo": [],

    "workflowMetadata": { "optin": { "activities": [], "audienceMapping": [] }, "enrolment": { "activities": [], "audienceMapping": [] } }

}'
Requirement 2: Overall Limit (Sum, Moving Window)
Brand Requirement: Global Gadgets (Org 100737, Prog 2607). Limit total Points (SUM) across ALL customers (OVERALL) to 1,000,000 in any 30-day MOVING_WINDOW.

curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "Global Gadgets Points Promo w Overall Limit-UI", "description": "Overall promo limit: Max 1M points total awarded in any 30-day window.",

        "orgId": 100737, "programId": 2607, "startDate": "2026-02-01T00:00:00+05:30", "endDate": "2026-04-30T23:59:59+05:30",

        "promotionType": "LOYALTY_EARNING", "status": "DRAFT", "timezoneName": "Asia/Kolkata", "promoIdentifer": "GG_LIMIT_ROLL_Q126_UI",

        "loyaltyConfigMetaData": { }, "loyaltyEarningType": "DIRECT_EARN", "promotionMetadata": []

    },

    "customerEnrolment": { "enrolmentMethod": "TRANSACTION", "audienceGroups": [] },

    "activities": [

        {

            "id": "activity_1761xxxxxxa2", "type": "SINGLE", "name": "Award Points", "event": "TransactionAdd",

            "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

            "commonCycleActionMapping": [ {

                "cycle": "Cycle_1", "startDate": "2026-02-01", "endDate": "2026-04-30",

                "actions": [ {

                    "id": "temp_action_pts_lim", "actionName": "AWARD_POINTS_ACTION", "actionClass":"...",

                    "mandatoryPropertiesValues": { "AwardStrategy":"109010", "ExpiryStrategy": "109006", "PointType": "Points" },

                    "embeddedStrategies": []

                } ]

            } ],

            "milestones": [], "cycles": [], "activityCycles": []

        }

    ],

    "limits": [

        {

            "granularity": "OVERALL",

            "actionType": "AWARD_CURRENCY",

            "actionSubTypeId": "Points",

            "limitType": "SUM",

            "limitValue": 1000000,

            "period": {

                "periodType": "MOVING_WINDOW",

                "periodValue": 30,

                "periodUnit": "DAYS"

            }

        }

    ],

    "liabilityOwnerSplitInfo": [],

    "workflowMetadata": { "optin": { "activities": [], "audienceMapping": [] }, "enrolment": { "activities": [], "audienceMapping": [] } }

}'

The liabilityOwnerSplitInfo Object

Defines how the reward liability (cost) is financially distributed. This is an array, so you can define multiple split objects.

Field

Type

Required

Description

orgId

integer

Optional

The Organization ID of the entity bearing this portion of the cost. Supported Values: A valid integer orgId.

liabilityOwnerId

integer

Optional

The specific ID of the entity that owns this liability.

  • If liabilityOwnerType is PROGRAM, this is the Program ID.
  • If liabilityOwnerType is PARTNER, this is the Partner ID. Supported Values: A valid Program or Partner ID. Example: 229 (representing the "Diamond" program).

componentType

enum

Optional

Specifies what this liability split is for.

  • PROMOTION: (Default) The cost split applies only to this specific promotion.
  • PROGRAM: The split applies to the entire program (less common).

ratio

number

Optional

The percentage (0-100) of the total liability this owner will cover. The sum of all ratio values in the liabilityOwnerSplitInfo array should equal 100. Supported Values: Number between 0 and 100. Example: 50 (for 50%).

liabilityOwnerType

enum

Optional

Specifies if the owner is an internal program or an external partner.

  • PROGRAM: Liability is assigned to one of your own loyalty programs.
  • PARTNER: Liability is assigned to an external partner entity.

active

boolean

Optional

Indicates if this specific split rule is active. If set to false, this split entry is ignored. Supported Values: true, false. Example: true

Requirement 1: Two-Way Split (Program/Program)

The brand has set up a promotion where the cost (liability) associated with the points awarded needs to be shared. The condition is: for any points given out by this promotion, the cost will be split equally (50/50) between two internal loyalty programs, specifically the "HiddenGemDefaultProgram" (ID 181, Org 51174) and the "Diamond" program (ID 229, Org 51174). This cost-sharing rule is active.

curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "Liability Split Check - Prog Prog-UI", "description": "Split liability 50/50 between HiddenGem (181) and Diamond (229) programs.",

        "orgId": 51174, "programId": 181, "startDate": "2025-11-20T00:00:00+05:30", "endDate": "2025-12-31T23:59:59+05:30",

        "promotionType": "LOYALTY_EARNING", "status": "DRAFT", "timezoneName": "Asia/Kolkata", "promoIdentifer": "LIABILITY_SPLIT_PROGPROG_UI",

        "loyaltyConfigMetaData": { }, "loyaltyEarningType": "DIRECT_EARN", "promotionMetadata": []

    },

    "customerEnrolment": { "enrolmentMethod": "TRANSACTION", "audienceGroups": [] },

    "activities": [

        {

            "id": "activity_1761xxxxxxb1", "type": "SINGLE", "name": "Award Points", "event": "TransactionAdd",

            "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

            "commonCycleActionMapping": [ {

                "cycle": "Cycle_1", "startDate": "2025-11-20", "endDate": "2025-12-31",

                "actions": [ {

                    "id": "temp_action_pts_split", "actionName": "AWARD_POINTS_ACTION", "actionClass":"...",

                    "description": "100 Points", "mandatoryPropertiesValues": { "AwardStrategy":"109010", "ExpiryStrategy": "109436", "PointType":"Main" },

                    "embeddedStrategies": []

                } ]

            } ],

            "milestones": [], "cycles": [], "activityCycles": []

        }

    ],

    "limits": [],

    "liabilityOwnerSplitInfo": [

        {

            "liabilityOwnerId": 181, "componentType": "PROMOTION", "ratio": 50, "isActive": true,

            "liabilityOwnerName": "HiddenGemDefaultProgram", "liabilityOwnerType": "PROGRAM", "orgId": 51174

        },

        {

            "liabilityOwnerId": 229, "componentType": "PROMOTION", "ratio": 50, "isActive": true,

            "liabilityOwnerName": "Diamond", "liabilityOwnerType": "PROGRAM", "orgId": 51174

        }

    ],

    "workflowMetadata": { "optin": { "activities": [], "audienceMapping": [] }, "enrolment": { "activities": [], "audienceMapping": [] } }

}'
Requirement 2: Program Only (100%)

Digital Hub has set up a standard promotion linked to their main loyalty program (Org 100737, Prog 2607). For any rewards issued by this promotion, the configuration explicitly states: the full 100% of the cost (liability) is assigned solely to the main loyalty program (ID 2607). This setup confirms the default scenario where the program itself covers all expenses for the rewards given.

curl --location 'https://nightly.intouch.capillarytech.com/intouch-api/v3/unifiedPromotions' \

--header 'cookie: ...' \

--header 'content-type: application/json' \

--header 'x-cap-remote-user: 50786981' \

--data '{

    "metadata": {

        "name": "Digital Hub Standard Points - 100 Liability-UI", "description": "Standard points promo, 100% program liability.",

        "orgId": 100737, "programId": 2607, "startDate": "2025-12-01T00:00:00+05:30", "endDate": "2025-12-31T23:59:59+05:30",

        "promotionType": "LOYALTY_EARNING", "status": "DRAFT", "timezoneName": "Asia/Kolkata", "promoIdentifer": "DH_STD_LIAB_DEC25_UI",

        "loyaltyConfigMetaData": { }, "loyaltyEarningType": "DIRECT_EARN", "promotionMetadata": []

    },

    "customerEnrolment": { "enrolmentMethod": "TRANSACTION", "audienceGroups": [] },

    "activities": [

        {

            "id": "activity_1761xxxxxxa6", "type": "SINGLE", "name": "Standard Points", "event": "TransactionAdd",

            "expJSON": "{\n  \"arity\": \"literal\",\n  \"type\": \"boolean:primitive\",\n  \"value\": \"true\"\n}",

            "commonCycleActionMapping": [{

                "cycle": "Cycle_1", "startDate": "2025-12-01", "endDate": "2025-12-31",

                "actions": [{

                    "id": "temp_action_std_pts", "actionName": "AWARD_POINTS_ACTION", "actionClass": "...",

                    "description": "Award Standard Points",

                    "mandatoryPropertiesValues": { "AwardStrategy":"109010", "ExpiryStrategy": "109006" },

                    "embeddedStrategies": []

                }]

            }],

            "milestones": [], "cycles": [], "activityCycles": []

        }

    ],

    "limits": [],

    "liabilityOwnerSplitInfo": [

        {

            "liabilityOwnerId": 2607,

            "componentType": "PROMOTION",

            "ratio": 100,

            "isActive": true,

            "liabilityOwnerName": "Default Program Name",

            "liabilityOwnerType": "PROGRAM",

            "orgId": 100737

        }

    ],

    "workflowMetadata": { "optin": { "activities": [], "audienceMapping": [] }, "enrolment": { "activities": [], "audienceMapping": [] } }

}'

Example response

{
    "data": {
        "metadata": {
            "name": "Efd Activity Based Prom11",
            "description": "Enrollment for all members, requires activity-based opt-in.",
            "programId": "HiddenGemDefaultProgram_ID",
            "orgId": 51174,
            "startDate": "2025-11-27T05:30:00+05:30",
            "endDate": "2025-12-28T05:29:59+05:30",
            "timezoneName": "Asia/Kolkata",
            "promotionType": "LOYALTY",
            "status": "DRAFT",
            "promoIdentifer": null,
            "promotionId": 0,
            "createdOn": "2025-10-21T20:43:08+05:30",
            "lastModifiedOn": "2025-10-21T20:43:08+05:30",
            "createdBy": 0,
            "lastModifiedBy": 0,
            "loyaltyEarningType": null,
            "version": null,
            "draftDetails": null,
            "loyaltyConfigMetaData": {
                "isStackable": false,
                "isConsideredForRanking": false,
                "isExclusive": false,
                "isAlwaysApply": false
            },
            "promotionMetadata": null,
            "commonStrategies": null
        },
        "customerEnrolment": {
            "enrolmentMethod": "TRANSACTION"
        },
        "activities": [
            {
                "type": "SINGLE",
                "id": "activity_reward_trigger",
                "name": "Main Reward Activity",
                "commonCycleActionMapping": [
                    {
                        "cycle": "cycle_promo_period",
                        "actions": [
                            {
                                "id": "action_award_points",
                                "actionName": "AWARD_CURRENCY",
                                "actionClass": "com.capillary.loyalty.engine.actor.promotion.actions.AwardCurrency",
                                "mandatoryPropertiesValues": {
                                    "POINTS_TO_AWARD": "100",
                                    "CURRENCY_IDENTIFIER": "POINTS"
                                }
                            }
                        ],
                        "startDate": "2025-11-27",
                        "endDate": "2025-12-27"
                    }
                ],
                "event": "TransactionAdd",
                "allCycles": []
            }
        ],
        "comments": null,
        "parentId": null,
        "version": 1,
        "limits": [],
        "liabilityOwnerSplitInfo": [],
        "id": "68f7a304fd5b970d1efaf626",
        "workflowMetadata": {
            "enrolment": {
                "basedOn": null,
                "activities": null,
                "audienceMapping": null,
                "restrictions": null
            },
            "optin": {
                "basedOn": "ACTIVITY",
                "audienceMapping": null,
                "activities": [
                    {
                        "type": "SINGLE",
                        "id": "activity_optin_trigger",
                        "name": "Opt-in Trigger Activity",
                        "event": "TransactionAdd",
                        "allCycles": []
                    }
                ],
                "restrictions": null
            }
        }
    },
    "errors": null,
    "warnings": null
}

Response body parameters

FieldTypeDescription
dataObjectThe main data object for the promotion (UnifiedPromotion).
.idStringSpecifies the unique system-generated identifier for the unified promotion.
.metadataObjectDefines the object containing all metadata for the promotion (MetadataResponse).
..nameStringSpecifies the name of the promotion.
..descriptionStringSpecifies the description of the promotion.
..programIdStringSpecifies the program ID associated with the promotion.
..orgIdInteger (int64)Specifies the organization ID.
..startDateString (date-time)Specifies the start date and time of the promotion in ISO 8601 format.
..endDateString (date-time)Specifies the end date and time of the promotion in ISO 8601 format.
..timezoneNameStringSpecifies the timezone name for the promotion's schedule.
..promotionTypeStringSpecifies the type of promotion (e.g., "LOYALTY", "GENERIC", "DISCOUNT").
..statusStringIndicates the current status of the promotion (e.g., DRAFT, ACTIVE).
..promoIdentiferStringSpecifies a unique string identifier for the promotion (may be system-generated).
..promotionIdInteger (int32)Specifies the legacy numerical promotion ID (system assigned).
..createdOnString (date-time)Specifies the creation timestamp (system-set).
..lastModifiedOnString (date-time)Specifies the last modification timestamp (system-set).
..createdByInteger (int32)Specifies the user ID of the creator (system-set).
..lastModifiedByInteger (int32)Specifies the user ID of the last modifier (system-set).
..loyaltyEarningTypeStringIndicates the loyalty earning type (e.g., DIRECT_EARN, ISSUE_AND_EARN, null).
..versionStringSpecifies the version string of the promotion (system managed).
..draftDetailsObjectDefines details if the promotion is a draft (DraftDetails).
...idStringSpecifies the draft's unique ID.
...statusStringSpecifies the draft's status.
...versionInteger (int32)Specifies the draft version number.
...lastModifiedByInteger (int32)Specifies the user who last modified the draft.
...lastModifiedOnString (date-time)Specifies when the draft was last modified.
..loyaltyConfigMetaDataObjectDefines loyalty-specific configurations (LoyaltyConfigMetaDto).
...isStackableBooleanIndicates if the promotion is stackable.
...isConsideredForRankingBooleanIndicates if the promotion is considered for ranking.
...isExclusiveBooleanIndicates if the promotion is exclusive.
...isAlwaysApplyBooleanIndicates if the promotion should always apply.
...skipEarnedDateCheckOnRedeemBooleanIndicates if the earned date check should be skipped on redemption.
..promotionMetadataArray (Object)Defines a list of custom key-value metadata pairs (PromotionMetadata).
...isBrandDefinedStringSpecifies if the metadata is defined by the brand.
...keyStringSpecifies the metadata key.
...valueStringSpecifies the metadata value.
..commonStrategiesObjectDefines common strategies, like expiry (CommonStrategies).
...expiryArray (Object)Defines a list of expiry strategies (StrategyInfo).
....strategyTypeIdInteger (int32)Specifies the strategy type ID.
....propertyValuesStringSpecifies the property values for the strategy.
....ownerStringSpecifies the owner of the strategy.
....updatedViaNewUIBooleanIndicates if the strategy was updated via the new UI.
....useCommonExpiryStrategyBooleanIndicates if the common expiry strategy is used.
....strategyRefStringSpecifies the strategy reference.
....strategySubTypeStringIndicates the strategy sub-type (e.g., ROLLING_EXPIRY_STRATEGY).
..promotionModeStringIndicates the promotion mode (e.g., LEGACY, UNIFIED).
.customerEnrolmentObjectDefines the customer enrolment rules (CustomerEnrolment).
..enrolmentMethodStringIndicates the method of customer enrolment (e.g., TRANSACTION, IMPORT, AUDIENCE_FILTER).
..audienceGroupsArray (Object)Defines a list of audience groups for enrolment (AudienceGroupDetails).
...audienceGroupIdInteger (int64)Specifies the unique ID for the audience group.
...audienceGroupNameStringSpecifies the name of the audience group.
...descriptionStringSpecifies the description of the audience group.
.activitiesArray (Object)Defines a list of activities (SingleActivity or GroupActivity).
..idStringSpecifies the unique ID for the activity.
..typeStringSpecifies the type of the activity (SINGLE or GROUP).
..nameStringSpecifies the name of the activity.
..refIdStringSpecifies the reference ID for the activity.
..parentIdStringSpecifies the parent activity's ID (if nested in a group).
..rulesetIdStringSpecifies the ruleset ID for the activity.
..cyclesArray (Object)Defines a list of general cycles (Cycle).
...idstringSpecifies the cycle ID.
...namestringSpecifies the cycle name.
...startDatestring (date-time)Specifies the cycle start date.
...endDatestring (date-time)Specifies the cycle end date.
..commonCycleActionMappingArray (Object)Defines action mappings for common cycles (CycleActionMapping).
...cycleStringSpecifies the cycle name/ID.
...defaultValueNumber (double)Specifies the default value for the action.
...startDateString (date-time)Specifies the cycle mapping start date.
...endDateString (date-time)Specifies the cycle mapping end date.
...rulesetIdStringSpecifies the cycle mapping ruleset ID.
...actionsArray (Object)Defines a list of actions (Action).
....idStringSpecifies the action ID.
....actionNameStringSpecifies the action name (e.g., AWARD_POINTS_ACTION).
....actionClassStringSpecifies the action class.
....descriptionStringSpecifies the action description.
....mandatoryPropertiesValuesObjectDefines key-value pairs for mandatory properties.
....mandatoryComplexPropertiesValuesObjectDefines key-value pairs for mandatory complex properties.
....embeddedStrategiesArray (Object)Defines a list of embedded StrategyInfo objects.
..eventString(SingleActivity) Specifies the event associated with the activity.
..ruleExpressionString(SingleActivity/GroupActivity) Specifies the rule expression.
..expJSONString(SingleActivity/GroupActivity) Specifies the rule expression in JSON format.
..frequencyTypeString(SingleActivity) Specifies the frequency type.
..targetEvaluationTypeString(SingleActivity) Specifies the target evaluation type (e.g., CYCLIC_WINDOW).
..targetCycleStartDateString (date-time)(SingleActivity) Specifies the target cycle start date.
..targetCycleEndDateString (date-time)(SingleActivity) Specifies the target cycle end date.
..activityCyclesArray (Object)(SingleActivity) Defines activity-specific cycles (ActivityCycle).
...idstringSpecifies the activity cycle ID.
...namestringSpecifies the activity cycle name.
...startDatestringSpecifies the activity cycle start date.
...endDatestringSpecifies the activity cycle end date.
...refCodestringSpecifies the activity cycle reference code.
...isActivebooleanIndicates if the activity cycle is active.
..milestonesArray (Object)(SingleActivity) Defines milestones (Milestone).
...namestringSpecifies the milestone name.
...sameActionsForEveryCyclebooleanIndicates if the same actions apply across all cycles.
...differentTargetsForEveryCyclebooleanIndicates if target values differ across cycles.
...descriptionstringIndicates the milestone description.
...trackingTypestringSpecifies how the milestone is tracked (e.g., DEFAULT, STREAKS).
...targetTypeenumDefines the KPI to track (e.g., SALES, COUNT, VISIT).
...targetEntityenumSpecifies the entity to track against (e.g., TRANSACTION, LINEITEM).
...defaultValuestringSpecifies the target value threshold.
...targetValuestringSpecifies the target value to achieve.
...preferredTillIdinteger (int64)Indicates a preferred till ID.
...frequencyTypestringSpecifies the frequency type for evaluation (e.g., PROMOTION_DURATION).
...targetEvaluationTypeenumSpecifies the evaluation logic window (e.g., FIXED_CALENDAR_WINDOW).
...recurringCyclesinteger (int32)Specifies the number of recurring cycles.
...targetGroupIdinteger (int64)Indicates the target group ID.
...leaderboardEnabledbooleanIndicates if a leaderboard is enabled.
...cycleActionMappingArray (Object)Specifies actions associated with milestone cycles. (Repeats commonCycleActionMapping structure).
...streaksArray (Object)Defines streak configuration (StreakConfig).
....namestringSpecifies the streak name.
....targetCountOfSequenceinteger (int32)Specifies the required count to achieve the streak.
....consecutivebooleanIndicates if the sequence must be consecutive.
...aggregateFunctionstringSpecifies the function to aggregate values (e.g., SUM, COUNT).
...cyclesArray (Object)Defines the evaluation cycles specific to this milestone. (Repeats cycles structure).
...periodsArray (Object)Defines the periods for the milestone. (Repeats activityCycles structure).
...targetRuleIdsArray (integer int64)Indicates associated target rule IDs.
...individualMilestoneFileDetailsArray (Object)Details related to uploaded files for individual targets.
....uploadFileNamestringThe original name of the uploaded file.
....fileUrlstringThe system URL where the file is stored.
....statusstringThe processing status of the file.
....totalRecordsintegerThe total number of records found in the file.
....successRecordsintegerThe number of records successfully processed.
....failureCountintegerThe number of records that failed to process.
..allCyclesArray (Object)Defines a list of all cycles (system populated).
..combinationTypeString(GroupActivity) Indicates how child activities are combined (e.g., ANY, ALL).
..childrenArray (Object)(GroupActivity) Defines a nested list of child GroupActivity or SingleActivity objects.
.commentsStringSpecifies any comments on the promotion.
.parentIdStringSpecifies the ID of the parent promotion.
.parentDetailsObjectDefines details of the parent promotion (ParentDetails).
..idStringSpecifies the parent promotion ID.
..statusStringSpecifies the parent promotion status.
..versionInteger (int32)Specifies the parent promotion version.
..lastModifiedByInteger (int32)Specifies the user who last modified the parent.
..lastModifiedOnString (date-time)Specifies when the parent was last modified.
.versionInteger (int32)Specifies the version number of the promotion.
.limitsArray (Object)Defines a list of limits for the promotion (LimitResponse).
..idInteger (int64)Specifies the limit ID (system-assigned).
..entityScopeStringIndicates the scope of the limit (e.g., PROGRAM, PROMOTION).
..granularityStringIndicates the granularity of the limit (e.g., OVERALL, USER).
..entityIdInteger (int64)Specifies the entity ID the limit applies to.
..actionTypeStringIndicates the action type being limited (e.g., AWARD_CURRENCY).
..actionSubTypeIdStringSpecifies the action sub-type ID (e.g., POINTS).
..limitTypeStringIndicates the type of limit (e.g., SUM, COUNT).
..limitValueNumberSpecifies the value of the limit.
..periodObjectDefines the time period for the limit (LimitPeriodResponse).
...idInteger (int64)Specifies the period ID (system-assigned).
...periodTypeStringIndicates the type of period (e.g., NON_PERIOD_BASED).
...periodUnitStringIndicates the unit for the period (e.g., DAYS, WEEKS, MONTHS).
...periodValueInteger (int32)Specifies the value for the period.
...periodStartDayStringIndicates the start day for weekly periods (e.g., SUNDAY).
...startDateString (date-time)Specifies the fixed start date for the period.
...endDateString (date-time)Specifies the fixed end date for the period.
..createdOnString (date-time)Specifies the creation timestamp of the limit.
..createdByInteger (int64)Specifies the user ID of the limit creator.
..lastUpdatedOnString (date-time)Specifies the last update timestamp of the limit.
..lastUpdatedByInteger (int64)Specifies the user ID of the last updater.
..activeBooleanIndicates if the limit is active.
.liabilityOwnerSplitInfoArray (Object)Defines how liability is split (LiabilityOwnerSplitInfo).
..orgIdInteger (int32)Specifies the organization ID.
..liabilityOwnerIdInteger (int32)Specifies the liability owner ID.
..componentIdInteger (int32)Specifies the component ID.
..componentTypeStringIndicates the component type (e.g., PROGRAM, PROMOTION).
..createdByInteger (int32)Specifies the user ID of the creator.
..ratioNumber (double)Specifies the liability split ratio (0-100).
..liabilityOwnerNameStringSpecifies the liability owner's name.
..liabilityOwnerTypeStringIndicates the liability owner's type (e.g., PARTNER, PROGRAM).
..activeBooleanIndicates if the split info is active.
.workflowMetadataObjectDefines workflow metadata for enrolment and opt-in (WorkflowMetadata).
..enrolmentObjectDefines enrolment workflow details (EnrolmentResponse).
...basedOnStringIndicates the basis for enrolment (e.g., ACTIVITY, AUDIENCE).
...activitiesArray (Object)Defines activities triggering enrolment.
...audienceMappingArray (Object)Defines audience mappings for enrolment.
....groupIdInteger (int64)Specifies the group ID.
....groupNameStringSpecifies the group name.
...restrictionsObjectDefines enrolment restrictions (PromotionRestrictionsResponse).
....optinExpiryBasedOnObjectDefines opt-in expiry (PromotionExpiryConfigResponse).
.....valueInteger (int32)Specifies the expiry value.
.....expiryDateString (date-time)Specifies the expiry date.
.....typeStringSpecifies the expiry type.
....enrolmentExpiryBasedOnObjectDefines enrolment expiry (PromotionExpiryConfigResponse).
.....valueInteger (int32)Specifies the expiry value.
.....expiryDateString (date-time)Specifies the expiry date.
.....typeStringSpecifies the expiry type.
....optinLimitPerCustomerObjectDefines opt-in limit (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
....maxRedemptionsPerEarnPerCustomerObjectDefines redemption limit (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
....enrolmentLimitPerPromotionObjectDefines total enrolment limit (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
....enrolmentLimitPerCustomerObjectDefines enrolment limit per customer (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
....maxPointsPerEarnPerCustomerObjectDefines max points per earn limit (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
..optinObjectDefines opt-in workflow details (OptinResponse).
...basedOnStringIndicates the basis for opt-in.
...activitiesArray (Object)Defines activities triggering opt-in.
...audienceMappingArray (Object)Defines audience mappings for opt-in.
....groupIdInteger (int64)Specifies the group ID.
....groupNameStringSpecifies the group name.
...restrictionsObjectDefines opt-in restrictions (PromotionRestrictionsResponse).
....optinExpiryBasedOnObjectDefines opt-in expiry (PromotionExpiryConfigResponse).
.....valueInteger (int32)Specifies the expiry value.
.....expiryDateString (date-time)Specifies the expiry date.
.....typeStringSpecifies the expiry type.
....enrolmentExpiryBasedOnObjectDefines enrolment expiry (PromotionExpiryConfigResponse).
.....valueInteger (int32)Specifies the expiry value.
.....expiryDateString (date-time)Specifies the expiry date.
.....typeStringSpecifies the expiry type.
....optinLimitPerCustomerObjectDefines opt-in limit (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
....maxRedemptionsPerEarnPerCustomerObjectDefines redemption limit (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
....enrolmentLimitPerPromotionObjectDefines total enrolment limit (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
....enrolmentLimitPerCustomerObjectDefines enrolment limit per customer (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
....maxPointsPerEarnPerCustomerObjectDefines max points per earn limit (PromotionRestrictionsConfigResponse).
.....valueInteger (int32)Specifies the limit value.
.....typeStringSpecifies the limit period type.
.....periodTypeStringSpecifies the window type.
.....periodUnitStringSpecifies the period unit.
.communicationApprovalStatusObjectDefines the status of communication approval (BulkClaimApproveResponse).
..successBooleanIndicates if the approval status check was successful.
..messageStringSpecifies the status message.
..responseObjectDefines the nested response object.
..statusCodeInteger (int32)Specifies the status code.
errorsArray (Object)Defines a list of errors that occurred, if any (ApiError).
.codeInteger (int64)Specifies the error code.
.messageStringSpecifies the error message.
warningsArray (Object)Defines a list of warnings, if any (ApiWarning).
.messageStringSpecifies the warning message.
Language
URL
Click Try It! to start a request and see the response here!