---
title: "Redeem customer loyalty points"
method: POST
path: "/loyalty/cp/api/redeem-points"
tags: ["Redemptions & Discount Codes"]
---

# Redeem customer loyalty points

`POST /loyalty/cp/api/redeem-points`

## Request body

- CustomerLoyaltyRequestVM — Point redemption request details including redeem rule ID, points to redeem, and optional variant ID for product rewards
  - `customerEmail` string, nullable — Customer's email address. Alternative to customerId for identifying the customer. Provide either customerId OR customerEmail, not both. Must be a valid email address that exists in your Shopify store. Example: customer@example.com
  - `customerId` integer, nullable — Shopify customer ID (numeric). Identifies which customer is redeeming points. Provide either customerId OR customerEmail, not both. Example: 67890
  - `points` number, double, nullable — Number of points to redeem. Must be positive. If not provided, uses the default points value from the redemption rule. Customer must have at least this many available points. Example: 100.0
  - `redeemRuleId` integer, required — ID of the redemption rule to use. Determines what reward the customer receives. Use GET /api/external/point-redeem-rules to get available redemption options. Must be an active redemption rule configured in your loyalty program. Example: 5
  - `variantId` integer, nullable — Shopify product variant ID. Required when redeeming for product-specific rewards (free product). Not required for discount codes or store credit rewards. Must be a valid variant ID from your Shopify catalog. Example: 12345678

## Response `200`

Points redeemed successfully, returns updated customer loyalty information with new reward

- CustomerLoyaltyResponseVM
  - `achievableTierId` integer
  - `availablePoints` number, double
  - `createAt` string, date-time
  - `creditedPoints` number, double
  - `currentVipTier` string
  - `customerStatus` 'ACTIVE' | 'INACTIVE' | 'EXCLUDED' | 'EXCLUDED_BY_CUSTOMER'
  - `dob` string, date
  - `expiringPointsAmount` number, double
  - `pendingPoints` number, double
  - `pointsExpireAt` string, date-time
  - `referralLink` string
  - `referredCompleted` integer
  - `rewardedForCreatingAccount` boolean
  - `rewardedForFacebook` boolean
  - `rewardedForInstagram` boolean
  - `rewardedForNewsLetter` boolean
  - `rewardedForPinterest` boolean
  - `rewardedForSharingOnFacebook` boolean
  - `rewardedForSharingOnX` boolean
  - `rewardedForSms` boolean
  - `rewardedForTiktok` boolean
  - `rewardedForTwitter` boolean
  - `rewardedForYoutube` boolean
  - `rewards` CustomerReward[]
    - `amount` number, double
    - `createAt` string, date-time, required
    - `customerId` integer, required
    - `description` string
    - `discountCode` string, required
    - `discountCodeId` string
    - `expireDate` string, date-time
    - `id` integer
    - `lastExpiryReminderSentDate` string, date-time
    - `orderId` integer
    - `orderName` string
    - `pointRedeemRuleId` integer
    - `pointTransactionId` integer
    - `productData` string
    - `rewardType` 'STORE_CREDIT' | 'DISCOUNT_CODE' | 'POINTS'
    - `shop` string, required
    - `status` 'USED' | 'UNUSED' | 'REFUNDED' | 'EXPIRED' | 'SUBSCRIPTION_ACTIVE' | 'CANCELED', required
    - `usageCount` integer
    - `usedAt` string, date-time
    - `variantId` integer
  - `spentAmount` number, double
  - `storeCreditBalance` number, double
  - `storeCreditCurrency` string
  - `vipTierExpiredAt` string, date-time
  - `vipTierSpentAmount` number, double

## Other responses

- `400` — Invalid redemption request or insufficient points
- `401` — Customer not authenticated - JWT token missing or invalid

---

[API](https://skmtc.net/appstle/apis/storefront-apis.md) · [All operations](https://skmtc.net/appstle/apis/storefront-apis/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/appstle/storefront-apis/revisions/f62b6f66ee8f/schema)
