Create Benefit

Create a new loyalty benefit in DRAFT status.

Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…

Create Benefit

Creates a new loyalty benefit in DRAFT status for a program. The benefit enters a maker-checker approval workflow: submit it with Submit Benefit for Approval and publish it with Approve or Reject Benefit before it goes live. A new benefit has no benefitIdentifier or loyaltyBenefitRecordId until it's approved.

Example request

curl -X POST "https://eu.intouch.capillarytech.com/v3/benefits" \
  -H "Authorization: Basic <base64-encoded-credentials>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Birthday bonus",
    "description": "Extra points on birthday month",
    "programId": "973",
    "expiryType": "CUSTOM",
    "startDate": "2026-07-01T00:00:00+05:30",
    "endDate": "2026-12-31T23:59:59+05:30",
    "timezoneName": "Asia/Kolkata",
    "tierIds": [8159, 8165],
    "optin": {
      "optInStartDate": "2026-07-01T09:00:00+05:30",
      "optInEndDate": "2026-12-31T18:00:00+05:30"
    },
    "activities": [
      { "type": "SINGLE", "event": "TransactionAdd" }
    ]
  }'

Prerequisites

  • Authentication: Basic auth or OAuth token with loyalty program management permissions.
  • The tiers listed in tierIds must exist in the program.

Resource information

HTTP methodPOST
AuthenticationBasic or OAuth
Pagination supported?NO
Rate limitYES
Batch supportNO

Body parameters

API Quick Reference

Benefit
├── name (string)
├── description (string)
├── programId (string)
├── expiryType (enum)
├── startDate (string)
├── endDate (string)
├── timezoneName (string)
├── tierIds[] (integer)
├── optin
│   ├── optInStartDate (string)
│   └── optInEndDate (string)
└── activities[]
    ├── type (enum)
    └── event (string)
FieldTypeRequiredDescription
namestringRequiredDisplay name of the benefit. Max 255 characters.
descriptionstringRequiredDescription of the benefit. Max 1000 characters.
programIdstringRequiredLoyalty program ID the benefit belongs to, passed as a string (for example, "973"). To retrieve the programId, use the Get Loyalty Programs API.
expiryTypeenumRequiredHow the benefit's validity ends. Case-sensitive. CUSTOM requires endDate. INDEFINITE sets a far-future end date automatically. Supported values: CUSTOM, INDEFINITE.
startDatestringRequiredDefines the benefit's start date and time in ISO 8601 format with the region offset.

For example: The start date is at 14:30:45 on December 16, 2025, in India

Format for the request parameter: 2025-12-16T14:30:45+05:30

Returned unchanged in the response, in the offset you send.
endDatestringConditionalDefines the benefit's end date and time in ISO 8601 format with the region offset.

For example: The end date is at 14:30:45 on December 16, 2025, in India

Format for the request parameter: 2025-12-16T14:30:45+05:30

Required when expiryType is CUSTOM. Omit it for INDEFINITE.
timezoneNamestringRequiredIANA time zone name for the benefit (for example, Asia/Kolkata). Use timezoneName (lowercase z) — this is the correct field name across Capillary APIs.
tierIdsarray (integer)RequiredTier IDs the benefit applies to. Each tier must exist in the program. Retrieve tier IDs with the List All Tiers API.
optinobjectOptionalObject containing the opt-in window during which customers can opt in to the benefit.
.optInStartDatestringOptionalDefines the opt-in window's start date and time in ISO 8601 format with the region offset.

For example: The start date is at 14:30:45 on December 16, 2025, in India

Format for the request parameter: 2025-12-16T14:30:45+05:30
.optInEndDatestringOptionalDefines the opt-in window's end date and time in ISO 8601 format with the region offset.

For example: The end date is at 14:30:45 on December 16, 2025, in India

Format for the request parameter: 2025-12-16T14:30:45+05:30
activitiesarray (object)RequiredActivities that the benefit applies to.
.typeenumRequiredActivity type. Case-sensitive. Supported values: SINGLE.
.eventstringRequiredEvent that triggers the activity (for example, TransactionAdd).

Example response

{
  "data": {
    "loyaltyBenefitId": "a70ae03d0f54486fa9c3f4e8d89ce6e5",
    "version": 0,
    "metadata": {
      "name": "Birthday bonus",
      "description": "Extra points on birthday month",
      "programId": "2352",
      "orgId": "973",
      "expiryType": "CUSTOM",
      "status": "DRAFT",
      "customerEligibilityType": null,
      "benefitIdentifier": null,
      "loyaltyBenefitRecordId": null,
      "startDate": "2026-07-01T11:30:00+05:30",
      "endDate": "2027-01-01T11:29:59+05:30",
      "timezoneName": "Asia/Kolkata",
      "createdOn": "2026-06-23T15:08:08+05:30",
      "lastModifiedOn": "2026-06-23T15:08:08+05:30",
      "createdBy": 50821171,
      "lastModifiedBy": 50821171,
      "draftDetails": null
    },
    "benefitCategoryId": -1,
    "tierIds": [
      8159,
      8165,
      8166,
      10545,
      10656
    ],
    "optin": {
      "basedOn": null,
      "audienceMapping": null,
      "activities": null,
      "restrictions": null,
      "optInStartDate": "2026-07-01T20:30:00+05:30",
      "optInEndDate": "2027-01-01T05:30:00+05:30"
    },
    "activities": [
      {
        "type": "SINGLE",
        "event": "TransactionAdd",
        "allCycles": []
      }
    ],
    "limits": null,
    "configAttributes": null,
    "liabilityOwnerSplitInfo": null,
    "workflowMetadata": null,
    "communicationApprovalStatus": null,
    "parentId": null,
    "parentDetails": null,
    "comments": null,
    "id": "6a3a54007960e562c3e7c1c3"
  },
  "errors": null,
  "warnings": null
}

Response parameters

FieldTypeDescription
dataobjectObject containing the created benefit.
.loyaltyBenefitIdstringUnique ID assigned to the benefit. Use it with Get Benefit, Update Benefit, and the workflow endpoints.
.versionintegerVersion number of the benefit. 0 for a new draft.
.metadataobjectObject containing the benefit's core attributes and audit details.
..namestringDisplay name of the benefit.
..descriptionstringDescription of the benefit.
..programIdstringLoyalty program ID the benefit belongs to.
..orgIdintegerOrg ID derived from the auth token.
..expiryTypeenumHow the benefit's validity ends. Possible values: CUSTOM, INDEFINITE.
..statusenumCurrent stage of the benefit lifecycle. Always DRAFT on creation. Possible values: DRAFT, PENDING_APPROVAL, LIVE, UPCOMING, PAUSED, STOPPED.
..customerEligibilityTypestringCustomer eligibility configuration. null unless advanced eligibility is set up.
..benefitIdentifierstringIdentifier assigned when the benefit is approved. null while the benefit is in DRAFT or PENDING_APPROVAL.
..loyaltyBenefitRecordIdintegerRecord ID assigned when the benefit is approved. null while the benefit is in DRAFT or PENDING_APPROVAL.
..startDatestringDate and time when the benefit starts, in ISO 8601 format. Returned in the offset you sent.
..endDatestringDate and time when the benefit ends, in ISO 8601 format. For INDEFINITE benefits, set to a far-future date automatically.
..timezoneNamestringIANA time zone name, as sent.
..createdOntimestampIndicates the date and time the benefit was created, in ISO 8601 format, returned in the server time zone.

EU server example: 2025-12-16T14:30:45Z → 16 December 2025, 14:30:45 (UTC)

India server example (real capture from this environment): 2026-06-23T14:32:24+05:30 → 23 June 2026, 14:32:24 (IST)

Note: The response time zone always matches the server time zone, regardless of the time zone offset in the request.
..lastModifiedOntimestampIndicates the date and time the benefit was last modified, in ISO 8601 format, returned in the server time zone.

EU server example: 2025-12-16T14:30:45Z → 16 December 2025, 14:30:45 (UTC)

India server example (real capture from this environment): 2026-06-23T14:32:24+05:30 → 23 June 2026, 14:32:24 (IST)

Note: The response time zone always matches the server time zone, regardless of the time zone offset in the request.
..createdByintegerTill ID of the person who created the benefit. Retrieve till IDs with the Get Active Tills API.
..lastModifiedByintegerTill ID of the person who last modified the benefit. Retrieve till IDs with the Get Active Tills API.
..draftDetailsobjectObject containing details of an in-progress draft when a live benefit has an edit underway. null on a new draft.
.benefitCategoryIdintegerBenefit category ID. -1 means no benefit category is assigned.
.tierIdsarrayTier IDs the benefit applies to.
.optinobjectObject containing the opt-in window, as sent. null if no opt-in window was configured.
..basedOnstringOpt-in basis. null unless configured.
..audienceMappingobjectObject containing the opt-in's audience mapping. null unless configured.
..activitiesarrayActivities scoped to the opt-in. null unless configured.
..restrictionsobjectObject containing the opt-in's restrictions. null unless configured.
..optInStartDatestringDate and time when the opt-in window opens, in ISO 8601 format.
..optInEndDatestringDate and time when the opt-in window closes, in ISO 8601 format.
.activitiesarrayActivities the benefit applies to.
..typeenumActivity type. Possible values: SINGLE.
..eventstringEvent that triggers the activity.
..allCyclesarrayCycle entries computed for the activity. Empty on a new draft.
.limitsarrayUsage limits configured for the benefit. null or empty unless limits are configured.
.configAttributesobjectObject containing advanced configuration attributes. null unless configured.
.liabilityOwnerSplitInfoarrayLiability split configuration entries. Each entry defines how liability for the benefit is split. null unless configured. See Get Benefit for entry fields.
.workflowMetadataobjectObject containing additional workflow data. null unless configured.
.communicationApprovalStatusobjectObject containing the communication approval result. null until the benefit is approved.
.parentIdstringID of the parent benefit, when this benefit is a draft fork of a live benefit. null otherwise.
.parentDetailsobjectObject containing details of the parent benefit. null otherwise.
.commentsstringReviewer's note from the most recent workflow action. null until reviewed.
.idstringUnique ID of this benefit record.
errorsarrayError list. null on success.
warningsarrayWarning list. null on success.

Error & warning codes

CodeTypeDescription
LOYALTY_BENEFITS.NAME_REQUIREDErrorname is missing. HTTP 400.
LOYALTY_BENEFITS.DESCRIPTION_REQUIREDErrordescription is missing. HTTP 400.
LOYALTY_BENEFITS.PROGRAM_ID_REQUIREDErrorprogramId is missing. HTTP 400.
LOYALTY_BENEFITS.END_DATE_REQUIRED_FOR_CUSTOMErrorexpiryType is CUSTOM but endDate is missing. HTTP 400.
INVALID_EXPIRYTYPEErrorexpiryType is not INDEFINITE or CUSTOM. HTTP 400.
LOYALTY_BENEFITS.TIER_NOT_FOUNDErrorOne or more IDs in tierIds don't exist in the program. HTTP 400.
Invalid inputErrorAn activities[].type value is not SINGLE. HTTP 400.

Note: Validation errors return a generic numeric code on the wire rather than an error-specific number. The Code column shows the stable symbolic code or message text carried in the error.


Body Params
string
required

Display name of the benefit.

string
required

Description of the benefit.

string
required

Loyalty program ID the benefit belongs to.

string
enum
required

How the benefit's validity ends.

Allowed:
string
required

Defines the benefit's start date and time in ISO 8601 format with the region offset (for example, 2025-12-16T14:30:45+05:30). Returned unchanged in the response, in the offset you send.

string

Defines the benefit's end date and time in ISO 8601 format with the region offset (for example, 2025-12-16T14:30:45+05:30). Required when expiryType is CUSTOM.

string
required

IANA time zone name.

tierIds
array of integers
required

Tier IDs the benefit applies to.

tierIds*
optin
object
activities
array of objects
required
activities*
Headers
string
Responses

201

Benefit created in DRAFT status

400

Validation error: see the error table in the doc page

401

Authentication failed

Language
Credentials
Basic
base64
:
URL
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json