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

# Redeem customer points for rewards

`POST /api/external/redeem-points`

## Headers

- `X-API-Key` string, required

## Request body

- CustomerLoyaltyRequestVM — Redemption request with customer ID/email, redeem rule ID, points to redeem
  - `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 successfully redeemed and reward generated

- 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 request
- `401` — Unauthorized - Invalid or missing X-API-Key

---

[API](https://skmtc.dev/appstle/apis/admin-apis.md) · [All operations](https://skmtc.dev/appstle/apis/admin-apis/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/appstle/admin-apis/revisions/27286503779d/schema)
