Product API: These endpoints are part of the Loyalty API. All endpoints begin with: /api/v1/loyalty/claims/

Complete Claim Flow

Here's the typical flow for processing a reward redemption:

1

Member Initiates Claim

Member selects a reward and confirms they want to redeem their points.

2

Request OTP

Call /claims/request-otp to send verification to member's email.

3

Create Claim Request

Submit the claim with the OTP code via /claims.

4

Staff Approves/Rejects

Staff reviews and processes the claim via approve or reject endpoints.

Request Claim OTP

POST Request Claim OTP
points_write
/api/v1/loyalty/claims/request-otp

Request a verification code for claiming a reward. OTP is sent to member's email.

Request Body

{
  "member_email": "ahmed@example.com",
  "card_id": 5,
  "reward_id": 1
}

member_email (string, required) - Member's email
card_id (integer, required) - Card ID
reward_id (integer, optional) - Reward ID

Response

{
  "success": true,
  "data": {
    "expires_at": "2025-01-15T10:40:00Z",
    "expires_in_minutes": 10
  },
  "message": "Verification code sent to member email."
}

Create Claim Request

POST Create Claim Request
points_write
/api/v1/loyalty/claims

Create a new reward claim request. OTP verification required.

Request Body

{
  "member_email": "ahmed@example.com",
  "card_id": 5,
  "reward_id": 1,
  "verification_code": "123456",
  "member_note": "Pickup at downtown branch"
}

member_email (string, required) - Member's email
card_id (integer, required) - Card ID
reward_id (integer, required) - Reward ID
verification_code (string, required) - 6-digit OTP code
member_note (string, optional) - Member note

Response

{
  "success": true,
  "data": {
    "claim_request": {
      "id": 100,
      "status": "pending",
      "created_at": "2025-01-15T10:30:00Z"
    }
  }
}

List Claim Requests

GET List Claim Requests
points_read
/api/v1/loyalty/claims?card_id={card_id}&status={status}

Get all claim requests for a card, optionally filtered by status.

Query Parameters

card_id=5
status=pending

card_id (integer, required) - The card ID
status (string, optional) - Filter: pending, approved, rejected, expired

Get Claim Request

GET Get Claim Request
points_read
/api/v1/loyalty/claims/{request_id}

Get details of a specific claim request.

URL Parameter: request_id (integer, required) - The request ID

Approve Claim Request

POST Approve Claim Request
points_write
/api/v1/loyalty/claims/{request_id}/approve

Approve a pending claim request and process the reward. Points are deducted from member's balance.

Request Body

{
  "staff_note": "Approved via API"
}

staff_note (string, optional) - Staff note

Response

{
  "success": true,
  "data": {
    "claim_request": {
      "id": 100,
      "status": "approved",
      "points_deducted": 500,
      "approved_at": "2025-01-15T11:00:00Z"
    }
  }
}

Reject Claim Request

POST Reject Claim Request
points_write
/api/v1/loyalty/claims/{request_id}/reject

Reject a pending claim request. Points remain with the member.

Request Body

{
  "staff_note": "Insufficient points balance"
}

staff_note (string, optional) - Staff note

Response

{
  "success": true,
  "data": {
    "claim_request": {
      "id": 100,
      "status": "rejected",
      "rejected_at": "2025-01-15T11:00:00Z"
    }
  }
}
ESC