post
https://{Host}/v3/tiers//approve
Recent Requests
Log in to see full request history
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Loading…
Approve or Reject Tier
Approves or rejects a tier in PENDING_APPROVAL status. Approving publishes the tier to the loyalty engine and transitions it to ACTIVE. Rejecting transitions it back to DRAFT and records the reviewer's comment so the maker can revise and resubmit.
Example request
curl -X POST "https://eu.intouch.capillarytech.com/v3/tiers/6a2121936497e74ec3517ad8/approve" \
-H "Authorization: Basic <base64-encoded-credentials>" \
-H "Content-Type: application/json" \
-d '{
"approvalStatus": "REJECT",
"comment": "Threshold needs review before publishing"
}'Prerequisites
- Authentication: Basic auth or OAuth token with reviewer permissions for loyalty program management.
- The tier must be in
PENDING_APPROVALstatus. Find pending tiers with List Pending Tier Approvals. - For approval, the program must have
SLAB_UPGRADEandSLAB_DOWNGRADEstrategies configured.
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
tierId | string | Required | The objectId of the tier to review, from the List Pending Tier Approvals response. |
Body parameters
| Field | Type | Required | Description |
|---|---|---|---|
approvalStatus | enum | Required | Review decision. Must be one of: APPROVE, REJECT. Case-sensitive. |
comment | string | Optional | Reviewer's note. On rejection, it's stored as the rejection comment and returned to the maker. No length limit is enforced. |
Example response
{
"data": {
"objectId": "6a2aad51b1f2f8016a6598bc",
"tierUniqueId": "ut-973-010",
"orgId": 100737,
"programId": 973,
"status": "ACTIVE",
"parentId": null,
"version": 1,
"slabId": 25635,
"name": "Super Platinum",
"description": "Premium tier for top spenders",
"color": "#E5E4E2",
"serialNumber": 10,
"eligibility": {
"kpiType": "CURRENT_POINTS",
"threshold": 100000,
"upgradeType": "LAZY"
},
"validity": {
"periodType": "SLAB_UPGRADE",
"periodValue": 12,
"renewal": {
"criteriaType": "Same as eligibility"
},
"unit": "NUM_MONTHS"
},
"downgrade": null,
"engineConfig": null,
"meta": {
"createdBy": "75237721",
"createdAt": "2026-06-11T12:42:57Z",
"updatedBy": "75237721",
"updatedAt": "2026-06-11T12:55:56Z",
"approvedBy": "75237721",
"approvedAt": "2026-06-11T12:55:56Z",
"rejectedBy": "75237721",
"rejectedAt": "2026-06-11T12:54:37Z",
"rejectionComment": "Threshold needs review before publishing"
},
"comments": null
},
"errors": null,
"warnings": null
}{
"data": {
"objectId": "6a2ab246b1f2f8016a6598bd",
"tierUniqueId": "ut-973-011",
"orgId": 100737,
"programId": 973,
"status": "DRAFT",
"parentId": null,
"version": 1,
"slabId": null,
"name": "Super Duper Platinum ",
"description": "Premium tier for top spenders",
"color": "#E5E4E2",
"serialNumber": 11,
"eligibility": {
"kpiType": "CURRENT_POINTS",
"threshold": 500000.0,
"upgradeType": "LAZY"
},
"validity": {
"periodType": "SLAB_UPGRADE",
"periodValue": 12,
"renewal": {
"criteriaType": "Same as eligibility"
},
"unit": "NUM_MONTHS"
},
"downgrade": null,
"engineConfig": null,
"meta": {
"createdBy": "75237721",
"createdAt": "2026-06-11T13:04:06Z",
"updatedBy": "75237721",
"updatedAt": "2026-06-11T13:04:50Z",
"rejectedBy": "75237721",
"rejectedAt": "2026-06-11T13:04:50Z",
"rejectionComment": "Threshold needs review before publishing"
},
"comments": "Threshold needs review before publishing"
},
"errors": null,
"warnings": null
}Response parameters
| Field | Type | Description |
|---|---|---|
data | object | Object containing the full tier record after the review action. See Submit Tier for Approval for the complete field reference. |
.status | enum | Stage after the review action. Possible values: ACTIVE (after approval), DRAFT (after rejection). After approval, the same tier appears as LIVE in List All Tiers and Get Tier responses. |
.slabId | integer | Unique ID of the published tier, set after a successful approval. null after rejection of a new tier. |
.meta.approvedBy | string | User ID of the reviewer who approved the tier. Present after approval. |
.meta.approvedAt | timestamp | Date and time when the tier was approved, in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ), returned in the server time zone. Present after approval. |
.meta.rejectedBy | string | User ID of the reviewer who rejected the tier. Present after rejection. |
.meta.rejectedAt | timestamp | Date and time when the tier was rejected, in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ), returned in the server time zone. Present after rejection. |
.meta.rejectionComment | string | Reviewer's comment. Present after rejection. |
.comments | string | Reviewer's note from this review action. |
errors | array | Error list. null on success. |
warnings | array | Warning list. null on success. |
Error & warning codes
| Code | Error number | Type | Description |
|---|---|---|---|
TIER.NOT_FOUND | 9056 | Error | No tier matches the given tierId. HTTP 404. |
TIER.UNKNOWN_APPROVAL_ACTION | 9041 | Error | approvalStatus is not APPROVE or REJECT. HTTP 400. |
TIER.PROGRAM_DOWNGRADE_STRATEGY_NOT_CONFIGURED | 9052 | Error | The program has no SLAB_DOWNGRADE strategy. Configure Tier Advanced Settings first. HTTP 400. |
TIER.PROGRAM_UPGRADE_STRATEGY_NOT_CONFIGURED | 9053 | Error | The program has no SLAB_UPGRADE strategy. Configure Tier Advanced Settings first. HTTP 400. |
TIER_APPROVE_REQUIRES_PENDING | — | Error | The tier is not in PENDING_APPROVAL status. HTTP 409. |
TIER_APPROVAL_DRIFT | — | Error | The published tier changed after this draft was created. The response includes a diffs list showing each changed field. Recreate the draft from the current state and resubmit. HTTP 409. |
Note: Conflict errors (HTTP 409) return the generic error number
999999with a descriptive message on the wire, except approval drift, which returns a structured body with acodeanddiffslist.
400Validation error, including error 9041 for an invalid approvalStatus
404Tier not found (error 9056)
409Status conflict: tier not pending approval, or approval blocked by drift
