Approve or reject a benefit that is pending approval.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Approve or Reject Benefit
Reviews a benefit in PENDING_APPROVAL status. Approving publishes the benefit and rejecting returns it to DRAFT for further edits.
- Approve: the benefit transitions to
LIVEif its start date has passed, orUPCOMINGif the start date is still in the future. Approval assigns abenefitIdentifier(a UUID) and aloyaltyBenefitRecordId(an integer), and returns acommunicationApprovalStatusresult.loyaltyBenefitRecordIdis what keeps the benefit's record in sync when it's published to the points engine on each approval. Approving a later edit of the same benefit (a draft fork) updates the same published record rather than creating a duplicate. - Reject: the benefit transitions back to
DRAFTso the maker can revise and resubmit it.
A benefit must be in PENDING_APPROVAL status to be reviewed. Submit a draft with Submit Benefit for Approval.
Example request
curl -X POST "https://eu.intouch.capillarytech.com/v3/benefits/86c29c3653f74c0a9f1b2c3d4e5f6a7b/review" \
-H "Authorization: Basic <base64-encoded-credentials>" \
-H "Content-Type: application/json" \
-d '{
"approvalStatus": "APPROVE",
"comment": "Approved for launch",
"reviewedBy": 123456,
"lastUpdatedBy": 123456
}'Prerequisites
- Authentication: Basic auth or OAuth token with reviewer permissions for loyalty program management.
- The benefit must be in
PENDING_APPROVALstatus.
Resource information
| HTTP method | POST |
|---|---|
| Authentication | Basic or OAuth |
| Pagination supported? | NO |
| Rate limit | YES |
| Batch support | NO |
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
loyaltyBenefitId | string | Required | Unique ID of the benefit to review, returned by Create Benefit. |
Body parameters
| Field | Type | Required | Description |
|---|---|---|---|
approvalStatus | enum | Required | Review decision. Case-sensitive. Supported values: APPROVE: publishes the benefit — transitions to LIVE if the start date has passed, or UPCOMING if it's still in the future, and assigns benefitIdentifier and loyaltyBenefitRecordId, REJECT: returns the benefit to DRAFT so the maker can revise and resubmit it. |
comment | string | Optional | Reviewer's note. Max 150 characters. Returned as comments in the response. |
reviewedBy | integer | Required | Till ID of the reviewer. Retrieve till IDs with the Get Active Tills API. |
lastUpdatedBy | integer | Required | Till ID of the person performing the action. Retrieve till IDs with the Get Active Tills API. |
Example response
The Approved tab shows the response to an APPROVE action where the start date is in the future, so the benefit becomes UPCOMING. The Rejected tab shows the response to a REJECT action, where the benefit returns to DRAFT and benefitIdentifier, loyaltyBenefitRecordId, and communicationApprovalStatus are null.
{
"data": {
"loyaltyBenefitId": "86c29c3653f74c0a9f1b2c3d4e5f6a7b",
"version": 7,
"metadata": {
"name": "Birthday bonus",
"description": "Extra points on birthday month",
"programId": "973",
"orgId": 12345,
"expiryType": "CUSTOM",
"status": "UPCOMING",
"customerEligibilityType": null,
"benefitIdentifier": "5e9f6a2b-1c3d-4e5f-8a7b-9c1d2e3f4a5b",
"loyaltyBenefitRecordId": 287,
"startDate": "2026-08-01T00:00:00+05:30",
"endDate": "2027-01-31T23:59:59+05:30",
"timezoneName": "Asia/Kolkata",
"createdOn": "2026-06-23T14:32:24+05:30",
"lastModifiedOn": "2026-06-23T14:40:31+05:30",
"createdBy": 123456,
"lastModifiedBy": 123456,
"draftDetails": null
},
"benefitCategoryId": -1,
"tierIds": [
8159,
8165
],
"optin": {
"basedOn": null,
"audienceMapping": null,
"activities": null,
"restrictions": null,
"optInStartDate": "2026-08-01T09:00:00+05:30",
"optInEndDate": "2027-01-31T18:00:00+05:30"
},
"activities": [
{
"type": "SINGLE",
"event": "TransactionAdd",
"allCycles": []
}
],
"limits": null,
"configAttributes": null,
"liabilityOwnerSplitInfo": null,
"workflowMetadata": null,
"communicationApprovalStatus": {
"success": true,
"message": "No communications to approve",
"response": null,
"statusCode": 200
},
"parentId": null,
"parentDetails": null,
"comments": "Approved for launch",
"id": "6a3a4ba0c1d2e3f4a5b6c7d8"
},
"errors": null,
"warnings": null
}{
"data": {
"loyaltyBenefitId": "86c29c3653f74c0a9f1b2c3d4e5f6a7b",
"version": 3,
"metadata": {
"name": "Birthday bonus",
"description": "Extra points on birthday month",
"programId": "973",
"orgId": 12345,
"expiryType": "CUSTOM",
"status": "DRAFT",
"customerEligibilityType": null,
"benefitIdentifier": null,
"loyaltyBenefitRecordId": null,
"startDate": "2026-08-01T00:00:00+05:30",
"endDate": "2027-01-31T23:59:59+05:30",
"timezoneName": "Asia/Kolkata",
"createdOn": "2026-06-23T14:32:24+05:30",
"lastModifiedOn": "2026-06-23T14:39:57+05:30",
"createdBy": 123456,
"lastModifiedBy": 123456,
"draftDetails": null
},
"benefitCategoryId": -1,
"tierIds": [8159, 8165],
"optin": {
"basedOn": null,
"audienceMapping": null,
"activities": null,
"restrictions": null,
"optInStartDate": "2026-08-01T09:00:00+05:30",
"optInEndDate": "2027-01-31T18:00:00+05:30"
},
"activities": [
{
"type": "SINGLE",
"event": "TransactionAdd",
"allCycles": []
}
],
"limits": null,
"configAttributes": null,
"liabilityOwnerSplitInfo": null,
"workflowMetadata": null,
"communicationApprovalStatus": null,
"parentId": null,
"parentDetails": null,
"comments": "Needs revised end date",
"id": "6a3a4ba0c1d2e3f4a5b6c7d8"
},
"errors": null,
"warnings": null
}Response parameters
| Field | Type | Description |
|---|---|---|
data | object | Object containing the benefit after the review. Has the same fields as the Get Benefit response. |
.metadata | object | Object containing workflow stage data. |
..status | enum | Stage after the review. LIVE or UPCOMING after approval, DRAFT after rejection. Possible values: DRAFT, PENDING_APPROVAL, LIVE, UPCOMING, PAUSED, STOPPED. |
..benefitIdentifier | string | Identifier assigned on approval, a UUID. null after rejection. |
..loyaltyBenefitRecordId | integer | Record ID assigned on approval. null after rejection. |
.communicationApprovalStatus | object | Object containing the communication approval result, set on approval. null after rejection. |
..success | boolean | true if the communication approval succeeded. |
..message | string | Result message of the communication approval. |
..response | object | Additional response payload. null when none. |
..statusCode | integer | HTTP status code of the communication approval result. |
.comments | string | Reviewer's note, echoed from the comment field in the request. |
errors | array | Error list. null on success. |
warnings | array | Warning list. null on success. |
Error & warning codes
| Code | Type | Description |
|---|---|---|
loyaltyBenefitId=<id> | Error | No benefit matches the given loyaltyBenefitId. HTTP 404. |
requires status=PENDING_APPROVAL | Error | The benefit is not in PENDING_APPROVAL status, so it can't be reviewed. HTTP 404. |
Note: These errors return a generic numeric code on the wire rather than an error-specific number. The Code column shows the identifying text carried in the error message.
401Authentication failed
404No benefit in PENDING_APPROVAL matches the given loyaltyBenefitId
